wxg 3 years ago
commit
4e438d318b
100 changed files with 8044 additions and 0 deletions
  1. 11 0
      .idea/$PROJECT_FILE$
  2. 8 0
      .idea/.gitignore
  3. 19 0
      .idea/compiler.xml
  4. 8 0
      .idea/encodings.xml
  5. 30 0
      .idea/jarRepositories.xml
  6. 21 0
      .idea/misc.xml
  7. 465 0
      .idea/qaplug_profiles.xml
  8. 124 0
      .idea/uiDesigner.xml
  9. 6 0
      .idea/vcs.xml
  10. 118 0
      .mvn/wrapper/MavenWrapperDownloader.java
  11. BIN
      .mvn/wrapper/maven-wrapper.jar
  12. 2 0
      .mvn/wrapper/maven-wrapper.properties
  13. BIN
      file/system/20211119/admin_code_41.png
  14. 11 0
      fyzd-phone/.idea/$PROJECT_FILE$
  15. 8 0
      fyzd-phone/.idea/.gitignore
  16. 19 0
      fyzd-phone/.idea/compiler.xml
  17. 6 0
      fyzd-phone/.idea/encodings.xml
  18. 25 0
      fyzd-phone/.idea/jarRepositories.xml
  19. 21 0
      fyzd-phone/.idea/misc.xml
  20. 465 0
      fyzd-phone/.idea/qaplug_profiles.xml
  21. 10 0
      fyzd-phone/.idea/runConfigurations.xml
  22. 269 0
      fyzd-phone/logs/info-collection.log
  23. 622 0
      fyzd-phone/logs/winxin-fyzd.log
  24. BIN
      fyzd-phone/logs/winxin-fyzd.log.2021-11-23.0.gz
  25. 209 0
      fyzd-phone/pom.xml
  26. 17 0
      fyzd-phone/src/main/java/com/yx/face/FyzdPhoneApplication.java
  27. 30 0
      fyzd-phone/src/main/java/com/yx/face/boot/component/wx/MyWxMpService.java
  28. 151 0
      fyzd-phone/src/main/java/com/yx/face/boot/component/wx/WxMaConfiguration.java
  29. 47 0
      fyzd-phone/src/main/java/com/yx/face/boot/component/wx/WxMaProperties.java
  30. 39 0
      fyzd-phone/src/main/java/com/yx/face/boot/config/MinioConfig.java
  31. 93 0
      fyzd-phone/src/main/java/com/yx/face/boot/config/SwaggerConfig.java
  32. 43 0
      fyzd-phone/src/main/java/com/yx/face/boot/config/TaskPoolConfig.java
  33. 50 0
      fyzd-phone/src/main/java/com/yx/face/boot/restful/CommonException.java
  34. 40 0
      fyzd-phone/src/main/java/com/yx/face/boot/restful/RestCode.java
  35. 64 0
      fyzd-phone/src/main/java/com/yx/face/boot/restful/RestDTO.java
  36. 43 0
      fyzd-phone/src/main/java/com/yx/face/boot/restful/RestResponse.java
  37. 64 0
      fyzd-phone/src/main/java/com/yx/face/boot/restful/RestResult.java
  38. 44 0
      fyzd-phone/src/main/java/com/yx/face/boot/restful/ServiceException.java
  39. 226 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/AliOssCloudUtil.java
  40. 906 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/ConvertUtils.java
  41. 45 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/CookieUtils.java
  42. 642 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/DateUtils.java
  43. 193 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/ForeignAesUtil.java
  44. 9 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/HttpUtils.java
  45. 51 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/IDCardEncryptionUtil.java
  46. 137 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/IPUtils.java
  47. 102 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/JsonUtils.java
  48. 278 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/MiniOUtils.java
  49. 299 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/NumUtils.java
  50. 315 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/OkHttpUtils.java
  51. 207 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/QRCodeUtil.java
  52. 647 0
      fyzd-phone/src/main/java/com/yx/face/boot/uitls/oConvertUtils.java
  53. 127 0
      fyzd-phone/src/main/java/com/yx/face/controller/FileUpload/FileUploadController.java
  54. 160 0
      fyzd-phone/src/main/java/com/yx/face/controller/FileUpload/UploadController.java
  55. 44 0
      fyzd-phone/src/main/java/com/yx/face/controller/admin/WinXinController.java
  56. 29 0
      fyzd-phone/src/main/java/com/yx/face/controller/dto/WxInfoDTO.java
  57. 18 0
      fyzd-phone/src/main/java/com/yx/face/service/WeiXinApiService.java
  58. 53 0
      fyzd-phone/src/main/java/com/yx/face/service/impl/WeiXinApiServiceImpl.java
  59. 85 0
      fyzd-phone/src/main/resources/application-prod.yml
  60. 3 0
      fyzd-phone/src/main/resources/application.yml
  61. 85 0
      fyzd-phone/target/classes/application-prod.yml
  62. 3 0
      fyzd-phone/target/classes/application.yml
  63. BIN
      fyzd-phone/target/classes/com/yx/face/FyzdPhoneApplication.class
  64. BIN
      fyzd-phone/target/classes/com/yx/face/boot/component/wx/MyWxMpService.class
  65. BIN
      fyzd-phone/target/classes/com/yx/face/boot/component/wx/WxMaConfiguration.class
  66. BIN
      fyzd-phone/target/classes/com/yx/face/boot/component/wx/WxMaProperties$Config.class
  67. BIN
      fyzd-phone/target/classes/com/yx/face/boot/component/wx/WxMaProperties.class
  68. BIN
      fyzd-phone/target/classes/com/yx/face/boot/config/MinioConfig.class
  69. BIN
      fyzd-phone/target/classes/com/yx/face/boot/config/SwaggerConfig.class
  70. BIN
      fyzd-phone/target/classes/com/yx/face/boot/config/TaskPoolConfig.class
  71. BIN
      fyzd-phone/target/classes/com/yx/face/boot/restful/CommonException.class
  72. BIN
      fyzd-phone/target/classes/com/yx/face/boot/restful/RestCode.class
  73. BIN
      fyzd-phone/target/classes/com/yx/face/boot/restful/RestDTO.class
  74. BIN
      fyzd-phone/target/classes/com/yx/face/boot/restful/RestResponse.class
  75. BIN
      fyzd-phone/target/classes/com/yx/face/boot/restful/RestResult.class
  76. BIN
      fyzd-phone/target/classes/com/yx/face/boot/restful/ServiceException.class
  77. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/AliOssCloudUtil.class
  78. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/ConvertUtils.class
  79. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/CookieUtils.class
  80. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/DateUtils.class
  81. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/ForeignAesUtil.class
  82. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/HttpUtils.class
  83. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/IDCardEncryptionUtil.class
  84. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/IPUtils.class
  85. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/JsonUtils.class
  86. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/MiniOUtils.class
  87. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/NumUtils.class
  88. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/OkHttpUtils$1.class
  89. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/OkHttpUtils$2.class
  90. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/OkHttpUtils$3.class
  91. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/OkHttpUtils$ICallBack.class
  92. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/OkHttpUtils.class
  93. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/QRCodeUtil.class
  94. BIN
      fyzd-phone/target/classes/com/yx/face/boot/uitls/oConvertUtils.class
  95. BIN
      fyzd-phone/target/classes/com/yx/face/controller/FileUpload/UploadController.class
  96. BIN
      fyzd-phone/target/classes/com/yx/face/controller/admin/WinXinController.class
  97. BIN
      fyzd-phone/target/classes/com/yx/face/controller/dto/WxInfoDTO.class
  98. BIN
      fyzd-phone/target/classes/com/yx/face/service/WeiXinApiService.class
  99. BIN
      fyzd-phone/target/classes/com/yx/face/service/impl/WeiXinApiServiceImpl.class
  100. 178 0
      logs/fyzd.log

+ 11 - 0
.idea/$PROJECT_FILE$

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AnalysisProjectProfileManager">
+    <option name="PROJECT_PROFILE" />
+    <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
+    <list size="0" />
+  </component>
+  <component name="SuppressionsComponent">
+    <option name="suppComments" value="[]" />
+  </component>
+</project>

+ 8 - 0
.idea/.gitignore

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

+ 19 - 0
.idea/compiler.xml

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

+ 8 - 0
.idea/encodings.xml

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

+ 30 - 0
.idea/jarRepositories.xml

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

+ 21 - 0
.idea/misc.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="FindBugsConfigurable">
+    <option name="make" value="true" />
+    <option name="effort" value="default" />
+    <option name="priority" value="Medium" />
+    <option name="excludeFilter" value="" />
+  </component>
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
+  <component name="SuppressionsComponent">
+    <option name="suppComments" value="[]" />
+  </component>
+</project>

+ 465 - 0
.idea/qaplug_profiles.xml

@@ -0,0 +1,465 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AnalysisProjectProfileManager">
+    <option name="PROJECT_PROFILE" value="Project Default" />
+    <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
+    <scopes />
+    <profiles>
+      <profile profile_name="Project Default" version="1.0" is_locked="false">
+        <coding_rule class="AM_CREATES_EMPTY_JAR_FILE_ENTRY" level="MAJOR" enabled="true" />
+        <coding_rule class="AM_CREATES_EMPTY_ZIP_FILE_ENTRY" level="MAJOR" enabled="true" />
+        <coding_rule class="AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACTION" level="CRITICAL" enabled="false" />
+        <coding_rule class="BAC_BAD_APPLET_CONSTRUCTOR" level="MAJOR" enabled="false" />
+        <coding_rule class="BC_BAD_CAST_TO_ABSTRACT_COLLECTION" level="MAJOR" enabled="true" />
+        <coding_rule class="BC_BAD_CAST_TO_CONCRETE_COLLECTION" level="CRITICAL" enabled="true" />
+        <coding_rule class="BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS" level="CRITICAL" enabled="true" />
+        <coding_rule class="BC_IMPOSSIBLE_CAST" level="BLOCKER" enabled="true" />
+        <coding_rule class="BC_IMPOSSIBLE_DOWNCAST" level="MAJOR" enabled="false" />
+        <coding_rule class="BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY" level="MAJOR" enabled="false" />
+        <coding_rule class="BC_IMPOSSIBLE_INSTANCEOF" level="CRITICAL" enabled="true" />
+        <coding_rule class="BC_UNCONFIRMED_CAST" level="CRITICAL" enabled="true" />
+        <coding_rule class="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE" level="CRITICAL" enabled="false" />
+        <coding_rule class="BC_VACUOUS_INSTANCEOF" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_ADD_OF_SIGNED_BYTE" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_AND" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_AND_ZZ" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_IOR" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_IOR_OF_SIGNED_BYTE" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_SIGNED_CHECK" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_SIGNED_CHECK_HIGH_BIT" level="CRITICAL" enabled="true" />
+        <coding_rule class="BOA_BADLY_OVERRIDDEN_ADAPTER" level="CRITICAL" enabled="true" />
+        <coding_rule class="BSHIFT_WRONG_ADD_PRIORITY" level="MAJOR" enabled="false" />
+        <coding_rule class="BX_BOXING_IMMEDIATELY_UNBOXED" level="MAJOR" enabled="true" />
+        <coding_rule class="BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION" level="MAJOR" enabled="true" />
+        <coding_rule class="BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR" level="MAJOR" enabled="true" />
+        <coding_rule class="BX_UNBOXING_IMMEDIATELY_REBOXED" level="CRITICAL" enabled="false" />
+        <coding_rule class="CAA_COVARIANT_ARRAY_ELEMENT_STORE" level="MAJOR" enabled="false" />
+        <coding_rule class="CAA_COVARIANT_ARRAY_FIELD" level="MAJOR" enabled="false" />
+        <coding_rule class="CAA_COVARIANT_ARRAY_LOCAL" level="MAJOR" enabled="false" />
+        <coding_rule class="CAA_COVARIANT_ARRAY_RETURN" level="MAJOR" enabled="false" />
+        <coding_rule class="CD_CIRCULAR_DEPENDENCY" level="MAJOR" enabled="false" />
+        <coding_rule class="CI_CONFUSED_INHERITANCE" level="MINOR" enabled="true" />
+        <coding_rule class="CNT_ROUGH_CONSTANT_VALUE" level="MAJOR" enabled="false" />
+        <coding_rule class="CN_IDIOM" level="MAJOR" enabled="true" />
+        <coding_rule class="CN_IDIOM_NO_SUPER_CALL" level="MAJOR" enabled="true" />
+        <coding_rule class="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE" level="MAJOR" enabled="true" />
+        <coding_rule class="CO_ABSTRACT_SELF" level="MAJOR" enabled="true" />
+        <coding_rule class="CO_COMPARETO_INCORRECT_FLOATING" level="MAJOR" enabled="false" />
+        <coding_rule class="CO_COMPARETO_RESULTS_MIN_VALUE" level="CRITICAL" enabled="false" />
+        <coding_rule class="CO_SELF_NO_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="DB_DUPLICATE_BRANCHES" level="CRITICAL" enabled="true" />
+        <coding_rule class="DB_DUPLICATE_SWITCH_CLAUSES" level="CRITICAL" enabled="true" />
+        <coding_rule class="DC_DOUBLECHECK" level="MAJOR" enabled="true" />
+        <coding_rule class="DC_PARTIALLY_CONSTRUCTED" level="MAJOR" enabled="false" />
+        <coding_rule class="DE_MIGHT_DROP" level="MAJOR" enabled="true" />
+        <coding_rule class="DE_MIGHT_IGNORE" level="MAJOR" enabled="true" />
+        <coding_rule class="DLS_DEAD_LOCAL_INCREMENT_IN_RETURN" level="MAJOR" enabled="false" />
+        <coding_rule class="DLS_DEAD_LOCAL_STORE" level="CRITICAL" enabled="true" />
+        <coding_rule class="DLS_DEAD_LOCAL_STORE_IN_RETURN" level="CRITICAL" enabled="true" />
+        <coding_rule class="DLS_DEAD_LOCAL_STORE_OF_NULL" level="CRITICAL" enabled="true" />
+        <coding_rule class="DLS_DEAD_LOCAL_STORE_SHADOWS_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="DLS_DEAD_STORE_OF_CLASS_LITERAL" level="CRITICAL" enabled="true" />
+        <coding_rule class="DLS_OVERWRITTEN_INCREMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="DL_SYNCHRONIZATION_ON_BOOLEAN" level="CRITICAL" enabled="true" />
+        <coding_rule class="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE" level="CRITICAL" enabled="true" />
+        <coding_rule class="DL_SYNCHRONIZATION_ON_SHARED_CONSTANT" level="CRITICAL" enabled="true" />
+        <coding_rule class="DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION" level="MAJOR" enabled="true" />
+        <coding_rule class="DMI_ARGUMENTS_WRONG_ORDER" level="CRITICAL" enabled="false" />
+        <coding_rule class="DMI_BAD_MONTH" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE" level="CRITICAL" enabled="false" />
+        <coding_rule class="DMI_BLOCKING_METHODS_ON_URL" level="BLOCKER" enabled="true" />
+        <coding_rule class="DMI_CALLING_NEXT_FROM_HASNEXT" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_COLLECTION_OF_URLS" level="BLOCKER" enabled="true" />
+        <coding_rule class="DMI_CONSTANT_DB_PASSWORD" level="BLOCKER" enabled="true" />
+        <coding_rule class="DMI_DOH" level="CRITICAL" enabled="false" />
+        <coding_rule class="DMI_EMPTY_DB_PASSWORD" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS" level="CRITICAL" enabled="false" />
+        <coding_rule class="DMI_FUTILE_ATTEMPT_TO_CHANGE_MAXPOOL_SIZE_OF_SCHEDULED_THREAD_POOL_EXECUTOR" level="MINOR" enabled="true" />
+        <coding_rule class="DMI_HARDCODED_ABSOLUTE_FILENAME" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_INVOKING_HASHCODE_ON_ARRAY" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_INVOKING_TOSTRING_ON_ARRAY" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_NONSERIALIZABLE_OBJECT_WRITTEN" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_RANDOM_USED_ONLY_ONCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_SCHEDULED_THREAD_POOL_EXECUTOR_WITH_ZERO_CORE_THREADS" level="MINOR" enabled="true" />
+        <coding_rule class="DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED" level="MAJOR" enabled="true" />
+        <coding_rule class="DMI_UNSUPPORTED_METHOD" level="MAJOR" enabled="true" />
+        <coding_rule class="DMI_USELESS_SUBSTRING" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD" level="MINOR" enabled="true" />
+        <coding_rule class="DMI_VACUOUS_SELF_COLLECTION_CALL" level="CRITICAL" enabled="true" />
+        <coding_rule class="DM_BOOLEAN_CTOR" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_BOXED_PRIMITIVE_FOR_COMPARE" level="MAJOR" enabled="false" />
+        <coding_rule class="DM_BOXED_PRIMITIVE_FOR_PARSING" level="MAJOR" enabled="false" />
+        <coding_rule class="DM_BOXED_PRIMITIVE_TOSTRING" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_CONVERT_CASE" level="INFO" enabled="true" />
+        <coding_rule class="DM_DEFAULT_ENCODING" level="CRITICAL" enabled="false" />
+        <coding_rule class="DM_EXIT" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_FP_NUMBER_CTOR" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_GC" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_INVALID_MIN_MAX" level="MAJOR" enabled="false" />
+        <coding_rule class="DM_MONITOR_WAIT_ON_CONDITION" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_NEW_FOR_GETCLASS" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_NEXTINT_VIA_NEXTDOUBLE" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_NUMBER_CTOR" level="CRITICAL" enabled="true" />
+        <coding_rule class="DM_RUN_FINALIZERS_ON_EXIT" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_STRING_CTOR" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_STRING_TOSTRING" level="INFO" enabled="true" />
+        <coding_rule class="DM_STRING_VOID_CTOR" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_USELESS_THREAD" level="MAJOR" enabled="true" />
+        <coding_rule class="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED" level="MAJOR" enabled="true" />
+        <coding_rule class="DP_DO_INSIDE_DO_PRIVILEGED" level="MAJOR" enabled="true" />
+        <coding_rule class="EC_ARRAY_AND_NONARRAY" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_BAD_ARRAY_COMPARE" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_INCOMPATIBLE_ARRAY_COMPARE" level="MAJOR" enabled="false" />
+        <coding_rule class="EC_NULL_ARG" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_UNRELATED_CLASS_AND_INTERFACE" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_UNRELATED_INTERFACES" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_UNRELATED_TYPES" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_UNRELATED_TYPES_USING_POINTER_EQUALITY" level="CRITICAL" enabled="true" />
+        <coding_rule class="EI_EXPOSE_REP" level="MAJOR" enabled="true" />
+        <coding_rule class="EI_EXPOSE_REP2" level="MAJOR" enabled="true" />
+        <coding_rule class="EI_EXPOSE_STATIC_REP2" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_ABSTRACT_SELF" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_ALWAYS_FALSE" level="BLOCKER" enabled="true" />
+        <coding_rule class="EQ_ALWAYS_TRUE" level="BLOCKER" enabled="true" />
+        <coding_rule class="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_COMPARETO_USE_OBJECT_EQUALS" level="CRITICAL" enabled="true" />
+        <coding_rule class="EQ_COMPARING_CLASS_NAMES" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_DOESNT_OVERRIDE_EQUALS" level="MAJOR" enabled="false" />
+        <coding_rule class="EQ_DONT_DEFINE_EQUALS_FOR_ENUM" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_GETCLASS_AND_CLASS_CONSTANT" level="CRITICAL" enabled="true" />
+        <coding_rule class="EQ_OTHER_NO_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_OTHER_USE_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_SELF_NO_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_SELF_USE_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_UNUSUAL" level="MINOR" enabled="true" />
+        <coding_rule class="ES_COMPARING_PARAMETER_STRING_WITH_EQ" level="MAJOR" enabled="true" />
+        <coding_rule class="ES_COMPARING_STRINGS_WITH_EQ" level="MAJOR" enabled="true" />
+        <coding_rule class="ESync_EMPTY_SYNC" level="MAJOR" enabled="true" />
+        <coding_rule class="FB_MISSING_EXPECTED_WARNING" level="CRITICAL" enabled="false" />
+        <coding_rule class="FB_UNEXPECTED_WARNING" level="CRITICAL" enabled="false" />
+        <coding_rule class="FE_FLOATING_POINT_EQUALITY" level="CRITICAL" enabled="true" />
+        <coding_rule class="FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER" level="CRITICAL" enabled="true" />
+        <coding_rule class="FI_EMPTY" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_EXPLICIT_INVOCATION" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_FINALIZER_NULLS_FIELDS" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_FINALIZER_ONLY_NULLS_FIELDS" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_MISSING_SUPER_CALL" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_NULLIFY_SUPER" level="CRITICAL" enabled="true" />
+        <coding_rule class="FI_PUBLIC_SHOULD_BE_PROTECTED" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_USELESS" level="MINOR" enabled="true" />
+        <coding_rule class="FL_MATH_USING_FLOAT_PRECISION" level="CRITICAL" enabled="true" />
+        <coding_rule class="GC_UNCHECKED_TYPE_IN_GENERIC_CALL" level="CRITICAL" enabled="true" />
+        <coding_rule class="GC_UNRELATED_TYPES" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_EQUALS_NO_HASHCODE" level="MAJOR" enabled="true" />
+        <coding_rule class="HE_EQUALS_USE_HASHCODE" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_HASHCODE_NO_EQUALS" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_HASHCODE_USE_OBJECT_EQUALS" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_INHERITS_EQUALS_USE_HASHCODE" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_USE_OF_UNHASHABLE_CLASS" level="CRITICAL" enabled="true" />
+        <coding_rule class="HRS_REQUEST_PARAMETER_TO_COOKIE" level="MAJOR" enabled="true" />
+        <coding_rule class="HRS_REQUEST_PARAMETER_TO_HTTP_HEADER" level="MAJOR" enabled="true" />
+        <coding_rule class="HSC_HUGE_SHARED_STRING_CONSTANT" level="CRITICAL" enabled="true" />
+        <coding_rule class="IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD" level="MAJOR" enabled="true" />
+        <coding_rule class="ICAST_BAD_SHIFT_AMOUNT" level="CRITICAL" enabled="true" />
+        <coding_rule class="ICAST_IDIV_CAST_TO_DOUBLE" level="CRITICAL" enabled="true" />
+        <coding_rule class="ICAST_INTEGER_MULTIPLY_CAST_TO_LONG" level="CRITICAL" enabled="true" />
+        <coding_rule class="ICAST_INT_2_LONG_AS_INSTANT" level="CRITICAL" enabled="false" />
+        <coding_rule class="ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL" level="CRITICAL" enabled="true" />
+        <coding_rule class="ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND" level="CRITICAL" enabled="true" />
+        <coding_rule class="ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT" level="CRITICAL" enabled="true" />
+        <coding_rule class="IC_INIT_CIRCULARITY" level="CRITICAL" enabled="true" />
+        <coding_rule class="IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION" level="MAJOR" enabled="true" />
+        <coding_rule class="IIL_ELEMENTS_GET_LENGTH_IN_LOOP" level="MAJOR" enabled="false" />
+        <coding_rule class="IIL_PATTERN_COMPILE_IN_LOOP" level="MAJOR" enabled="false" />
+        <coding_rule class="IIL_PATTERN_COMPILE_IN_LOOP_INDIRECT" level="MAJOR" enabled="false" />
+        <coding_rule class="IIL_PREPARE_STATEMENT_IN_LOOP" level="MAJOR" enabled="false" />
+        <coding_rule class="IIO_INEFFICIENT_INDEX_OF" level="MAJOR" enabled="false" />
+        <coding_rule class="IIO_INEFFICIENT_LAST_INDEX_OF" level="MAJOR" enabled="false" />
+        <coding_rule class="IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD" level="CRITICAL" enabled="true" />
+        <coding_rule class="IJU_BAD_SUITE_METHOD" level="CRITICAL" enabled="true" />
+        <coding_rule class="IJU_NO_TESTS" level="CRITICAL" enabled="true" />
+        <coding_rule class="IJU_SETUP_NO_SUPER" level="CRITICAL" enabled="true" />
+        <coding_rule class="IJU_SUITE_NOT_STATIC" level="CRITICAL" enabled="true" />
+        <coding_rule class="IJU_TEARDOWN_NO_SUPER" level="CRITICAL" enabled="true" />
+        <coding_rule class="IL_CONTAINER_ADDED_TO_ITSELF" level="CRITICAL" enabled="true" />
+        <coding_rule class="IL_INFINITE_LOOP" level="CRITICAL" enabled="true" />
+        <coding_rule class="IL_INFINITE_RECURSIVE_LOOP" level="CRITICAL" enabled="true" />
+        <coding_rule class="IMA_INEFFICIENT_MEMBER_ACCESS" level="MAJOR" enabled="false" />
+        <coding_rule class="IMSE_DONT_CATCH_IMSE" level="MAJOR" enabled="true" />
+        <coding_rule class="IM_AVERAGE_COMPUTATION_COULD_OVERFLOW" level="CRITICAL" enabled="true" />
+        <coding_rule class="IM_BAD_CHECK_FOR_ODD" level="CRITICAL" enabled="true" />
+        <coding_rule class="IM_MULTIPLYING_RESULT_OF_IREM" level="CRITICAL" enabled="true" />
+        <coding_rule class="INT_BAD_COMPARISON_WITH_INT_VALUE" level="CRITICAL" enabled="false" />
+        <coding_rule class="INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="INT_BAD_COMPARISON_WITH_SIGNED_BYTE" level="CRITICAL" enabled="true" />
+        <coding_rule class="INT_BAD_REM_BY_1" level="CRITICAL" enabled="true" />
+        <coding_rule class="INT_VACUOUS_BIT_OPERATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="INT_VACUOUS_COMPARISON" level="CRITICAL" enabled="true" />
+        <coding_rule class="IO_APPENDING_TO_OBJECT_OUTPUT_STREAM" level="CRITICAL" enabled="true" />
+        <coding_rule class="IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN" level="CRITICAL" enabled="true" />
+        <coding_rule class="IS2_INCONSISTENT_SYNC" level="CRITICAL" enabled="true" />
+        <coding_rule class="ISC_INSTANTIATE_STATIC_CLASS" level="MAJOR" enabled="true" />
+        <coding_rule class="IS_FIELD_NOT_GUARDED" level="CRITICAL" enabled="true" />
+        <coding_rule class="ITA_INEFFICIENT_TO_ARRAY" level="CRITICAL" enabled="true" />
+        <coding_rule class="IT_NO_SUCH_ELEMENT" level="MINOR" enabled="true" />
+        <coding_rule class="J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION" level="CRITICAL" enabled="true" />
+        <coding_rule class="JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS" level="MINOR" enabled="true" />
+        <coding_rule class="JLM_JSR166_LOCK_MONITORENTER" level="CRITICAL" enabled="true" />
+        <coding_rule class="JLM_JSR166_UTILCONCURRENT_MONITORENTER" level="CRITICAL" enabled="false" />
+        <coding_rule class="JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT" level="CRITICAL" enabled="false" />
+        <coding_rule class="LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE" level="MAJOR" enabled="false" />
+        <coding_rule class="LI_LAZY_INIT_STATIC" level="CRITICAL" enabled="true" />
+        <coding_rule class="LI_LAZY_INIT_UPDATE_STATIC" level="CRITICAL" enabled="true" />
+        <coding_rule class="ME_ENUM_FIELD_SETTER" level="MAJOR" enabled="false" />
+        <coding_rule class="ME_MUTABLE_ENUM_FIELD" level="MAJOR" enabled="false" />
+        <coding_rule class="MF_CLASS_MASKS_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="MF_METHOD_MASKS_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="ML_SYNC_ON_UPDATED_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="MSF_MUTABLE_SERVLET_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_CANNOT_BE_FINAL" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_EXPOSE_REP" level="CRITICAL" enabled="true" />
+        <coding_rule class="MS_FINAL_PKGPROTECT" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_MUTABLE_ARRAY" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_MUTABLE_COLLECTION" level="MAJOR" enabled="false" />
+        <coding_rule class="MS_MUTABLE_COLLECTION_PKGPROTECT" level="MAJOR" enabled="false" />
+        <coding_rule class="MS_MUTABLE_HASHTABLE" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_OOI_PKGPROTECT" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_PKGPROTECT" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_SHOULD_BE_FINAL" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_SHOULD_BE_REFACTORED_TO_BE_FINAL" level="CRITICAL" enabled="false" />
+        <coding_rule class="MTIA_SUSPECT_SERVLET_INSTANCE_FIELD" level="CRITICAL" enabled="true" />
+        <coding_rule class="MTIA_SUSPECT_STRUTS_INSTANCE_FIELD" level="CRITICAL" enabled="true" />
+        <coding_rule class="MWN_MISMATCHED_NOTIFY" level="CRITICAL" enabled="true" />
+        <coding_rule class="MWN_MISMATCHED_WAIT" level="CRITICAL" enabled="true" />
+        <coding_rule class="NM_BAD_EQUAL" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_CLASS_NAMING_CONVENTION" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_CLASS_NOT_EXCEPTION" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_CONFUSING" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_FIELD_NAMING_CONVENTION" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_LCASE_HASHCODE" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_LCASE_TOSTRING" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_METHOD_CONSTRUCTOR_CONFUSION" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_METHOD_NAMING_CONVENTION" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_SAME_SIMPLE_NAME_AS_INTERFACE" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_VERY_CONFUSING" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_VERY_CONFUSING_INTENTIONAL" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_WRONG_PACKAGE" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_WRONG_PACKAGE_INTENTIONAL" level="MAJOR" enabled="true" />
+        <coding_rule class="NN_NAKED_NOTIFY" level="CRITICAL" enabled="true" />
+        <coding_rule class="NOISE_FIELD_REFERENCE" level="MAJOR" enabled="false" />
+        <coding_rule class="NOISE_METHOD_CALL" level="MAJOR" enabled="false" />
+        <coding_rule class="NOISE_NULL_DEREFERENCE" level="MAJOR" enabled="false" />
+        <coding_rule class="NOISE_OPERATION" level="MAJOR" enabled="false" />
+        <coding_rule class="NO_NOTIFY_NOT_NOTIFYALL" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_ALWAYS_NULL" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_ALWAYS_NULL_EXCEPTION" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_ARGUMENT_MIGHT_BE_NULL" level="MAJOR" enabled="true" />
+        <coding_rule class="NP_BOOLEAN_RETURN_NULL" level="MAJOR" enabled="true" />
+        <coding_rule class="NP_CLONE_COULD_RETURN_NULL" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_CLOSING_NULL" level="MAJOR" enabled="false" />
+        <coding_rule class="NP_DEREFERENCE_OF_READLINE_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_GUARANTEED_DEREF" level="BLOCKER" enabled="true" />
+        <coding_rule class="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_IMMEDIATE_DEREFERENCE_OF_READLINE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_LOAD_OF_KNOWN_NULL_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_METHOD_PARAMETER_TIGHTENS_ANNOTATION" level="MAJOR" enabled="false" />
+        <coding_rule class="NP_METHOD_RETURN_RELAXING_ANNOTATION" level="MAJOR" enabled="false" />
+        <coding_rule class="NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" level="CRITICAL" enabled="false" />
+        <coding_rule class="NP_NONNULL_PARAM_VIOLATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NONNULL_RETURN_VIOLATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_INSTANCEOF" level="BLOCKER" enabled="true" />
+        <coding_rule class="NP_NULL_ON_SOME_PATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_ON_SOME_PATH_EXCEPTION" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_PARAM_DEREF" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_PARAM_DEREF_NONVIRTUAL" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_OPTIONAL_RETURN_NULL" level="MAJOR" enabled="false" />
+        <coding_rule class="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_STORE_INTO_NONNULL_FIELD" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_SYNC_AND_NULL_CHECK_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="NP_TOSTRING_COULD_RETURN_NULL" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_UNWRITTEN_FIELD" level="MAJOR" enabled="false" />
+        <coding_rule class="NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="NS_DANGEROUS_NON_SHORT_CIRCUIT" level="CRITICAL" enabled="true" />
+        <coding_rule class="NS_NON_SHORT_CIRCUIT" level="MAJOR" enabled="true" />
+        <coding_rule class="OBL_UNSATISFIED_OBLIGATION" level="CRITICAL" enabled="false" />
+        <coding_rule class="OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE" level="CRITICAL" enabled="false" />
+        <coding_rule class="ODR_OPEN_DATABASE_RESOURCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="OS_OPEN_STREAM" level="CRITICAL" enabled="true" />
+        <coding_rule class="OS_OPEN_STREAM_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="PS_PUBLIC_SEMAPHORES" level="CRITICAL" enabled="true" />
+        <coding_rule class="PT_ABSOLUTE_PATH_TRAVERSAL" level="CRITICAL" enabled="false" />
+        <coding_rule class="PT_RELATIVE_PATH_TRAVERSAL" level="CRITICAL" enabled="false" />
+        <coding_rule class="PZLA_PREFER_ZERO_LENGTH_ARRAYS" level="MAJOR" enabled="true" />
+        <coding_rule class="PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS" level="CRITICAL" enabled="false" />
+        <coding_rule class="QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="QF_QUESTIONABLE_FOR_LOOP" level="CRITICAL" enabled="true" />
+        <coding_rule class="RANGE_ARRAY_INDEX" level="MAJOR" enabled="false" />
+        <coding_rule class="RANGE_ARRAY_LENGTH" level="MAJOR" enabled="false" />
+        <coding_rule class="RANGE_ARRAY_OFFSET" level="MAJOR" enabled="false" />
+        <coding_rule class="RANGE_STRING_INDEX" level="MAJOR" enabled="false" />
+        <coding_rule class="RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES" level="CRITICAL" enabled="true" />
+        <coding_rule class="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RC_REF_COMPARISON" level="CRITICAL" enabled="true" />
+        <coding_rule class="RC_REF_COMPARISON_BAD_PRACTICE" level="MAJOR" enabled="false" />
+        <coding_rule class="RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN" level="MAJOR" enabled="false" />
+        <coding_rule class="REC_CATCH_EXCEPTION" level="MAJOR" enabled="true" />
+        <coding_rule class="RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION" level="CRITICAL" enabled="true" />
+        <coding_rule class="RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION" level="CRITICAL" enabled="true" />
+        <coding_rule class="RE_POSSIBLE_UNINTENDED_PATTERN" level="CRITICAL" enabled="true" />
+        <coding_rule class="RI_REDUNDANT_INTERFACES" level="MAJOR" enabled="true" />
+        <coding_rule class="RR_NOT_CHECKED" level="MAJOR" enabled="true" />
+        <coding_rule class="RS_READOBJECT_SYNC" level="CRITICAL" enabled="true" />
+        <coding_rule class="RU_INVOKE_RUN" level="MAJOR" enabled="true" />
+        <coding_rule class="RV_01_TO_INT" level="MAJOR" enabled="true" />
+        <coding_rule class="RV_ABSOLUTE_VALUE_OF_HASHCODE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RV_ABSOLUTE_VALUE_OF_RANDOM_INT" level="CRITICAL" enabled="true" />
+        <coding_rule class="RV_CHECK_COMPARETO_FOR_SPECIFIC_RETURN_VALUE" level="CRITICAL" enabled="false" />
+        <coding_rule class="RV_CHECK_FOR_POSITIVE_INDEXOF" level="MINOR" enabled="true" />
+        <coding_rule class="RV_DONT_JUST_NULL_CHECK_READLINE" level="MAJOR" enabled="true" />
+        <coding_rule class="RV_EXCEPTION_NOT_THROWN" level="CRITICAL" enabled="true" />
+        <coding_rule class="RV_NEGATING_RESULT_OF_COMPARETO" level="CRITICAL" enabled="false" />
+        <coding_rule class="RV_REM_OF_HASHCODE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RV_REM_OF_RANDOM_INT" level="CRITICAL" enabled="true" />
+        <coding_rule class="RV_RETURN_VALUE_IGNORED" level="MINOR" enabled="true" />
+        <coding_rule class="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" level="MAJOR" enabled="true" />
+        <coding_rule class="RV_RETURN_VALUE_IGNORED_INFERRED" level="CRITICAL" enabled="false" />
+        <coding_rule class="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT" level="MAJOR" enabled="false" />
+        <coding_rule class="RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED" level="MAJOR" enabled="false" />
+        <coding_rule class="RpC_REPEATED_CONDITIONAL_TEST" level="MAJOR" enabled="true" />
+        <coding_rule class="SA_FIELD_DOUBLE_ASSIGNMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_FIELD_SELF_ASSIGNMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_FIELD_SELF_COMPARISON" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_FIELD_SELF_COMPUTATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_LOCAL_DOUBLE_ASSIGNMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_LOCAL_SELF_ASSIGNMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_LOCAL_SELF_ASSIGNMENT_INSTEAD_OF_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="SA_LOCAL_SELF_COMPARISON" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_LOCAL_SELF_COMPUTATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="SBSC_USE_STRINGBUFFER_CONCATENATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="SC_START_IN_CTOR" level="CRITICAL" enabled="true" />
+        <coding_rule class="SE_BAD_FIELD" level="MINOR" enabled="false" />
+        <coding_rule class="SE_BAD_FIELD_INNER_CLASS" level="MINOR" enabled="true" />
+        <coding_rule class="SE_BAD_FIELD_STORE" level="CRITICAL" enabled="true" />
+        <coding_rule class="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_INNER_CLASS" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_METHOD_MUST_BE_PRIVATE" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_NONFINAL_SERIALVERSIONID" level="CRITICAL" enabled="true" />
+        <coding_rule class="SE_NONLONG_SERIALVERSIONID" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_NONSTATIC_SERIALVERSIONID" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_NO_SERIALVERSIONID" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_NO_SUITABLE_CONSTRUCTOR" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_PRIVATE_READ_RESOLVE_NOT_INHERITED" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_READ_RESOLVE_IS_STATIC" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_READ_RESOLVE_MUST_RETURN_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_TRANSIENT_FIELD_NOT_RESTORED" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS" level="MAJOR" enabled="true" />
+        <coding_rule class="SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH" level="MAJOR" enabled="false" />
+        <coding_rule class="SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW" level="MAJOR" enabled="false" />
+        <coding_rule class="SF_SWITCH_FALLTHROUGH" level="MAJOR" enabled="false" />
+        <coding_rule class="SF_SWITCH_NO_DEFAULT" level="MAJOR" enabled="false" />
+        <coding_rule class="SIC_INNER_SHOULD_BE_STATIC" level="MAJOR" enabled="true" />
+        <coding_rule class="SIC_INNER_SHOULD_BE_STATIC_ANON" level="MAJOR" enabled="true" />
+        <coding_rule class="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS" level="MAJOR" enabled="true" />
+        <coding_rule class="SIC_THREADLOCAL_DEADLY_EMBRACE" level="MAJOR" enabled="false" />
+        <coding_rule class="SIO_SUPERFLUOUS_INSTANCEOF" level="CRITICAL" enabled="true" />
+        <coding_rule class="SI_INSTANCE_BEFORE_FINALS_ASSIGNED" level="CRITICAL" enabled="true" />
+        <coding_rule class="SP_SPIN_ON_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="SQL_BAD_PREPARED_STATEMENT_ACCESS" level="CRITICAL" enabled="true" />
+        <coding_rule class="SQL_BAD_RESULTSET_ACCESS" level="CRITICAL" enabled="true" />
+        <coding_rule class="SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE" level="CRITICAL" enabled="true" />
+        <coding_rule class="SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING" level="CRITICAL" enabled="true" />
+        <coding_rule class="SR_NOT_CHECKED" level="MAJOR" enabled="true" />
+        <coding_rule class="SS_SHOULD_BE_STATIC" level="MAJOR" enabled="true" />
+        <coding_rule class="STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="STCAL_STATIC_CALENDAR_INSTANCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="STI_INTERRUPTED_ON_CURRENTTHREAD" level="CRITICAL" enabled="true" />
+        <coding_rule class="STI_INTERRUPTED_ON_UNKNOWNTHREAD" level="CRITICAL" enabled="true" />
+        <coding_rule class="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" level="CRITICAL" enabled="true" />
+        <coding_rule class="SWL_SLEEP_WITH_LOCK_HELD" level="CRITICAL" enabled="true" />
+        <coding_rule class="SW_SWING_METHODS_INVOKED_IN_SWING_THREAD" level="MAJOR" enabled="true" />
+        <coding_rule class="TLW_TWO_LOCK_WAIT" level="MAJOR" enabled="true" />
+        <coding_rule class="TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_COMPARING_VALUES_WITH_INCOMPATIBLE_TYPE_QUALIFIERS" level="CRITICAL" enabled="false" />
+        <coding_rule class="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_UNKNOWN_VALUE_USED_WHERE_ALWAYS_STRICTLY_REQUIRED" level="CRITICAL" enabled="false" />
+        <coding_rule class="UCF_USELESS_CONTROL_FLOW" level="CRITICAL" enabled="true" />
+        <coding_rule class="UCF_USELESS_CONTROL_FLOW_NEXT_LINE" level="CRITICAL" enabled="true" />
+        <coding_rule class="UC_USELESS_CONDITION" level="MAJOR" enabled="false" />
+        <coding_rule class="UC_USELESS_CONDITION_TYPE" level="MAJOR" enabled="false" />
+        <coding_rule class="UC_USELESS_OBJECT" level="MAJOR" enabled="false" />
+        <coding_rule class="UC_USELESS_OBJECT_STACK" level="MAJOR" enabled="false" />
+        <coding_rule class="UC_USELESS_VOID_METHOD" level="MAJOR" enabled="false" />
+        <coding_rule class="UG_SYNC_SET_UNSYNC_GET" level="MAJOR" enabled="true" />
+        <coding_rule class="UI_INHERITANCE_UNSAFE_GETRESOURCE" level="MAJOR" enabled="true" />
+        <coding_rule class="UL_UNRELEASED_LOCK" level="CRITICAL" enabled="true" />
+        <coding_rule class="UL_UNRELEASED_LOCK_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS" level="CRITICAL" enabled="true" />
+        <coding_rule class="UM_UNNECESSARY_MATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="UPM_UNCALLED_PRIVATE_METHOD" level="CRITICAL" enabled="true" />
+        <coding_rule class="URF_UNREAD_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="UR_UNINIT_READ" level="MAJOR" enabled="true" />
+        <coding_rule class="UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR" level="MAJOR" enabled="false" />
+        <coding_rule class="USM_USELESS_ABSTRACT_METHOD" level="MAJOR" enabled="false" />
+        <coding_rule class="USM_USELESS_SUBCLASS_METHOD" level="MAJOR" enabled="false" />
+        <coding_rule class="UUF_UNUSED_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" level="MAJOR" enabled="false" />
+        <coding_rule class="UWF_NULL_FIELD" level="CRITICAL" enabled="true" />
+        <coding_rule class="UWF_UNWRITTEN_FIELD" level="MAJOR" enabled="false" />
+        <coding_rule class="UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="UW_UNCOND_WAIT" level="MAJOR" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_BAD_ARGUMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_BAD_CONVERSION" level="CRITICAL" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY" level="MAJOR" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN" level="MAJOR" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUPPLIED" level="MAJOR" enabled="false" />
+        <coding_rule class="VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED" level="MAJOR" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_ILLEGAL" level="CRITICAL" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_MISSING_ARGUMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_USES_NEWLINE" level="CRITICAL" enabled="false" />
+        <coding_rule class="VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG" level="CRITICAL" enabled="true" />
+        <coding_rule class="VO_VOLATILE_INCREMENT" level="CRITICAL" enabled="false" />
+        <coding_rule class="VO_VOLATILE_REFERENCE_TO_ARRAY" level="MAJOR" enabled="true" />
+        <coding_rule class="VR_UNRESOLVABLE_REFERENCE" level="MAJOR" enabled="false" />
+        <coding_rule class="WA_AWAIT_NOT_IN_LOOP" level="CRITICAL" enabled="true" />
+        <coding_rule class="WA_NOT_IN_LOOP" level="CRITICAL" enabled="true" />
+        <coding_rule class="WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL" level="CRITICAL" enabled="true" />
+        <coding_rule class="WMI_WRONG_MAP_ITERATOR" level="CRITICAL" enabled="true" />
+        <coding_rule class="WS_WRITEOBJECT_SYNC" level="CRITICAL" enabled="true" />
+        <coding_rule class="XFB_XML_FACTORY_BYPASS" level="CRITICAL" enabled="true" />
+        <coding_rule class="XSS_REQUEST_PARAMETER_TO_JSP_WRITER" level="CRITICAL" enabled="true" />
+        <coding_rule class="XSS_REQUEST_PARAMETER_TO_SEND_ERROR" level="CRITICAL" enabled="true" />
+        <coding_rule class="XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER" level="CRITICAL" enabled="true" />
+      </profile>
+    </profiles>
+    <list size="0" />
+  </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>

+ 118 - 0
.mvn/wrapper/MavenWrapperDownloader.java

@@ -0,0 +1,118 @@
+/*
+ * Copyright 2007-present the original author or authors.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import java.net.*;
+import java.io.*;
+import java.nio.channels.*;
+import java.util.Properties;
+
+public class MavenWrapperDownloader {
+
+    private static final String WRAPPER_VERSION = "0.5.6";
+    /**
+     * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
+     */
+    private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+            + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
+
+    /**
+     * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
+     * use instead of the default one.
+     */
+    private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
+            ".mvn/wrapper/maven-wrapper.properties";
+
+    /**
+     * Path where the maven-wrapper.jar will be saved to.
+     */
+    private static final String MAVEN_WRAPPER_JAR_PATH =
+            ".mvn/wrapper/maven-wrapper.jar";
+
+    /**
+     * Name of the property which should be used to override the default download url for the wrapper.
+     */
+    private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
+
+    public static void main(String args[]) {
+        System.out.println("- Downloader started");
+        File baseDirectory = new File(args[0]);
+        System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
+
+        // If the maven-wrapper.properties exists, read it and check if it contains a custom
+        // wrapperUrl parameter.
+        File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
+        String url = DEFAULT_DOWNLOAD_URL;
+        if (mavenWrapperPropertyFile.exists()) {
+            FileInputStream mavenWrapperPropertyFileInputStream = null;
+            try {
+                mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
+                Properties mavenWrapperProperties = new Properties();
+                mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
+                url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
+            } catch (IOException e) {
+                System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
+            } finally {
+                try {
+                    if (mavenWrapperPropertyFileInputStream != null) {
+                        mavenWrapperPropertyFileInputStream.close();
+                    }
+                } catch (IOException e) {
+                    // Ignore ...
+                }
+            }
+        }
+        System.out.println("- Downloading from: " + url);
+
+        File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
+        if (!outputFile.getParentFile().exists()) {
+            if (!outputFile.getParentFile().mkdirs()) {
+                System.out.println(
+                        "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
+            }
+        }
+        System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
+        try {
+            downloadFileFromURL(url, outputFile);
+            System.out.println("Done");
+            System.exit(0);
+        } catch (Throwable e) {
+            System.out.println("- Error downloading");
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static void downloadFileFromURL(String urlString, File destination) throws Exception {
+        if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
+            String username = System.getenv("MVNW_USERNAME");
+            char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
+            Authenticator.setDefault(new Authenticator() {
+                @Override
+                protected PasswordAuthentication getPasswordAuthentication() {
+                    return new PasswordAuthentication(username, password);
+                }
+            });
+        }
+        URL website = new URL(urlString);
+        ReadableByteChannel rbc;
+        rbc = Channels.newChannel(website.openStream());
+        FileOutputStream fos = new FileOutputStream(destination);
+        fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
+        fos.close();
+        rbc.close();
+    }
+
+}

BIN
.mvn/wrapper/maven-wrapper.jar


+ 2 - 0
.mvn/wrapper/maven-wrapper.properties

@@ -0,0 +1,2 @@
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.1/apache-maven-3.8.1-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar

BIN
file/system/20211119/admin_code_41.png


+ 11 - 0
fyzd-phone/.idea/$PROJECT_FILE$

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AnalysisProjectProfileManager">
+    <option name="PROJECT_PROFILE" />
+    <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
+    <list size="0" />
+  </component>
+  <component name="SuppressionsComponent">
+    <option name="suppComments" value="[]" />
+  </component>
+</project>

+ 8 - 0
fyzd-phone/.idea/.gitignore

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

+ 19 - 0
fyzd-phone/.idea/compiler.xml

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

+ 6 - 0
fyzd-phone/.idea/encodings.xml

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

+ 25 - 0
fyzd-phone/.idea/jarRepositories.xml

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

+ 21 - 0
fyzd-phone/.idea/misc.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ExternalStorageConfigurationManager" enabled="true" />
+  <component name="FindBugsConfigurable">
+    <option name="make" value="true" />
+    <option name="effort" value="default" />
+    <option name="priority" value="Medium" />
+    <option name="excludeFilter" value="" />
+  </component>
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK" />
+  <component name="SuppressionsComponent">
+    <option name="suppComments" value="[]" />
+  </component>
+</project>

+ 465 - 0
fyzd-phone/.idea/qaplug_profiles.xml

@@ -0,0 +1,465 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="AnalysisProjectProfileManager">
+    <option name="PROJECT_PROFILE" value="Project Default" />
+    <option name="USE_PROJECT_LEVEL_SETTINGS" value="false" />
+    <scopes />
+    <profiles>
+      <profile profile_name="Project Default" version="1.0" is_locked="false">
+        <coding_rule class="AM_CREATES_EMPTY_JAR_FILE_ENTRY" level="MAJOR" enabled="true" />
+        <coding_rule class="AM_CREATES_EMPTY_ZIP_FILE_ENTRY" level="MAJOR" enabled="true" />
+        <coding_rule class="AT_OPERATION_SEQUENCE_ON_CONCURRENT_ABSTRACTION" level="CRITICAL" enabled="false" />
+        <coding_rule class="BAC_BAD_APPLET_CONSTRUCTOR" level="MAJOR" enabled="false" />
+        <coding_rule class="BC_BAD_CAST_TO_ABSTRACT_COLLECTION" level="MAJOR" enabled="true" />
+        <coding_rule class="BC_BAD_CAST_TO_CONCRETE_COLLECTION" level="CRITICAL" enabled="true" />
+        <coding_rule class="BC_EQUALS_METHOD_SHOULD_WORK_FOR_ALL_OBJECTS" level="CRITICAL" enabled="true" />
+        <coding_rule class="BC_IMPOSSIBLE_CAST" level="BLOCKER" enabled="true" />
+        <coding_rule class="BC_IMPOSSIBLE_DOWNCAST" level="MAJOR" enabled="false" />
+        <coding_rule class="BC_IMPOSSIBLE_DOWNCAST_OF_TOARRAY" level="MAJOR" enabled="false" />
+        <coding_rule class="BC_IMPOSSIBLE_INSTANCEOF" level="CRITICAL" enabled="true" />
+        <coding_rule class="BC_UNCONFIRMED_CAST" level="CRITICAL" enabled="true" />
+        <coding_rule class="BC_UNCONFIRMED_CAST_OF_RETURN_VALUE" level="CRITICAL" enabled="false" />
+        <coding_rule class="BC_VACUOUS_INSTANCEOF" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_ADD_OF_SIGNED_BYTE" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_AND" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_AND_ZZ" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_IOR" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_IOR_OF_SIGNED_BYTE" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_SIGNED_CHECK" level="CRITICAL" enabled="true" />
+        <coding_rule class="BIT_SIGNED_CHECK_HIGH_BIT" level="CRITICAL" enabled="true" />
+        <coding_rule class="BOA_BADLY_OVERRIDDEN_ADAPTER" level="CRITICAL" enabled="true" />
+        <coding_rule class="BSHIFT_WRONG_ADD_PRIORITY" level="MAJOR" enabled="false" />
+        <coding_rule class="BX_BOXING_IMMEDIATELY_UNBOXED" level="MAJOR" enabled="true" />
+        <coding_rule class="BX_BOXING_IMMEDIATELY_UNBOXED_TO_PERFORM_COERCION" level="MAJOR" enabled="true" />
+        <coding_rule class="BX_UNBOXED_AND_COERCED_FOR_TERNARY_OPERATOR" level="MAJOR" enabled="true" />
+        <coding_rule class="BX_UNBOXING_IMMEDIATELY_REBOXED" level="CRITICAL" enabled="false" />
+        <coding_rule class="CAA_COVARIANT_ARRAY_ELEMENT_STORE" level="MAJOR" enabled="false" />
+        <coding_rule class="CAA_COVARIANT_ARRAY_FIELD" level="MAJOR" enabled="false" />
+        <coding_rule class="CAA_COVARIANT_ARRAY_LOCAL" level="MAJOR" enabled="false" />
+        <coding_rule class="CAA_COVARIANT_ARRAY_RETURN" level="MAJOR" enabled="false" />
+        <coding_rule class="CD_CIRCULAR_DEPENDENCY" level="MAJOR" enabled="false" />
+        <coding_rule class="CI_CONFUSED_INHERITANCE" level="MINOR" enabled="true" />
+        <coding_rule class="CNT_ROUGH_CONSTANT_VALUE" level="MAJOR" enabled="false" />
+        <coding_rule class="CN_IDIOM" level="MAJOR" enabled="true" />
+        <coding_rule class="CN_IDIOM_NO_SUPER_CALL" level="MAJOR" enabled="true" />
+        <coding_rule class="CN_IMPLEMENTS_CLONE_BUT_NOT_CLONEABLE" level="MAJOR" enabled="true" />
+        <coding_rule class="CO_ABSTRACT_SELF" level="MAJOR" enabled="true" />
+        <coding_rule class="CO_COMPARETO_INCORRECT_FLOATING" level="MAJOR" enabled="false" />
+        <coding_rule class="CO_COMPARETO_RESULTS_MIN_VALUE" level="CRITICAL" enabled="false" />
+        <coding_rule class="CO_SELF_NO_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="DB_DUPLICATE_BRANCHES" level="CRITICAL" enabled="true" />
+        <coding_rule class="DB_DUPLICATE_SWITCH_CLAUSES" level="CRITICAL" enabled="true" />
+        <coding_rule class="DC_DOUBLECHECK" level="MAJOR" enabled="true" />
+        <coding_rule class="DC_PARTIALLY_CONSTRUCTED" level="MAJOR" enabled="false" />
+        <coding_rule class="DE_MIGHT_DROP" level="MAJOR" enabled="true" />
+        <coding_rule class="DE_MIGHT_IGNORE" level="MAJOR" enabled="true" />
+        <coding_rule class="DLS_DEAD_LOCAL_INCREMENT_IN_RETURN" level="MAJOR" enabled="false" />
+        <coding_rule class="DLS_DEAD_LOCAL_STORE" level="CRITICAL" enabled="true" />
+        <coding_rule class="DLS_DEAD_LOCAL_STORE_IN_RETURN" level="CRITICAL" enabled="true" />
+        <coding_rule class="DLS_DEAD_LOCAL_STORE_OF_NULL" level="CRITICAL" enabled="true" />
+        <coding_rule class="DLS_DEAD_LOCAL_STORE_SHADOWS_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="DLS_DEAD_STORE_OF_CLASS_LITERAL" level="CRITICAL" enabled="true" />
+        <coding_rule class="DLS_OVERWRITTEN_INCREMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="DL_SYNCHRONIZATION_ON_BOOLEAN" level="CRITICAL" enabled="true" />
+        <coding_rule class="DL_SYNCHRONIZATION_ON_BOXED_PRIMITIVE" level="CRITICAL" enabled="true" />
+        <coding_rule class="DL_SYNCHRONIZATION_ON_SHARED_CONSTANT" level="CRITICAL" enabled="true" />
+        <coding_rule class="DL_SYNCHRONIZATION_ON_UNSHARED_BOXED_PRIMITIVE" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_ANNOTATION_IS_NOT_VISIBLE_TO_REFLECTION" level="MAJOR" enabled="true" />
+        <coding_rule class="DMI_ARGUMENTS_WRONG_ORDER" level="CRITICAL" enabled="false" />
+        <coding_rule class="DMI_BAD_MONTH" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_BIGDECIMAL_CONSTRUCTED_FROM_DOUBLE" level="CRITICAL" enabled="false" />
+        <coding_rule class="DMI_BLOCKING_METHODS_ON_URL" level="BLOCKER" enabled="true" />
+        <coding_rule class="DMI_CALLING_NEXT_FROM_HASNEXT" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_COLLECTIONS_SHOULD_NOT_CONTAIN_THEMSELVES" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_COLLECTION_OF_URLS" level="BLOCKER" enabled="true" />
+        <coding_rule class="DMI_CONSTANT_DB_PASSWORD" level="BLOCKER" enabled="true" />
+        <coding_rule class="DMI_DOH" level="CRITICAL" enabled="false" />
+        <coding_rule class="DMI_EMPTY_DB_PASSWORD" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_ENTRY_SETS_MAY_REUSE_ENTRY_OBJECTS" level="CRITICAL" enabled="false" />
+        <coding_rule class="DMI_FUTILE_ATTEMPT_TO_CHANGE_MAXPOOL_SIZE_OF_SCHEDULED_THREAD_POOL_EXECUTOR" level="MINOR" enabled="true" />
+        <coding_rule class="DMI_HARDCODED_ABSOLUTE_FILENAME" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_INVOKING_HASHCODE_ON_ARRAY" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_INVOKING_TOSTRING_ON_ANONYMOUS_ARRAY" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_INVOKING_TOSTRING_ON_ARRAY" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_LONG_BITS_TO_DOUBLE_INVOKED_ON_INT" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_NONSERIALIZABLE_OBJECT_WRITTEN" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_RANDOM_USED_ONLY_ONCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_SCHEDULED_THREAD_POOL_EXECUTOR_WITH_ZERO_CORE_THREADS" level="MINOR" enabled="true" />
+        <coding_rule class="DMI_THREAD_PASSED_WHERE_RUNNABLE_EXPECTED" level="MAJOR" enabled="true" />
+        <coding_rule class="DMI_UNSUPPORTED_METHOD" level="MAJOR" enabled="true" />
+        <coding_rule class="DMI_USELESS_SUBSTRING" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_USING_REMOVEALL_TO_CLEAR_COLLECTION" level="CRITICAL" enabled="true" />
+        <coding_rule class="DMI_VACUOUS_CALL_TO_EASYMOCK_METHOD" level="MINOR" enabled="true" />
+        <coding_rule class="DMI_VACUOUS_SELF_COLLECTION_CALL" level="CRITICAL" enabled="true" />
+        <coding_rule class="DM_BOOLEAN_CTOR" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_BOXED_PRIMITIVE_FOR_COMPARE" level="MAJOR" enabled="false" />
+        <coding_rule class="DM_BOXED_PRIMITIVE_FOR_PARSING" level="MAJOR" enabled="false" />
+        <coding_rule class="DM_BOXED_PRIMITIVE_TOSTRING" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_CONVERT_CASE" level="INFO" enabled="true" />
+        <coding_rule class="DM_DEFAULT_ENCODING" level="CRITICAL" enabled="false" />
+        <coding_rule class="DM_EXIT" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_FP_NUMBER_CTOR" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_GC" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_INVALID_MIN_MAX" level="MAJOR" enabled="false" />
+        <coding_rule class="DM_MONITOR_WAIT_ON_CONDITION" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_NEW_FOR_GETCLASS" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_NEXTINT_VIA_NEXTDOUBLE" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_NUMBER_CTOR" level="CRITICAL" enabled="true" />
+        <coding_rule class="DM_RUN_FINALIZERS_ON_EXIT" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_STRING_CTOR" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_STRING_TOSTRING" level="INFO" enabled="true" />
+        <coding_rule class="DM_STRING_VOID_CTOR" level="MAJOR" enabled="true" />
+        <coding_rule class="DM_USELESS_THREAD" level="MAJOR" enabled="true" />
+        <coding_rule class="DP_CREATE_CLASSLOADER_INSIDE_DO_PRIVILEGED" level="MAJOR" enabled="true" />
+        <coding_rule class="DP_DO_INSIDE_DO_PRIVILEGED" level="MAJOR" enabled="true" />
+        <coding_rule class="EC_ARRAY_AND_NONARRAY" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_BAD_ARRAY_COMPARE" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_INCOMPATIBLE_ARRAY_COMPARE" level="MAJOR" enabled="false" />
+        <coding_rule class="EC_NULL_ARG" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_UNRELATED_CLASS_AND_INTERFACE" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_UNRELATED_INTERFACES" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_UNRELATED_TYPES" level="CRITICAL" enabled="true" />
+        <coding_rule class="EC_UNRELATED_TYPES_USING_POINTER_EQUALITY" level="CRITICAL" enabled="true" />
+        <coding_rule class="EI_EXPOSE_REP" level="MAJOR" enabled="true" />
+        <coding_rule class="EI_EXPOSE_REP2" level="MAJOR" enabled="true" />
+        <coding_rule class="EI_EXPOSE_STATIC_REP2" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_ABSTRACT_SELF" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_ALWAYS_FALSE" level="BLOCKER" enabled="true" />
+        <coding_rule class="EQ_ALWAYS_TRUE" level="BLOCKER" enabled="true" />
+        <coding_rule class="EQ_CHECK_FOR_OPERAND_NOT_COMPATIBLE_WITH_THIS" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_COMPARETO_USE_OBJECT_EQUALS" level="CRITICAL" enabled="true" />
+        <coding_rule class="EQ_COMPARING_CLASS_NAMES" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_DOESNT_OVERRIDE_EQUALS" level="MAJOR" enabled="false" />
+        <coding_rule class="EQ_DONT_DEFINE_EQUALS_FOR_ENUM" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_GETCLASS_AND_CLASS_CONSTANT" level="CRITICAL" enabled="true" />
+        <coding_rule class="EQ_OTHER_NO_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_OTHER_USE_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_OVERRIDING_EQUALS_NOT_SYMMETRIC" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_SELF_NO_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_SELF_USE_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="EQ_UNUSUAL" level="MINOR" enabled="true" />
+        <coding_rule class="ES_COMPARING_PARAMETER_STRING_WITH_EQ" level="MAJOR" enabled="true" />
+        <coding_rule class="ES_COMPARING_STRINGS_WITH_EQ" level="MAJOR" enabled="true" />
+        <coding_rule class="ESync_EMPTY_SYNC" level="MAJOR" enabled="true" />
+        <coding_rule class="FB_MISSING_EXPECTED_WARNING" level="CRITICAL" enabled="false" />
+        <coding_rule class="FB_UNEXPECTED_WARNING" level="CRITICAL" enabled="false" />
+        <coding_rule class="FE_FLOATING_POINT_EQUALITY" level="CRITICAL" enabled="true" />
+        <coding_rule class="FE_TEST_IF_EQUAL_TO_NOT_A_NUMBER" level="CRITICAL" enabled="true" />
+        <coding_rule class="FI_EMPTY" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_EXPLICIT_INVOCATION" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_FINALIZER_NULLS_FIELDS" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_FINALIZER_ONLY_NULLS_FIELDS" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_MISSING_SUPER_CALL" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_NULLIFY_SUPER" level="CRITICAL" enabled="true" />
+        <coding_rule class="FI_PUBLIC_SHOULD_BE_PROTECTED" level="MAJOR" enabled="true" />
+        <coding_rule class="FI_USELESS" level="MINOR" enabled="true" />
+        <coding_rule class="FL_MATH_USING_FLOAT_PRECISION" level="CRITICAL" enabled="true" />
+        <coding_rule class="GC_UNCHECKED_TYPE_IN_GENERIC_CALL" level="CRITICAL" enabled="true" />
+        <coding_rule class="GC_UNRELATED_TYPES" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_EQUALS_NO_HASHCODE" level="MAJOR" enabled="true" />
+        <coding_rule class="HE_EQUALS_USE_HASHCODE" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_HASHCODE_NO_EQUALS" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_HASHCODE_USE_OBJECT_EQUALS" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_INHERITS_EQUALS_USE_HASHCODE" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_SIGNATURE_DECLARES_HASHING_OF_UNHASHABLE_CLASS" level="CRITICAL" enabled="true" />
+        <coding_rule class="HE_USE_OF_UNHASHABLE_CLASS" level="CRITICAL" enabled="true" />
+        <coding_rule class="HRS_REQUEST_PARAMETER_TO_COOKIE" level="MAJOR" enabled="true" />
+        <coding_rule class="HRS_REQUEST_PARAMETER_TO_HTTP_HEADER" level="MAJOR" enabled="true" />
+        <coding_rule class="HSC_HUGE_SHARED_STRING_CONSTANT" level="CRITICAL" enabled="true" />
+        <coding_rule class="IA_AMBIGUOUS_INVOCATION_OF_INHERITED_OR_OUTER_METHOD" level="MAJOR" enabled="true" />
+        <coding_rule class="ICAST_BAD_SHIFT_AMOUNT" level="CRITICAL" enabled="true" />
+        <coding_rule class="ICAST_IDIV_CAST_TO_DOUBLE" level="CRITICAL" enabled="true" />
+        <coding_rule class="ICAST_INTEGER_MULTIPLY_CAST_TO_LONG" level="CRITICAL" enabled="true" />
+        <coding_rule class="ICAST_INT_2_LONG_AS_INSTANT" level="CRITICAL" enabled="false" />
+        <coding_rule class="ICAST_INT_CAST_TO_DOUBLE_PASSED_TO_CEIL" level="CRITICAL" enabled="true" />
+        <coding_rule class="ICAST_INT_CAST_TO_FLOAT_PASSED_TO_ROUND" level="CRITICAL" enabled="true" />
+        <coding_rule class="ICAST_QUESTIONABLE_UNSIGNED_RIGHT_SHIFT" level="CRITICAL" enabled="true" />
+        <coding_rule class="IC_INIT_CIRCULARITY" level="CRITICAL" enabled="true" />
+        <coding_rule class="IC_SUPERCLASS_USES_SUBCLASS_DURING_INITIALIZATION" level="MAJOR" enabled="true" />
+        <coding_rule class="IIL_ELEMENTS_GET_LENGTH_IN_LOOP" level="MAJOR" enabled="false" />
+        <coding_rule class="IIL_PATTERN_COMPILE_IN_LOOP" level="MAJOR" enabled="false" />
+        <coding_rule class="IIL_PATTERN_COMPILE_IN_LOOP_INDIRECT" level="MAJOR" enabled="false" />
+        <coding_rule class="IIL_PREPARE_STATEMENT_IN_LOOP" level="MAJOR" enabled="false" />
+        <coding_rule class="IIO_INEFFICIENT_INDEX_OF" level="MAJOR" enabled="false" />
+        <coding_rule class="IIO_INEFFICIENT_LAST_INDEX_OF" level="MAJOR" enabled="false" />
+        <coding_rule class="IJU_ASSERT_METHOD_INVOKED_FROM_RUN_METHOD" level="CRITICAL" enabled="true" />
+        <coding_rule class="IJU_BAD_SUITE_METHOD" level="CRITICAL" enabled="true" />
+        <coding_rule class="IJU_NO_TESTS" level="CRITICAL" enabled="true" />
+        <coding_rule class="IJU_SETUP_NO_SUPER" level="CRITICAL" enabled="true" />
+        <coding_rule class="IJU_SUITE_NOT_STATIC" level="CRITICAL" enabled="true" />
+        <coding_rule class="IJU_TEARDOWN_NO_SUPER" level="CRITICAL" enabled="true" />
+        <coding_rule class="IL_CONTAINER_ADDED_TO_ITSELF" level="CRITICAL" enabled="true" />
+        <coding_rule class="IL_INFINITE_LOOP" level="CRITICAL" enabled="true" />
+        <coding_rule class="IL_INFINITE_RECURSIVE_LOOP" level="CRITICAL" enabled="true" />
+        <coding_rule class="IMA_INEFFICIENT_MEMBER_ACCESS" level="MAJOR" enabled="false" />
+        <coding_rule class="IMSE_DONT_CATCH_IMSE" level="MAJOR" enabled="true" />
+        <coding_rule class="IM_AVERAGE_COMPUTATION_COULD_OVERFLOW" level="CRITICAL" enabled="true" />
+        <coding_rule class="IM_BAD_CHECK_FOR_ODD" level="CRITICAL" enabled="true" />
+        <coding_rule class="IM_MULTIPLYING_RESULT_OF_IREM" level="CRITICAL" enabled="true" />
+        <coding_rule class="INT_BAD_COMPARISON_WITH_INT_VALUE" level="CRITICAL" enabled="false" />
+        <coding_rule class="INT_BAD_COMPARISON_WITH_NONNEGATIVE_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="INT_BAD_COMPARISON_WITH_SIGNED_BYTE" level="CRITICAL" enabled="true" />
+        <coding_rule class="INT_BAD_REM_BY_1" level="CRITICAL" enabled="true" />
+        <coding_rule class="INT_VACUOUS_BIT_OPERATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="INT_VACUOUS_COMPARISON" level="CRITICAL" enabled="true" />
+        <coding_rule class="IO_APPENDING_TO_OBJECT_OUTPUT_STREAM" level="CRITICAL" enabled="true" />
+        <coding_rule class="IP_PARAMETER_IS_DEAD_BUT_OVERWRITTEN" level="CRITICAL" enabled="true" />
+        <coding_rule class="IS2_INCONSISTENT_SYNC" level="CRITICAL" enabled="true" />
+        <coding_rule class="ISC_INSTANTIATE_STATIC_CLASS" level="MAJOR" enabled="true" />
+        <coding_rule class="IS_FIELD_NOT_GUARDED" level="CRITICAL" enabled="true" />
+        <coding_rule class="ITA_INEFFICIENT_TO_ARRAY" level="CRITICAL" enabled="true" />
+        <coding_rule class="IT_NO_SUCH_ELEMENT" level="MINOR" enabled="true" />
+        <coding_rule class="J2EE_STORE_OF_NON_SERIALIZABLE_OBJECT_INTO_SESSION" level="CRITICAL" enabled="true" />
+        <coding_rule class="JCIP_FIELD_ISNT_FINAL_IN_IMMUTABLE_CLASS" level="MINOR" enabled="true" />
+        <coding_rule class="JLM_JSR166_LOCK_MONITORENTER" level="CRITICAL" enabled="true" />
+        <coding_rule class="JLM_JSR166_UTILCONCURRENT_MONITORENTER" level="CRITICAL" enabled="false" />
+        <coding_rule class="JML_JSR166_CALLING_WAIT_RATHER_THAN_AWAIT" level="CRITICAL" enabled="false" />
+        <coding_rule class="LG_LOST_LOGGER_DUE_TO_WEAK_REFERENCE" level="MAJOR" enabled="false" />
+        <coding_rule class="LI_LAZY_INIT_STATIC" level="CRITICAL" enabled="true" />
+        <coding_rule class="LI_LAZY_INIT_UPDATE_STATIC" level="CRITICAL" enabled="true" />
+        <coding_rule class="ME_ENUM_FIELD_SETTER" level="MAJOR" enabled="false" />
+        <coding_rule class="ME_MUTABLE_ENUM_FIELD" level="MAJOR" enabled="false" />
+        <coding_rule class="MF_CLASS_MASKS_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="MF_METHOD_MASKS_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="ML_SYNC_ON_FIELD_TO_GUARD_CHANGING_THAT_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="ML_SYNC_ON_UPDATED_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="MSF_MUTABLE_SERVLET_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_CANNOT_BE_FINAL" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_EXPOSE_REP" level="CRITICAL" enabled="true" />
+        <coding_rule class="MS_FINAL_PKGPROTECT" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_MUTABLE_ARRAY" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_MUTABLE_COLLECTION" level="MAJOR" enabled="false" />
+        <coding_rule class="MS_MUTABLE_COLLECTION_PKGPROTECT" level="MAJOR" enabled="false" />
+        <coding_rule class="MS_MUTABLE_HASHTABLE" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_OOI_PKGPROTECT" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_PKGPROTECT" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_SHOULD_BE_FINAL" level="MAJOR" enabled="true" />
+        <coding_rule class="MS_SHOULD_BE_REFACTORED_TO_BE_FINAL" level="CRITICAL" enabled="false" />
+        <coding_rule class="MTIA_SUSPECT_SERVLET_INSTANCE_FIELD" level="CRITICAL" enabled="true" />
+        <coding_rule class="MTIA_SUSPECT_STRUTS_INSTANCE_FIELD" level="CRITICAL" enabled="true" />
+        <coding_rule class="MWN_MISMATCHED_NOTIFY" level="CRITICAL" enabled="true" />
+        <coding_rule class="MWN_MISMATCHED_WAIT" level="CRITICAL" enabled="true" />
+        <coding_rule class="NM_BAD_EQUAL" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_CLASS_NAMING_CONVENTION" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_CLASS_NOT_EXCEPTION" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_CONFUSING" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_FIELD_NAMING_CONVENTION" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_FUTURE_KEYWORD_USED_AS_IDENTIFIER" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_FUTURE_KEYWORD_USED_AS_MEMBER_IDENTIFIER" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_LCASE_HASHCODE" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_LCASE_TOSTRING" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_METHOD_CONSTRUCTOR_CONFUSION" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_METHOD_NAMING_CONVENTION" level="MAJOR" enabled="false" />
+        <coding_rule class="NM_SAME_SIMPLE_NAME_AS_INTERFACE" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_SAME_SIMPLE_NAME_AS_SUPERCLASS" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_VERY_CONFUSING" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_VERY_CONFUSING_INTENTIONAL" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_WRONG_PACKAGE" level="MAJOR" enabled="true" />
+        <coding_rule class="NM_WRONG_PACKAGE_INTENTIONAL" level="MAJOR" enabled="true" />
+        <coding_rule class="NN_NAKED_NOTIFY" level="CRITICAL" enabled="true" />
+        <coding_rule class="NOISE_FIELD_REFERENCE" level="MAJOR" enabled="false" />
+        <coding_rule class="NOISE_METHOD_CALL" level="MAJOR" enabled="false" />
+        <coding_rule class="NOISE_NULL_DEREFERENCE" level="MAJOR" enabled="false" />
+        <coding_rule class="NOISE_OPERATION" level="MAJOR" enabled="false" />
+        <coding_rule class="NO_NOTIFY_NOT_NOTIFYALL" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_ALWAYS_NULL" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_ALWAYS_NULL_EXCEPTION" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_ARGUMENT_MIGHT_BE_NULL" level="MAJOR" enabled="true" />
+        <coding_rule class="NP_BOOLEAN_RETURN_NULL" level="MAJOR" enabled="true" />
+        <coding_rule class="NP_CLONE_COULD_RETURN_NULL" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_CLOSING_NULL" level="MAJOR" enabled="false" />
+        <coding_rule class="NP_DEREFERENCE_OF_READLINE_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_EQUALS_SHOULD_HANDLE_NULL_ARGUMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_GUARANTEED_DEREF" level="BLOCKER" enabled="true" />
+        <coding_rule class="NP_GUARANTEED_DEREF_ON_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_IMMEDIATE_DEREFERENCE_OF_READLINE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_LOAD_OF_KNOWN_NULL_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_METHOD_PARAMETER_TIGHTENS_ANNOTATION" level="MAJOR" enabled="false" />
+        <coding_rule class="NP_METHOD_RETURN_RELAXING_ANNOTATION" level="MAJOR" enabled="false" />
+        <coding_rule class="NP_NONNULL_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" level="CRITICAL" enabled="false" />
+        <coding_rule class="NP_NONNULL_PARAM_VIOLATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NONNULL_RETURN_VIOLATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_INSTANCEOF" level="BLOCKER" enabled="true" />
+        <coding_rule class="NP_NULL_ON_SOME_PATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_ON_SOME_PATH_EXCEPTION" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_ON_SOME_PATH_FROM_RETURN_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_ON_SOME_PATH_MIGHT_BE_INFEASIBLE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_PARAM_DEREF" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_PARAM_DEREF_ALL_TARGETS_DANGEROUS" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_NULL_PARAM_DEREF_NONVIRTUAL" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_OPTIONAL_RETURN_NULL" level="MAJOR" enabled="false" />
+        <coding_rule class="NP_PARAMETER_MUST_BE_NONNULL_BUT_MARKED_AS_NULLABLE" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_STORE_INTO_NONNULL_FIELD" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_SYNC_AND_NULL_CHECK_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="NP_TOSTRING_COULD_RETURN_NULL" level="CRITICAL" enabled="true" />
+        <coding_rule class="NP_UNWRITTEN_FIELD" level="MAJOR" enabled="false" />
+        <coding_rule class="NP_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="NS_DANGEROUS_NON_SHORT_CIRCUIT" level="CRITICAL" enabled="true" />
+        <coding_rule class="NS_NON_SHORT_CIRCUIT" level="MAJOR" enabled="true" />
+        <coding_rule class="OBL_UNSATISFIED_OBLIGATION" level="CRITICAL" enabled="false" />
+        <coding_rule class="OBL_UNSATISFIED_OBLIGATION_EXCEPTION_EDGE" level="CRITICAL" enabled="false" />
+        <coding_rule class="ODR_OPEN_DATABASE_RESOURCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="ODR_OPEN_DATABASE_RESOURCE_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="OS_OPEN_STREAM" level="CRITICAL" enabled="true" />
+        <coding_rule class="OS_OPEN_STREAM_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="PS_PUBLIC_SEMAPHORES" level="CRITICAL" enabled="true" />
+        <coding_rule class="PT_ABSOLUTE_PATH_TRAVERSAL" level="CRITICAL" enabled="false" />
+        <coding_rule class="PT_RELATIVE_PATH_TRAVERSAL" level="CRITICAL" enabled="false" />
+        <coding_rule class="PZLA_PREFER_ZERO_LENGTH_ARRAYS" level="MAJOR" enabled="true" />
+        <coding_rule class="PZ_DONT_REUSE_ENTRY_OBJECTS_IN_ITERATORS" level="CRITICAL" enabled="false" />
+        <coding_rule class="QBA_QUESTIONABLE_BOOLEAN_ASSIGNMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="QF_QUESTIONABLE_FOR_LOOP" level="CRITICAL" enabled="true" />
+        <coding_rule class="RANGE_ARRAY_INDEX" level="MAJOR" enabled="false" />
+        <coding_rule class="RANGE_ARRAY_LENGTH" level="MAJOR" enabled="false" />
+        <coding_rule class="RANGE_ARRAY_OFFSET" level="MAJOR" enabled="false" />
+        <coding_rule class="RANGE_STRING_INDEX" level="MAJOR" enabled="false" />
+        <coding_rule class="RCN_REDUNDANT_COMPARISON_OF_NULL_AND_NONNULL_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RCN_REDUNDANT_COMPARISON_TWO_NULL_VALUES" level="CRITICAL" enabled="true" />
+        <coding_rule class="RCN_REDUNDANT_NULLCHECK_OF_NONNULL_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RCN_REDUNDANT_NULLCHECK_OF_NULL_VALUE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RCN_REDUNDANT_NULLCHECK_WOULD_HAVE_BEEN_A_NPE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RC_REF_COMPARISON" level="CRITICAL" enabled="true" />
+        <coding_rule class="RC_REF_COMPARISON_BAD_PRACTICE" level="MAJOR" enabled="false" />
+        <coding_rule class="RC_REF_COMPARISON_BAD_PRACTICE_BOOLEAN" level="MAJOR" enabled="false" />
+        <coding_rule class="REC_CATCH_EXCEPTION" level="MAJOR" enabled="true" />
+        <coding_rule class="RE_BAD_SYNTAX_FOR_REGULAR_EXPRESSION" level="CRITICAL" enabled="true" />
+        <coding_rule class="RE_CANT_USE_FILE_SEPARATOR_AS_REGULAR_EXPRESSION" level="CRITICAL" enabled="true" />
+        <coding_rule class="RE_POSSIBLE_UNINTENDED_PATTERN" level="CRITICAL" enabled="true" />
+        <coding_rule class="RI_REDUNDANT_INTERFACES" level="MAJOR" enabled="true" />
+        <coding_rule class="RR_NOT_CHECKED" level="MAJOR" enabled="true" />
+        <coding_rule class="RS_READOBJECT_SYNC" level="CRITICAL" enabled="true" />
+        <coding_rule class="RU_INVOKE_RUN" level="MAJOR" enabled="true" />
+        <coding_rule class="RV_01_TO_INT" level="MAJOR" enabled="true" />
+        <coding_rule class="RV_ABSOLUTE_VALUE_OF_HASHCODE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RV_ABSOLUTE_VALUE_OF_RANDOM_INT" level="CRITICAL" enabled="true" />
+        <coding_rule class="RV_CHECK_COMPARETO_FOR_SPECIFIC_RETURN_VALUE" level="CRITICAL" enabled="false" />
+        <coding_rule class="RV_CHECK_FOR_POSITIVE_INDEXOF" level="MINOR" enabled="true" />
+        <coding_rule class="RV_DONT_JUST_NULL_CHECK_READLINE" level="MAJOR" enabled="true" />
+        <coding_rule class="RV_EXCEPTION_NOT_THROWN" level="CRITICAL" enabled="true" />
+        <coding_rule class="RV_NEGATING_RESULT_OF_COMPARETO" level="CRITICAL" enabled="false" />
+        <coding_rule class="RV_REM_OF_HASHCODE" level="CRITICAL" enabled="true" />
+        <coding_rule class="RV_REM_OF_RANDOM_INT" level="CRITICAL" enabled="true" />
+        <coding_rule class="RV_RETURN_VALUE_IGNORED" level="MINOR" enabled="true" />
+        <coding_rule class="RV_RETURN_VALUE_IGNORED_BAD_PRACTICE" level="MAJOR" enabled="true" />
+        <coding_rule class="RV_RETURN_VALUE_IGNORED_INFERRED" level="CRITICAL" enabled="false" />
+        <coding_rule class="RV_RETURN_VALUE_IGNORED_NO_SIDE_EFFECT" level="MAJOR" enabled="false" />
+        <coding_rule class="RV_RETURN_VALUE_OF_PUTIFABSENT_IGNORED" level="MAJOR" enabled="false" />
+        <coding_rule class="RpC_REPEATED_CONDITIONAL_TEST" level="MAJOR" enabled="true" />
+        <coding_rule class="SA_FIELD_DOUBLE_ASSIGNMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_FIELD_SELF_ASSIGNMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_FIELD_SELF_COMPARISON" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_FIELD_SELF_COMPUTATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_LOCAL_DOUBLE_ASSIGNMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_LOCAL_SELF_ASSIGNMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_LOCAL_SELF_ASSIGNMENT_INSTEAD_OF_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="SA_LOCAL_SELF_COMPARISON" level="CRITICAL" enabled="true" />
+        <coding_rule class="SA_LOCAL_SELF_COMPUTATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="SBSC_USE_STRINGBUFFER_CONCATENATION" level="CRITICAL" enabled="true" />
+        <coding_rule class="SC_START_IN_CTOR" level="CRITICAL" enabled="true" />
+        <coding_rule class="SE_BAD_FIELD" level="MINOR" enabled="false" />
+        <coding_rule class="SE_BAD_FIELD_INNER_CLASS" level="MINOR" enabled="true" />
+        <coding_rule class="SE_BAD_FIELD_STORE" level="CRITICAL" enabled="true" />
+        <coding_rule class="SE_COMPARATOR_SHOULD_BE_SERIALIZABLE" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_INNER_CLASS" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_METHOD_MUST_BE_PRIVATE" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_NONFINAL_SERIALVERSIONID" level="CRITICAL" enabled="true" />
+        <coding_rule class="SE_NONLONG_SERIALVERSIONID" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_NONSTATIC_SERIALVERSIONID" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_NO_SERIALVERSIONID" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_NO_SUITABLE_CONSTRUCTOR" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_NO_SUITABLE_CONSTRUCTOR_FOR_EXTERNALIZATION" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_PRIVATE_READ_RESOLVE_NOT_INHERITED" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_READ_RESOLVE_IS_STATIC" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_READ_RESOLVE_MUST_RETURN_OBJECT" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_TRANSIENT_FIELD_NOT_RESTORED" level="MAJOR" enabled="true" />
+        <coding_rule class="SE_TRANSIENT_FIELD_OF_NONSERIALIZABLE_CLASS" level="MAJOR" enabled="true" />
+        <coding_rule class="SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH" level="MAJOR" enabled="false" />
+        <coding_rule class="SF_DEAD_STORE_DUE_TO_SWITCH_FALLTHROUGH_TO_THROW" level="MAJOR" enabled="false" />
+        <coding_rule class="SF_SWITCH_FALLTHROUGH" level="MAJOR" enabled="false" />
+        <coding_rule class="SF_SWITCH_NO_DEFAULT" level="MAJOR" enabled="false" />
+        <coding_rule class="SIC_INNER_SHOULD_BE_STATIC" level="MAJOR" enabled="true" />
+        <coding_rule class="SIC_INNER_SHOULD_BE_STATIC_ANON" level="MAJOR" enabled="true" />
+        <coding_rule class="SIC_INNER_SHOULD_BE_STATIC_NEEDS_THIS" level="MAJOR" enabled="true" />
+        <coding_rule class="SIC_THREADLOCAL_DEADLY_EMBRACE" level="MAJOR" enabled="false" />
+        <coding_rule class="SIO_SUPERFLUOUS_INSTANCEOF" level="CRITICAL" enabled="true" />
+        <coding_rule class="SI_INSTANCE_BEFORE_FINALS_ASSIGNED" level="CRITICAL" enabled="true" />
+        <coding_rule class="SP_SPIN_ON_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="SQL_BAD_PREPARED_STATEMENT_ACCESS" level="CRITICAL" enabled="true" />
+        <coding_rule class="SQL_BAD_RESULTSET_ACCESS" level="CRITICAL" enabled="true" />
+        <coding_rule class="SQL_NONCONSTANT_STRING_PASSED_TO_EXECUTE" level="CRITICAL" enabled="true" />
+        <coding_rule class="SQL_PREPARED_STATEMENT_GENERATED_FROM_NONCONSTANT_STRING" level="CRITICAL" enabled="true" />
+        <coding_rule class="SR_NOT_CHECKED" level="MAJOR" enabled="true" />
+        <coding_rule class="SS_SHOULD_BE_STATIC" level="MAJOR" enabled="true" />
+        <coding_rule class="STCAL_INVOKE_ON_STATIC_CALENDAR_INSTANCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="STCAL_INVOKE_ON_STATIC_DATE_FORMAT_INSTANCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="STCAL_STATIC_CALENDAR_INSTANCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="STCAL_STATIC_SIMPLE_DATE_FORMAT_INSTANCE" level="CRITICAL" enabled="true" />
+        <coding_rule class="STI_INTERRUPTED_ON_CURRENTTHREAD" level="CRITICAL" enabled="true" />
+        <coding_rule class="STI_INTERRUPTED_ON_UNKNOWNTHREAD" level="CRITICAL" enabled="true" />
+        <coding_rule class="ST_WRITE_TO_STATIC_FROM_INSTANCE_METHOD" level="CRITICAL" enabled="true" />
+        <coding_rule class="SWL_SLEEP_WITH_LOCK_HELD" level="CRITICAL" enabled="true" />
+        <coding_rule class="SW_SWING_METHODS_INVOKED_IN_SWING_THREAD" level="MAJOR" enabled="true" />
+        <coding_rule class="TLW_TWO_LOCK_WAIT" level="MAJOR" enabled="true" />
+        <coding_rule class="TQ_ALWAYS_VALUE_USED_WHERE_NEVER_REQUIRED" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_COMPARING_VALUES_WITH_INCOMPATIBLE_TYPE_QUALIFIERS" level="CRITICAL" enabled="false" />
+        <coding_rule class="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_ALWAYS_SINK" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_EXPLICIT_UNKNOWN_SOURCE_VALUE_REACHES_NEVER_SINK" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_MAYBE_SOURCE_VALUE_REACHES_ALWAYS_SINK" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_MAYBE_SOURCE_VALUE_REACHES_NEVER_SINK" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_NEVER_VALUE_USED_WHERE_ALWAYS_REQUIRED" level="CRITICAL" enabled="true" />
+        <coding_rule class="TQ_UNKNOWN_VALUE_USED_WHERE_ALWAYS_STRICTLY_REQUIRED" level="CRITICAL" enabled="false" />
+        <coding_rule class="UCF_USELESS_CONTROL_FLOW" level="CRITICAL" enabled="true" />
+        <coding_rule class="UCF_USELESS_CONTROL_FLOW_NEXT_LINE" level="CRITICAL" enabled="true" />
+        <coding_rule class="UC_USELESS_CONDITION" level="MAJOR" enabled="false" />
+        <coding_rule class="UC_USELESS_CONDITION_TYPE" level="MAJOR" enabled="false" />
+        <coding_rule class="UC_USELESS_OBJECT" level="MAJOR" enabled="false" />
+        <coding_rule class="UC_USELESS_OBJECT_STACK" level="MAJOR" enabled="false" />
+        <coding_rule class="UC_USELESS_VOID_METHOD" level="MAJOR" enabled="false" />
+        <coding_rule class="UG_SYNC_SET_UNSYNC_GET" level="MAJOR" enabled="true" />
+        <coding_rule class="UI_INHERITANCE_UNSAFE_GETRESOURCE" level="MAJOR" enabled="true" />
+        <coding_rule class="UL_UNRELEASED_LOCK" level="CRITICAL" enabled="true" />
+        <coding_rule class="UL_UNRELEASED_LOCK_EXCEPTION_PATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="UMAC_UNCALLABLE_METHOD_OF_ANONYMOUS_CLASS" level="CRITICAL" enabled="true" />
+        <coding_rule class="UM_UNNECESSARY_MATH" level="CRITICAL" enabled="true" />
+        <coding_rule class="UPM_UNCALLED_PRIVATE_METHOD" level="CRITICAL" enabled="true" />
+        <coding_rule class="URF_UNREAD_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="UR_UNINIT_READ" level="MAJOR" enabled="true" />
+        <coding_rule class="UR_UNINIT_READ_CALLED_FROM_SUPER_CONSTRUCTOR" level="MAJOR" enabled="false" />
+        <coding_rule class="USM_USELESS_ABSTRACT_METHOD" level="MAJOR" enabled="false" />
+        <coding_rule class="USM_USELESS_SUBCLASS_METHOD" level="MAJOR" enabled="false" />
+        <coding_rule class="UUF_UNUSED_FIELD" level="MAJOR" enabled="true" />
+        <coding_rule class="UUF_UNUSED_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="UWF_FIELD_NOT_INITIALIZED_IN_CONSTRUCTOR" level="MAJOR" enabled="false" />
+        <coding_rule class="UWF_NULL_FIELD" level="CRITICAL" enabled="true" />
+        <coding_rule class="UWF_UNWRITTEN_FIELD" level="MAJOR" enabled="false" />
+        <coding_rule class="UWF_UNWRITTEN_PUBLIC_OR_PROTECTED_FIELD" level="CRITICAL" enabled="false" />
+        <coding_rule class="UW_UNCOND_WAIT" level="MAJOR" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_BAD_ARGUMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_BAD_CONVERSION" level="CRITICAL" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_BAD_CONVERSION_FROM_ARRAY" level="MAJOR" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_BAD_CONVERSION_TO_BOOLEAN" level="MAJOR" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_EXPECTED_MESSAGE_FORMAT_SUPPLIED" level="MAJOR" enabled="false" />
+        <coding_rule class="VA_FORMAT_STRING_EXTRA_ARGUMENTS_PASSED" level="MAJOR" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_ILLEGAL" level="CRITICAL" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_MISSING_ARGUMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_NO_PREVIOUS_ARGUMENT" level="CRITICAL" enabled="true" />
+        <coding_rule class="VA_FORMAT_STRING_USES_NEWLINE" level="CRITICAL" enabled="false" />
+        <coding_rule class="VA_PRIMITIVE_ARRAY_PASSED_TO_OBJECT_VARARG" level="CRITICAL" enabled="true" />
+        <coding_rule class="VO_VOLATILE_INCREMENT" level="CRITICAL" enabled="false" />
+        <coding_rule class="VO_VOLATILE_REFERENCE_TO_ARRAY" level="MAJOR" enabled="true" />
+        <coding_rule class="VR_UNRESOLVABLE_REFERENCE" level="MAJOR" enabled="false" />
+        <coding_rule class="WA_AWAIT_NOT_IN_LOOP" level="CRITICAL" enabled="true" />
+        <coding_rule class="WA_NOT_IN_LOOP" level="CRITICAL" enabled="true" />
+        <coding_rule class="WL_USING_GETCLASS_RATHER_THAN_CLASS_LITERAL" level="CRITICAL" enabled="true" />
+        <coding_rule class="WMI_WRONG_MAP_ITERATOR" level="CRITICAL" enabled="true" />
+        <coding_rule class="WS_WRITEOBJECT_SYNC" level="CRITICAL" enabled="true" />
+        <coding_rule class="XFB_XML_FACTORY_BYPASS" level="CRITICAL" enabled="true" />
+        <coding_rule class="XSS_REQUEST_PARAMETER_TO_JSP_WRITER" level="CRITICAL" enabled="true" />
+        <coding_rule class="XSS_REQUEST_PARAMETER_TO_SEND_ERROR" level="CRITICAL" enabled="true" />
+        <coding_rule class="XSS_REQUEST_PARAMETER_TO_SERVLET_WRITER" level="CRITICAL" enabled="true" />
+      </profile>
+    </profiles>
+    <list size="0" />
+  </component>
+</project>

+ 10 - 0
fyzd-phone/.idea/runConfigurations.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="RunConfigurationProducerService">
+    <option name="ignoredProducers">
+      <set>
+        <option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
+      </set>
+    </option>
+  </component>
+</project>

+ 269 - 0
fyzd-phone/logs/info-collection.log

@@ -0,0 +1,269 @@
+2021-11-22 18:02:44.246  INFO 21108 --- [main] com.yx.face.FyzdPhoneApplication         : Starting FyzdPhoneApplication using Java 1.8.0_291 on DESKTOP-UV4BOQR with PID 21108 (D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone\target\classes started by 崔哥 in D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone)
+2021-11-22 18:02:44.249  INFO 21108 --- [main] com.yx.face.FyzdPhoneApplication         : The following profiles are active: dev
+2021-11-22 18:02:45.196  INFO 21108 --- [main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=3543d1d9-5772-3797-97e9-736c0592e80e
+2021-11-22 18:02:45.473  INFO 21108 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8802 (http)
+2021-11-22 18:02:45.482  INFO 21108 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
+2021-11-22 18:02:45.482  INFO 21108 --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
+2021-11-22 18:02:45.617  INFO 21108 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/dev]    : Initializing Spring embedded WebApplicationContext
+2021-11-22 18:02:45.617  INFO 21108 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1327 ms
+2021-11-22 18:02:46.295  WARN 21108 --- [main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'minIoClientConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'minio.minio_url' in value "${minio.minio_url}"
+2021-11-22 18:02:46.297  INFO 21108 --- [main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
+2021-11-22 18:02:46.308  INFO 21108 --- [main] ConditionEvaluationReportLoggingListener : 
+
+Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
+2021-11-22 18:02:46.328 ERROR 21108 --- [main] o.s.boot.SpringApplication               : Application run failed
+
+org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'minIoClientConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'minio.minio_url' in value "${minio.minio_url}"
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:405) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1413) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.7.jar:5.3.7]
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.7.jar:5.3.7]
+	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:771) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:763) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1318) [spring-boot-2.4.6.jar:2.4.6]
+	at com.yx.face.FyzdPhoneApplication.main(FyzdPhoneApplication.java:13) [classes/:na]
+Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'minio.minio_url' in value "${minio.minio_url}"
+	at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:175) ~[spring-context-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:936) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1321) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.7.jar:5.3.7]
+	... 18 common frames omitted
+
+2021-11-22 18:07:23.727  INFO 10384 --- [main] com.yx.face.FyzdPhoneApplication         : Starting FyzdPhoneApplication using Java 1.8.0_291 on DESKTOP-UV4BOQR with PID 10384 (D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone\target\classes started by 崔哥 in D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone)
+2021-11-22 18:07:23.729  INFO 10384 --- [main] com.yx.face.FyzdPhoneApplication         : The following profiles are active: dev
+2021-11-22 18:07:24.692  INFO 10384 --- [main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=3543d1d9-5772-3797-97e9-736c0592e80e
+2021-11-22 18:07:24.957  INFO 10384 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8802 (http)
+2021-11-22 18:07:24.966  INFO 10384 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
+2021-11-22 18:07:24.967  INFO 10384 --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
+2021-11-22 18:07:25.115  INFO 10384 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/dev]    : Initializing Spring embedded WebApplicationContext
+2021-11-22 18:07:25.115  INFO 10384 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1331 ms
+2021-11-22 18:07:26.366  WARN 10384 --- [main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'minIoClientConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'minio.minio_url' in value "${minio.minio_url}"
+2021-11-22 18:07:26.369  INFO 10384 --- [main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
+2021-11-22 18:07:26.380  INFO 10384 --- [main] ConditionEvaluationReportLoggingListener : 
+
+Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
+2021-11-22 18:07:26.404 ERROR 10384 --- [main] o.s.boot.SpringApplication               : Application run failed
+
+org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'minIoClientConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'minio.minio_url' in value "${minio.minio_url}"
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:405) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1413) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.7.jar:5.3.7]
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.7.jar:5.3.7]
+	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:771) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:763) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1318) [spring-boot-2.4.6.jar:2.4.6]
+	at com.yx.face.FyzdPhoneApplication.main(FyzdPhoneApplication.java:13) [classes/:na]
+Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'minio.minio_url' in value "${minio.minio_url}"
+	at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:175) ~[spring-context-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:936) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1321) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.7.jar:5.3.7]
+	... 18 common frames omitted
+
+2021-11-22 18:15:08.345  INFO 20840 --- [main] com.yx.face.FyzdPhoneApplication         : Starting FyzdPhoneApplication using Java 1.8.0_291 on DESKTOP-UV4BOQR with PID 20840 (D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone\target\classes started by 崔哥 in D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone)
+2021-11-22 18:15:08.349  INFO 20840 --- [main] com.yx.face.FyzdPhoneApplication         : The following profiles are active: dev
+2021-11-22 18:15:09.282  INFO 20840 --- [main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=3543d1d9-5772-3797-97e9-736c0592e80e
+2021-11-22 18:15:09.546  INFO 20840 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8802 (http)
+2021-11-22 18:15:09.555  INFO 20840 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
+2021-11-22 18:15:09.556  INFO 20840 --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
+2021-11-22 18:15:09.697  INFO 20840 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/dev]    : Initializing Spring embedded WebApplicationContext
+2021-11-22 18:15:09.697  INFO 20840 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1310 ms
+2021-11-22 18:15:10.365  WARN 20840 --- [main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'minIoClientConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'minio.minio_url' in value "${minio.minio_url}"
+2021-11-22 18:15:10.368  INFO 20840 --- [main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
+2021-11-22 18:15:10.376  INFO 20840 --- [main] ConditionEvaluationReportLoggingListener : 
+
+Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
+2021-11-22 18:15:10.394 ERROR 20840 --- [main] o.s.boot.SpringApplication               : Application run failed
+
+org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'minIoClientConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'minio.minio_url' in value "${minio.minio_url}"
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:405) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1413) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:601) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:944) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) ~[spring-context-5.3.7.jar:5.3.7]
+	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583) ~[spring-context-5.3.7.jar:5.3.7]
+	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:771) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:763) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:438) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:339) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1329) [spring-boot-2.4.6.jar:2.4.6]
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1318) [spring-boot-2.4.6.jar:2.4.6]
+	at com.yx.face.FyzdPhoneApplication.main(FyzdPhoneApplication.java:13) [classes/:na]
+Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder 'minio.minio_url' in value "${minio.minio_url}"
+	at org.springframework.util.PropertyPlaceholderHelper.parseStringValue(PropertyPlaceholderHelper.java:180) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.util.PropertyPlaceholderHelper.replacePlaceholders(PropertyPlaceholderHelper.java:126) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.core.env.AbstractPropertyResolver.doResolvePlaceholders(AbstractPropertyResolver.java:239) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.core.env.AbstractPropertyResolver.resolveRequiredPlaceholders(AbstractPropertyResolver.java:210) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.context.support.PropertySourcesPlaceholderConfigurer.lambda$processProperties$0(PropertySourcesPlaceholderConfigurer.java:175) ~[spring-context-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.AbstractBeanFactory.resolveEmbeddedValue(AbstractBeanFactory.java:936) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1321) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1300) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:657) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:640) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.7.jar:5.3.7]
+	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:399) ~[spring-beans-5.3.7.jar:5.3.7]
+	... 18 common frames omitted
+
+2021-11-22 18:25:42.850  INFO 4864 --- [main] com.yx.face.FyzdPhoneApplication         : Starting FyzdPhoneApplication using Java 1.8.0_291 on DESKTOP-UV4BOQR with PID 4864 (D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone\target\classes started by 崔哥 in D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone)
+2021-11-22 18:25:42.853  INFO 4864 --- [main] com.yx.face.FyzdPhoneApplication         : The following profiles are active: dev
+2021-11-22 18:25:43.787  INFO 4864 --- [main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=3543d1d9-5772-3797-97e9-736c0592e80e
+2021-11-22 18:25:44.047  INFO 4864 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8802 (http)
+2021-11-22 18:25:44.054  INFO 4864 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
+2021-11-22 18:25:44.054  INFO 4864 --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
+2021-11-22 18:25:44.190  INFO 4864 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/dev]    : Initializing Spring embedded WebApplicationContext
+2021-11-22 18:25:44.191  INFO 4864 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1294 ms
+2021-11-22 18:25:44.871  WARN 4864 --- [main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'uploadController': Injection of resource dependencies failed; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'io.minio.MinioClient' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@javax.annotation.Resource(shareable=true, lookup=, name=, description=, authenticationType=CONTAINER, type=class java.lang.Object, mappedName=)}
+2021-11-22 18:25:44.873  INFO 4864 --- [main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
+2021-11-22 18:25:44.884  INFO 4864 --- [main] ConditionEvaluationReportLoggingListener : 
+
+Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
+2021-11-22 18:25:44.902 ERROR 4864 --- [main] o.s.b.d.LoggingFailureAnalysisReporter   : 
+
+***************************
+APPLICATION FAILED TO START
+***************************
+
+Description:
+
+A component required a bean of type 'io.minio.MinioClient' that could not be found.
+
+
+Action:
+
+Consider defining a bean of type 'io.minio.MinioClient' in your configuration.
+
+2021-11-22 18:27:59.781  INFO 21884 --- [main] com.yx.face.FyzdPhoneApplication         : Starting FyzdPhoneApplication using Java 1.8.0_291 on DESKTOP-UV4BOQR with PID 21884 (D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone\target\classes started by 崔哥 in D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone)
+2021-11-22 18:27:59.786  INFO 21884 --- [main] com.yx.face.FyzdPhoneApplication         : The following profiles are active: dev
+2021-11-22 18:28:00.730  INFO 21884 --- [main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=3543d1d9-5772-3797-97e9-736c0592e80e
+2021-11-22 18:28:01.006  INFO 21884 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8802 (http)
+2021-11-22 18:28:01.013  INFO 21884 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
+2021-11-22 18:28:01.013  INFO 21884 --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
+2021-11-22 18:28:01.144  INFO 21884 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/dev]    : Initializing Spring embedded WebApplicationContext
+2021-11-22 18:28:01.144  INFO 21884 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1314 ms
+2021-11-22 18:28:02.835  WARN 21884 --- [main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.PortInUseException: Port 8802 is already in use
+2021-11-22 18:28:02.844  INFO 21884 --- [main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
+2021-11-22 18:28:02.854  INFO 21884 --- [main] ConditionEvaluationReportLoggingListener : 
+
+Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
+2021-11-22 18:28:02.866 ERROR 21884 --- [main] o.s.b.d.LoggingFailureAnalysisReporter   : 
+
+***************************
+APPLICATION FAILED TO START
+***************************
+
+Description:
+
+Web server failed to start. Port 8802 was already in use.
+
+Action:
+
+Identify and stop the process that's listening on port 8802 or configure this application to listen on another port.
+
+2021-11-22 18:29:11.492  INFO 21416 --- [main] com.yx.face.FyzdPhoneApplication         : Starting FyzdPhoneApplication using Java 1.8.0_291 on DESKTOP-UV4BOQR with PID 21416 (D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone\target\classes started by 崔哥 in D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone)
+2021-11-22 18:29:11.496  INFO 21416 --- [main] com.yx.face.FyzdPhoneApplication         : The following profiles are active: dev
+2021-11-22 18:29:12.449  INFO 21416 --- [main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=3543d1d9-5772-3797-97e9-736c0592e80e
+2021-11-22 18:29:12.719  INFO 21416 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8802 (http)
+2021-11-22 18:29:12.726  INFO 21416 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
+2021-11-22 18:29:12.727  INFO 21416 --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
+2021-11-22 18:29:12.862  INFO 21416 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/dev]    : Initializing Spring embedded WebApplicationContext
+2021-11-22 18:29:12.863  INFO 21416 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1328 ms
+2021-11-22 18:29:14.534  WARN 21416 --- [main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.PortInUseException: Port 8802 is already in use
+2021-11-22 18:29:14.538  INFO 21416 --- [main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
+2021-11-22 18:29:14.548  INFO 21416 --- [main] ConditionEvaluationReportLoggingListener : 
+
+Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
+2021-11-22 18:29:14.566 ERROR 21416 --- [main] o.s.b.d.LoggingFailureAnalysisReporter   : 
+
+***************************
+APPLICATION FAILED TO START
+***************************
+
+Description:
+
+Web server failed to start. Port 8802 was already in use.
+
+Action:
+
+Identify and stop the process that's listening on port 8802 or configure this application to listen on another port.
+
+2021-11-22 18:32:11.605  INFO 14924 --- [main] com.yx.face.FyzdPhoneApplication         : Starting FyzdPhoneApplication using Java 1.8.0_291 on DESKTOP-UV4BOQR with PID 14924 (D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone\target\classes started by 崔哥 in D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone)
+2021-11-22 18:32:11.607  INFO 14924 --- [main] com.yx.face.FyzdPhoneApplication         : The following profiles are active: dev
+2021-11-22 18:32:12.565  INFO 14924 --- [main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=3543d1d9-5772-3797-97e9-736c0592e80e
+2021-11-22 18:32:12.845  INFO 14924 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8802 (http)
+2021-11-22 18:32:12.852  INFO 14924 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
+2021-11-22 18:32:12.852  INFO 14924 --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
+2021-11-22 18:32:12.986  INFO 14924 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/dev]    : Initializing Spring embedded WebApplicationContext
+2021-11-22 18:32:12.986  INFO 14924 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1335 ms
+2021-11-22 18:32:14.782  INFO 14924 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8802 (http) with context path '/dev'
+2021-11-22 18:32:15.455  INFO 14924 --- [main] com.yx.face.FyzdPhoneApplication         : Started FyzdPhoneApplication in 4.795 seconds (JVM running for 5.869)
+2021-11-22 18:33:35.774  INFO 19540 --- [main] com.yx.face.FyzdPhoneApplication         : Starting FyzdPhoneApplication using Java 1.8.0_291 on DESKTOP-UV4BOQR with PID 19540 (D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone\target\classes started by 崔哥 in D:\CMC\YXCODE\dev-fyzd\face-server\fyzd-phone)
+2021-11-22 18:33:35.777  INFO 19540 --- [main] com.yx.face.FyzdPhoneApplication         : The following profiles are active: dev
+2021-11-22 18:33:36.733  INFO 19540 --- [main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=3543d1d9-5772-3797-97e9-736c0592e80e
+2021-11-22 18:33:37.018  INFO 19540 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8802 (http)
+2021-11-22 18:33:37.025  INFO 19540 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
+2021-11-22 18:33:37.025  INFO 19540 --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
+2021-11-22 18:33:37.161  INFO 19540 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/dev]    : Initializing Spring embedded WebApplicationContext
+2021-11-22 18:33:37.161  INFO 19540 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 1342 ms
+2021-11-22 18:33:38.939  WARN 19540 --- [main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop'; nested exception is org.springframework.boot.web.server.PortInUseException: Port 8802 is already in use
+2021-11-22 18:33:38.944  INFO 19540 --- [main] o.apache.catalina.core.StandardService   : Stopping service [Tomcat]
+2021-11-22 18:33:38.954  INFO 19540 --- [main] ConditionEvaluationReportLoggingListener : 
+
+Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
+2021-11-22 18:33:38.968 ERROR 19540 --- [main] o.s.b.d.LoggingFailureAnalysisReporter   : 
+
+***************************
+APPLICATION FAILED TO START
+***************************
+
+Description:
+
+Web server failed to start. Port 8802 was already in use.
+
+Action:
+
+Identify and stop the process that's listening on port 8802 or configure this application to listen on another port.
+

File diff suppressed because it is too large
+ 622 - 0
fyzd-phone/logs/winxin-fyzd.log


BIN
fyzd-phone/logs/winxin-fyzd.log.2021-11-23.0.gz


+ 209 - 0
fyzd-phone/pom.xml

@@ -0,0 +1,209 @@
+<?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.6</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.yx</groupId>
+    <artifactId>fyzd-phone</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>fyzd-phone</name>
+    <description>微信获取手机号</description>
+    <properties>
+        <java.version>1.8</java.version>
+        <skipTests>true</skipTests>
+        <spring-cloud.version>2020.0.3</spring-cloud.version>
+    </properties>
+
+    <dependencyManagement>
+        <dependencies>
+            <dependency>
+                <groupId>org.springframework.cloud</groupId>
+                <artifactId>spring-cloud-dependencies</artifactId>
+                <version>${spring-cloud.version}</version>
+                <type>pom</type>
+                <scope>import</scope>
+            </dependency>
+        </dependencies>
+    </dependencyManagement>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+        <!--========================【数据库相关依赖】===============================-->
+
+
+        <!--阿里云oss-->
+
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.10.2</version>
+        </dependency>
+        <!--minio-->
+        <dependency>
+            <groupId>io.minio</groupId>
+            <artifactId>minio</artifactId>
+            <version>8.2.1</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>com.squareup.okhttp3</groupId>
+                    <artifactId>okhttp</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+
+        <dependency>
+            <groupId>jakarta.persistence</groupId>
+            <artifactId>jakarta.persistence-api</artifactId>
+            <version>2.2.3</version>
+        </dependency>
+        <!--========================【工具类相关依赖】===============================-->
+        <dependency>
+            <groupId>commons-io</groupId>
+            <artifactId>commons-io</artifactId>
+            <version>2.8.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.15</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.guava</groupId>
+            <artifactId>guava</artifactId>
+            <version>30.1.1-jre</version>
+        </dependency>
+
+        <!--========================【http】===============================-->
+        <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.3.9</version>
+        </dependency>
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+            <version>3.12.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.60</version>
+        </dependency>
+
+        <!--========================【微信对接工具包相关依赖】===============================-->
+        <dependency>
+            <groupId>com.github.binarywang</groupId>
+            <artifactId>weixin-java-miniapp</artifactId>
+            <version>4.0.7.B</version>
+        </dependency>
+        <!--========================【EXCEL相关依赖】===============================-->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>2.2.8</version>
+        </dependency>
+        <!--========================【在线接口文档相关依赖】===============================-->
+        <dependency>
+            <groupId>com.github.xiaoymin</groupId>
+            <artifactId>knife4j-spring-boot-starter</artifactId>
+            <version>3.0.2</version>
+        </dependency>
+        <!--========================【接口安全相关依赖】===============================-->
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.14.0</version>
+        </dependency>
+        <!-- ...............二维码生成器......................................................... -->
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.3.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.3.3</version>
+        </dependency>
+
+    </dependencies>
+
+
+    <build>
+        <finalName>hanghui-weixin-fyzd</finalName>
+        <!--加上这个才能打包时将静态资源打进去-->
+        <resources>
+            <resource>
+                <directory>${basedir}/src/main/webapp</directory>
+                <targetPath>META-INF/resources</targetPath>
+                <includes>
+                    <include>**/**</include>
+                </includes>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <includes>
+                    <include>**/*.*</include>
+                </includes>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <includes>
+                    <include>**/*.xml</include>
+                    <include>**/*.yml</include>
+                    <include>**/*.properties</include>
+                </includes>
+            </resource>
+        </resources>
+
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <configuration>
+                    <mainClass>com.yx.face.FyzdPhoneApplication</mainClass>
+                    <excludes>
+                        <exclude>
+                            <groupId>org.projectlombok</groupId>
+                            <artifactId>lombok</artifactId>
+                        </exclude>
+                    </excludes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 17 - 0
fyzd-phone/src/main/java/com/yx/face/FyzdPhoneApplication.java

@@ -0,0 +1,17 @@
+package com.yx.face;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.scheduling.annotation.EnableAsync;
+@EnableAsync
+@EnableFeignClients
+@SpringBootApplication
+public class FyzdPhoneApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(FyzdPhoneApplication.class, args);
+    }
+
+
+}

+ 30 - 0
fyzd-phone/src/main/java/com/yx/face/boot/component/wx/MyWxMpService.java

@@ -0,0 +1,30 @@
+package com.yx.face.boot.component.wx;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaSubscribeMessage;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * @description: MyWxMpService <br>
+ * @date: 2021/4/29 13:09 <br>
+ * @author: PWB <br>
+ */
+@Slf4j
+@Component
+public class MyWxMpService {
+    @Value("${weixin.appid}")
+    private String appid;
+    public void sendMsg(WxMaSubscribeMessage subscribeMessage) {
+        final WxMaService wxService = WxMaConfiguration.getMaService(appid);
+        try {
+            wxService.getMsgService().sendSubscribeMsg(subscribeMessage);
+        } catch (WxErrorException e) {
+            log.info(e.getMessage());
+        }
+    }
+
+
+}

+ 151 - 0
fyzd-phone/src/main/java/com/yx/face/boot/component/wx/WxMaConfiguration.java

@@ -0,0 +1,151 @@
+package com.yx.face.boot.component.wx;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl;
+import cn.binarywang.wx.miniapp.bean.WxMaKefuMessage;
+import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl;
+import cn.binarywang.wx.miniapp.message.WxMaMessageHandler;
+import cn.binarywang.wx.miniapp.message.WxMaMessageRouter;
+import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.error.WxRuntimeException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+
+import javax.annotation.PostConstruct;
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @description: WxMaConfiguration <br>
+ * @date: 2021/4/13 10:17 <br>
+ * @author: PWB <br>
+ */
+@Slf4j
+@Configuration
+@EnableConfigurationProperties(WxMaProperties.class)
+public class WxMaConfiguration {
+    private final WxMaProperties properties;
+
+    private static final Map<String, WxMaMessageRouter> routers = Maps.newHashMap();
+    private static Map<String, WxMaService> maServices;
+
+    @Autowired
+    public WxMaConfiguration(WxMaProperties properties) {
+        this.properties = properties;
+    }
+
+    public static WxMaService getMaService(String appid) {
+        WxMaService wxService = maServices.get(appid);
+        if (wxService == null) {
+            throw new IllegalArgumentException(String.format("未找到对应appid=[%s]的配置,请核实!", appid));
+        }
+
+        return wxService;
+    }
+
+    public static WxMaMessageRouter getRouter(String appid) {
+        return routers.get(appid);
+    }
+
+    @PostConstruct
+    public void init() {
+        List<WxMaProperties.Config> configs = this.properties.getConfigs();
+        if (configs == null) {
+            throw new WxRuntimeException("大哥,拜托先看下项目首页的说明(readme文件),添加下相关配置,注意别配错了!");
+        }
+
+        maServices = configs.stream()
+                .map(a -> {
+                    WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
+//                WxMaDefaultConfigImpl config = new WxMaRedisConfigImpl(new JedisPool());
+                    // 使用上面的配置时,需要同时引入jedis-lock的依赖,否则会报类无法找到的异常
+                    config.setAppid(a.getAppid());
+                    config.setSecret(a.getSecret());
+                    config.setToken(a.getToken());
+                    config.setAesKey(a.getAesKey());
+                    config.setMsgDataFormat(a.getMsgDataFormat());
+
+                    WxMaService service = new WxMaServiceImpl();
+                    service.setWxMaConfig(config);
+                    routers.put(a.getAppid(), this.newRouter(service));
+                    return service;
+                }).collect(Collectors.toMap(s -> s.getWxMaConfig().getAppid(), a -> a));
+    }
+
+    private WxMaMessageRouter newRouter(WxMaService service) {
+        final WxMaMessageRouter router = new WxMaMessageRouter(service);
+        router
+                .rule().handler(logHandler).next()
+                .rule().async(false).content("订阅消息").handler(subscribeMsgHandler).end()
+                .rule().async(false).content("文本").handler(textHandler).end()
+                .rule().async(false).content("图片").handler(picHandler).end()
+                .rule().async(false).content("二维码").handler(qrcodeHandler).end();
+        return router;
+    }
+
+    private final WxMaMessageHandler subscribeMsgHandler = (wxMessage, context, service, sessionManager) -> {
+
+       /* service.getMsgService().sendSubscribeMsg(WxMaSubscribeMessage.builder()
+                .templateId("此处更换为自己的模板id")
+                .data(Lists.newArrayList(
+                        new WxMaSubscribeMessage.Data("keyword1", "339208499")))
+                .toUser(wxMessage.getFromUser())
+                .build());*/
+        return null;
+    };
+
+    private final WxMaMessageHandler logHandler = (wxMessage, context, service, sessionManager) -> {
+        log.info("收到消息:" + wxMessage.toString());
+        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("收到信息为:" + wxMessage.toJson())
+                .toUser(wxMessage.getFromUser()).build());
+        return null;
+    };
+
+    private final WxMaMessageHandler textHandler = (wxMessage, context, service, sessionManager) -> {
+        service.getMsgService().sendKefuMsg(WxMaKefuMessage.newTextBuilder().content("回复文本消息")
+                .toUser(wxMessage.getFromUser()).build());
+        return null;
+    };
+
+    private final WxMaMessageHandler picHandler = (wxMessage, context, service, sessionManager) -> {
+        try {
+            WxMediaUploadResult uploadResult = service.getMediaService()
+                    .uploadMedia("image", "png",
+                            ClassLoader.getSystemResourceAsStream("tmp.png"));
+            service.getMsgService().sendKefuMsg(
+                    WxMaKefuMessage
+                            .newImageBuilder()
+                            .mediaId(uploadResult.getMediaId())
+                            .toUser(wxMessage.getFromUser())
+                            .build());
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    };
+
+    private final WxMaMessageHandler qrcodeHandler = (wxMessage, context, service, sessionManager) -> {
+        try {
+            final File file = service.getQrcodeService().createQrcode("123", 430);
+            WxMediaUploadResult uploadResult = service.getMediaService().uploadMedia("image", file);
+            service.getMsgService().sendKefuMsg(
+                    WxMaKefuMessage
+                            .newImageBuilder()
+                            .mediaId(uploadResult.getMediaId())
+                            .toUser(wxMessage.getFromUser())
+                            .build());
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+        }
+
+        return null;
+    };
+
+}

+ 47 - 0
fyzd-phone/src/main/java/com/yx/face/boot/component/wx/WxMaProperties.java

@@ -0,0 +1,47 @@
+package com.yx.face.boot.component.wx;
+
+import lombok.Data;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+import java.util.List;
+
+/**
+ * @description: WxMaProperties <br>
+ * @date: 2021/4/13 10:18 <br>
+ * @author: PWB <br>
+ */
+@Data
+@ConfigurationProperties(prefix = "wx.miniapp")
+public class WxMaProperties {
+
+    private List<Config> configs;
+
+    @Data
+    public static class Config {
+        /**
+         * 设置微信小程序的appid
+         */
+        private String appid;
+
+        /**
+         * 设置微信小程序的Secret
+         */
+        private String secret;
+
+        /**
+         * 设置微信小程序消息服务器配置的token
+         */
+        private String token;
+
+        /**
+         * 设置微信小程序消息服务器配置的EncodingAESKey
+         */
+        private String aesKey;
+
+        /**
+         * 消息格式,XML或者JSON
+         */
+        private String msgDataFormat;
+    }
+
+}

+ 39 - 0
fyzd-phone/src/main/java/com/yx/face/boot/config/MinioConfig.java

@@ -0,0 +1,39 @@
+package com.yx.face.boot.config;
+
+import com.yx.face.boot.uitls.MiniOUtils;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Minio文件上传配置文件
+ */
+@Slf4j
+@Configuration
+public class MinioConfig {
+    @Value("${MINIO_PATH_URL}")
+    private String minioUrl;
+    @Value("${MINIO_ACCESS_KEY}")
+    private String minioName;
+    @Value("${MINIO_SECRET_KEY}")
+    private String minioPass;
+    @Value("${MINIO_OSS_BUCKET}")
+    private String bucketName;
+
+
+    @Bean
+    public void initMinio(){
+        if(!minioUrl.startsWith("http")){
+            minioUrl = "http://" + minioUrl;
+        }
+        if(!minioUrl.endsWith("/")){
+            minioUrl = minioUrl.concat("/");
+        }
+        MiniOUtils.setMinioUrl(minioUrl);
+        MiniOUtils.setMinioName(minioName);
+        MiniOUtils.setMinioPass(minioPass);
+        MiniOUtils.setBucketName(bucketName);
+    }
+
+}

+ 93 - 0
fyzd-phone/src/main/java/com/yx/face/boot/config/SwaggerConfig.java

@@ -0,0 +1,93 @@
+/**
+ * Copyright (C), 2018-2019, XXX有限公司
+ * FileName: SwaggerConfig
+ * Author:   pwb
+ * Date:     2019/7/12 10:44
+ * Description: swagger2配置类
+ * History:
+ * <author>          <time>          <version>          <desc>
+ * frank           修改时间           1.0.0              ycypApp
+ */
+package com.yx.face.boot.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.service.Contact;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+/**
+ * 〈swagger2配置类〉
+ *
+ * @author pwb
+ * @create 2019/7/12
+ * @since 1.0.0
+ */
+
+@Configuration
+@EnableSwagger2
+//@ConditionalOnProperty(name = "swagger.enable", havingValue = "true")
+public class SwaggerConfig {
+
+    @Value("${swagger.enable}")
+    private boolean enable;
+/*
+    //2
+    @Bean
+    public Docket api() {
+
+        ParameterBuilder tokenPar = new ParameterBuilder();
+        List<Parameter> pars = new ArrayList<>();
+        tokenPar.name("Authorization").description("AccessToken令牌").modelRef(new ModelRef("string")).parameterType("header").required(false).build();
+        pars.add(tokenPar.build());
+
+        return new Docket(DocumentationType.SWAGGER_2)
+                .apiInfo(apiInfo())
+                .select()
+                .apis(RequestHandlerSelectors.basePackage(" com.yx.face.controller"))
+                .paths(PathSelectors.any())
+                .build()
+                .globalOperationParameters(pars);
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("机场审核")
+                .description("后台服务接口;")
+                .contact(new Contact("pwb", "www.baidu.com", "925234379@qq.com"))
+                .version("1.0")
+                .build();
+    }
+*/
+
+    @Bean
+    public Docket createRestApi() {
+        return new Docket(DocumentationType.OAS_30)
+                .enable(enable)
+                .useDefaultResponseMessages(false)
+                .apiInfo(apiInfo())
+                .groupName("1.X版本")
+                .select()
+                .apis(RequestHandlerSelectors.basePackage("com.yx.face.controller"))
+                .paths(PathSelectors.any())
+                .build();
+    }
+
+    private ApiInfo apiInfo() {
+        return new ApiInfoBuilder()
+                .title("案件分析服务 API")
+                .description("后台服务接口")
+                .termsOfServiceUrl("http://localhost:8088/")
+                .contact(new Contact("pwb", "www.baidu.com", "925234379@qq.com"))
+                .version("1.0")
+                .build();
+    }
+
+
+}

+ 43 - 0
fyzd-phone/src/main/java/com/yx/face/boot/config/TaskPoolConfig.java

@@ -0,0 +1,43 @@
+package com.yx.face.boot.config;
+
+import org.springframework.aop.interceptor.AsyncExecutionAspectSupport;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * @description: TaskPoolConfig <br>
+ * @date: 2021/8/4 14:52 <br>
+ * @author: PWB <br>
+ */
+@EnableAsync
+@Configuration
+public class TaskPoolConfig {
+
+    @Bean(AsyncExecutionAspectSupport.DEFAULT_TASK_EXECUTOR_BEAN_NAME)
+    public Executor executor() {
+        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+        //核心线程数10:线程池创建时候初始化的线程数
+        executor.setCorePoolSize(10);
+        //最大线程数20:线程池最大的线程数,只有在缓冲队列满了之后才会申请超过核心线程数的线程
+        executor.setMaxPoolSize(20);
+        //缓冲队列200:用来缓冲执行任务的队列
+        executor.setQueueCapacity(200);
+        //允许线程的空闲时间60秒:当超过了核心线程出之外的线程在空闲时间到达之后会被销毁
+        executor.setKeepAliveSeconds(60);
+        //线程池对拒绝任务的处理策略:这里采用了CallerRunsPolicy策略,当线程池没有处理能力的时候,
+        //该策略会直接在 execute 方法的调用线程中运行被拒绝的任务;如果执行程序已关闭,则会丢弃该任务
+        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+        //线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
+        executor.setThreadNamePrefix("mTaskExecutor-");
+        executor.setWaitForTasksToCompleteOnShutdown(true);
+        executor.setAwaitTerminationSeconds(5);
+        executor.initialize();
+        return executor;
+    }
+
+}

+ 50 - 0
fyzd-phone/src/main/java/com/yx/face/boot/restful/CommonException.java

@@ -0,0 +1,50 @@
+package com.yx.face.boot.restful;
+
+import java.io.Serializable;
+
+
+/**
+ * @description: 通用异常抛出 列如 工具类中的异常抛出  <br>
+ * @since: 1.0 <br>
+ * @date: 2020/10/21 11:21 <br>
+ * @author: PWB <br>
+ */
+public class CommonException extends RuntimeException implements Serializable {
+
+    private static final long serialVersionUID = 1213855733833039552L;
+
+    private Integer code;
+
+    public CommonException() {
+        super(RestCode.FAIL.getMsg());
+        this.code = RestCode.FAIL.getCode();
+    }
+
+    public CommonException(String message) {
+        super(message);
+        this.code = RestCode.FAIL.getCode();
+    }
+
+    public CommonException(Integer code, String message) {
+        super(message);
+        this.code = code;
+    }
+
+    public CommonException(RestCode resCode) {
+        super(resCode.getMsg());
+        this.code = resCode.getCode();
+    }
+
+    public CommonException(String message, Throwable cause) {
+        super(message, cause);
+        this.code = RestCode.FAIL.getCode();
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+}

+ 40 - 0
fyzd-phone/src/main/java/com/yx/face/boot/restful/RestCode.java

@@ -0,0 +1,40 @@
+package com.yx.face.boot.restful;
+
+
+public enum RestCode {
+
+    SUCCESS(200, "成功"),
+    FAIL(400, "失败"),
+    UNAUTHORIZED(401, "未授权"),
+    FORBIDDEN(403, "禁止访问该资源"),
+    NOT_FOUND(404, "未发现该资源"),
+    REQUEST_TIMEOUT(408, "请求超时"),
+    INTERNAL_SERVER_ERROR(500, "服务器内部错误"),
+    SERVICE_UNAVAILABLE(503, "服务无法获得"),
+    GATEWAY_TIMEOUT(504, "网关超时"),
+    REMOTE_INVOCATION_FAIL(900, "远程服务调用失败");
+
+    public int code;
+    private String msg;
+
+    RestCode(int code, String msg) {
+        this.code = code;
+        this.msg = msg;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public void setCode(int code) {
+        this.code = code;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public void setMsg(String msg) {
+        this.msg = msg;
+    }
+}

+ 64 - 0
fyzd-phone/src/main/java/com/yx/face/boot/restful/RestDTO.java

@@ -0,0 +1,64 @@
+package com.yx.face.boot.restful;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.SneakyThrows;
+
+/**
+ * @description: RestDTO <br>
+ * @date: 2021/3/24 16:57 <br>
+ * @author: PWB <br>
+ */
+@ApiModel("分页查询参数 model ")
+public class RestDTO<T> {
+
+    @ApiModelProperty("第几页 默认1 ")
+    public Integer pageNum = 1;
+
+    @ApiModelProperty("每页大小 默认 20")
+    private Integer pageSize = 20;
+
+    @ApiModelProperty("其它查询参数 ")
+    private T data;
+
+    public Integer getPageNum() {
+        return pageNum;
+    }
+
+    public void setPageNum(Integer pageNum) {
+        if (pageNum == null || pageNum < 1) {
+            this.pageNum = 1;
+            return;
+        }
+        this.pageNum = pageNum;
+    }
+
+    public Integer getPageSize() {
+        return pageSize;
+    }
+
+    public void setPageSize(Integer pageSize) {
+        if (pageSize == null || pageSize < 1) {
+            this.pageSize = 20;
+            return;
+        }
+        this.pageSize = pageSize;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public void setData(T data) {
+        this.data = data;
+    }
+
+
+    @SneakyThrows
+    @Override
+    public String toString() {
+        ObjectMapper om = new ObjectMapper();
+        return om.writeValueAsString(this);
+    }
+}

+ 43 - 0
fyzd-phone/src/main/java/com/yx/face/boot/restful/RestResponse.java

@@ -0,0 +1,43 @@
+package com.yx.face.boot.restful;
+
+
+public class RestResponse {
+
+    public static RestResult<String> ok() {
+        return new RestResult<String>().setCode(RestCode.SUCCESS).setMsg(RestCode.SUCCESS.getMsg());
+    }
+
+    public static <T> RestResult<T> ok(T data) {
+        return new RestResult<T>().setCode(RestCode.SUCCESS).setMsg(RestCode.SUCCESS.getMsg()).setData(data);
+    }
+
+    public static <T> RestResult<T> error(String message) {
+        return new RestResult<T>().setCode(RestCode.FAIL).setMsg(message);
+    }
+
+    public static <T> RestResult<T> error(RestCode restCode, T data) {
+        return new RestResult<T>().setCode(restCode.getCode()).setMsg(restCode.getMsg()).setData(data);
+    }
+
+    public static <T> RestResult<T> error(RestCode restCode) {
+        return new RestResult<T>().setCode(restCode.getCode()).setMsg(restCode.getMsg());
+    }
+
+    public static <T> RestResult<T> build(int code, String msg) {
+        return new RestResult<T>().setCode(code).setMsg(msg);
+    }
+
+    public static <T> RestResult<T> build(int code, String msg, T data) {
+        return new RestResult<T>().setCode(code).setMsg(msg).setData(data);
+    }
+
+    public static <T> T verifyRestResult(RestResult<T> restResult) {
+        if (restResult == null) {
+            throw new ServiceException(RestCode.SERVICE_UNAVAILABLE);
+        }
+        if (restResult.getCode() != RestCode.SUCCESS.getCode()) {
+            throw new ServiceException(restResult.getCode(), restResult.getMsg());
+        }
+        return restResult.getData();
+    }
+}

+ 64 - 0
fyzd-phone/src/main/java/com/yx/face/boot/restful/RestResult.java

@@ -0,0 +1,64 @@
+package com.yx.face.boot.restful;
+
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.SneakyThrows;
+
+import java.io.Serializable;
+
+
+@ApiModel("返回类")
+public class RestResult<T> implements Serializable {
+
+    private static final long serialVersionUID = 3758864789222317092L;
+
+    @ApiModelProperty("状态码")
+    public int code;
+
+    @ApiModelProperty("返回消息")
+    private String msg;
+
+    @ApiModelProperty("对象")
+    private T data;
+
+    public RestResult<T> setCode(RestCode restCode) {
+        this.code = restCode.code;
+        return this;
+    }
+
+    public int getCode() {
+        return code;
+    }
+
+    public RestResult<T> setCode(int code) {
+        this.code = code;
+        return this;
+    }
+
+    public String getMsg() {
+        return msg;
+    }
+
+    public RestResult<T> setMsg(String msg) {
+        this.msg = msg;
+        return this;
+    }
+
+    public T getData() {
+        return data;
+    }
+
+    public RestResult<T> setData(T data) {
+        this.data = data;
+        return this;
+    }
+
+    @SneakyThrows
+    @Override
+    public String toString() {
+        ObjectMapper om = new ObjectMapper();
+        return om.writeValueAsString(this);
+    }
+}

+ 44 - 0
fyzd-phone/src/main/java/com/yx/face/boot/restful/ServiceException.java

@@ -0,0 +1,44 @@
+package com.yx.face.boot.restful;
+
+import java.io.Serializable;
+
+
+public class ServiceException extends RuntimeException implements Serializable {
+
+    private static final long serialVersionUID = 1213855733833039552L;
+
+    private Integer code;
+
+    public ServiceException() {
+        super(RestCode.FAIL.getMsg());
+        this.code = RestCode.FAIL.getCode();
+    }
+
+    public ServiceException(String message) {
+        super(message);
+        this.code = RestCode.FAIL.getCode();
+    }
+
+    public ServiceException(Integer code, String message) {
+        super(message);
+        this.code = code;
+    }
+
+    public ServiceException(RestCode resCode) {
+        super(resCode.getMsg());
+        this.code = resCode.getCode();
+    }
+
+    public ServiceException(String message, Throwable cause) {
+        super(message, cause);
+        this.code = RestCode.FAIL.getCode();
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+}

+ 226 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/AliOssCloudUtil.java

@@ -0,0 +1,226 @@
+package com.yx.face.boot.uitls;
+
+import com.aliyun.oss.OSS;
+import com.aliyun.oss.OSSClientBuilder;
+import com.aliyun.oss.OSSException;
+import com.aliyun.oss.model.*;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @ProjectName: fyzd-phone
+ * @Package: com.yx.face.boot.uitls
+ * @ClassName: AliOssCloudUtil
+ * @Author: 崔哥
+ * @Description: 阿里oss
+ * @Date: 2021/11/8 12:56
+ * @Version: 1.0
+ */
+public class AliOssCloudUtil {
+
+    Log log = LogFactory.getLog(AliOssCloudUtil.class);
+    private String endpoint = "oss-cn-gz-ysgzlt-d01-a.ltops.gzdata.com.cn";
+
+    //阿里云的accessKeyId
+    private String accessKeyId = "MXbgJTXbnTlJjadk";
+
+    //阿里云的accessKeySecret
+    private String accessKeySecret = "qBYKQPWjMVXJH9zVIVoqURQ14vGsW0";
+
+    //空间
+    private String bucketName = "hanghui";
+
+    //文件存储目录
+    private String filedir = "photo/";
+
+    private String logImg = "log/";
+
+    private OSS ossClient;
+
+    public AliOssCloudUtil() {
+        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+    }
+
+    public String getFiledir() {
+        return this.filedir;
+    }
+
+    public String getLogImg() {
+        return this.logImg;
+    }
+
+    //自定义上传文件夹
+    public AliOssCloudUtil(String filedir, String logImg) {
+        this.filedir = filedir;
+        this.logImg = logImg;
+        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+    }
+
+
+    /**
+     * 初始化
+     */
+    public void init() {
+        ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
+    }
+
+    /**
+     * 销毁
+     */
+    public void destory() {
+        ossClient.shutdown();
+    }
+
+
+    /**
+     * 上传到OSS服务器
+     *
+     * @param instream 文件流
+     * @param fileName 文件名称 包括后缀名
+     * @return 出错返回"" ,唯一MD5数字签名
+     */
+    public String uploadFile2OSS(InputStream instream, String fileName) {
+        String ret = "";
+        // 判断bucket是否已经存在,不存在进行创建
+        if (!doesBucketExist()) {
+            createBucket();
+        }
+        try {
+            //创建上传Object的Metadata
+            ObjectMetadata objectMetadata = new ObjectMetadata();
+            objectMetadata.setContentLength(instream.available());
+            objectMetadata.setCacheControl("no-cache");
+            objectMetadata.setHeader("Pragma", "no-cache");
+            objectMetadata.setContentType(getcontentType(fileName.substring(fileName.lastIndexOf("."))));
+            objectMetadata.setContentDisposition("inline;filename=" + fileName);
+            // 指定上传文件操作时是否覆盖同名Object。
+            // 不指定x-oss-forbid-overwrite时,默认覆盖同名Object。
+            // 指定x-oss-forbid-overwrite为false时,表示允许覆盖同名Object。
+            // 指定x-oss-forbid-overwrite为true时,表示禁止覆盖同名Object,如果同名Object已存在,程序将报错。
+            objectMetadata.setHeader("x-oss-forbid-overwrite", "false");
+            String dateTime = DateUtils.dateTime().concat("/");
+            String objectName = logImg + dateTime + fileName;
+
+            //上传文件
+            ossClient.putObject(bucketName, objectName, instream, objectMetadata);
+            // 封装  url 路径
+            String url = "http://" + bucketName + "." + endpoint + "/" + objectName;
+            System.out.println(objectName);
+            ret = url;
+        } catch (IOException e) {
+            log.error(e.getMessage(), e);
+        } finally {
+            ossClient.shutdown();
+            try {
+                if (instream != null) {
+                    instream.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+        return ret;
+    }
+
+    /**
+     * 判断文件是否存在。doesObjectExist还有一个参数isOnlyInOSS,
+     * 如果为true则忽略302重定向或镜像;如果为false,则考虑302重定向或镜像。
+     * yourObjectName 表示上传文件到OSS时需要指定包含文件后缀在内的完整路径,例如abc/efg/123.jpg。
+     *
+     * @return 存在返回true
+     */
+    public boolean doesObjectExist(String objectName) {
+        boolean exists = ossClient.doesObjectExist(bucketName, filedir + objectName);
+        return exists;
+    }
+
+    /**
+     * 判断Bucket是否存在
+     *
+     * @return 存在返回true
+     */
+    public boolean doesBucketExist() {
+        boolean exists = ossClient.doesBucketExist(bucketName);
+        return exists;
+    }
+
+    /**
+     * 创建Bucket
+     */
+    public void createBucket() {
+        CreateBucketRequest createBucketRequest = new CreateBucketRequest(bucketName);
+        // 设置bucket权限为公共读,默认是私有读写
+        createBucketRequest.setCannedACL(CannedAccessControlList.PublicRead);
+        // 设置bucket存储类型为低频访问类型,默认是标准类型
+        createBucketRequest.setStorageClass(StorageClass.IA);
+        boolean exists = ossClient.doesBucketExist(bucketName);
+        if (!exists) {
+            try {
+                ossClient.createBucket(createBucketRequest);
+                // 关闭client
+                ossClient.shutdown();
+            } catch (Exception e) {
+                log.error(e.getMessage());
+            }
+        }
+    }
+
+    /**
+     * Description: 判断OSS服务文件上传时文件的contentType
+     *
+     * @param FilenameExtension 文件后缀
+     * @return String
+     */
+    public static String getcontentType(String FilenameExtension) {
+        if ("bmp".equalsIgnoreCase(FilenameExtension)) {
+            return "image/bmp";
+        }
+        if ("gif".equalsIgnoreCase(FilenameExtension)) {
+            return "image/gif";
+        }
+        if ("jpeg".equalsIgnoreCase(FilenameExtension) ||
+                "jpg".equalsIgnoreCase(FilenameExtension) ||
+                "png".equalsIgnoreCase(FilenameExtension)) {
+            return "image/jpeg";
+        }
+        if ("html".equalsIgnoreCase(FilenameExtension)) {
+            return "text/html";
+        }
+        if ("txt".equalsIgnoreCase(FilenameExtension)) {
+            return "text/plain";
+        }
+        if ("vsd".equalsIgnoreCase(FilenameExtension)) {
+            return "application/vnd.visio";
+        }
+        if ("pptx".equalsIgnoreCase(FilenameExtension) ||
+                "ppt".equalsIgnoreCase(FilenameExtension)) {
+            return "application/vnd.ms-powerpoint";
+        }
+        if ("docx".equalsIgnoreCase(FilenameExtension) ||
+                "doc".equalsIgnoreCase(FilenameExtension)) {
+            return "application/msword";
+        }
+        if ("xml".equalsIgnoreCase(FilenameExtension)) {
+            return "text/xml";
+        }
+        return "image/jpeg";
+    }
+
+
+    /**
+     * @param fileName
+     * @return
+     * @Title: getInputStreamByFileUrl
+     * @Description: 根据文件路径获取InputStream流
+     * @return: InputStream
+     */
+    public InputStream getInputStreamByFileUrl(String fileName) {
+        // ossObject包含文件所在的存储空间名称、文件名称、文件元信息以及一个输入流。
+        OSSObject ossObject = ossClient.getObject(bucketName, fileName);
+        return ossObject.getObjectContent();
+    }
+}

+ 906 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/ConvertUtils.java

@@ -0,0 +1,906 @@
+package com.yx.face.boot.uitls;
+
+
+import  com.yx.face.boot.restful.CommonException;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.nio.charset.StandardCharsets;
+import java.text.DecimalFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Base64;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.Random;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * @description: 用于将一个对象转换为另一个对象等操作
+ */
+public final class ConvertUtils {
+    private ConvertUtils() {
+    }
+
+    //region [处理几种类型的数据,发生错误时返回默认数据等操作]
+
+    public static String getStringValue(String s) {
+        return s == null ? "" : s;
+
+    }
+
+    public static String getStringValue(Object s) {
+        return s == null ? "" : s.toString();
+    }
+
+
+    /**
+     * 这里主要用来验证代表的状态值或等级等,要求大于-1,不能为null
+     */
+    public static Boolean judgeIntegerValue(Integer v) {
+        if (v != null) {
+            return v > -1;
+        }
+        return false;
+    }
+
+    /**
+     * 这里主要用来获取代表的状态值或等级等,最小为0
+     */
+    public static Integer getIntegerValue(Integer v) {
+        if (v != null) {
+            if (v > -1) {
+                return v;
+            }
+        }
+        return 0;
+    }
+
+    /**
+     * 这里主要用来验证代表值常量的判断,要求大于0,不能为null
+     */
+    public static Boolean judgeIntegerKey(Integer v) {
+        return getIntValue(v) > 0;
+    }
+
+    public static Integer getIntValue(Integer v) {
+        return getIntValue(v, -1);
+    }
+
+    public static Integer getIntValue(Integer v, int def) {
+        if (v != null && !v.equals(0)) {
+            return v;
+        } else {
+            return def;
+        }
+    }
+
+    public static int getIntValue(String v) {
+        return getIntValue(v, -1);
+    }
+
+    public static int getIntValue(String v, int def) {
+        try {
+            return Integer.parseInt(v);
+        } catch (Exception ex) {
+            return def;
+        }
+    }
+
+    /**
+     * 这里主要用来验证是不是自增ID,要求大于0,不能为null
+     */
+    public static Boolean judgeLongKey(Long v) {
+        return getLongValue(v) > 0;
+    }
+
+    public static Long getLongValue(Long v) {
+        return getLongValue(v, -1L);
+    }
+
+    public static Long getLongValue(Long v, Long def) {
+        if (v != null && !v.equals(0L)) {
+            return v;
+        } else {
+            return def;
+        }
+    }
+
+    public static Long getLongValue(String v) {
+        return getLongValue(v, -1L);
+    }
+
+    public static Long getLongValue(String v, Long def) {
+        try {
+            return Long.parseLong(v);
+        } catch (Exception ex) {
+            return def;
+        }
+    }
+
+    public static Float getFloatValue(String v) {
+        return getFloatValue(v, 0);
+    }
+
+    public static Float getFloatValue(String v, float def) {
+        try {
+            return Float.parseFloat(v);
+        } catch (Exception ex) {
+            return def;
+        }
+    }
+
+    /**
+     * 返回保留2位数的数据
+     *
+     * @param v 值
+     */
+    public static Double getDoubleRetain(Double v) {
+        return getDoubleRetain(v, 2);
+    }
+
+    /**
+     * 返回指定保留位数的数据
+     *
+     * @param v   值
+     * @param num 位数
+     */
+    public static Double getDoubleRetain(Double v, int num) {
+        StringBuilder s = new StringBuilder();
+        for (int i = 0; i < num; i++) {
+            s.append("0");
+        }
+        DecimalFormat df = new DecimalFormat("#." + s);
+        return getDoubleValue(df.format(v));
+    }
+
+    public static Double getDoubleValue(String v) {
+        return getDoubleValue(v, 0);
+    }
+
+    public static Double getDoubleValue(String v, double def) {
+        try {
+            return Double.parseDouble(v);
+        } catch (Exception ex) {
+            return def;
+        }
+    }
+
+    //region [BigDecimal操作]
+
+    /**
+     * 判断是否v1是否大于v2
+     *
+     * @param v1 原始值
+     * @param v2 待比值
+     */
+    public static Boolean judgeBigDecimalBig(BigDecimal v1, BigDecimal v2) {
+        return v1.compareTo(v2) > 0;
+    }
+
+    /**
+     * 判断是否v1是否小于v2
+     *
+     * @param v1 原始值
+     * @param v2 待比值
+     */
+    public static Boolean judgeBigDecimalSmall(BigDecimal v1, BigDecimal v2) {
+        return v1.compareTo(v2) < 0;
+    }
+
+    /**
+     * 判断是否v1是否等于v2
+     *
+     * @param v1 原始值
+     * @param v2 待比值
+     */
+    public static Boolean judgeBigDecimalEqual(BigDecimal v1, BigDecimal v2) {
+        return v1.compareTo(v2) == 0;
+    }
+
+    /**
+     * 返回相加数据
+     *
+     * @param v1 原始值
+     * @param v2 待加值
+     */
+    public static BigDecimal getBigDecimalAdd(BigDecimal v1, BigDecimal v2) {
+        return v1.add(v2);
+    }
+
+    /**
+     * 返回相减数据
+     *
+     * @param v1 原始值
+     * @param v2 待减值
+     */
+    public static BigDecimal getBigDecimalSubtract(BigDecimal v1, BigDecimal v2) {
+        return v1.subtract(v2);
+    }
+
+    /**
+     * 返回相乘数据
+     *
+     * @param v1  原始值
+     * @param v2  待乘值
+     * @param num 保留位数
+     */
+    public static BigDecimal getBigDecimalMultiply(BigDecimal v1, BigDecimal v2, int num) {
+        return getBigDecimalRetain(v1.multiply(v2), num);
+    }
+
+    /**
+     * 返回相除数据
+     *
+     * @param v1  被除数
+     * @param v2  除数
+     * @param num 保留位数
+     */
+    public static BigDecimal getBigDecimalDivide(BigDecimal v1, BigDecimal v2, int num) {
+        return v1.divide(v2, num, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 返回保留2位数的四舍五入数据
+     *
+     * @param v 值
+     */
+    public static BigDecimal getBigDecimalRetain(BigDecimal v) {
+        return getBigDecimalRetain(v, 2);
+    }
+
+    /**
+     * 返回指定保留位数的四舍五入数据
+     *
+     * @param v   值
+     * @param num 位数
+     */
+    public static BigDecimal getBigDecimalRetain(BigDecimal v, int num) {
+        return getBigDecimalValue(v).setScale(num, BigDecimal.ROUND_HALF_UP);
+    }
+
+    /**
+     * 返回截取2位数的数据【不四舍五入】
+     *
+     * @param v 值
+     */
+    public static BigDecimal getBigDecimalIntercept(BigDecimal v) {
+        return getBigDecimalIntercept(v, 2);
+    }
+
+    /**
+     * 返回指定截取位数的数据【不四舍五入】
+     *
+     * @param v   值
+     * @param num 位数
+     */
+    public static BigDecimal getBigDecimalIntercept(BigDecimal v, int num) {
+        return getBigDecimalValue(v).setScale(num, BigDecimal.ROUND_DOWN);
+    }
+
+    public static BigDecimal getBigDecimalValue(BigDecimal v) {
+        return getBigDecimalValue(v, "0");
+    }
+
+    public static BigDecimal getBigDecimalValue(BigDecimal v, String def) {
+        if (v != null) {
+            return v;
+        } else {
+            return new BigDecimal(def);
+        }
+    }
+    //endregion
+
+    public static String getFormatDate(Date v) {
+        return getFormatDate(v, "");
+    }
+
+    public static String getFormatDate(Date v, String format) {
+        try {
+            if (format == null || format.isEmpty()) {
+                format = "yyyy-MM-dd HH:mm:ss";
+            }
+            SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
+            return simpleDateFormat.format(v);
+        } catch (Exception ex) {
+            throw new CommonException(ex.getMessage());
+        }
+    }
+
+    //endregion
+
+    //region [对时间进行相应的处理]
+
+    //获取当前月份加指定月数的月份第一天
+    public static String getFirstDayOfMonth(int month) {
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.MONTH, month);
+        //设置为1号,当前日期既为本月第一天
+        c.set(Calendar.DAY_OF_MONTH, 1);
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    //获取当前月份的第一天
+    public static String getFirstDayOfMonth() {
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.MONTH, 0);
+        //设置为1号,当前日期既为本月第一天
+        c.set(Calendar.DAY_OF_MONTH, 1);
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    //获取给定日期月份的第一天
+    public static String getFirstDayOfMonth(Date date) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.add(Calendar.MONTH, 0);
+        //设置为1号,当前日期既为本月第一天
+        c.set(Calendar.DAY_OF_MONTH, 1);
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    //获取当前月份加指定月数的月份最后一天:
+    public static String getLastDayOfMonth(int month) {
+        //获取当前月最后一天
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.MONTH, month);
+        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    //获取当前月最后一天:
+    public static String getLastDayOfMonth() {
+        //获取当前月最后一天
+        Calendar c = Calendar.getInstance();
+        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    //获取给定日期月份最后一天:
+    public static String getLastDayOfMonth(Date date) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.set(Calendar.DAY_OF_MONTH, c.getActualMaximum(Calendar.DAY_OF_MONTH));
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    /**
+     * 得到加N周后的周一
+     *
+     * @return yyyy-MM-dd
+     */
+    public static String getFirstDayOfWeek(int week) {
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.WEEK_OF_MONTH, week);
+        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
+        if (day_of_week == 0) {
+            day_of_week = 7;
+        }
+        c.add(Calendar.DATE, -day_of_week + 1);
+        System.out.println(c.getTime());
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    /**
+     * 得到本周周一
+     *
+     * @return yyyy-MM-dd
+     */
+    public static String getFirstDayOfWeek() {
+        Calendar c = Calendar.getInstance();
+        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
+        if (day_of_week == 0) {
+            day_of_week = 7;
+        }
+        c.add(Calendar.DATE, -day_of_week + 1);
+        System.out.println(c.getTime());
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    /**
+     * 得到给定日期的周一
+     *
+     * @return yyyy-MM-dd
+     */
+    public static String getFirstDayOfWeek(Date date) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
+        if (day_of_week == 0) {
+            day_of_week = 7;
+        }
+        c.add(Calendar.DATE, -day_of_week + 1);
+        System.out.println(c.getTime());
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    /**
+     * 得到加N周后的周日
+     *
+     * @return yyyy-MM-dd
+     */
+    public static String getLastDayOfWeek(int week) {
+        Calendar c = Calendar.getInstance();
+        c.add(Calendar.WEEK_OF_MONTH, week);
+        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
+        if (day_of_week == 0) {
+            day_of_week = 7;
+        }
+        c.add(Calendar.DATE, -day_of_week + 7);
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    /**
+     * 得到本周周日
+     *
+     * @return yyyy-MM-dd
+     */
+    public static String getLastDayOfWeek() {
+        Calendar c = Calendar.getInstance();
+        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
+        if (day_of_week == 0) {
+            day_of_week = 7;
+        }
+        c.add(Calendar.DATE, -day_of_week + 7);
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    /**
+     * 得到给定日期的周日
+     *
+     * @return yyyy-MM-dd
+     */
+    public static String getLastDayOfWeek(Date date) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
+        if (day_of_week == 0) {
+            day_of_week = 7;
+        }
+        c.add(Calendar.DATE, -day_of_week + 7);
+        return getFormatDate(c.getTime(), "yyyy-MM-dd");
+    }
+
+    /**
+     * 获取给定日期是星期几
+     *
+     * @param date
+     * @return 当前日期是星期几
+     */
+    public static int getWeekOfDate(Date date) {
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        int w = c.get(Calendar.DAY_OF_WEEK) - 1;
+        if (w <= 0) {
+            w = 7;
+        }
+        return w;
+    }
+
+    /**
+     * 计算两个日期之间相差的天数
+     *
+     * @param smdate 较小的时间
+     * @param bdate  较大的时间
+     * @return 相差天数
+     * @throws ParseException
+     */
+    public static Integer daysBetween(Date smdate, Date bdate) throws ParseException {
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            smdate = sdf.parse(sdf.format(smdate));
+            bdate = sdf.parse(sdf.format(bdate));
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(smdate);
+            long time1 = cal.getTimeInMillis();
+            cal.setTime(bdate);
+            long time2 = cal.getTimeInMillis();
+            long between_days = (time2 - time1) / (1000 * 3600 * 24);
+            return Integer.parseInt(String.valueOf(between_days));
+        } catch (Exception e) {
+            throw new CommonException(e.getMessage());
+        }
+
+    }
+
+    /**
+     * 计算两个日期之间相差的分钟
+     *
+     * @param smdate 较小的时间
+     * @param bdate  较大的时间
+     * @return 相差分钟数
+     */
+    public static Integer minuteBetween(Date smdate, Date bdate) {
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            smdate = sdf.parse(sdf.format(smdate));
+            bdate = sdf.parse(sdf.format(bdate));
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(smdate);
+            long time1 = cal.getTimeInMillis();
+            cal.setTime(bdate);
+            long time2 = cal.getTimeInMillis();
+            long between_minute = (time2 - time1) / (1000 * 60);
+            return Integer.parseInt(String.valueOf(between_minute));
+        } catch (Exception e) {
+            throw new CommonException(e.getMessage());
+        }
+
+    }
+
+    /**
+     * 计算两个日期之间相差的秒钟
+     *
+     * @param smdate 较小的时间
+     * @param bdate  较大的时间
+     * @return 相秒钟数
+     */
+    public static Integer secondBetween(Date smdate, Date bdate) {
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            smdate = sdf.parse(sdf.format(smdate));
+            bdate = sdf.parse(sdf.format(bdate));
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(smdate);
+            long time1 = cal.getTimeInMillis();
+            cal.setTime(bdate);
+            long time2 = cal.getTimeInMillis();
+            long between_Between = (time2 - time1) / 1000;
+            return Integer.parseInt(String.valueOf(between_Between));
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    //返回只有年月日的时间格式
+    public static Date getString2Date(String strDate) {
+        return getString2Date(strDate, "yyyy-MM-dd");
+    }
+
+    //返回相应格式的时间
+    public static Date getString2Date(String strDate, String format) {
+        Date date;
+        try {
+            date = new SimpleDateFormat(format).parse(strDate);
+        } catch (Exception e) {
+            throw new CommonException(e.getMessage());
+        }
+        return date;
+    }
+
+    /**
+     * 将指定的年月日加上相应的数字后返回新的时间
+     *
+     * @param date  – 日期
+     * @param type  – 加减类型 y年m月d日 h小时mm分s秒
+     * @param value – 加上的数值 如果为负数,则为减去
+     * @return 返回增加后的Date
+     */
+    public static Date dateAdd(Date date, String type, int value) {
+        try {
+            Calendar cal = Calendar.getInstance();
+            cal.setTime(date);
+            if ("d".equals(type)) {
+                //日期加减N天
+                cal.add(Calendar.DAY_OF_YEAR, value);
+            } else if ("m".equals(type)) {
+                //日期加减N个月
+                cal.add(Calendar.MONTH, value);
+            } else if ("y".equals(type)) {
+                //日期加减N年
+                cal.add(Calendar.YEAR, value);
+            } else if ("h".equals(type)) {
+                //日期加减小时
+                cal.add(Calendar.HOUR, value);
+            } else if ("mm".equals(type)) {
+                //日期加减分钟
+                cal.add(Calendar.MINUTE, value);
+            } else if ("s".equals(type)) {
+                //日期加减秒
+                cal.add(Calendar.SECOND, value);
+            }
+            return cal.getTime();
+        } catch (Exception e) {
+            throw new CommonException(e.getMessage());
+        }
+
+    }
+
+    //endregion
+
+    //region [对文本的一些转换处理操作]
+
+    /**
+     * 去除编辑器文本格式
+     *
+     * @param str 要操作的文本
+     */
+    public static String removeFormat(String str) {
+        String inStr = str;
+        if (!getStringValue(str).trim().equals("")) {
+            inStr = str.replaceAll("</?[^>]+>", "");
+        }
+        return inStr;
+    }
+
+    /**
+     * 将字符串格式化成HTML代码
+     *
+     * @param str 要格式化的字符串
+     */
+    public static String textToHtml(String str) {
+        String inStr = str;
+        if (!getStringValue(str).trim().equals("")) {
+            inStr = inStr.replace("&", "&amp;");
+            inStr = inStr.replace("<", "&lt;");
+            inStr = inStr.replace(">", "&gt;");
+            inStr = inStr.replace("\r\n", "<br>");
+            inStr = inStr.replace("\n", "<br>");
+            inStr = inStr.replace("\t", " ");
+            inStr = inStr.replace(" ", "&nbsp;");
+        }
+        return inStr;
+    }
+
+    /**
+     * 将HTML代码转化成文本格式
+     *
+     * @param str 要格式化的字符串
+     */
+    public static String htmlToText(String str) {
+        String inStr = str;
+        if (!getStringValue(str).trim().equals("")) {
+            inStr = inStr.replace("&nbsp;", " ");
+            inStr = inStr.replace("<br>", "\r\n");
+            inStr = inStr.replace("&lt;", "<");
+            inStr = inStr.replace("&gt;", ">");
+            inStr = inStr.replace("&amp;", "&");
+        }
+        return inStr;
+    }
+
+    /**
+     * 截取规定字符数字符串,必须保证str不等于null(如果字符串含有html代码先转成文本再截取)
+     *
+     * @param str  原是字符串
+     * @param num  规定的长度
+     * @param spot 是否加省略点...
+     */
+    public static String subStringNumber(String str, int num, Boolean spot) {
+        String strSpot = spot ? "..." : "";
+        String stur = removeFormat(str).trim();
+        if (stur.length() > num) {
+            stur = stur.substring(0, num) + strSpot;
+        }
+        return stur;
+    }
+
+    /**
+     * 截取规定字节数字符串,必须保证str不等于null(如果字符串含有html代码先转成文本再截取)
+     *
+     * @param str  原是字符串
+     * @param num  规定的字节长度
+     * @param spot 是否加省略点...
+     */
+    public static String subStringBytes(String str, int num, Boolean spot) {
+        String strSpot = spot ? "..." : "";
+        String stur = removeFormat(str).trim();
+        byte[] bytes = stur.getBytes();
+        if (bytes.length > num) {
+            for (int i = 1; i <= stur.length(); i++) {
+                //这里已经处理掉了如截取6个字节“abcde薛”这种情况
+                byte[] bytesFor = stur.trim().substring(0, i).getBytes();
+                //如果当前截取的字符串字节数大于了要求的字节数,那取上一次截取的值
+                if (bytesFor.length > num) {
+                    stur = stur.substring(0, (i - 1)) + strSpot;
+                    return stur;
+                }
+            }
+        }
+        return stur;
+    }
+
+    /**
+     * 将字符串一部分隐藏为规定个数的“*”号,begin大于或等于字符长度返回原字符串
+     *
+     * @param str   要处理的字符串
+     * @param begin 显示几个字符后开始隐藏
+     * @param num   隐藏为“*”的字符数量
+     */
+    public static String replaceStr(String str, int begin, int num) {
+        String inStr = getStringValue(str).trim();
+        StringBuilder retStr = new StringBuilder();
+        if (inStr.length() >= (begin + num)) {
+            retStr.append(inStr, 0, begin);
+            for (int i = 0; i < num; i++) {
+                retStr.append("*");
+            }
+            retStr.append(inStr.substring(begin + num));
+        } else {
+            if (inStr.length() > begin) {
+                retStr.append(inStr, 0, begin);
+                for (int i = 0; i < inStr.length() - begin; i++) {
+                    retStr.append("*");
+                }
+            } else {
+                return inStr;
+            }
+        }
+        return retStr.toString();
+    }
+
+
+    /**
+     * 给字符串Base64编码并替换相应的字符
+     *
+     * @param text 要编码的字符串n
+     */
+    public static String encoderString(String text) throws Exception {
+        try {
+            Base64.Encoder encoder = Base64.getEncoder();
+            return encoder.encodeToString(text.getBytes(StandardCharsets.UTF_8));
+        } catch (Exception e) {
+            throw new CommonException(e.getMessage());
+        }
+
+    }
+
+    /**
+     * 给字Base64符串解码【有时密文的“+”号会被转为空格,里面要处理下】
+     *
+     * @param text 要解码的字符串
+     */
+    public static String decodeString(String text) throws Exception {
+        try {
+            return new String(Base64.getDecoder().decode(text.replaceAll(" ", "+")));
+        } catch (Exception e) {
+            throw new CommonException(e.getMessage());
+        }
+    }
+
+
+    //UTF-8+BOM编码转化为普通的UTF-8编码
+    public static String replaceUTF8Bom(String str) {
+        return str.replace("\uFEFF", "");
+    }
+
+    /**
+     * 特殊符号转码 utf-8
+     */
+    public static String encodeUrlComponent(String str) {
+        String result = null;
+
+        try {
+            result = URLEncoder.encode(str, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            result = str;
+        }
+        return result;
+    }
+
+    /**
+     * 解码 utf-8
+     */
+    public static String decoderString(String str) {
+        String result = "";
+        if (null == str) {
+            return "";
+        }
+        try {
+            result = URLDecoder.decode(str, "UTF-8");
+        } catch (UnsupportedEncodingException e) {
+            return null;
+        }
+        return result;
+    }
+
+    /**
+     * 加上http协议
+     */
+    public static String httpStr(String url) {
+        if (url.startsWith("http:") || url.startsWith("https:")) {
+            return url;
+        }
+        return "http:" + url;
+    }
+
+    /**
+     * 用于维易淘获取优惠卷金额。【格式都是“满xx元减xx元】
+     */
+    public static String splitMoney(String str) {
+        String s = str.split("元")[1];
+        return s.replace("减", "");
+    }
+
+    /**
+     * 获取图片,格式:<img size=790x1178>//**.jpg</img>
+     */
+    public static String splitImage(String str) {
+        String img = null;
+        Pattern compile = Pattern.compile("//.*.</img>");
+        Matcher matcher = compile.matcher(str);
+        while (matcher.find()) {
+            img = matcher.group();
+        }
+        if (img == null) {
+            return null;
+        }
+        return img.replace("</img>", "");
+    }
+
+    /**
+     * 拼多多的累计销量是字符串格式,格式其中为 "10万"
+     */
+    public static Integer splitSales(String volume) {
+        volume = volume.replaceAll("\\+", "");
+        if (volume.contains("万")) {
+            String str = volume.split("万")[0];
+            float number = (Float.parseFloat(str) * 10000);
+            return (int) number;
+        }
+        return Integer.valueOf(volume);
+    }
+
+
+    /**
+     * 返回随机N位整数
+     */
+    public static int getRandomNumber(int num) {
+        if (num <= 0) {
+            num = 1;
+        }
+        StringBuilder code = new StringBuilder();
+        Random random = new Random();
+        for (int i = 0; i < num; i++) {
+            code.append(random.nextInt(10));
+        }
+        return Integer.parseInt(code.toString());
+    }
+
+    /**
+     * 正则验证
+     *
+     * @param rgx 表达式
+     * @param res 值
+     */
+    public static boolean isCorrect(String rgx, String res) {
+        Pattern p = Pattern.compile(rgx);
+        Matcher m = p.matcher(res);
+        return m.matches();
+    }
+
+    /**
+     * 验证手机号码
+     *
+     * @param number 手机号
+     */
+    public static boolean phoneJudge(String number) {
+        String rgx = "^((13[0-9])|(15[0-9])|(18[0-9])|(19[0-9])|(17[0-9]))\\d{8}$";
+        return isCorrect(rgx, number);
+    }
+
+    /**
+     * 验证身份证号码
+     *
+     * @param number 身份证
+     */
+    public static boolean idCardJudge(String number) {
+        String rgx = "^\\d{15}|^\\d{17}([0-9]|X|x)$";
+        return isCorrect(rgx, number);
+    }
+
+    /**
+     * 验证护照号码
+     *
+     * @param number 护照
+     */
+    public static boolean passportJudge(String number) {
+        String rgx1 = "^[a-zA-Z]{5,17}$";
+        String rgx2 = "^[a-zA-Z0-9]{5,17}$";
+        return (isCorrect(rgx1, number) || isCorrect(rgx2, number));
+    }
+}

+ 45 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/CookieUtils.java

@@ -0,0 +1,45 @@
+package com.yx.face.boot.uitls;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @description: CookieUtils <br>
+ * @date: 2021/3/31 18:48 <br>
+ * @author: PWB <br>
+ */
+public class CookieUtils {
+
+    public static Cookie getCookie(HttpServletRequest request, String cookieName) {
+        Cookie[] cookies = request.getCookies();
+        if (cookies != null && cookies.length > 0) {
+            for (Cookie value : cookies) {
+                if (value.getName().equals(cookieName)) {
+                    return value;
+                }
+            }
+        }
+        return null;
+    }
+
+    public static String getCookieValue(HttpServletRequest request, String cookieName) {
+        Cookie cookie = getCookie(request, cookieName);
+        if (cookie != null) {
+            return cookie.getValue();
+        } else {
+            return null;
+        }
+    }
+
+    public static Cookie getCookie(Cookie[] cookies, String cookieName) {
+        if (null != cookies) {
+            for (Cookie cookie : cookies) {
+                if (cookie.getName().equals(cookieName)) {
+                    return cookie;
+                }
+            }
+        }
+        return null;
+    }
+
+}

+ 642 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/DateUtils.java

@@ -0,0 +1,642 @@
+package com.yx.face.boot.uitls;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
+
+import java.lang.management.ManagementFactory;
+import java.math.BigDecimal;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+/**
+ * 时间工具类
+ */
+public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
+
+    public static String YYYY = "yyyy";
+
+    public static String MIN = "min";
+
+    public static String MAX = "max";
+
+    public static String YYYY_MM = "yyyy-MM";
+
+    public static String YYYYMM = "yyyyMM";
+
+    public static String YYYY_MM_DD = "yyyy-MM-dd";
+
+    public static String YYYY_MM_01 = "yyyy-MM-01";
+
+    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
+
+    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+
+    public static String CN_YYYY_MM_DD_HH_MM = "yyyy年MM月dd日 HH:mm";
+
+    public static String YYYY_MM_DD_T_HH_MM_SS = "yyyy-MM-dd'T'HH:mm:ss";
+
+    public static String HH_MM_SS = "HH-mm-ss";
+
+    public static String MM_DD_HH_MM = "MM-dd HH:mm";
+
+    private static String[] parsePatterns = {
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
+            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
+            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
+
+    /**
+     * 获取当前Date型日期
+     *
+     * @return Date() 当前日期
+     */
+    public static Date getNowDate() {
+        return new Date();
+    }
+
+    /**
+     * 获取当前日期, 默认格式为yyyy-MM-dd
+     *
+     * @return String
+     */
+    public static String getDate() {
+        return dateTimeNow(YYYY_MM_DD);
+    }
+
+    /**
+     * 获取当前日期, 默认格式为MM-dd HH:mm
+     *
+     * @return String
+     */
+    public static String getMDHMDate() {
+        return dateTimeNow(MM_DD_HH_MM);
+    }
+
+    /**
+     * 获取当前日期, 默认格式为MM-dd HH:mm
+     *
+     * @return String
+     */
+    public static String getMDHMDate(Date date) {
+        return dateTimeNow(MM_DD_HH_MM, date);
+    }
+
+
+    public static String getTime() {
+        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
+    }
+
+    public static String dateTimeNow() {
+        return dateTimeNow(YYYYMMDDHHMMSS);
+    }
+
+    public static String dateTimeNow(final String format) {
+        return parseDateToStr(format, new Date());
+    }
+
+    public static String dateTimeNow(final String format, Date date) {
+        return parseDateToStr(format, date);
+    }
+
+    public static String dateTime(final Date date) {
+        return parseDateToStr(YYYY_MM_DD, date);
+    }
+
+    public static String parseDateToStr(final String format, final Date date) {
+        return new SimpleDateFormat(format).format(date);
+    }
+
+    /**
+     * @param date 指定日期<br>
+     * @return long 周几<br>
+     * @description: 获取指定日期是那周的周几 <br>
+     * @date: 2021/5/21 20:53 <br>
+     * @author: PWB <br>
+     */
+    public static int getWeek(Date date) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        return cal.get(Calendar.DAY_OF_WEEK) - 1;
+    }
+
+
+    public static Date dateTime(final String format, final String ts) {
+        try {
+            return new SimpleDateFormat(format).parse(ts);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 日期路径 即年/月/日 如2018/08/08
+     */
+    public static String datePath() {
+        Date now = new Date();
+        return DateFormatUtils.format(now, "yyyy/MM/dd");
+    }
+
+    /**
+     * 日期路径 即年/月/日 如20180808
+     */
+    public static String dateTime() {
+        final Date now = new Date();
+        return DateFormatUtils.format(now, "yyyyMMdd");
+    }
+
+    /**
+     * 日期型字符串转化为日期 格式
+     */
+    public static Date parseDate(Object str) {
+        if (str == null) {
+            return null;
+        }
+        try {
+            return parseDate(str.toString(), parsePatterns);
+        } catch (ParseException e) {
+            return null;
+        }
+    }
+
+    /**
+     * 获取服务器启动时间
+     */
+    public static Date getServerStartDate() {
+        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
+        return new Date(time);
+    }
+
+
+    /**
+     * 计算两个时间差
+     */
+    public static String getDatePoor(Date endDate, Date nowDate) {
+        // 获得两个时间的毫秒时间差异
+        long diff = endDate.getTime() - nowDate.getTime();
+        // 计算差多少天
+        long day = diff / MILLIS_PER_DAY;
+        // 计算差多少小时
+        long hour = diff % MILLIS_PER_DAY / MILLIS_PER_HOUR;
+        // 计算差多少分钟
+        long min = diff % MILLIS_PER_DAY % MILLIS_PER_HOUR / MILLIS_PER_MINUTE;
+        // 计算差多少秒//输出结果
+        long sec = diff % MILLIS_PER_DAY % MILLIS_PER_HOUR % MILLIS_PER_MINUTE / MILLIS_PER_SECOND;
+        return String.format("%02d", hour) + ":" + String.format("%02d", min) + ":" + String.format("%02d", sec);
+    }
+
+
+    //计算两个时间的时间差 并转为白话文
+    public static String doTransformDate(Date endDate, Date beginDate) {
+        if (endDate == null || beginDate == null) {
+            return null;
+        }
+        long diff = endDate.getTime() - beginDate.getTime();
+        if (diff < 0) {
+            return null;
+        }
+        // 计算差多少天
+        long day = diff / MILLIS_PER_DAY;
+        // 计算差多少小时
+        long hour = diff % MILLIS_PER_DAY / MILLIS_PER_HOUR;
+        // 计算差多少分钟
+        long min = diff % MILLIS_PER_DAY % MILLIS_PER_HOUR / MILLIS_PER_MINUTE;
+        // 计算差多少秒//输出结果
+        // long sec = diff % MILLIS_PER_DAY % MILLIS_PER_HOUR % MILLIS_PER_MINUTE / MILLIS_PER_SECOND;
+        if (day == 0 && hour == 0) {
+            return min + "分钟";
+        }
+        if (day == 0) {
+            return hour + "小时" + min + "分钟";
+        }
+        return day + "天" + hour + "小时" + min + "分钟";
+    }
+
+    /**
+     * 获取两个时间之间的年月
+     */
+    public static List<Date> getYearMonth(Date start, Date end) {
+        List<Date> list = new ArrayList<>();
+        //格式化为年月
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
+        Calendar min = Calendar.getInstance();
+        Calendar max = Calendar.getInstance();
+        min.setTime(start);
+        min.set(min.get(Calendar.YEAR), min.get(Calendar.MONTH), 1);
+        max.setTime(end);
+        max.set(max.get(Calendar.YEAR), max.get(Calendar.MONTH), 2);
+        while (min.before(max)) {
+            list.add(min.getTime());
+            min.add(Calendar.MONTH, 1);
+        }
+        return list;
+    }
+
+
+    public static List<String> getSevenDays(Date date) {
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(date);
+        Date endDate = calendar.getTime();
+        calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) - 6);
+        Date startDate = calendar.getTime();
+        List<Date> dates = findDates(startDate, endDate);
+        List<String> result = new ArrayList<>();
+        for (Date d : dates) {
+            result.add(DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, d));
+        }
+        return result;
+    }
+
+
+    public static List<Date> findDates(Date dBegin, Date dEnd) {
+        List<Date> lDate = new ArrayList<>();
+        lDate.add(dBegin);
+        Calendar calBegin = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calBegin.setTime(dBegin);
+        Calendar calEnd = Calendar.getInstance();
+        // 使用给定的 Date 设置此 Calendar 的时间
+        calEnd.setTime(dEnd);
+        // 测试此日期是否在指定日期之后
+        while (dEnd.after(calBegin.getTime())) {
+            // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
+            calBegin.add(Calendar.DAY_OF_MONTH, 1);
+            lDate.add(calBegin.getTime());
+        }
+        return lDate;
+    }
+
+    /**
+     * 根据当前日,加减日期
+     *
+     * @param day 日期 正数为+ ,负数为减
+     * @return 计算后的日期字符串 年月日 yyyy-MM-dd
+     */
+    public static String getCalculateDay(int day) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        cal.add(Calendar.DATE, day);
+        Date d = cal.getTime();
+        SimpleDateFormat sp = new SimpleDateFormat(YYYY_MM_DD);
+        sp.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        return sp.format(d);
+    }
+
+
+    /**
+     * 时间戳转秒
+     */
+    public static Long getSeconds(Long Millisecond) {
+        double k = Math.round(Millisecond * 1.0 / 1000L);
+        double result = (int) Math.rint(k);
+        String str = new BigDecimal(result + "").toString();
+        return Long.valueOf(str);
+    }
+
+    public static Date getBeginTime() {
+        Calendar todayEnd = Calendar.getInstance();
+        todayEnd.set(Calendar.HOUR_OF_DAY, 0);
+        todayEnd.set(Calendar.MINUTE, 0);
+        todayEnd.set(Calendar.SECOND, 0);
+        todayEnd.set(Calendar.MILLISECOND, 0);
+        return todayEnd.getTime();
+    }
+
+
+    public static Date getEndTime() {
+        Calendar todayEnd = Calendar.getInstance();
+        todayEnd.set(Calendar.HOUR_OF_DAY, 23);
+        todayEnd.set(Calendar.MINUTE, 59);
+        todayEnd.set(Calendar.SECOND, 59);
+        todayEnd.set(Calendar.MILLISECOND, 999);
+        return todayEnd.getTime();
+    }
+
+    /**
+     * 判断是否超过多少小时 如:24
+     *
+     * @param tableTime 业务时间
+     * @param hour      多少小时
+     */
+    public static boolean judgmentDate(long tableTime, double hour) {
+        Date start = new Date(tableTime);
+        //业务时间
+        Date end = new Date();//当前时间
+        long cha = end.getTime() - start.getTime();
+        if (cha < 0) {
+            return false;
+        }
+        double result = cha * 1.0 / (1000 * 60 * 60);
+        return result <= hour;//是小于等于 hour 小时
+    }
+
+
+    /**
+     * 获取精确到秒的时间戳
+     */
+    public static int getSecondTimestamp(Date date) {
+        if (null == date) {
+            return 0;
+        }
+        String timestamp = String.valueOf(date.getTime());
+        int length = timestamp.length();
+        if (length > 3) {
+            return Integer.parseInt(timestamp.substring(0, length - 3));
+        } else {
+            return 0;
+        }
+    }
+
+
+    /**
+     * @param date 指定日期 <br>
+     * @return boolean <br>
+     * @description: 判断某个日期 是否 是今日 <br>
+     * @since: 1.0 <br>
+     * @date: 2020/7/10 10:16 <br>
+     * @author: PWB <br>
+     */
+    public static boolean isToday(Date date) {
+        Date now = new Date();
+        SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
+        String todayStr = sdf.format(now);
+        return todayStr.equals(sdf.format(date));
+    }
+
+    //yesterday
+    public static boolean isYesterday(Date date) {
+        Date yesterday = addDays(new Date(), -1);
+        SimpleDateFormat sdf = new SimpleDateFormat(YYYY_MM_DD);
+        String yesterdayStr = sdf.format(yesterday);
+        return yesterdayStr.equals(sdf.format(date));
+    }
+
+    /**
+     * 通过long/1000 获取时间格式
+     *
+     * @return 计算后的日期字符串 YYYY_MM_DD_HH_MM_SS
+     */
+    public static String getDateStrByInt(int millions) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        cal.setTimeInMillis((long) millions * 1000);
+        Date d = cal.getTime();
+        SimpleDateFormat sp = new SimpleDateFormat(YYYY_MM_DD_HH_MM_SS);
+        sp.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        return sp.format(d);
+    }
+
+
+    /**
+     * 获取当前时间的最大值贺最小值
+     *
+     * @param millions 当前时间
+     * @param patterns min 和 max
+     */
+    public static int getIntStrByPatterns(int millions, String patterns) {
+        if (millions <= 0) {
+            return 0;
+        }
+        Date strtodate = null;
+        try {
+            final SimpleDateFormat format = new SimpleDateFormat(YYYY_MM_DD);
+            final Calendar cal = Calendar.getInstance();
+            cal.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+            cal.setTimeInMillis((long) millions * 1000);
+            String formatDate = format.format(cal.getTime());
+            if ("min".equals(patterns)) {
+                cal.setTime(format.parse(formatDate));
+                cal.add(Calendar.DAY_OF_YEAR, 0);
+                strtodate = new Date(cal.getTime().getTime() + 1);
+            }
+            if ("max".equals(patterns)) {
+                cal.setTime(format.parse(formatDate));
+                cal.add(Calendar.DAY_OF_YEAR, 1);
+                strtodate = new Date(cal.getTime().getTime() - 1);
+            }
+        } catch (ParseException e) {
+            return 0;
+        }
+        if (strtodate == null) {
+            return 0;
+        }
+        return (int) (strtodate.getTime() / 1000);
+    }
+
+
+    /**
+     * 获取当月最后一天最大值
+     */
+    public static int getMonLastDay(int millions) {
+        if (millions <= 0) {
+            return 0;
+        }
+        Date strtodate = null;
+        try {
+            final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+            final Calendar calendar = Calendar.getInstance();
+            calendar.setTimeInMillis((long) millions * 1000);
+            String formatDate = format.format(calendar.getTime());
+            calendar.setTime(format.parse(formatDate));
+            calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+            calendar.add(Calendar.DAY_OF_YEAR, 1);
+            strtodate = new Date(calendar.getTime().getTime() - 1);
+        } catch (ParseException e) {
+            return 0;
+        }
+        return (int) (strtodate.getTime() / 1000);
+    }
+
+
+    /**
+     * 获取当前时间格式化
+     *
+     * @param millions 时间int
+     */
+    public static int getIntGSH(int millions, String parent) {
+        if (millions <= 0) {
+            return 0;
+        }
+        Date strtodate = null;
+        try {
+            final SimpleDateFormat format = new SimpleDateFormat(parent);
+            final Calendar cal = Calendar.getInstance();
+            cal.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+            cal.setTimeInMillis((long) millions * 1000);
+            String formatDate = format.format(cal.getTime());
+            cal.setTime(format.parse(formatDate));
+            strtodate = new Date(cal.getTime().getTime());
+
+        } catch (ParseException e) {
+            return 0;
+        }
+        return (int) (strtodate.getTime() / 1000);
+    }
+
+
+    /**
+     * 获取YYYYMMinter类型数据
+     *
+     * @return 计算后的日期字符串 YYYYMM
+     */
+    public static Integer getYYYYMMIntByInt(int millions) {
+        final Calendar cal = Calendar.getInstance();
+        cal.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        cal.setTimeInMillis((long) millions * 1000);
+        Date d = cal.getTime();
+        SimpleDateFormat sp = new SimpleDateFormat(YYYYMM);
+        sp.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
+        return Integer.parseInt(sp.format(d));
+    }
+
+    // 获得当天0点时间
+    public static Date getTimeMorning() {
+        final Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        return cal.getTime();
+
+
+    }
+
+    // 获得昨天0点时间
+    public static Date getYesterdayMorning() {
+        final Calendar cal = Calendar.getInstance();
+        cal.setTimeInMillis(getTimeMorning().getTime() - 3600 * 24 * 1000);
+        return cal.getTime();
+    }
+
+    // 获得当天近7天时间
+    public static Date getWeekFromNow() {
+        final Calendar cal = Calendar.getInstance();
+        cal.setTimeInMillis(getTimeMorning().getTime() - 3600 * 24 * 1000 * 7);
+        return cal.getTime();
+    }
+
+    // 获得当天24点时间
+    public static Date getTimeNight() {
+        final Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.HOUR_OF_DAY, 24);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        return cal.getTime();
+    }
+
+    // 获得本周一0点时间
+    public static Date getTimeWeekMorning() {
+        final Calendar cal = Calendar.getInstance();
+        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
+        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+        return cal.getTime();
+    }
+
+    // 获得本周日24点时间
+    public static Date getTimeWeeknight() {
+        final Calendar cal = Calendar.getInstance();
+        cal.setTime(getTimeWeekMorning());
+        cal.add(Calendar.DAY_OF_WEEK, 7);
+        return cal.getTime();
+    }
+
+    // 获得本月第一天0点时间
+    public static Date getTimeMonthMorning() {
+        final Calendar cal = Calendar.getInstance();
+        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH));
+        return cal.getTime();
+    }
+
+    // 获得本月最后一天24点时间
+    public static Date getTimeMonthNight() {
+        final Calendar cal = Calendar.getInstance();
+        cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        cal.set(Calendar.HOUR_OF_DAY, 24);
+        return cal.getTime();
+    }
+
+    public static Date getLastMonthStartMorning() {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(getTimeMonthMorning());
+        cal.add(Calendar.MONTH, -1);
+        return cal.getTime();
+    }
+
+    public static Date getCurrentQuarterStartTime() {
+        final Calendar c = Calendar.getInstance();
+        int currentMonth = c.get(Calendar.MONTH) + 1;
+        SimpleDateFormat longSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        SimpleDateFormat shortSdf = new SimpleDateFormat("yyyy-MM-dd");
+        Date now = null;
+        try {
+            if (currentMonth <= 3)
+                c.set(Calendar.MONTH, 0);
+            else if (currentMonth <= 6)
+                c.set(Calendar.MONTH, 3);
+            else if (currentMonth <= 9)
+                c.set(Calendar.MONTH, 4);
+            else if (currentMonth <= 12)
+                c.set(Calendar.MONTH, 9);
+            c.set(Calendar.DATE, 1);
+            now = longSdf.parse(shortSdf.format(c.getTime()) + " 00:00:00");
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return now;
+    }
+
+    /**
+     * 当前季度的结束时间,即2012-03-31 23:59:59
+     */
+    public static Date getCurrentQuarterEndTime() {
+        final Calendar cal = Calendar.getInstance();
+        cal.setTime(getCurrentQuarterStartTime());
+        cal.add(Calendar.MONTH, 3);
+        return cal.getTime();
+    }
+
+
+    public static Date getCurrentYearStartTime() {
+        final Calendar cal = Calendar.getInstance();
+        cal.set(cal.get(Calendar.YEAR), Calendar.JANUARY, 1, 0, 0, 0);
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.YEAR));
+        return cal.getTime();
+    }
+
+    public static Date getCurrentYearEndTime() {
+        final Calendar cal = Calendar.getInstance();
+        cal.setTime(getCurrentYearStartTime());
+        cal.add(Calendar.YEAR, 1);
+        return cal.getTime();
+    }
+
+    public static Date getLastYearStartTime() {
+        final Calendar cal = Calendar.getInstance();
+        cal.setTime(getCurrentYearStartTime());
+        cal.add(Calendar.YEAR, -1);
+        return cal.getTime();
+    }
+
+    public static String getReduceEightTime(String time) {
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            Calendar cal = Calendar.getInstance();
+            if (StringUtils.isBlank(time)) {
+                cal.setTime(new Date());
+            } else {
+                Date date = sdf.parse(time);
+                cal.setTime(date);
+            }
+            cal.add(Calendar.HOUR_OF_DAY, -8);
+            Date dateTime = cal.getTime();
+            String format = sdf.format(dateTime);
+            return format;
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+        return "";
+    }
+}

+ 193 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/ForeignAesUtil.java

@@ -0,0 +1,193 @@
+package com.yx.face.boot.uitls;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.HexUtil;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.bouncycastle.jce.provider.BouncyCastleProvider;
+import org.springframework.stereotype.Component;
+
+import javax.crypto.Cipher;
+import javax.crypto.NoSuchPaddingException;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.Key;
+import java.security.NoSuchAlgorithmException;
+import java.security.NoSuchProviderException;
+import java.security.Security;
+import java.util.Arrays;
+import java.util.TreeMap;
+
+
+/**
+ * @ProjectName: face-server
+ * @Package: com.yx.face.boot.uitls
+ * @ClassName: ForeignAesUtil
+ * @Author: 崔哥
+ * @Description:
+ * @Date: 2021/9/8 11:03
+ * @Version: 1.0
+ */
+@Component
+public class ForeignAesUtil {
+
+    /**
+     * @author ngh
+     * AES128 算法
+     * <p>
+     * CBC 模式
+     * <p>
+     * PKCS7Padding 填充模式
+     * <p>
+     * CBC模式需要添加一个参数iv
+     * <p>
+     * 介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别
+     * 要实现在java端用PKCS7Padding填充,需要用到bouncycastle组件来实现
+     */
+    private Key key;
+    private Cipher cipher;
+
+    byte[] iv = "0103022405070878".getBytes();
+    byte[] keyBytes = "fskm@0716".getBytes();
+
+    public void init(byte[] keyBytes) {
+        // 如果密钥不足16位,那么就补足.  这个if 中的内容很重要
+        int base = 16;
+        if (keyBytes.length % base != 0) {
+            int groups = keyBytes.length / base + (keyBytes.length % base != 0 ? 1 : 0);
+            byte[] temp = new byte[groups * base];
+            Arrays.fill(temp, (byte) 0);
+            System.arraycopy(keyBytes, 0, temp, 0, keyBytes.length);
+            keyBytes = temp;
+        }
+        // 初始化
+        Security.addProvider(new BouncyCastleProvider());
+        // 转化成JAVA的密钥格式
+        key = new SecretKeySpec(keyBytes, "AES");
+        try {
+            // 初始化cipher
+            cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC");
+        } catch (NoSuchAlgorithmException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (NoSuchPaddingException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        } catch (NoSuchProviderException e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+    }
+
+
+    public String encrypt(String content) {
+        return Base64.encode(encrypt(content.getBytes(), keyBytes));
+    }
+
+    public String encrypt(String content, String keyBytes) {
+        return Base64.encode(encrypt(content.getBytes(), keyBytes.getBytes()));
+    }
+
+    public String encryptByHex(String content) {
+        return HexUtil.encodeHexStr(encrypt(content.getBytes(), keyBytes));
+    }
+
+    public String encryptByHex(String content, String keyBytes) {
+        return HexUtil.encodeHexStr(encrypt(content.getBytes(), keyBytes.getBytes()));
+    }
+
+    /**
+     * 加密方法
+     *
+     * @param content  要加密的字符串
+     * @param keyBytes 加密密钥
+     * @return
+     */
+    public byte[] encrypt(byte[] content, byte[] keyBytes) {
+        byte[] encryptedText = null;
+        keyBytes = new String(keyBytes).getBytes();
+        init(keyBytes);
+        try {
+            cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
+            encryptedText = cipher.doFinal(content);
+        } catch (Exception e) {
+            // TODO Auto-generated catch block
+            e.printStackTrace();
+        }
+        return encryptedText;
+    }
+
+    public String decrypt(String encryptedData) {
+        return new String(decrypt(Base64.decode(encryptedData), keyBytes));
+    }
+
+    public String decrypt(String encryptedData, String keyData) {
+        return new String(decrypt(Base64.decode(encryptedData), keyData.getBytes()));
+    }
+
+    public String decryptByHex(String encryptedData) {
+        return new String(decrypt(HexUtil.decodeHex(encryptedData), keyBytes));
+    }
+
+    public String decryptByHex(String encryptedData, String keyData) {
+        return new String(decrypt(HexUtil.decodeHex(encryptedData), keyData.getBytes()));
+    }
+
+    /**
+     * 解密方法
+     *
+     * @param encryptedData 要解密的字符串
+     * @param keyBytes      解密密钥
+     * @return
+     */
+    public byte[] decrypt(byte[] encryptedData, byte[] keyBytes) {
+        byte[] encryptedText = null;
+        init(keyBytes);
+        try {
+            cipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(iv));
+            encryptedText = cipher.doFinal(encryptedData);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return encryptedText;
+    }
+
+
+    public static String getMD5BySort(TreeMap<String, String> map, String secret) {
+        StringBuilder md5Param = new StringBuilder();
+
+        for (String key : map.keySet()) {
+            md5Param.append(map.get(key));
+        }
+
+        String signStr;
+
+        if (StringUtils.isBlank(secret)) {
+            signStr = DigestUtils.md5Hex(md5Param.toString());
+        } else {
+            signStr = DigestUtils.md5Hex(md5Param + secret);
+        }
+
+        if (signStr.length() < 25) {
+            signStr = signStr.substring(5, signStr.length());
+        } else {
+            signStr = signStr.substring(5, 25);
+        }
+
+        return signStr;
+    }
+
+
+    public static void main(String[] args) {
+        ForeignAesUtil foreignAesUtil = new ForeignAesUtil();
+        //加密字符串
+        String content = "222222";
+        System.out.println("加密前的:" + content);
+        // 加密方法
+        String encStr = foreignAesUtil.encryptByHex(content);
+        System.out.println("加密后的内容:" + encStr);
+        // 解密方法
+        String decStr = foreignAesUtil.decryptByHex(encStr);
+        System.out.println("解密后的内容:" + decStr);
+    }
+}

+ 9 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/HttpUtils.java

@@ -0,0 +1,9 @@
+package com.yx.face.boot.uitls;
+
+
+
+
+public class HttpUtils {
+
+
+}

+ 51 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/IDCardEncryptionUtil.java

@@ -0,0 +1,51 @@
+package com.yx.face.boot.uitls;
+
+import com.alibaba.excel.util.StringUtils;
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * @ProjectName: airport-review-smoke
+ * @Package: com.yixin.review.boot.uitls
+ * @ClassName: IDCardEncryptionUtil
+ * @Author: 崔哥
+ * @Description: 身份证加密
+ * @Date: 2021/9/6 9:28
+ * @Version: 1.0
+ */
+@Slf4j
+public class IDCardEncryptionUtil {
+
+
+    // 手机号码前三后四脱敏
+    public static String mobileEncrypt(String mobile) {
+        if (StringUtils.isEmpty(mobile) || (mobile.length() != 11)) {
+            return mobile;
+        }
+        return mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
+    }
+
+    //身份证前六后四脱敏
+    public static String idEncrypt(String id) {
+        if (StringUtils.isEmpty(id) || (id.length() < 8)) {
+            return id;
+        }
+        return id.replaceAll("(?<=\\w{6})\\w(?=\\w{4})", "*");
+    }
+
+    //护照前2后3位脱敏,护照一般为8或9位
+    public static String idPassport(String id) {
+        if (StringUtils.isEmpty(id) || (id.length() < 8)) {
+            return id;
+        }
+        return id.substring(0, 2) + new String(new char[id.length() - 5]).replace("\0", "*") + id.substring(id.length() - 3);
+    }
+
+
+    public static void main(String[] args) {
+        String ino = "513722587956565455";
+        String s = idEncrypt(ino);
+        System.out.println(s);
+    }
+
+
+}

+ 137 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/IPUtils.java

@@ -0,0 +1,137 @@
+package com.yx.face.boot.uitls;
+
+
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.web.context.request.RequestContextHolder;
+import org.springframework.web.context.request.ServletRequestAttributes;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+
+@Slf4j
+public class IPUtils {
+    private final static String UNKNOWN = "unknown";
+    private final static int MAX_LENGTH = 15;
+    private static final String IP_UTILS_FLAG = ",";
+    private static final String LOCALHOST_IP = "0:0:0:0:0:0:0:1";
+    private static final String LOCALHOST_IP1 = "127.0.0.1";
+    private static final String X_ORIGINAL_FORWARDED_FOR = "X-Original-Forwarded-For";
+    private static final String X_FORWARDED_FOR = "X-Forwarded-For";
+    private static final String x_forwarded_for = "x-forwarded-for";
+    private static final String PROXY_CLIENT_IP = "Proxy-Client-IP";
+    private static final String WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP";
+    private static final String HTTP_CLIENT_IP = "HTTP_CLIENT_IP";
+    private static final String HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR";
+
+    /**
+     * 获取IP地址
+     * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
+     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
+     */
+    public static String getIP() {
+        ServletRequestAttributes requestAttributes = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
+        if (requestAttributes == null) {
+            return null;
+        }
+        HttpServletRequest request = requestAttributes.getRequest();
+        return getIP(request);
+    }
+
+
+    /**
+     * 获取IP地址
+     * <p>
+     * 使用Nginx等反向代理软件, 则不能通过request.getRemoteAddr()获取IP地址
+     * 如果使用了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP地址,X-Forwarded-For中第一个非unknown的有效IP字符串,则为真实IP地址
+     */
+    public static String getIP(HttpServletRequest request) {
+        String ip = null;
+        try {
+            //以下两个获取在k8s中,将真实的客户端IP,放到了x-Original-Forwarded-For。而将WAF的回源地址放到了 x-Forwarded-For了。
+            ip = request.getHeader(X_ORIGINAL_FORWARDED_FOR);
+
+            //X-Forwarded-For
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader(X_FORWARDED_FOR);
+            }
+            //获取nginx等代理的ip  x-forwarded-for
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader(x_forwarded_for);
+            }
+            //Proxy-Client-IP
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader(PROXY_CLIENT_IP);
+            }
+
+            //WL-Proxy-Client-IP
+            if (StringUtils.isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader(WL_PROXY_CLIENT_IP);
+            }
+
+            //HTTP_CLIENT_IP
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader(HTTP_CLIENT_IP);
+            }
+
+            //HTTP_X_FORWARDED_FOR
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader(HTTP_X_FORWARDED_FOR);
+            }
+            //兼容k8s集群获取ip
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getRemoteAddr();
+                if (LOCALHOST_IP1.equalsIgnoreCase(ip) || LOCALHOST_IP.equalsIgnoreCase(ip)) {
+                    //根据网卡取本机配置的IP
+                    try {
+                        InetAddress iNet = InetAddress.getLocalHost();
+                        ip = iNet.getHostAddress();
+                    } catch (UnknownHostException e) {
+                        log.error("getClientIp error: {}", e.getMessage());
+                    }
+                }
+            }
+        } catch (Exception e) {
+            log.error("IPUtils ERROR ", e);
+        }
+        //使用代理,则获取第一个IP地址
+        if (!StringUtils.isEmpty(ip) && ip.indexOf(IP_UTILS_FLAG) > 0) {
+            ip = ip.substring(0, ip.indexOf(IP_UTILS_FLAG));
+        }
+        return ip;
+    }
+
+
+    public static String getIpAddr(HttpServletRequest request) {
+        String ip = null;
+        try {
+            ip = request.getHeader(x_forwarded_for);
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader(PROXY_CLIENT_IP);
+            }
+            if (StringUtils.isEmpty(ip) || ip.length() == 0 || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader(WL_PROXY_CLIENT_IP);
+            }
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader(HTTP_CLIENT_IP);
+            }
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getHeader(HTTP_X_FORWARDED_FOR);
+            }
+            if (StringUtils.isEmpty(ip) || UNKNOWN.equalsIgnoreCase(ip)) {
+                ip = request.getRemoteAddr();
+            }
+        } catch (Exception e) {
+            log.error("IPUtils ERROR ", e);
+        }
+        // 使用代理,则获取第一个IP地址
+        if (!StringUtils.isEmpty(ip) && ip.length() > MAX_LENGTH) {
+            if (ip.indexOf(IP_UTILS_FLAG) > 0) {
+                ip = ip.substring(0, ip.indexOf(IP_UTILS_FLAG));
+            }
+        }
+        return LOCALHOST_IP.equals(ip) ? LOCALHOST_IP1 : ip;
+    }
+}

+ 102 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/JsonUtils.java

@@ -0,0 +1,102 @@
+package com.yx.face.boot.uitls;
+
+
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.JavaType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import  com.yx.face.boot.restful.CommonException;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TimeZone;
+
+
+public class JsonUtils {
+    private static final ObjectMapper objectMapper = new ObjectMapper();
+
+    static {
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        objectMapper.setDateFormat(sdf);
+        objectMapper.setTimeZone(TimeZone.getDefault());
+        objectMapper.setSerializationInclusion(Include.ALWAYS);
+        // 设置输入时忽略JSON字符串中存在而Java对象实际没有的属性
+        objectMapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+    }
+
+    /**
+     * 将对象转换为JSON字符串
+     */
+    public static String toJson(Object obj) {
+        if (obj == null) {
+            return null;
+        }
+        try {
+            return objectMapper.writeValueAsString(obj);
+        } catch (Exception e) {
+            throw new CommonException("对象转换为JSON字符串 异常!", e);
+        }
+    }
+
+    /**
+     * JSON字符串转换为对象 <br>
+     */
+    public static <T> T toObject(String json, Class<T> clazz) {
+        if (StringUtils.isEmpty(json)) {
+            return null;
+        }
+        try {
+            return objectMapper.readValue(json, clazz);
+        } catch (IOException e) {
+            throw new CommonException("JSON字符串转换为对象 异常!", e);
+        }
+    }
+
+    /**
+     * 将Json字符串转换成List
+     */
+    public static <T> List<T> toObjectList(Class<T> clazz, String json) {
+        if (StringUtils.isEmpty(json)) {
+            return null;
+        }
+        JavaType javaType = getCollectionType(ArrayList.class, clazz);
+        try {
+            return objectMapper.readValue(json, javaType);
+        } catch (IOException e) {
+            throw new CommonException("Json字符串转换成List 异常!", e);
+        }
+    }
+
+    /**
+     * 获取泛型的Collection Type
+     *
+     * @param collectionClass 泛型的Collection
+     * @param elementClasses  元素类
+     * @return JavaType Java类型
+     * @since 1.0
+     */
+    public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {
+        return objectMapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
+    }
+
+    /**
+     * 将JSON字符串转为Map
+     */
+    public static Map<String, Object> toMap(String json) {
+        if (StringUtils.isEmpty(json)) {
+            return null;
+        }
+        try {
+            @SuppressWarnings("unchecked")
+            Map<String, Object> maps = objectMapper.readValue(json, Map.class);//转成map
+            return maps;
+        } catch (Exception e) {
+            throw new CommonException("JSON字符串转为Map 异常!", e);
+        }
+    }
+
+}

+ 278 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/MiniOUtils.java

@@ -0,0 +1,278 @@
+package com.yx.face.boot.uitls;
+
+
+import io.minio.*;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.stereotype.Component;
+
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+
+/**
+ * @ProjectName: fyzd-phone
+ * @Package: com.yx.face.boot.uitls
+ * @ClassName: MiniOUtils
+ * @Author: 崔哥
+ * @Description:
+ * @Date: 2021/11/24 11:27
+ * @Version: 1.0
+ */
+@Component
+public class MiniOUtils {
+
+//    /**
+//     * ACCESS_KEY
+//     */
+//    private static String MINIO_ACCESS_KEY = "admin";
+//
+//    /**
+//     * 服务器路径
+//     */
+//    private static String MINIO_PATH_URL = "127.0.0.1:9000";
+//
+//    /**
+//     * 文件存储块
+//     */
+//    private static String MINIO_OSS_BUCKET = "hanghui";
+//
+//    /**
+//     * SECRET_KEY
+//     */
+//    private static String MINIO_SECRET_KEY = "nqj##3961";
+//
+//    /**
+//     * REGION
+//     */
+//    private static String MINIO_REGION;
+
+
+    private static String minioUrl;
+    private static String minioName;
+    private static String minioPass;
+    private static String bucketName;
+
+    public static void setMinioUrl(String minioUrl) {
+        MiniOUtils.minioUrl = minioUrl;
+    }
+
+    public static void setMinioName(String minioName) {
+        MiniOUtils.minioName = minioName;
+    }
+
+    public static void setMinioPass(String minioPass) {
+        MiniOUtils.minioPass = minioPass;
+    }
+
+    public static void setBucketName(String bucketName) {
+        MiniOUtils.bucketName = bucketName;
+    }
+
+    public static String getMinioUrl() {
+        return minioUrl;
+    }
+
+    public static String getBucketName() {
+        return bucketName;
+    }
+
+
+    /**
+     * 构建连接客户端
+     */
+    public static MinioClient minioClient = null;
+
+
+    /**
+     * 创建桶
+     *
+     * @param bucket 桶
+     */
+    public static void makeBucket(String bucket) throws Exception {
+        initMinio(minioUrl, minioName, minioPass);
+        // 判断桶是否存在
+        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucket).build());
+        if (!isExist) {
+            // 新建桶
+            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucket).build());
+        }
+    }
+
+
+    /**
+     * 通过二进制流上传到MiniO存储
+     *
+     * @param inputStream 文件
+     * @param fileName    文件名
+     * @return
+     */
+    public static String fileUpload2MiniO(InputStream inputStream, String fileName) {
+        initMinio(minioUrl, minioName, minioPass);
+        try {
+            boolean exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+            if (!exists) {
+                //不存在就创建一个新的BUCKET
+                makeBucket(bucketName);
+            }
+            String contentType = getcontentType(fileName);
+            minioClient.putObject(PutObjectArgs.builder().bucket(bucketName)
+                    .object(fileName)
+                    .stream(inputStream, Long.valueOf(inputStream.available()), -1l)
+                    .contentType(contentType).build());
+        } catch (Exception e) {
+            new RuntimeException("上传发生错误!");
+        }
+        return minioUrl + bucketName + "/" + fileName;
+    }
+
+    /**
+     * 文件下载
+     *
+     * @param fileName 文件名
+     * @return InputStream
+     */
+    public static InputStream downLoadFile(String fileName) {
+        initMinio(minioUrl, minioName, minioPass);
+        InputStream inputStream = null;
+        try {
+            StatObjectResponse statObjectResponse = minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(fileName).build());
+            if (statObjectResponse.size() > 0) {
+                inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(bucketName).object(fileName).build());
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return inputStream;
+    }
+
+    /**
+     * 删除文件
+     *
+     * @param fileName
+     * @return flag
+     */
+    public static Boolean removeFile(String fileName) {
+        initMinio(minioUrl, minioName, minioPass);
+        boolean flag = false;
+        try {
+            minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
+            flag = true;
+        } catch (Exception e) {
+            e.printStackTrace();
+            flag = false;
+        }
+        return flag;
+    }
+
+
+    /**
+     * 删除桶(只有当桶中没有数据的时候才能删除)
+     *
+     * @param bucketName
+     * @return
+     */
+    public static boolean removeBucket(String bucketName) {
+        initMinio(minioUrl, minioName, minioPass);
+        boolean exists = false;
+        try {
+            exists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
+            if (exists) {
+                minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());
+                exists = true;
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return exists;
+    }
+
+    /**
+     * 获取日期
+     *
+     * @return 例: 20210506
+     */
+    public static String getToDay() {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyyddMM");
+        return formatter.format(System.currentTimeMillis());
+    }
+
+    /**
+     * 判断文件名是否带盘符,重新处理
+     *
+     * @param fileName
+     * @return
+     */
+    public static String getFileName(String fileName) {
+        //判断是否带有盘符信息
+        // Check for Unix-style path
+        int unixSep = fileName.lastIndexOf('/');
+        // Check for Windows-style path
+        int winSep = fileName.lastIndexOf('\\');
+        // Cut off at latest possible point
+        int pos = (winSep > unixSep ? winSep : unixSep);
+        if (pos != -1) {
+            // Any sort of path separator found...
+            fileName = fileName.substring(pos + 1);
+        }
+        //替换上传文件名字的特殊字符
+        fileName = fileName.replace("=", "").replace(",", "").replace("&", "").replace("#", "");
+        return fileName;
+    }
+
+    /**
+     * Description: 判断OSS服务文件上传时文件的contentType
+     *
+     * @param FilenameExtension 文件后缀
+     * @return String
+     */
+    public static String getcontentType(String FilenameExtension) {
+        if ("bmp".equalsIgnoreCase(FilenameExtension)) {
+            return "image/bmp";
+        }
+        if ("gif".equalsIgnoreCase(FilenameExtension)) {
+            return "image/gif";
+        }
+        if ("jpeg".equalsIgnoreCase(FilenameExtension) ||
+                "jpg".equalsIgnoreCase(FilenameExtension) ||
+                "png".equalsIgnoreCase(FilenameExtension)) {
+            return "image/jpeg";
+        }
+        if ("html".equalsIgnoreCase(FilenameExtension)) {
+            return "text/html";
+        }
+        if ("txt".equalsIgnoreCase(FilenameExtension)) {
+            return "text/plain";
+        }
+        if ("vsd".equalsIgnoreCase(FilenameExtension)) {
+            return "application/vnd.visio";
+        }
+        if ("pptx".equalsIgnoreCase(FilenameExtension) ||
+                "ppt".equalsIgnoreCase(FilenameExtension)) {
+            return "application/vnd.ms-powerpoint";
+        }
+        if ("docx".equalsIgnoreCase(FilenameExtension) ||
+                "doc".equalsIgnoreCase(FilenameExtension)) {
+            return "application/msword";
+        }
+        if ("xml".equalsIgnoreCase(FilenameExtension)) {
+            return "text/xml";
+        }
+        return "image/jpeg";
+    }
+
+    /**
+     * 初始化客户端
+     *
+     * @param minioUrl
+     * @param minioName
+     * @param minioPass
+     * @return
+     */
+    private static MinioClient initMinio(String minioUrl, String minioName, String minioPass) {
+        if (minioClient == null) {
+            minioClient = MinioClient.builder().endpoint(minioUrl).credentials(minioName, minioPass).build();
+        }
+        return minioClient;
+    }
+}

+ 299 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/NumUtils.java

@@ -0,0 +1,299 @@
+package com.yx.face.boot.uitls;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Random;
+import java.util.UUID;
+
+/**
+ * @description: ArabicNumToChineseNumUtil <br>
+ * @date: 2020/1/7 16:06 <br>
+ * @author: PWB <br>
+ * @version: 1.0 <br>
+ */
+@Slf4j
+public class NumUtils {
+    private static Random rand;
+
+    static {
+        rand = new Random();
+    }
+
+    /**
+     * 单位进位,中文默认为4位即(万、亿)
+     */
+    public static final int UNIT_STEP = 4;
+
+    /**
+     * 单位
+     */
+    public static final String[] CN_UNITS = new String[]{"个", "十", "百", "千", "万", "十",
+            "百", "千", "亿", "十", "百", "千", "万"};
+
+    /**
+     * 汉字
+     */
+    public static final String[] CN_CHARS = new String[]{"零", "一", "二", "三", "四",
+            "五", "六", "七", "八", "九"};
+
+
+    /**
+     * @param srcNum 需要转换的数值 <br>
+     * @return java.lang.String <br>
+     * @description: getCNNum 将阿拉伯数字转换为中文数字123=》一二三 <br>
+     * @version: 1.0 <br>
+     * @date: 2020/1/8 9:41 <br>
+     */
+    public static String getCNNum(int srcNum) {
+        StringBuilder desCNNum = new StringBuilder();
+
+        if (srcNum <= 0)
+            desCNNum = new StringBuilder("零");
+        else {
+            int singleDigit;
+            while (srcNum > 0) {
+                singleDigit = srcNum % 10;
+                desCNNum.insert(0, CN_CHARS[singleDigit]);
+                srcNum /= 10;
+            }
+        }
+        return desCNNum.toString();
+    }
+
+
+    /**
+     * @param num 需要转换的数值 <br>
+     * @return java.lang.String <br>
+     * @description: cvt  数值转换为中文字符串 如2转化为贰 <br>
+     * @version: 1.0 <br>
+     * @date: 2020/1/8 9:38 <br>
+     */
+    public static String cvt(long num) {
+        return cvt(num, false);
+    }
+
+
+    /**
+     * @param num          需要转换的数值
+     * @param isColloquial 是否口语化。例如12转换为'十二'而不是'一十二' <br>
+     * @return java.lang.String <br>
+     * @description: cvt  数值转换为中文字符串(口语化) <br>
+     * @version: 1.0 <br>
+     * @date: 2020/1/8 9:38 <br>
+     */
+    public static String cvt(String num, boolean isColloquial) {
+        int integer, decimal;
+        StringBuilder stringBuilder = new StringBuilder(32);
+        String[] splitNum = num.split("\\.");
+        integer = Integer.parseInt(splitNum[0]);    //整数部分
+        decimal = Integer.parseInt(splitNum[1]);    //小数部分
+        String[] result_1 = convert(integer, isColloquial);
+        for (String str1 : result_1)
+            stringBuilder.append(str1);
+        if (decimal == 0) {//小数部分为0时
+            return stringBuilder.toString();
+        }
+        String result_2 = getCNNum(decimal);  //例如5.32,小数部分展示三二,而不是三十二
+        stringBuilder.append("点");
+        stringBuilder.append(result_2);
+        return stringBuilder.toString();
+
+    }
+
+    /**
+     * @param num          需要转换的数值
+     * @param isColloquial 是否口语化。例如12转换为'十二'而不是'一十二' <br>
+     * @return java.lang.String <br>
+     * @description: cvt 对于int,long类型的数据处理 <br>
+     * @version: 1.0 <br>
+     * @date: 2020/1/8 9:39 <br>
+     */
+    public static String cvt(long num, boolean isColloquial) {
+        String[] result = convert(num, isColloquial);
+        StringBuilder stringBuilder = new StringBuilder(32);
+        for (String str : result) {
+            stringBuilder.append(str);
+        }
+        return stringBuilder.toString();
+    }
+
+
+    /**
+     * @param num          需要转换的数值
+     * @param isColloquial 是否口语化。例如12转换为'十二'而不是'一十二'。 <br>
+     * @return java.lang.String[] <br>
+     * @description: convert  将数值转换为中文 <br>
+     * @version: 1.0 <br>
+     * @date: 2020/1/8 9:40 <br>
+     */
+    public static String[] convert(long num, boolean isColloquial) {
+        if (num < 10) {// 10以下直接返回对应汉字
+            return new String[]{CN_CHARS[(int) num]};// ASCII2int
+        }
+
+        char[] chars = String.valueOf(num).toCharArray();
+        if (chars.length > CN_UNITS.length) {// 超过单位表示范围的返回空
+            return new String[]{};
+        }
+
+        boolean isLastUnitStep = false;// 记录上次单位进位
+        ArrayList<String> cnChars = new ArrayList<>(chars.length * 2);// 创建数组,将数字填入单位对应的位置
+        for (int pos = chars.length - 1; pos >= 0; pos--) {// 从低位向高位循环
+            char ch = chars[pos];
+            String cnChar = CN_CHARS[ch - '0'];// ascii2int 汉字
+            int unitPos = chars.length - pos - 1;// 对应的单位坐标
+            String cnUnit = CN_UNITS[unitPos];// 单位
+            boolean isZero = (ch == '0');// 是否为0
+            boolean isZeroLow = (pos + 1 < chars.length && chars[pos + 1] == '0');// 是否低位为0
+
+            boolean isUnitStep = (unitPos >= UNIT_STEP && (unitPos % UNIT_STEP == 0));// 当前位是否需要单位进位
+
+            if (isUnitStep && isLastUnitStep) {// 去除相邻的上一个单位进位
+                int size = cnChars.size();
+                cnChars.remove(size - 1);
+                if (!CN_CHARS[0].equals(cnChars.get(size - 2))) {// 补0
+                    cnChars.add(CN_CHARS[0]);
+                }
+            }
+
+            if (isUnitStep || !isZero) {// 单位进位(万、亿),或者非0时加上单位
+                cnChars.add(cnUnit);
+                isLastUnitStep = isUnitStep;
+            }
+            if (isZero && (isZeroLow || isUnitStep)) {// 当前位为0低位为0,或者当前位为0并且为单位进位时进行省略
+                continue;
+            }
+            cnChars.add(cnChar);
+            isLastUnitStep = false;
+        }
+
+        Collections.reverse(cnChars);
+        // 清除最后一位的0
+        int chSize = cnChars.size();
+        String chEnd = cnChars.get(chSize - 1);
+        if (CN_CHARS[0].equals(chEnd) || CN_UNITS[0].equals(chEnd)) {
+            cnChars.remove(chSize - 1);
+        }
+
+        // 口语化处理
+        if (isColloquial) {
+            String chFirst = cnChars.get(0);
+            String chSecond = cnChars.get(1);
+            if (chFirst.equals(CN_CHARS[1]) && chSecond.startsWith(CN_UNITS[1])) {// 是否以'一'开头,紧跟'十'
+                cnChars.remove(0);
+            }
+        }
+        return cnChars.toArray(new String[]{});
+    }
+
+
+    /**
+     * @param chineseStr 字符串 <br>
+     * @return boolean <br>
+     * @description: isChineseNum 判断传入的字符串是否全是汉字数字 <br>
+     * @date: 2020/1/7 16:19 <br>
+     */
+    public static boolean isChineseNum(String chineseStr) {
+        final String allChineseNum = "零一二三四五六七八九十百千万亿";
+        char[] ch = chineseStr.toCharArray();
+        for (char c : ch) {
+            if (!allChineseNum.contains(String.valueOf(c))) {
+                return false;
+            }
+        }
+        return true;
+    }
+
+    /**
+     * @param str 待验证的字符串 <br>
+     * @return boolean <br>
+     * @description: isNum  判断数字字符串是否是整数字符串 <br>
+     * @date: 2020/1/7 16:20 <br>
+     */
+    public static boolean isNum(String str) {
+        String reg = "[0-9]+";
+        return str.matches(reg);
+    }
+
+
+    /**
+     * 生成一批用户帐号
+     */
+    public static String getUUID() {
+        return UUID.randomUUID().toString().replace("-", "");
+    }
+
+    /**
+     * 随机获取一个小写字母
+     */
+    public static char getLetter() {
+        return (char) getRandomInt(97, 122);
+    }
+
+    /**
+     * 随机获取一个大写字母
+     */
+    public static char getUpper() {
+        return (char) getRandomInt(65, 90);
+    }
+
+    /**
+     * 随机获取一个0-9的数字
+     */
+    public static int getNum() {
+        return getRandomInt(0, 9);
+    }
+
+    /**
+     * 获取一个范围内的随机数字
+     */
+    public static int getRandomInt(int min, int max) {
+        return rand.nextInt(max - min + 1) + min;
+    }
+
+
+    public static String getPercentage(int num1, int num2) {
+        if (num1 == 0) {
+            return "0.00%";
+        }
+        if (num2 == 0) {
+            if (num1 > 0) {
+                return "100.00%";
+            }
+            return "0.00%";
+        }
+        DecimalFormat format = new DecimalFormat("###0.00%");
+        format.setMaximumFractionDigits(2);
+        return format.format((double) num1 / (double) num2);
+    }
+
+
+    public static String getPercentage(BigDecimal num1, BigDecimal num2) {
+        BigDecimal fa = BigDecimal.ZERO;
+        int compare1 = num1.compareTo(fa);
+        int compare2 = num2.compareTo(fa);
+        if (compare1 == 0) {
+            return "0.00%";
+        }
+        if (compare2 == 0) {
+            if (compare1 > 0) {
+                return "100.00%";
+            }
+            return "0.00%";
+        }
+        fa = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
+        return getPercentage(fa);
+    }
+
+
+    public static String getPercentage(BigDecimal fa) {
+        DecimalFormat format = new DecimalFormat("###0.00%");
+        format.setMaximumFractionDigits(2);
+        return format.format(fa.doubleValue());
+    }
+
+}

+ 315 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/OkHttpUtils.java

@@ -0,0 +1,315 @@
+package com.yx.face.boot.uitls;
+
+import com.alibaba.fastjson.JSON;
+import lombok.extern.slf4j.Slf4j;
+import okhttp3.*;
+
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.X509TrustManager;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.security.SecureRandom;
+import java.security.cert.X509Certificate;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @ProjectName: airport-review-smoke
+ * @Package: com.yixin.review.boot.uitls
+ * @ClassName: OkHttpUtils
+ * @Author: 崔哥
+ * @Description:
+ * @Date: 2021/9/3 18:22
+ * @Version: 1.0
+ */
+@Slf4j
+public class OkHttpUtils {
+    private static volatile OkHttpClient okHttpClient = null;
+    private static volatile Semaphore semaphore = null;
+    private Map<String, String> headerMap;
+    private Map<String, String> paramMap;
+    private String url;
+    private Request.Builder request;
+
+    /**
+     * 初始化okHttpClient,并且允许https访问
+     */
+    private OkHttpUtils() {
+        if (okHttpClient == null) {
+            synchronized (OkHttpUtils.class) {
+                if (okHttpClient == null) {
+                    TrustManager[] trustManagers = buildTrustManagers();
+                    okHttpClient = new OkHttpClient.Builder()
+                            .connectTimeout(15, TimeUnit.SECONDS)
+                            .writeTimeout(20, TimeUnit.SECONDS)
+                            .readTimeout(20, TimeUnit.SECONDS)
+                            .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
+                            .hostnameVerifier((hostName, session) -> true)
+                            .retryOnConnectionFailure(true)
+                            .build();
+                    addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
+                }
+            }
+        }
+    }
+
+    /**
+     * 用于异步请求时,控制访问线程数,返回结果
+     *
+     * @return
+     */
+    private static Semaphore getSemaphoreInstance() {
+        //只能1个线程同时访问
+        synchronized (OkHttpUtils.class) {
+            if (semaphore == null) {
+                semaphore = new Semaphore(0);
+            }
+        }
+        return semaphore;
+    }
+
+    /**
+     * 创建OkHttpUtils
+     *
+     * @return
+     */
+    public static OkHttpUtils builder() {
+        return new OkHttpUtils();
+    }
+
+    /**
+     * 添加url
+     *
+     * @param url
+     * @return
+     */
+    public OkHttpUtils url(String url) {
+        this.url = url;
+        return this;
+    }
+
+    /**
+     * 添加参数
+     *
+     * @param key   参数名
+     * @param value 参数值
+     * @return
+     */
+    public OkHttpUtils addParam(String key, String value) {
+        if (paramMap == null) {
+            paramMap = new LinkedHashMap<>(16);
+        }
+        paramMap.put(key, value);
+        return this;
+    }
+
+    /**
+     * 添加请求头
+     *
+     * @param key   参数名
+     * @param value 参数值
+     * @return
+     */
+    public OkHttpUtils addHeader(String key, String value) {
+        if (headerMap == null) {
+            headerMap = new LinkedHashMap<>(16);
+        }
+        headerMap.put(key, value);
+        return this;
+    }
+
+    /**
+     * 初始化get方法
+     *
+     * @return
+     */
+    public OkHttpUtils get() {
+        request = new Request.Builder().get();
+        StringBuilder urlBuilder = new StringBuilder(url);
+        if (paramMap != null) {
+            urlBuilder.append("?");
+            try {
+                for (Map.Entry<String, String> entry : paramMap.entrySet()) {
+                    urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).
+                            append("=").
+                            append(URLEncoder.encode(entry.getValue(), "utf-8")).
+                            append("&");
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+            urlBuilder.deleteCharAt(urlBuilder.length() - 1);
+        }
+        request.url(urlBuilder.toString());
+        return this;
+    }
+
+    /**
+     * 初始化post方法
+     *
+     * @param isJsonPost true等于json的方式提交数据,类似postman里post方法的raw
+     *                   false等于普通的表单提交
+     * @return
+     */
+    public OkHttpUtils post(boolean isJsonPost) {
+        RequestBody requestBody;
+        if (isJsonPost) {
+            String json = "";
+            if (paramMap != null) {
+                json = JSON.toJSONString(paramMap);
+            }
+            requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
+        } else {
+            FormBody.Builder formBody = new FormBody.Builder();
+            if (paramMap != null) {
+                paramMap.forEach(formBody::add);
+            }
+            requestBody = formBody.build();
+            log.info("requestBody;", requestBody);
+        }
+        request = new Request.Builder().post(requestBody).url(url);
+        return this;
+    }
+
+    public OkHttpUtils localPost(String json) {
+        RequestBody requestBody;
+        requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
+        request = new Request.Builder().post(requestBody).url(url);
+        return this;
+    }
+
+    /**
+     * 同步请求
+     *
+     * @return
+     */
+    public String sync() {
+        setHeader(request);
+        try {
+            Response response = okHttpClient.newCall(request.build()).execute();
+            assert response.body() != null;
+            return response.body().string();
+        } catch (IOException e) {
+            e.printStackTrace();
+            return "请求失败:" + e.getMessage();
+        }
+    }
+
+    /**
+     * 异步请求,有返回值
+     */
+    public String async() {
+        StringBuilder buffer = new StringBuilder("");
+        setHeader(request);
+        okHttpClient.newCall(request.build()).enqueue(new Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+                buffer.append("请求出错:").append(e.getMessage());
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                assert response.body() != null;
+                buffer.append(response.body().string());
+                getSemaphoreInstance().release();
+            }
+        });
+        try {
+            getSemaphoreInstance().acquire();
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+        return buffer.toString();
+    }
+
+    /**
+     * 异步请求,带有接口回调
+     *
+     * @param callBack
+     */
+    public void async(ICallBack callBack) {
+        setHeader(request);
+        okHttpClient.newCall(request.build()).enqueue(new Callback() {
+            @Override
+            public void onFailure(Call call, IOException e) {
+                callBack.onFailure(call, e.getMessage());
+            }
+
+            @Override
+            public void onResponse(Call call, Response response) throws IOException {
+                assert response.body() != null;
+                callBack.onSuccessful(call, response.body().string());
+            }
+        });
+    }
+
+    /**
+     * 为request添加请求头
+     *
+     * @param request
+     */
+    private void setHeader(Request.Builder request) {
+        if (headerMap != null) {
+            try {
+                for (Map.Entry<String, String> entry : headerMap.entrySet()) {
+                    request.addHeader(entry.getKey(), entry.getValue());
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+
+
+    /**
+     * 生成安全套接字工厂,用于https请求的证书跳过
+     *
+     * @return
+     */
+    private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {
+        SSLSocketFactory ssfFactory = null;
+        try {
+            SSLContext sc = SSLContext.getInstance("SSL");
+            sc.init(null, trustAllCerts, new SecureRandom());
+            ssfFactory = sc.getSocketFactory();
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return ssfFactory;
+    }
+
+    private static TrustManager[] buildTrustManagers() {
+        return new TrustManager[]{
+                new X509TrustManager() {
+                    @Override
+                    public void checkClientTrusted(X509Certificate[] chain, String authType) {
+                    }
+
+                    @Override
+                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
+                    }
+
+                    @Override
+                    public X509Certificate[] getAcceptedIssuers() {
+                        return new X509Certificate[]{};
+                    }
+                }
+        };
+    }
+
+    /**
+     * 自定义一个接口回调
+     */
+    public interface ICallBack {
+
+        void onSuccessful(Call call, String data);
+
+        void onFailure(Call call, String errorMsg);
+
+    }
+
+}

+ 207 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/QRCodeUtil.java

@@ -0,0 +1,207 @@
+/**
+ * Copyright (C), 2018-2019, XXX有限公司
+ * FileName: QRCodeUtil
+ * Author:   pwb
+ * Date:     2019/7/13 9:16
+ * Description: QRCodeUtil
+ * History:
+ * <author>          <time>          <version>          <desc>
+ * frank           修改时间           1.0.0              ycypApp
+ */
+package com.yx.face.boot.uitls;
+
+
+import com.google.zxing.*;
+import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.common.HybridBinarizer;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletResponse;
+import java.awt.*;
+import java.awt.geom.RoundRectangle2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.OutputStream;
+import java.util.HashMap;
+import java.util.Hashtable;
+import java.util.Map;
+
+public class QRCodeUtil {
+    private static final String CHARSET = "utf-8";
+    private static final String FORMAT_NAME = "JPG";
+    // 二维码尺寸
+    private static final int QRCODE_SIZE = 300;
+    // LOGO宽度
+    private static final int WIDTH = 60;
+    // LOGO高度
+    private static final int HEIGHT = 60;
+
+    private static BufferedImage createImage(String content, String imgPath, boolean needCompress) throws Exception {
+        Hashtable hints = new Hashtable();
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
+        hints.put(EncodeHintType.MARGIN, 1);
+        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
+                hints);
+        int width = bitMatrix.getWidth();
+        int height = bitMatrix.getHeight();
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        for (int x = 0; x < width; x++) {
+            for (int y = 0; y < height; y++) {
+                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
+            }
+        }
+        if (imgPath == null || "".equals(imgPath)) {
+            return image;
+        }
+        // 插入图片
+        QRCodeUtil.insertImage(image, imgPath, needCompress);
+        return image;
+    }
+
+    private static void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {
+        File file = new File(imgPath);
+        if (!file.exists()) {
+            System.err.println("" + imgPath + "   该文件不存在!");
+            return;
+        }
+        Image src = ImageIO.read(new File(imgPath));
+        int width = src.getWidth(null);
+        int height = src.getHeight(null);
+        if (needCompress) { // 压缩LOGO
+            if (width > WIDTH) {
+                width = WIDTH;
+            }
+            if (height > HEIGHT) {
+                height = HEIGHT;
+            }
+            Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
+            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+            Graphics g = tag.getGraphics();
+            g.drawImage(image, 0, 0, null); // 绘制缩小后的图
+            g.dispose();
+            src = image;
+        }
+        // 插入LOGO
+        Graphics2D graph = source.createGraphics();
+        int x = (QRCODE_SIZE - width) / 2;
+        int y = (QRCODE_SIZE - height) / 2;
+        graph.drawImage(src, x, y, width, height, null);
+        Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
+        graph.setStroke(new BasicStroke(3f));
+        graph.draw(shape);
+        graph.dispose();
+    }
+
+
+    public static void encode(String content, String imgPath, String destPath, boolean needCompress) throws Exception {
+        BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
+        mkdirs(destPath);
+        // String file = new Random().nextInt(99999999)+".jpg";
+        // ImageIO.write(image, FORMAT_NAME, new File(destPath+"/"+file));
+        ImageIO.write(image, FORMAT_NAME, new File(destPath));
+    }
+
+
+
+    public static BufferedImage encode(String content, String imgPath, boolean needCompress) throws Exception {
+        BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
+        return image;
+    }
+
+
+
+    public static void mkdirs(String destPath) {
+        File file = new File(destPath);
+        // 当文件夹不存在时,mkdirs会自动创建多层目录,区别于mkdir.(mkdir如果父目录不存在则会抛出异常)
+        if (!file.exists() && !file.isDirectory()) {
+            file.mkdirs();
+        }
+    }
+
+
+
+    public static void encode(String content, String imgPath, String destPath) throws Exception {
+        QRCodeUtil.encode(content, imgPath, destPath, false);
+    }
+    // 被注释的方法
+    /*
+     * public static void encode(String content, String destPath, boolean
+     * needCompress) throws Exception { QRCodeUtil.encode(content, null, destPath,
+     * needCompress); }
+     */
+
+
+    public static void encode(String content, String destPath) throws Exception {
+        QRCodeUtil.encode(content, null, destPath, false);
+    }
+
+
+    public static void encode(String content, String imgPath, OutputStream output, boolean needCompress)
+            throws Exception {
+        BufferedImage image = QRCodeUtil.createImage(content, imgPath, needCompress);
+        ImageIO.write(image, FORMAT_NAME, output);
+    }
+
+
+
+    public static void encode(String content, OutputStream output) throws Exception {
+        QRCodeUtil.encode(content, null, output, false);
+    }
+
+
+
+    public static String decode(File file) throws Exception {
+        BufferedImage image;
+        image = ImageIO.read(file);
+        if (image == null) {
+            return null;
+        }
+        BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
+        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
+        Result result;
+        Hashtable hints = new Hashtable();
+        hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
+        result = new MultiFormatReader().decode(bitmap, hints);
+        String resultStr = result.getText();
+        return resultStr;
+    }
+
+
+    public static String decode(String path) throws Exception {
+        return QRCodeUtil.decode(new File(path));
+    }
+
+
+
+    public static BitMatrix generateQRCodeStream(String content, HttpServletResponse response) {
+        //给相应添加头部信息,主要告诉浏览器返回的是图片流
+        response.setHeader("Cache-Control", "no-store");
+        // 不设置缓存
+        response.setHeader("Pragma", "no-cache");
+        response.setDateHeader("Expires", 0);
+        response.setContentType("image/png");
+        //设置图片的文字编码以及内边框
+        Map<EncodeHintType, Object> hints = new HashMap<>();
+        //编码
+        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+        //边框距
+        hints.put(EncodeHintType.MARGIN, 0);
+
+
+        BitMatrix bitMatrix;
+        try {
+            //参数分别为:编码内容、编码类型、图片宽度、图片高度,设置参数
+            bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, 300, 300, hints);
+        } catch (WriterException e) {
+            e.printStackTrace();
+            return null;
+        }
+        return bitMatrix;
+
+    }
+
+
+}

+ 647 - 0
fyzd-phone/src/main/java/com/yx/face/boot/uitls/oConvertUtils.java

@@ -0,0 +1,647 @@
+package com.yx.face.boot.uitls;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Field;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.UnknownHostException;
+import java.sql.Date;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 
+ * @Author  张代浩
+ *
+ */
+@Slf4j
+public class oConvertUtils {
+	public static boolean isEmpty(Object object) {
+		if (object == null) {
+			return (true);
+		}
+		if ("".equals(object)) {
+			return (true);
+		}
+		if ("null".equals(object)) {
+			return (true);
+		}
+		return (false);
+	}
+	
+	public static boolean isNotEmpty(Object object) {
+		if (object != null && !object.equals("") && !object.equals("null")) {
+			return (true);
+		}
+		return (false);
+	}
+
+	public static String decode(String strIn, String sourceCode, String targetCode) {
+		String temp = code2code(strIn, sourceCode, targetCode);
+		return temp;
+	}
+
+	public static String StrToUTF(String strIn, String sourceCode, String targetCode) {
+		strIn = "";
+		try {
+			strIn = new String(strIn.getBytes("ISO-8859-1"), "GBK");
+		} catch (UnsupportedEncodingException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		return strIn;
+
+	}
+
+	private static String code2code(String strIn, String sourceCode, String targetCode) {
+		String strOut = null;
+		if (strIn == null || (strIn.trim()).equals("")) {
+			return strIn;
+		}
+		try {
+			byte[] b = strIn.getBytes(sourceCode);
+			for (int i = 0; i < b.length; i++) {
+				System.out.print(b[i] + "  ");
+			}
+			strOut = new String(b, targetCode);
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		}
+		return strOut;
+	}
+
+	public static int getInt(String s, int defval) {
+		if (s == null || s == "") {
+			return (defval);
+		}
+		try {
+			return (Integer.parseInt(s));
+		} catch (NumberFormatException e) {
+			return (defval);
+		}
+	}
+
+	public static int getInt(String s) {
+		if (s == null || s == "") {
+			return 0;
+		}
+		try {
+			return (Integer.parseInt(s));
+		} catch (NumberFormatException e) {
+			return 0;
+		}
+	}
+
+	public static int getInt(String s, Integer df) {
+		if (s == null || s == "") {
+			return df;
+		}
+		try {
+			return (Integer.parseInt(s));
+		} catch (NumberFormatException e) {
+			return 0;
+		}
+	}
+
+	public static Integer[] getInts(String[] s) {
+		Integer[] integer = new Integer[s.length];
+		if (s == null) {
+			return null;
+		}
+		for (int i = 0; i < s.length; i++) {
+			integer[i] = Integer.parseInt(s[i]);
+		}
+		return integer;
+
+	}
+
+	public static double getDouble(String s, double defval) {
+		if (s == null || s == "") {
+			return (defval);
+		}
+		try {
+			return (Double.parseDouble(s));
+		} catch (NumberFormatException e) {
+			return (defval);
+		}
+	}
+
+	public static double getDou(Double s, double defval) {
+		if (s == null) {
+			return (defval);
+		}
+		return s;
+	}
+
+	/*public static Short getShort(String s) {
+		if (StringUtil.isNotEmpty(s)) {
+			return (Short.parseShort(s));
+		} else {
+			return null;
+		}
+	}*/
+
+	public static int getInt(Object object, int defval) {
+		if (isEmpty(object)) {
+			return (defval);
+		}
+		try {
+			return (Integer.parseInt(object.toString()));
+		} catch (NumberFormatException e) {
+			return (defval);
+		}
+	}
+	
+	public static Integer getInt(Object object) {
+		if (isEmpty(object)) {
+			return null;
+		}
+		try {
+			return (Integer.parseInt(object.toString()));
+		} catch (NumberFormatException e) {
+			return null;
+		}
+	}
+
+	public static int getInt(BigDecimal s, int defval) {
+		if (s == null) {
+			return (defval);
+		}
+		return s.intValue();
+	}
+
+	public static Integer[] getIntegerArry(String[] object) {
+		int len = object.length;
+		Integer[] result = new Integer[len];
+		try {
+			for (int i = 0; i < len; i++) {
+				result[i] = new Integer(object[i].trim());
+			}
+			return result;
+		} catch (NumberFormatException e) {
+			return null;
+		}
+	}
+
+	public static String getString(String s) {
+		return (getString(s, ""));
+	}
+
+	/**
+	 * 转义成Unicode编码
+	 * @param s
+	 * @return
+	 */
+	/*public static String escapeJava(Object s) {
+		return StringEscapeUtils.escapeJava(getString(s));
+	}*/
+	
+	public static String getString(Object object) {
+		if (isEmpty(object)) {
+			return "";
+		}
+		return (object.toString().trim());
+	}
+
+	public static String getString(int i) {
+		return (String.valueOf(i));
+	}
+
+	public static String getString(float i) {
+		return (String.valueOf(i));
+	}
+
+	public static String getString(String s, String defval) {
+		if (isEmpty(s)) {
+			return (defval);
+		}
+		return (s.trim());
+	}
+
+	public static String getString(Object s, String defval) {
+		if (isEmpty(s)) {
+			return (defval);
+		}
+		return (s.toString().trim());
+	}
+
+	public static long stringToLong(String str) {
+		Long test = new Long(0);
+		try {
+			test = Long.valueOf(str);
+		} catch (Exception e) {
+		}
+		return test.longValue();
+	}
+
+	/**
+	 * 获取本机IP
+	 */
+	public static String getIp() {
+		String ip = null;
+		try {
+			InetAddress address = InetAddress.getLocalHost();
+			ip = address.getHostAddress();
+
+		} catch (UnknownHostException e) {
+			e.printStackTrace();
+		}
+		return ip;
+	}
+
+	/**
+	 * 判断一个类是否为基本数据类型。
+	 * 
+	 * @param clazz
+	 *            要判断的类。
+	 * @return true 表示为基本数据类型。
+	 */
+	private static boolean isBaseDataType(Class clazz) throws Exception {
+		return (clazz.equals(String.class) || clazz.equals(Integer.class) || clazz.equals(Byte.class) || clazz.equals(Long.class) || clazz.equals(Double.class) || clazz.equals(Float.class) || clazz.equals(Character.class) || clazz.equals(Short.class) || clazz.equals(BigDecimal.class) || clazz.equals(BigInteger.class) || clazz.equals(Boolean.class) || clazz.equals(Date.class) || clazz.isPrimitive());
+	}
+
+	/**
+	 * @param request
+	 *            IP
+	 * @return IP Address
+	 */
+	public static String getIpAddrByRequest(HttpServletRequest request) {
+		String ip = request.getHeader("x-forwarded-for");
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getHeader("WL-Proxy-Client-IP");
+		}
+		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+			ip = request.getRemoteAddr();
+		}
+		return ip;
+	}
+
+	/**
+	 * @return 本机IP
+	 * @throws SocketException
+	 */
+	public static String getRealIp() throws SocketException {
+		String localip = null;// 本地IP,如果没有配置外网IP则返回它
+		String netip = null;// 外网IP
+
+		Enumeration<NetworkInterface> netInterfaces = NetworkInterface.getNetworkInterfaces();
+		InetAddress ip = null;
+		boolean finded = false;// 是否找到外网IP
+		while (netInterfaces.hasMoreElements() && !finded) {
+			NetworkInterface ni = netInterfaces.nextElement();
+			Enumeration<InetAddress> address = ni.getInetAddresses();
+			while (address.hasMoreElements()) {
+				ip = address.nextElement();
+				if (!ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 外网IP
+					netip = ip.getHostAddress();
+					finded = true;
+					break;
+				} else if (ip.isSiteLocalAddress() && !ip.isLoopbackAddress() && ip.getHostAddress().indexOf(":") == -1) {// 内网IP
+					localip = ip.getHostAddress();
+				}
+			}
+		}
+
+		if (netip != null && !"".equals(netip)) {
+			return netip;
+		} else {
+			return localip;
+		}
+	}
+
+	/**
+	 * java去除字符串中的空格、回车、换行符、制表符
+	 * 
+	 * @param str
+	 * @return
+	 */
+	public static String replaceBlank(String str) {
+		String dest = "";
+		if (str != null) {
+			Pattern p = Pattern.compile("\\s*|\t|\r|\n");
+			Matcher m = p.matcher(str);
+			dest = m.replaceAll("");
+		}
+		return dest;
+
+	}
+
+	/**
+	 * 判断元素是否在数组内
+	 * 
+	 * @param substring
+	 * @param source
+	 * @return
+	 */
+	public static boolean isIn(String substring, String[] source) {
+		if (source == null || source.length == 0) {
+			return false;
+		}
+		for (int i = 0; i < source.length; i++) {
+			String aSource = source[i];
+			if (aSource.equals(substring)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * 获取Map对象
+	 */
+	public static Map<Object, Object> getHashMap() {
+		return new HashMap<Object, Object>();
+	}
+
+	/**
+	 * SET转换MAP
+	 * 
+	 * @param str
+	 * @return
+	 */
+	public static Map<Object, Object> SetToMap(Set<Object> setobj) {
+		Map<Object, Object> map = getHashMap();
+		for (Iterator iterator = setobj.iterator(); iterator.hasNext();) {
+			Map.Entry<Object, Object> entry = (Map.Entry<Object, Object>) iterator.next();
+			map.put(entry.getKey().toString(), entry.getValue() == null ? "" : entry.getValue().toString().trim());
+		}
+		return map;
+
+	}
+
+	public static boolean isInnerIP(String ipAddress) {
+		boolean isInnerIp = false;
+		long ipNum = getIpNum(ipAddress);
+		/**
+		 * 私有IP:A类 10.0.0.0-10.255.255.255 B类 172.16.0.0-172.31.255.255 C类 192.168.0.0-192.168.255.255 当然,还有127这个网段是环回地址
+		 **/
+		long aBegin = getIpNum("10.0.0.0");
+		long aEnd = getIpNum("10.255.255.255");
+		long bBegin = getIpNum("172.16.0.0");
+		long bEnd = getIpNum("172.31.255.255");
+		long cBegin = getIpNum("192.168.0.0");
+		long cEnd = getIpNum("192.168.255.255");
+		isInnerIp = isInner(ipNum, aBegin, aEnd) || isInner(ipNum, bBegin, bEnd) || isInner(ipNum, cBegin, cEnd) || ipAddress.equals("127.0.0.1");
+		return isInnerIp;
+	}
+
+	private static long getIpNum(String ipAddress) {
+		String[] ip = ipAddress.split("\\.");
+		long a = Integer.parseInt(ip[0]);
+		long b = Integer.parseInt(ip[1]);
+		long c = Integer.parseInt(ip[2]);
+		long d = Integer.parseInt(ip[3]);
+
+		long ipNum = a * 256 * 256 * 256 + b * 256 * 256 + c * 256 + d;
+		return ipNum;
+	}
+
+	private static boolean isInner(long userIp, long begin, long end) {
+		return (userIp >= begin) && (userIp <= end);
+	}
+	
+	/**
+	 * 将下划线大写方式命名的字符串转换为驼峰式。
+	 * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br>
+	 * 例如:hello_world->helloWorld
+	 * 
+	 * @param name
+	 *            转换前的下划线大写方式命名的字符串
+	 * @return 转换后的驼峰式命名的字符串
+	 */
+	public static String camelName(String name) {
+		StringBuilder result = new StringBuilder();
+		// 快速检查
+		if (name == null || name.isEmpty()) {
+			// 没必要转换
+			return "";
+		} else if (!name.contains("_")) {
+			// 不含下划线,仅将首字母小写
+			//update-begin--Author:zhoujf  Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能
+			//update-begin--Author:zhoujf  Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能
+			return name.substring(0, 1).toLowerCase() + name.substring(1).toLowerCase();
+			//update-end--Author:zhoujf  Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能
+		}
+		// 用下划线将原始字符串分割
+		String camels[] = name.split("_");
+		for (String camel : camels) {
+			// 跳过原始字符串中开头、结尾的下换线或双重下划线
+			if (camel.isEmpty()) {
+				continue;
+			}
+			// 处理真正的驼峰片段
+			if (result.length() == 0) {
+				// 第一个驼峰片段,全部字母都小写
+				result.append(camel.toLowerCase());
+			} else {
+				// 其他的驼峰片段,首字母大写
+				result.append(camel.substring(0, 1).toUpperCase());
+				result.append(camel.substring(1).toLowerCase());
+			}
+		}
+		return result.toString();
+	}
+	
+	/**
+	 * 将下划线大写方式命名的字符串转换为驼峰式。
+	 * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br>
+	 * 例如:hello_world,test_id->helloWorld,testId 转换前的下划线大写方式命名的字符串
+	 * @param
+	 * @return 转换后的驼峰式命名的字符串
+	 */
+	public static String camelNames(String names) {
+		if(names==null||names.equals("")){
+			return null;
+		}
+		StringBuffer sf = new StringBuffer();
+		String[] fs = names.split(",");
+		for (String field : fs) {
+			field = camelName(field);
+			sf.append(field + ",");
+		}
+		String result = sf.toString();
+		return result.substring(0, result.length() - 1);
+	}
+	
+	//update-begin--Author:zhoujf  Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能
+	/**
+	 * 将下划线大写方式命名的字符串转换为驼峰式。(首字母写)
+	 * 如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。</br>
+	 * 例如:hello_world->HelloWorld
+	 * 
+	 * @param name
+	 *            转换前的下划线大写方式命名的字符串
+	 * @return 转换后的驼峰式命名的字符串
+	 */
+	public static String camelNameCapFirst(String name) {
+		StringBuilder result = new StringBuilder();
+		// 快速检查
+		if (name == null || name.isEmpty()) {
+			// 没必要转换
+			return "";
+		} else if (!name.contains("_")) {
+			// 不含下划线,仅将首字母小写
+			return name.substring(0, 1).toUpperCase() + name.substring(1).toLowerCase();
+		}
+		// 用下划线将原始字符串分割
+		String camels[] = name.split("_");
+		for (String camel : camels) {
+			// 跳过原始字符串中开头、结尾的下换线或双重下划线
+			if (camel.isEmpty()) {
+				continue;
+			}
+			// 其他的驼峰片段,首字母大写
+			result.append(camel.substring(0, 1).toUpperCase());
+			result.append(camel.substring(1).toLowerCase());
+		}
+		return result.toString();
+	}
+	//update-end--Author:zhoujf  Date:20180503 for:TASK #2500 【代码生成器】代码生成器开发一通用模板生成功能
+	
+	/**
+	 * 将驼峰命名转化成下划线
+	 * @param para
+	 * @return
+	 */
+	public static String camelToUnderline(String para){
+        if(para.length()<3){
+        	return para.toLowerCase(); 
+        }
+        StringBuilder sb=new StringBuilder(para);
+        int temp=0;//定位
+        //从第三个字符开始 避免命名不规范 
+        for(int i=2;i<para.length();i++){
+            if(Character.isUpperCase(para.charAt(i))){
+                sb.insert(i+temp, "_");
+                temp+=1;
+            }
+        }
+        return sb.toString().toLowerCase(); 
+	}
+
+	/**
+	 * 随机数
+	 * @param place 定义随机数的位数
+	 */
+	public static String randomGen(int place) {
+		String base = "qwertyuioplkjhgfdsazxcvbnmQAZWSXEDCRFVTGBYHNUJMIKLOP0123456789";
+		StringBuffer sb = new StringBuffer();
+		Random rd = new Random();
+		for(int i=0;i<place;i++) {
+			sb.append(base.charAt(rd.nextInt(base.length())));
+		}
+		return sb.toString();
+	}
+	
+	/**
+	 * 获取类的所有属性,包括父类
+	 * 
+	 * @param object
+	 * @return
+	 */
+	public static Field[] getAllFields(Object object) {
+		Class<?> clazz = object.getClass();
+		List<Field> fieldList = new ArrayList<>();
+		while (clazz != null) {
+			fieldList.addAll(new ArrayList<>(Arrays.asList(clazz.getDeclaredFields())));
+			clazz = clazz.getSuperclass();
+		}
+		Field[] fields = new Field[fieldList.size()];
+		fieldList.toArray(fields);
+		return fields;
+	}
+	
+	/**
+	  * 将map的key全部转成小写
+	 * @param list
+	 * @return
+	 */
+	public static List<Map<String, Object>> toLowerCasePageList(List<Map<String, Object>> list){
+		List<Map<String, Object>> select = new ArrayList<>();
+		for (Map<String, Object> row : list) {
+			 Map<String, Object> resultMap = new HashMap<>();
+			 Set<String> keySet = row.keySet(); 
+			 for (String key : keySet) { 
+				 String newKey = key.toLowerCase(); 
+				 resultMap.put(newKey, row.get(key)); 
+			 }
+			 select.add(resultMap);
+		}
+		return select;
+	}
+
+	/**
+	 * 将entityList转换成modelList
+	 * @param fromList
+	 * @param tClass
+	 * @param <F>
+	 * @param <T>
+	 * @return
+	 */
+	public static<F,T> List<T> entityListToModelList(List<F> fromList, Class<T> tClass){
+		if(fromList.isEmpty() || fromList == null){
+			return null;
+		}
+		List<T> tList = new ArrayList<>();
+		for(F f : fromList){
+			T t = entityToModel(f, tClass);
+			tList.add(t);
+		}
+		return tList;
+	}
+
+	public static<F,T> T entityToModel(F entity, Class<T> modelClass) {
+		log.debug("entityToModel : Entity属性的值赋值到Model");
+		Object model = null;
+		if (entity == null || modelClass ==null) {
+			return null;
+		}
+
+		try {
+			model = modelClass.newInstance();
+		} catch (InstantiationException e) {
+			log.error("entityToModel : 实例化异常", e);
+		} catch (IllegalAccessException e) {
+			log.error("entityToModel : 安全权限异常", e);
+		}
+		BeanUtils.copyProperties(entity, model);
+		return (T)model;
+	}
+
+	/**
+	 * 判断 list 是否为空
+	 *
+	 * @param list
+	 * @return true or false
+	 * list == null		: true
+	 * list.size() == 0	: true
+	 */
+	public static boolean listIsEmpty(Collection list) {
+		return (list == null || list.size() == 0);
+	}
+
+	/**
+	 * 判断 list 是否不为空
+	 *
+	 * @param list
+	 * @return true or false
+	 * list == null		: false
+	 * list.size() == 0	: false
+	 */
+	public static boolean listIsNotEmpty(Collection list) {
+		return !listIsEmpty(list);
+	}
+
+}

+ 127 - 0
fyzd-phone/src/main/java/com/yx/face/controller/FileUpload/FileUploadController.java

@@ -0,0 +1,127 @@
+//package com.yx.face.controller.FileUpload;
+//
+//import com.alibaba.fastjson.JSON;
+//import com.alibaba.fastjson.JSONObject;
+//import com.yx.face.boot.uitls.AliOssCloudUtil;
+//import io.swagger.annotations.Api;
+//import lombok.extern.slf4j.Slf4j;
+//import org.apache.commons.codec.binary.Base64;
+//import org.springframework.web.bind.annotation.*;
+//import org.springframework.web.multipart.MultipartFile;
+//import sun.misc.BASE64Decoder;
+//
+//import javax.servlet.http.HttpServletResponse;
+//import java.io.*;
+//import java.net.URLEncoder;
+//import java.util.UUID;
+//
+///**
+// * @ProjectName: fyzd-phone
+// * @Package: com.yx.face.controller.FileUpload
+// * @ClassName: FileUploadController
+// * @Author: 崔哥
+// * @Description:
+// * @Date: 2021/11/8 13:00
+// * @Version: 1.0
+// */
+//@Slf4j
+//@Api(tags = "B 文件上传")
+//@RestController
+//@RequestMapping("/fyzd")
+//public class FileUploadController {
+//    /**
+//     * 文件上传
+//     *
+//     * @param data
+//     * @return
+//     */
+//    @PostMapping("/file/upload")
+//    public String upload(@RequestBody String data) {
+//        log.info("日志" + data);
+//        JSONObject jsonObject = JSON.parseObject(data);
+//        String filename = jsonObject.getString("name");
+//        String base64 = jsonObject.getString("base64");
+//        filename = filename.replace("-", "");
+//        InputStream inputStream = null;
+//        try {
+//            byte[] bytes = new BASE64Decoder().decodeBuffer(base64);  //将字符串转换为byte数组,这里的content是那一串base64密文 /9j/4AAQ.................,不包含(data:img/jpg;base64,)注意标点符号
+//            inputStream = new ByteArrayInputStream(bytes);
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//            System.out.println("上传失败");
+//        }
+//        AliOssCloudUtil util = new AliOssCloudUtil();
+//        //上传成功返回完整路径的url
+//        String url = util.uploadFile2OSS(inputStream, filename);
+//        return url;
+//    }
+//
+//    @PostMapping("/file/logImg")
+//    public String logImg(@RequestBody String data) {
+//        log.info("日志" + data);
+//        JSONObject jsonObject = JSON.parseObject(data);
+//        String filename = jsonObject.getString("name");
+//        String base64 = jsonObject.getString("base64");
+//        filename = filename.replace("-", "");
+//        InputStream inputStream = null;
+//        try {
+//            byte[] bytes = new BASE64Decoder().decodeBuffer(base64);  //将字符串转换为byte数组,这里的content是那一串base64密文 /9j/4AAQ.................,不包含(data:img/jpg;base64,)注意标点符号
+//            inputStream = new ByteArrayInputStream(bytes);
+//        } catch (IOException e) {
+//            e.printStackTrace();
+//            System.out.println("上传失败");
+//        }
+//        AliOssCloudUtil util = new AliOssCloudUtil();
+//        //上传成功返回完整路径的url
+//        String url = util.uploadFile2OSS(inputStream, filename);
+//        return url;
+//    }
+//    /**
+//     * 判断文件是否存在
+//     *
+//     * @param fileName 储存的文件名
+//     * @return
+//     */
+//    @GetMapping("/file/exists")
+//    public Boolean exists(String fileName) {
+//        AliOssCloudUtil util = new AliOssCloudUtil();
+//        Boolean bool = util.doesObjectExist(fileName);
+//        return bool;
+//    }
+//
+//
+//    /**
+//     * 下载oss对应文件
+//     *
+//     * @param fileName 储存的文件名
+//     * @return
+//     */
+//    @GetMapping("/file/downLoad")
+//    public String downloadFile(String fileName) {
+//        // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
+//        byte[] data = null;
+//        // 读取图片字节数组
+//        AliOssCloudUtil ossClientUtil = new AliOssCloudUtil();
+//        InputStream is = ossClientUtil.getInputStreamByFileUrl("log" + fileName.split("log")[1]);
+//        try {
+//            ByteArrayOutputStream swapStream = new ByteArrayOutputStream();
+//            byte[] buff = new byte[1024];
+//            int rc = 0;
+//            while ((rc = is.read(buff, 0, 100)) > 0) {
+//                swapStream.write(buff, 0, rc);
+//            }
+//            data = swapStream.toByteArray();
+//        } catch (Exception e) {
+//            e.printStackTrace();
+//        } finally {
+//            if (is != null) {
+//                try {
+//                    is.close();
+//                } catch (IOException e) {
+//                    e.printStackTrace();
+//                }
+//            }
+//        }
+//        return new String(Base64.encodeBase64(data));
+//    }
+//}

+ 160 - 0
fyzd-phone/src/main/java/com/yx/face/controller/FileUpload/UploadController.java

@@ -0,0 +1,160 @@
+package com.yx.face.controller.FileUpload;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.yx.face.boot.uitls.DateUtils;
+import com.yx.face.boot.uitls.MiniOUtils;
+import io.minio.MinioClient;
+import io.swagger.annotations.Api;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.codec.binary.Base64;
+import org.apache.poi.util.IOUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import sun.misc.BASE64Decoder;
+
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+
+/**
+ * @ProjectName: fyzd-phone
+ * @Package: com.yx.face.controller.FileUpload
+ * @ClassName: UploadController
+ * @Author: 崔哥
+ * @Description:
+ * @Date: 2021/11/22 16:01
+ * @Version: 1.0
+ */
+@Slf4j
+@Api(tags = "B 文件上传")
+@RestController
+@RequestMapping("/fyzd")
+public class UploadController {
+
+    @Autowired
+    private MiniOUtils miniOUtils;
+
+    /**
+     * 文件上传
+     *
+     * @param data
+     * @return
+     */
+    @PostMapping("/file/upload")
+    public String upload(@RequestBody String data) {
+        log.info("日志" + data);
+        try {
+            log.info("日志" + data);
+            JSONObject jsonObject = JSON.parseObject(data);
+            String filename = jsonObject.getString("name");
+            String base64 = jsonObject.getString("base64");
+            filename = filename.replace("-", "");
+            InputStream inputStream = null;
+            try {
+                byte[] bytes = new BASE64Decoder().decodeBuffer(base64);  //将字符串转换为byte数组,这里的content是那一串base64密文 /9j/4AAQ.................,不包含(data:img/jpg;base64,)注意标点符号
+                inputStream = new ByteArrayInputStream(bytes);
+            } catch (IOException e) {
+                e.printStackTrace();
+                System.out.println("上传失败");
+            }
+            String dateTime = DateUtils.dateTime().concat("/");
+            String objectName = "photo/" + dateTime + filename;
+            String url = miniOUtils.fileUpload2MiniO(inputStream, objectName);
+            return url;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return e.getMessage();
+        }
+    }
+
+    @PostMapping("/file/logImg")
+    public String logImg(@RequestBody String data) {
+        log.info("日志" + data);
+        try {
+            log.info("日志" + data);
+            JSONObject jsonObject = JSON.parseObject(data);
+            String filename = jsonObject.getString("name");
+            String base64 = jsonObject.getString("base64");
+            filename = filename.replace("-", "");
+            InputStream inputStream = null;
+            try {
+                byte[] bytes = new BASE64Decoder().decodeBuffer(base64);  //将字符串转换为byte数组,这里的content是那一串base64密文 /9j/4AAQ.................,不包含(data:img/jpg;base64,)注意标点符号
+                inputStream = new ByteArrayInputStream(bytes);
+            } catch (IOException e) {
+                e.printStackTrace();
+                System.out.println("上传失败");
+            }
+            String dateTime = DateUtils.dateTime().concat("/");
+            String objectName = "log/" + dateTime + filename;
+            String url = miniOUtils.fileUpload2MiniO(inputStream, objectName);
+            return url;
+        } catch (Exception e) {
+            e.printStackTrace();
+            return e.getMessage();
+        }
+    }
+
+    /**
+     * 下载oss对应文件
+     *
+     * @param fileName 储存的文件名
+     * @return
+     */
+    @GetMapping("/file/downLoad")
+    public String downloadFile(String fileName) {
+        // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
+        byte[] data = null;
+        // 读取图片字节数组
+        InputStream is = miniOUtils.downLoadFile("log" + fileName.split("log")[1]);
+        try {
+            data = IOUtils.toByteArray(is);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        if (data == null) {
+            return "";
+        }
+        return new String(Base64.encodeBase64(data));
+    }
+
+    /**
+     * 下载oss对应文件
+     *
+     * @param fileName 储存的文件名
+     * @return
+     */
+    @GetMapping("/file/photo")
+    public String downloadPhoto(String fileName) {
+        // 将图片文件转化为字节数组字符串,并对其进行Base64编码处理
+        byte[] data = null;
+        // 读取图片字节数组
+        InputStream is = miniOUtils.downLoadFile("photo" + fileName.split("photo")[1]);
+        try {
+            data = IOUtils.toByteArray(is);
+        } catch (Exception e) {
+            e.printStackTrace();
+        } finally {
+            if (is != null) {
+                try {
+                    is.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+        if (data == null) {
+            return "";
+        }
+        return new String(Base64.encodeBase64(data));
+    }
+}

+ 44 - 0
fyzd-phone/src/main/java/com/yx/face/controller/admin/WinXinController.java

@@ -0,0 +1,44 @@
+package com.yx.face.controller.admin;
+
+
+import com.yx.face.controller.dto.WxInfoDTO;
+import com.yx.face.service.WeiXinApiService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @description: 管理人员信息表(Admin)表控制层 <br>
+ * @author: PWB <br>
+ * @since: 1.0 <br>
+ * @date: 2021-05-21 13:37:01 <br>
+ */
+
+@RequiredArgsConstructor(onConstructor = @__(@Autowired))
+@Api(tags = "B 微信手机号获取")
+@RestController
+@RequestMapping("/weiXin")
+public class WinXinController {
+
+    private final WeiXinApiService weiXinApiService;
+
+    @ApiOperation(value = "获取微信用户绑定的手机号")
+    @PostMapping("/getPhone")
+    public Map<String, String> getWeiXin(@RequestBody WxInfoDTO dto) {
+        Map<String, String> mas = new HashMap<>();
+        if (dto == null) {
+            mas.put("code","500");
+            return mas;
+        }
+        Map<String, String> weiXin = weiXinApiService.getWeiXin(dto);
+        return weiXin;
+    }
+}
+

+ 29 - 0
fyzd-phone/src/main/java/com/yx/face/controller/dto/WxInfoDTO.java

@@ -0,0 +1,29 @@
+package com.yx.face.controller.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @description: 管理人员信息表(AdminInfo)实体类 <br>
+ * @author: PWB <br>
+ * @since: 1.0 <br>
+ * @date: 2021-04-02 17:13:56 <br>
+ */
+
+@ApiModel(" 微信请求相关参数 model")
+@Data
+public class WxInfoDTO {
+
+    @ApiModelProperty(value = "微信小程序 登录时获取的 code")
+    private String code;
+    @ApiModelProperty(value = "数据签名")
+    private String signature;
+    @ApiModelProperty(value = "微信用户基本信息")
+    private String rawData;
+    @ApiModelProperty(value = "数据签名")
+    private String encryptedData;
+    @ApiModelProperty(value = "加密算法的初始向量")
+    private String iv;
+}
+

+ 18 - 0
fyzd-phone/src/main/java/com/yx/face/service/WeiXinApiService.java

@@ -0,0 +1,18 @@
+package com.yx.face.service;
+
+import com.yx.face.controller.dto.WxInfoDTO;
+
+import java.util.Map;
+
+/**
+ * @ProjectName: face-server
+ * @Package: com.yx.face.service
+ * @ClassName: WeiXinApiService
+ * @Author: 崔哥
+ * @Description:
+ * @Date: 2021/11/1 18:27
+ * @Version: 1.0
+ */
+public interface WeiXinApiService {
+    Map<String, String> getWeiXin(WxInfoDTO dto);
+}

+ 53 - 0
fyzd-phone/src/main/java/com/yx/face/service/impl/WeiXinApiServiceImpl.java

@@ -0,0 +1,53 @@
+
+package com.yx.face.service.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
+import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
+import com.yx.face.boot.component.wx.WxMaConfiguration;
+import com.yx.face.controller.dto.WxInfoDTO;
+import com.yx.face.service.WeiXinApiService;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @ProjectName: face-server
+ * @Package: com.yx.face.service
+ * @ClassName: WeiXinApiService
+ * @Author: 崔哥
+ * @Description:
+ * @Date: 2021/11/1 18:27
+ * @Version: 1.0
+ */
+@Service
+public class WeiXinApiServiceImpl implements WeiXinApiService {
+    @Value("${weixin.appid}")
+    private String appid;
+
+    @Override
+    public Map<String, String> getWeiXin(WxInfoDTO dto) {
+        Map<String, String> map = new HashMap<>();
+        final WxMaService wxService = WxMaConfiguration.getMaService(appid);
+        WxMaJscode2SessionResult session = null;
+        try {
+            session = wxService.getUserService().getSessionInfo(dto.getCode());
+        } catch (WxErrorException e) {
+            e.printStackTrace();
+            map.put("code", "500");
+            return map;
+        }
+        if (session == null) {
+            map.put("code", "500");
+            return map;
+        }
+        WxMaPhoneNumberInfo phoneNoInfo = wxService.getUserService().getPhoneNoInfo(session.getSessionKey(), dto.getEncryptedData(), dto.getIv());
+        map.put("code", "200");
+        map.put("phone", phoneNoInfo.getPhoneNumber());
+        map.put("openid", session.getOpenid());
+        return map;
+    }
+}

+ 85 - 0
fyzd-phone/src/main/resources/application-prod.yml

@@ -0,0 +1,85 @@
+server:
+  port: 9810
+  servlet:
+    context-path: /winxin-fyzd
+    session:
+      persistent: false
+
+  tomcat:
+    accept-count: 150
+    uri-encoding: UTF-8
+    threads:
+      max: 20
+spring:
+  application:
+    name: /winxin-fyzd
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    default-property-inclusion: non_null
+    time-zone: GMT+8
+
+  messages:
+    basename: message/messages_zh_CN
+    encoding: UTF-8
+  servlet:
+    multipart:
+      enabled: true
+      max-file-size: 50MB
+      max-request-size: 50MB
+
+
+logging:
+  file:
+    name: ./logs/${spring.application.name}.log
+  level:
+    com.yixin.review: info
+  logback:
+    rollingpolicy:
+      max-history: 10
+      max-file-size: 10MB
+# minio 参数配置
+
+# 存储服务器
+MINIO_PATH_URL: http://192.168.9.187:9000
+#存储文件块
+MINIO_OSS_BUCKET: hanghui
+#账号
+MINIO_ACCESS_KEY: admin
+#密码
+MINIO_SECRET_KEY: nqj##3961
+
+##``````````````````````````````````` 微信小程序配置``````````````````````````````````````````````````````````````###
+wx:
+  miniapp:
+    configs:
+      - appid: wx4abbcffd7abc80b8
+        secret:  460651003eecb2d27cad6f15e95b09f9
+        token: #微信小程序消息服务器配置的token
+        aesKey: #微信小程序消息服务器配置的EncodingAESKey
+        msgDataFormat: JSON
+weixin.appid: wx4abbcffd7abc80b8
+##``````````````````````````````````` 在线文档 配置``````````````````````````````````````````````````````````````###
+swagger:
+  enable: true
+knife4j:
+  enable: true
+  basic:
+    enable: true
+    ## Basic认证用户名
+    username: fyzd
+    ## Basic认证密码
+    password: fyzd
+##``````````````````````````````````` 上传文件 配置``````````````````````````````````````````````````````````````###
+file.upload.path: file/
+file.upload.path.relative: /file/**
+web.address: https://fyzd.gzdata.com.cn:9100/fyzd/
+
+
+##``````````````````````````````````` 人脸服务 配置``````````````````````````````````````````````````````````````###
+face.service.tb: http://10.61.107.140:1820
+
+
+
+
+#定时任务 每5分钟
+cron.face.clear.user: 0 1/5 * * * ?

+ 3 - 0
fyzd-phone/src/main/resources/application.yml

@@ -0,0 +1,3 @@
+spring:
+  profiles:
+    active: prod

+ 85 - 0
fyzd-phone/target/classes/application-prod.yml

@@ -0,0 +1,85 @@
+server:
+  port: 9810
+  servlet:
+    context-path: /winxin-fyzd
+    session:
+      persistent: false
+
+  tomcat:
+    accept-count: 150
+    uri-encoding: UTF-8
+    threads:
+      max: 20
+spring:
+  application:
+    name: /winxin-fyzd
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    default-property-inclusion: non_null
+    time-zone: GMT+8
+
+  messages:
+    basename: message/messages_zh_CN
+    encoding: UTF-8
+  servlet:
+    multipart:
+      enabled: true
+      max-file-size: 50MB
+      max-request-size: 50MB
+
+
+logging:
+  file:
+    name: ./logs/${spring.application.name}.log
+  level:
+    com.yixin.review: info
+  logback:
+    rollingpolicy:
+      max-history: 10
+      max-file-size: 10MB
+# minio 参数配置
+
+# 存储服务器
+MINIO_PATH_URL: http://192.168.9.187:9000
+#存储文件块
+MINIO_OSS_BUCKET: hanghui
+#账号
+MINIO_ACCESS_KEY: admin
+#密码
+MINIO_SECRET_KEY: nqj##3961
+
+##``````````````````````````````````` 微信小程序配置``````````````````````````````````````````````````````````````###
+wx:
+  miniapp:
+    configs:
+      - appid: wx4abbcffd7abc80b8
+        secret:  460651003eecb2d27cad6f15e95b09f9
+        token: #微信小程序消息服务器配置的token
+        aesKey: #微信小程序消息服务器配置的EncodingAESKey
+        msgDataFormat: JSON
+weixin.appid: wx4abbcffd7abc80b8
+##``````````````````````````````````` 在线文档 配置``````````````````````````````````````````````````````````````###
+swagger:
+  enable: true
+knife4j:
+  enable: true
+  basic:
+    enable: true
+    ## Basic认证用户名
+    username: fyzd
+    ## Basic认证密码
+    password: fyzd
+##``````````````````````````````````` 上传文件 配置``````````````````````````````````````````````````````````````###
+file.upload.path: file/
+file.upload.path.relative: /file/**
+web.address: https://fyzd.gzdata.com.cn:9100/fyzd/
+
+
+##``````````````````````````````````` 人脸服务 配置``````````````````````````````````````````````````````````````###
+face.service.tb: http://10.61.107.140:1820
+
+
+
+
+#定时任务 每5分钟
+cron.face.clear.user: 0 1/5 * * * ?

+ 3 - 0
fyzd-phone/target/classes/application.yml

@@ -0,0 +1,3 @@
+spring:
+  profiles:
+    active: prod

BIN
fyzd-phone/target/classes/com/yx/face/FyzdPhoneApplication.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/component/wx/MyWxMpService.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/component/wx/WxMaConfiguration.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/component/wx/WxMaProperties$Config.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/component/wx/WxMaProperties.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/config/MinioConfig.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/config/SwaggerConfig.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/config/TaskPoolConfig.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/restful/CommonException.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/restful/RestCode.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/restful/RestDTO.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/restful/RestResponse.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/restful/RestResult.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/restful/ServiceException.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/AliOssCloudUtil.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/ConvertUtils.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/CookieUtils.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/DateUtils.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/ForeignAesUtil.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/HttpUtils.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/IDCardEncryptionUtil.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/IPUtils.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/JsonUtils.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/MiniOUtils.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/NumUtils.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/OkHttpUtils$1.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/OkHttpUtils$2.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/OkHttpUtils$3.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/OkHttpUtils$ICallBack.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/OkHttpUtils.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/QRCodeUtil.class


BIN
fyzd-phone/target/classes/com/yx/face/boot/uitls/oConvertUtils.class


BIN
fyzd-phone/target/classes/com/yx/face/controller/FileUpload/UploadController.class


BIN
fyzd-phone/target/classes/com/yx/face/controller/admin/WinXinController.class


BIN
fyzd-phone/target/classes/com/yx/face/controller/dto/WxInfoDTO.class


BIN
fyzd-phone/target/classes/com/yx/face/service/WeiXinApiService.class


BIN
fyzd-phone/target/classes/com/yx/face/service/impl/WeiXinApiServiceImpl.class


+ 178 - 0
logs/fyzd.log

@@ -0,0 +1,178 @@
+2021-12-01 12:40:42.083  INFO 20240 --- [main] com.yx.face.FaceServerApplication        : Starting FaceServerApplication using Java 1.8.0_291 on DESKTOP-UV4BOQR with PID 20240 (D:\CMC\YXCODE\dev-fyzd\face-server\target\classes started by 崔哥 in D:\CMC\YXCODE\dev-fyzd\face-server)
+2021-12-01 12:40:42.085  INFO 20240 --- [main] com.yx.face.FaceServerApplication        : The following profiles are active: dev
+2021-12-01 12:40:43.355  INFO 20240 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Multiple Spring Data modules found, entering strict repository configuration mode!
+2021-12-01 12:40:43.365  INFO 20240 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data Redis repositories in DEFAULT mode.
+2021-12-01 12:40:43.831  INFO 20240 --- [main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 427 ms. Found 0 Redis repository interfaces.
+2021-12-01 12:40:44.146  WARN 20240 --- [main] o.m.s.mapper.ClassPathMapperScanner      : No MyBatis mapper was found in '[com.yx.face]' package. Please check your configuration.
+2021-12-01 12:40:44.809  INFO 20240 --- [main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=94c9405e-71b5-3ee6-9120-3d6f4d16edd8
+2021-12-01 12:40:45.640  INFO 20240 --- [main] trationDelegate$BeanPostProcessorChecker : Bean 'redisConfig' of type [com.yx.face.boot.config.RedisConfig$$EnhancerBySpringCGLIB$$4d5ac3e1] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
+2021-12-01 12:40:46.080  INFO 20240 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8802 (http)
+2021-12-01 12:40:46.092  INFO 20240 --- [main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
+2021-12-01 12:40:46.092  INFO 20240 --- [main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.46]
+2021-12-01 12:40:46.282  INFO 20240 --- [main] o.a.c.c.C.[Tomcat].[localhost].[/fyzd]   : Initializing Spring embedded WebApplicationContext
+2021-12-01 12:40:46.283  INFO 20240 --- [main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 4135 ms
+2021-12-01 12:40:49.379  INFO 20240 --- [main] t.m.m.autoconfigure.MapperCacheDisabler  : Clear tk.mybatis.mapper.util.MsUtil CLASS_CACHE cache.
+2021-12-01 12:40:49.380  INFO 20240 --- [main] t.m.m.autoconfigure.MapperCacheDisabler  : Clear tk.mybatis.mapper.genid.GenIdUtil CACHE cache.
+2021-12-01 12:40:49.380  INFO 20240 --- [main] t.m.m.autoconfigure.MapperCacheDisabler  : Clear tk.mybatis.mapper.version.VersionUtil CACHE cache.
+2021-12-01 12:40:49.380  INFO 20240 --- [main] t.m.m.autoconfigure.MapperCacheDisabler  : Clear EntityHelper entityTableMap cache.
+2021-12-01 12:40:49.560  WARN 20240 --- [main] arterDeprecationWarningAutoConfiguration : spring-boot-starter-redis is deprecated as of Spring Boot 1.4, please migrate to spring-boot-starter-data-redis
+2021-12-01 12:40:50.176  INFO 20240 --- [main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8802 (http) with context path '/fyzd'
+2021-12-01 12:40:51.268  INFO 20240 --- [main] com.yx.face.FaceServerApplication        : Started FaceServerApplication in 10.023 seconds (JVM running for 10.952)
+2021-12-01 12:41:43.226  INFO 20240 --- [http-nio-8802-exec-3] o.a.c.c.C.[Tomcat].[localhost].[/fyzd]   : Initializing Spring DispatcherServlet 'dispatcherServlet'
+2021-12-01 12:41:43.226  INFO 20240 --- [http-nio-8802-exec-3] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
+2021-12-01 12:41:43.228  INFO 20240 --- [http-nio-8802-exec-3] o.s.web.servlet.DispatcherServlet        : Completed initialization in 2 ms
+2021-12-01 13:50:26.793  INFO 20240 --- [http-nio-8802-exec-10] c.y.f.b.c.security.AdminInterceptor      : 【【【【【【【=========preHandle  admin 管理员权限认证 begin==========】】】】】】】
+2021-12-01 13:50:26.794  INFO 20240 --- [http-nio-8802-exec-10] c.y.f.b.c.security.AdminInterceptor      : 管理员 IP=192.168.9.51 : 请求 path=/admin/auth/doGetInfo
+2021-12-01 13:50:26.825  INFO 20240 --- [http-nio-8802-exec-9] c.y.f.b.c.security.AdminInterceptor      : 【【【【【【【=========preHandle  admin 管理员权限认证 begin==========】】】】】】】
+2021-12-01 13:50:26.825  INFO 20240 --- [http-nio-8802-exec-9] c.y.f.b.c.security.AdminInterceptor      : 管理员 IP=192.168.9.51 : 请求 path=/admin/auth/doGetInfo
+2021-12-01 13:50:26.856  INFO 20240 --- [http-nio-8802-exec-9] c.yx.face.boot.component.aop.ServiceLog  : 【请求类名】:com.yx.face.service.impl.AdminServiceImpl
+2021-12-01 13:50:26.858  INFO 20240 --- [http-nio-8802-exec-9] c.yx.face.boot.component.aop.ServiceLog  : 【请求方法名】:getAuthInfo【参数】:[1]
+2021-12-01 13:50:26.884  INFO 20240 --- [http-nio-8802-exec-9] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
+2021-12-01 13:50:27.005  INFO 20240 --- [http-nio-8802-exec-9] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
+2021-12-01 13:50:27.045  INFO 20240 --- [http-nio-8802-exec-9] c.yx.face.boot.component.aop.ServiceLog  : 【耗时】:187毫秒
+2021-12-01 13:50:27.055  INFO 20240 --- [http-nio-8802-exec-9] c.yx.face.boot.component.aop.ServiceLog  : 【请求类名】:com.yx.face.service.impl.AdminServiceImpl
+2021-12-01 13:50:27.055  INFO 20240 --- [http-nio-8802-exec-9] c.yx.face.boot.component.aop.ServiceLog  : 【请求方法名】:getInfo【参数】:[1]
+2021-12-01 13:50:27.060  INFO 20240 --- [http-nio-8802-exec-9] c.yx.face.boot.component.aop.ServiceLog  : 【耗时】:5毫秒
+2021-12-01 13:50:27.354  INFO 20240 --- [http-nio-8802-exec-7] c.y.f.b.c.security.AdminInterceptor      : 【【【【【【【=========preHandle  admin 管理员权限认证 begin==========】】】】】】】
+2021-12-01 13:50:27.355  INFO 20240 --- [http-nio-8802-exec-7] c.y.f.b.c.security.AdminInterceptor      : 管理员 IP=192.168.9.51 : 请求 path=/admin/dataShow/getDeviceNumber
+2021-12-01 13:50:27.378  INFO 20240 --- [http-nio-8802-exec-4] c.y.f.b.c.security.AdminInterceptor      : 【【【【【【【=========preHandle  admin 管理员权限认证 begin==========】】】】】】】
+2021-12-01 13:50:27.379  INFO 20240 --- [http-nio-8802-exec-1] c.y.f.b.c.security.AdminInterceptor      : 【【【【【【【=========preHandle  admin 管理员权限认证 begin==========】】】】】】】
+2021-12-01 13:50:27.379  INFO 20240 --- [http-nio-8802-exec-1] c.y.f.b.c.security.AdminInterceptor      : 管理员 IP=192.168.9.51 : 请求 path=/admin/dataShow/getDeviceNumber
+2021-12-01 13:50:27.379  INFO 20240 --- [http-nio-8802-exec-4] c.y.f.b.c.security.AdminInterceptor      : 管理员 IP=192.168.9.51 : 请求 path=/admin/dataShow/getAdminData
+2021-12-01 13:50:27.380  INFO 20240 --- [http-nio-8802-exec-1] c.yx.face.boot.component.aop.ServiceLog  : 【请求类名】:com.yx.face.service.impl.AdminServiceImpl
+2021-12-01 13:50:27.381  INFO 20240 --- [http-nio-8802-exec-1] c.yx.face.boot.component.aop.ServiceLog  : 【请求方法名】:getAuthInfo【参数】:[1]
+2021-12-01 13:50:27.383  INFO 20240 --- [http-nio-8802-exec-1] c.yx.face.boot.component.aop.ServiceLog  : 【耗时】:2毫秒
+2021-12-01 13:50:27.384  INFO 20240 --- [http-nio-8802-exec-1] c.yx.face.boot.component.aop.ServiceLog  : 【请求类名】:com.yx.face.service.impl.AdminDataShowServiceImpl
+2021-12-01 13:50:27.384  INFO 20240 --- [http-nio-8802-exec-1] c.yx.face.boot.component.aop.ServiceLog  : 【请求方法名】:getDeviceNumber【参数】:[]
+2021-12-01 13:50:27.388  INFO 20240 --- [http-nio-8802-exec-1] c.yx.face.boot.component.aop.ServiceLog  : 【请求类名】:com.yx.face.service.impl.AdminServiceImpl
+2021-12-01 13:50:27.388  INFO 20240 --- [http-nio-8802-exec-1] c.yx.face.boot.component.aop.ServiceLog  : 【请求方法名】:getInfo【参数】:[]
+2021-12-01 13:50:27.390  INFO 20240 --- [http-nio-8802-exec-1] c.yx.face.boot.component.aop.ServiceLog  : 【耗时】:2毫秒
+2021-12-01 13:50:27.415  INFO 20240 --- [http-nio-8802-exec-1] c.yx.face.boot.component.aop.ServiceLog  : 【耗时】:30毫秒
+2021-12-01 13:50:27.432  INFO 20240 --- [http-nio-8802-exec-2] c.y.f.b.c.security.AdminInterceptor      : 【【【【【【【=========preHandle  admin 管理员权限认证 begin==========】】】】】】】
+2021-12-01 13:50:27.433  INFO 20240 --- [http-nio-8802-exec-2] c.y.f.b.c.security.AdminInterceptor      : 管理员 IP=192.168.9.51 : 请求 path=/admin/dataShow/getAdminData
+2021-12-01 13:50:27.433  INFO 20240 --- [http-nio-8802-exec-2] c.yx.face.boot.component.aop.ServiceLog  : 【请求类名】:com.yx.face.service.impl.AdminServiceImpl
+2021-12-01 13:50:27.433  INFO 20240 --- [http-nio-8802-exec-2] c.yx.face.boot.component.aop.ServiceLog  : 【请求方法名】:getAuthInfo【参数】:[1]
+2021-12-01 13:50:27.435  INFO 20240 --- [http-nio-8802-exec-2] c.yx.face.boot.component.aop.ServiceLog  : 【耗时】:2毫秒
+2021-12-01 13:50:27.436  INFO 20240 --- [http-nio-8802-exec-2] c.yx.face.boot.component.aop.ServiceLog  : 【请求类名】:com.yx.face.service.impl.AdminDataShowServiceImpl
+2021-12-01 13:50:27.436  INFO 20240 --- [http-nio-8802-exec-2] c.yx.face.boot.component.aop.ServiceLog  : 【请求方法名】:getAdminData【参数】:[]
+2021-12-01 13:50:27.436  INFO 20240 --- [http-nio-8802-exec-2] c.yx.face.boot.component.aop.ServiceLog  : 【请求类名】:com.yx.face.service.impl.AdminServiceImpl
+2021-12-01 13:50:27.436  INFO 20240 --- [http-nio-8802-exec-2] c.yx.face.boot.component.aop.ServiceLog  : 【请求方法名】:getInfo【参数】:[]
+2021-12-01 13:50:27.438  INFO 20240 --- [http-nio-8802-exec-2] c.yx.face.boot.component.aop.ServiceLog  : 【耗时】:2毫秒
+2021-12-01 13:50:29.472 ERROR 20240 --- [http-nio-8802-exec-2] c.y.f.boot.core.GlobalExceptionHandler   : Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to localhost:6379
+
+org.springframework.data.redis.RedisConnectionFailureException: Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to localhost:6379
+	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:283) ~[spring-data-redis-2.4.9.jar:2.4.9]
+	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:485) ~[spring-data-redis-2.4.9.jar:2.4.9]
+	at org.springframework.data.redis.core.RedisConnectionUtils.fetchConnection(RedisConnectionUtils.java:193) ~[spring-data-redis-2.4.9.jar:2.4.9]
+	at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:144) ~[spring-data-redis-2.4.9.jar:2.4.9]
+	at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:105) ~[spring-data-redis-2.4.9.jar:2.4.9]
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:209) ~[spring-data-redis-2.4.9.jar:2.4.9]
+	at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:189) ~[spring-data-redis-2.4.9.jar:2.4.9]
+	at org.springframework.data.redis.core.AbstractOperations.execute(AbstractOperations.java:96) ~[spring-data-redis-2.4.9.jar:2.4.9]
+	at org.springframework.data.redis.core.DefaultValueOperations.get(DefaultValueOperations.java:53) ~[spring-data-redis-2.4.9.jar:2.4.9]
+	at com.yx.face.boot.uitls.RedisUtil.get(RedisUtil.java:79) ~[classes/:na]
+	at com.yx.face.service.impl.AdminDataShowServiceImpl.getAdminData(AdminDataShowServiceImpl.java:108) ~[classes/:na]
+	at com.yx.face.service.impl.AdminDataShowServiceImpl$$FastClassBySpringCGLIB$$e3e372c5.invoke(<generated>) ~[classes/:na]
+	at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.7.jar:5.3.7]
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:779) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:89) ~[spring-aop-5.3.7.jar:5.3.7]
+	at com.yx.face.boot.component.aop.ServiceLog.aroundLog(ServiceLog.java:40) ~[classes/:na]
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_291]
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_291]
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_291]
+	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_291]
+	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:634) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:624) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:72) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:750) ~[spring-aop-5.3.7.jar:5.3.7]
+	at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:692) ~[spring-aop-5.3.7.jar:5.3.7]
+	at com.yx.face.service.impl.AdminDataShowServiceImpl$$EnhancerBySpringCGLIB$$70a9b432.getAdminData(<generated>) ~[classes/:na]
+	at com.yx.face.controller.admin.AdminDataShowController.getAdminData(AdminDataShowController.java:38) ~[classes/:na]
+	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_291]
+	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_291]
+	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_291]
+	at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_291]
+	at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.7.jar:5.3.7]
+	at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.7.jar:5.3.7]
+	at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.7.jar:5.3.7]
+	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.7.jar:5.3.7]
+	at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.7.jar:5.3.7]
+	at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.7.jar:5.3.7]
+	at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1063) ~[spring-webmvc-5.3.7.jar:5.3.7]
+	at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963) ~[spring-webmvc-5.3.7.jar:5.3.7]
+	at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) [spring-webmvc-5.3.7.jar:5.3.7]
+	at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) [spring-webmvc-5.3.7.jar:5.3.7]
+	at javax.servlet.http.HttpServlet.service(HttpServlet.java:652) [tomcat-embed-core-9.0.46.jar:4.0.FR]
+	at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) [spring-webmvc-5.3.7.jar:5.3.7]
+	at javax.servlet.http.HttpServlet.service(HttpServlet.java:733) [tomcat-embed-core-9.0.46.jar:4.0.FR]
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) [tomcat-embed-websocket-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at com.github.xiaoymin.knife4j.spring.filter.SecurityBasicAuthFilter.doFilter(SecurityBasicAuthFilter.java:87) [knife4j-spring-3.0.2.jar:na]
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) [spring-web-5.3.7.jar:5.3.7]
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.3.7.jar:5.3.7]
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) [spring-web-5.3.7.jar:5.3.7]
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.3.7.jar:5.3.7]
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) [spring-web-5.3.7.jar:5.3.7]
+	at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119) [spring-web-5.3.7.jar:5.3.7]
+	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:542) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:143) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:374) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:893) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1707) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_291]
+	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_291]
+	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.46.jar:9.0.46]
+	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_291]
+Caused by: redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to localhost:6379
+	at redis.clients.jedis.Connection.connect(Connection.java:165) ~[jedis-3.3.0.jar:na]
+	at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:109) ~[jedis-3.3.0.jar:na]
+	at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1904) ~[jedis-3.3.0.jar:na]
+	at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:278) ~[spring-data-redis-2.4.9.jar:2.4.9]
+	... 85 common frames omitted
+Caused by: java.net.SocketTimeoutException: connect timed out
+	at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) ~[na:1.8.0_291]
+	at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:81) ~[na:1.8.0_291]
+	at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:476) ~[na:1.8.0_291]
+	at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:218) ~[na:1.8.0_291]
+	at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:200) ~[na:1.8.0_291]
+	at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:162) ~[na:1.8.0_291]
+	at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:394) ~[na:1.8.0_291]
+	at java.net.Socket.connect(Socket.java:606) ~[na:1.8.0_291]
+	at redis.clients.jedis.DefaultJedisSocketFactory.createSocket(DefaultJedisSocketFactory.java:53) ~[jedis-3.3.0.jar:na]
+	at redis.clients.jedis.Connection.connect(Connection.java:158) ~[jedis-3.3.0.jar:na]
+	... 88 common frames omitted
+
+2021-12-01 13:51:24.340  INFO 20240 --- [http-nio-8802-exec-8] c.y.f.b.c.security.AdminInterceptor      : 【【【【【【【=========preHandle  admin 管理员权限认证 begin==========】】】】】】】
+2021-12-01 13:51:24.341  INFO 20240 --- [http-nio-8802-exec-8] c.y.f.b.c.security.AdminInterceptor      : 管理员 IP=192.168.9.51 : 请求 path=/admin/auth/doGetInfo
+2021-12-01 13:51:24.341  INFO 20240 --- [http-nio-8802-exec-8] c.yx.face.boot.component.aop.ServiceLog  : 【请求类名】:com.yx.face.service.impl.AdminServiceImpl
+2021-12-01 13:51:24.342  INFO 20240 --- [http-nio-8802-exec-8] c.yx.face.boot.component.aop.ServiceLog  : 【请求方法名】:getAuthInfo【参数】:[1]
+2021-12-01 13:51:24.343  INFO 20240 --- [http-nio-8802-exec-8] c.yx.face.boot.component.aop.ServiceLog  : 【耗时】:1毫秒
+2021-12-01 13:51:24.344  INFO 20240 --- [http-nio-8802-exec-8] c.yx.face.boot.component.aop.ServiceLog  : 【请求类名】:com.yx.face.service.impl.AdminServiceImpl
+2021-12-01 13:51:24.345  INFO 20240 --- [http-nio-8802-exec-8] c.yx.face.boot.component.aop.ServiceLog  : 【请求方法名】:getInfo【参数】:[1]
+2021-12-01 13:51:24.346  INFO 20240 --- [http-nio-8802-exec-8] c.yx.face.boot.component.aop.ServiceLog  : 【耗时】:1毫秒
+2021-12-01 13:52:14.078  INFO 20240 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
+2021-12-01 13:52:14.084  INFO 20240 --- [SpringContextShutdownHook] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.

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