Zhangmiaojie il y a 5 ans
commit
6a158ea725
100 fichiers modifiés avec 6327 ajouts et 0 suppressions
  1. 21 0
      .idea/compiler.xml
  2. 12 0
      .idea/eclipseCodeFormatter.xml
  3. 6 0
      .idea/encodings.xml
  4. 36 0
      .idea/inspectionProfiles/Project_Default.xml
  5. 13 0
      .idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml
  6. 13 0
      .idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml
  7. 13 0
      .idea/libraries/Maven__com_alibaba_fastjson_1_2_58.xml
  8. 13 0
      .idea/libraries/Maven__com_belerweb_pinyin4j_2_5_0.xml
  9. 13 0
      .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_9_0.xml
  10. 13 0
      .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_9_9.xml
  11. 13 0
      .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_9_9_3.xml
  12. 13 0
      .idea/libraries/Maven__com_google_code_gson_gson_2_8_2.xml
  13. 13 0
      .idea/libraries/Maven__com_jayway_jsonpath_json_path_2_4_0.xml
  14. 13 0
      .idea/libraries/Maven__com_ojia_base_java_base_1_0.xml
  15. 13 0
      .idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml
  16. 13 0
      .idea/libraries/Maven__commons_codec_commons_codec_1_11.xml
  17. 13 0
      .idea/libraries/Maven__commons_collections_commons_collections_3_2_1.xml
  18. 13 0
      .idea/libraries/Maven__commons_fileupload_commons_fileupload_1_2_2.xml
  19. 13 0
      .idea/libraries/Maven__commons_io_commons_io_2_2.xml
  20. 13 0
      .idea/libraries/Maven__javax_activation_activation_1_1.xml
  21. 13 0
      .idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml
  22. 13 0
      .idea/libraries/Maven__javax_mail_mail_1_4.xml
  23. 13 0
      .idea/libraries/Maven__jaxen_jaxen_1_1_6.xml
  24. 13 0
      .idea/libraries/Maven__junit_junit_4_12.xml
  25. 13 0
      .idea/libraries/Maven__mysql_mysql_connector_java_6_0_3.xml
  26. 13 0
      .idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_16.xml
  27. 13 0
      .idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_9_16.xml
  28. 13 0
      .idea/libraries/Maven__net_minidev_accessors_smart_1_2.xml
  29. 13 0
      .idea/libraries/Maven__net_minidev_json_smart_2_3.xml
  30. 13 0
      .idea/libraries/Maven__org_apache_commons_commons_email_1_1.xml
  31. 13 0
      .idea/libraries/Maven__org_apache_commons_commons_lang3_3_3_2.xml
  32. 13 0
      .idea/libraries/Maven__org_apache_commons_commons_pool2_2_6_2.xml
  33. 13 0
      .idea/libraries/Maven__org_apache_commons_commons_text_1_1.xml
  34. 13 0
      .idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_3.xml
  35. 13 0
      .idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_12.xml
  36. 13 0
      .idea/libraries/Maven__org_apache_httpcomponents_httpmime_4_5_3.xml
  37. 13 0
      .idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_11_2.xml
  38. 13 0
      .idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_11_2.xml
  39. 13 0
      .idea/libraries/Maven__org_apache_thrift_libthrift_0_9_2.xml
  40. 13 0
      .idea/libraries/Maven__org_assertj_assertj_core_3_11_1.xml
  41. 13 0
      .idea/libraries/Maven__org_dom4j_dom4j_2_1_0.xml
  42. 13 0
      .idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml
  43. 13 0
      .idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml
  44. 13 0
      .idea/libraries/Maven__org_jsoup_jsoup_1_11_2.xml
  45. 13 0
      .idea/libraries/Maven__org_mockito_mockito_core_2_23_4.xml
  46. 13 0
      .idea/libraries/Maven__org_objenesis_objenesis_2_6.xml
  47. 13 0
      .idea/libraries/Maven__org_ow2_asm_asm_5_0_4.xml
  48. 13 0
      .idea/libraries/Maven__org_skyscreamer_jsonassert_1_5_0.xml
  49. 13 0
      .idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_28.xml
  50. 13 0
      .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_28.xml
  51. 13 0
      .idea/libraries/Maven__org_springframework_boot_spring_boot_2_1_9_RELEASE.xml
  52. 13 0
      .idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_1_9_RELEASE.xml
  53. 13 0
      .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_1_9_RELEASE.xml
  54. 13 0
      .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_1_9_RELEASE.xml
  55. 13 0
      .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_2_1_9_RELEASE.xml
  56. 13 0
      .idea/libraries/Maven__org_springframework_boot_spring_boot_test_2_1_9_RELEASE.xml
  57. 13 0
      .idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_1_9_RELEASE.xml
  58. 13 0
      .idea/libraries/Maven__org_springframework_spring_aop_5_1_10_RELEASE.xml
  59. 13 0
      .idea/libraries/Maven__org_springframework_spring_beans_5_1_10_RELEASE.xml
  60. 13 0
      .idea/libraries/Maven__org_springframework_spring_context_5_1_10_RELEASE.xml
  61. 13 0
      .idea/libraries/Maven__org_springframework_spring_core_5_1_10_RELEASE.xml
  62. 13 0
      .idea/libraries/Maven__org_springframework_spring_expression_5_1_10_RELEASE.xml
  63. 13 0
      .idea/libraries/Maven__org_springframework_spring_jcl_5_1_10_RELEASE.xml
  64. 13 0
      .idea/libraries/Maven__org_springframework_spring_test_5_1_10_RELEASE.xml
  65. 13 0
      .idea/libraries/Maven__org_xmlunit_xmlunit_core_2_6_3.xml
  66. 13 0
      .idea/libraries/Maven__org_yaml_snakeyaml_1_23.xml
  67. 13 0
      .idea/libraries/Maven__redis_clients_jedis_2_7_1.xml
  68. 13 0
      .idea/misc.xml
  69. 8 0
      .idea/modules.xml
  70. 124 0
      .idea/uiDesigner.xml
  71. 1453 0
      .idea/workspace.xml
  72. 124 0
      pom.xml
  73. 13 0
      src/main/java/com/duowan/texiu/data/migration/TexiuDataMigrationApplication.java
  74. 775 0
      src/main/java/com/duowan/texiu/data/migration/model/EditJsonInfo.java
  75. 11 0
      src/main/java/com/duowan/texiu/data/migration/model/ErrorInfo.java
  76. 39 0
      src/main/java/com/duowan/texiu/data/migration/model/TableInfo.java
  77. 13 0
      src/main/java/com/duowan/texiu/data/migration/model/VideoInfo.java
  78. 787 0
      src/main/java/com/duowan/texiu/data/migration/model/VideoInfoFF.java
  79. 54 0
      src/main/java/com/duowan/texiu/data/migration/script/BatchHandleVideo.java
  80. 71 0
      src/main/java/com/duowan/texiu/data/migration/script/BatchHandleVideoTask.java
  81. 338 0
      src/main/java/com/duowan/texiu/data/migration/script/BatchUploadStaticResourceWorker.java
  82. 103 0
      src/main/java/com/duowan/texiu/data/migration/script/base/BaseTaskWorker.java
  83. 35 0
      src/main/java/com/duowan/texiu/data/migration/script/dd
  84. 64 0
      src/main/java/com/duowan/texiu/data/migration/tools/CommonThreadPool.java
  85. 38 0
      src/main/java/com/duowan/texiu/data/migration/tools/Constants.java
  86. 66 0
      src/main/java/com/duowan/texiu/data/migration/tools/DBUtil.java
  87. 105 0
      src/main/java/com/duowan/texiu/data/migration/tools/FFmpegUtils.java
  88. 185 0
      src/main/java/com/duowan/texiu/data/migration/tools/FileUtil.java
  89. 88 0
      src/main/java/com/duowan/texiu/data/migration/tools/HttpClient.java
  90. 234 0
      src/main/java/com/duowan/texiu/data/migration/tools/HttpClientService.java
  91. 39 0
      src/main/java/com/duowan/texiu/data/migration/tools/HttpResponseEntity.java
  92. 64 0
      src/main/java/com/duowan/texiu/data/migration/tools/HttpUtils.java
  93. 32 0
      src/main/java/com/duowan/texiu/data/migration/tools/PropertiesUtil.java
  94. 11 0
      src/main/java/com/duowan/texiu/data/migration/tools/ServiceException.java
  95. 117 0
      src/main/java/com/duowan/texiu/data/migration/tools/SqlUtil.java
  96. 84 0
      src/main/java/com/duowan/texiu/data/migration/tools/TextUtil.java
  97. 73 0
      src/main/java/com/duowan/texiu/data/migration/tools/UploadApiResult.java
  98. 35 0
      src/main/java/com/duowan/texiu/data/migration/tools/VideoConstant.java
  99. 236 0
      src/main/java/com/duowan/texiu/data/migration/tools/ZipUtil.java
  100. 1 0
      src/main/resources/application.properties

+ 21 - 0
.idea/compiler.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="CompilerConfiguration">
+    <annotationProcessing>
+      <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="texiu-data-migration" />
+      </profile>
+    </annotationProcessing>
+    <bytecodeTargetLevel>
+      <module name="texiu-data-migration" target="1.8" />
+    </bytecodeTargetLevel>
+  </component>
+  <component name="JavacSettings">
+    <option name="ADDITIONAL_OPTIONS_OVERRIDE">
+      <module name="texiu-data-migration" options="-parameters" />
+    </option>
+  </component>
+</project>

+ 12 - 0
.idea/eclipseCodeFormatter.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="EclipseCodeFormatterProjectSettings">
+    <option name="projectSpecificProfile">
+      <ProjectSpecificProfile>
+        <option name="formatter" value="ECLIPSE" />
+        <option name="pathToConfigFileJava" value="$PROJECT_DIR$/../../../通用/my-eclipse-style.xml" />
+        <option name="selectedJavaProfile" value="my" />
+      </ProjectSpecificProfile>
+    </option>
+  </component>
+</project>

+ 6 - 0
.idea/encodings.xml

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

+ 36 - 0
.idea/inspectionProfiles/Project_Default.xml

@@ -0,0 +1,36 @@
+<component name="InspectionProjectProfileManager">
+  <profile version="1.0">
+    <option name="myName" value="Project Default" />
+    <inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
+      <option name="TOP_LEVEL_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="INNER_CLASS_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="METHOD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
+        </value>
+      </option>
+      <option name="FIELD_OPTIONS">
+        <value>
+          <option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
+          <option name="REQUIRED_TAGS" value="" />
+        </value>
+      </option>
+      <option name="IGNORE_DEPRECATED" value="false" />
+      <option name="IGNORE_JAVADOC_PERIOD" value="true" />
+      <option name="IGNORE_DUPLICATED_THROWS" value="false" />
+      <option name="IGNORE_POINT_TO_ITSELF" value="false" />
+      <option name="myAdditionalJavadocTags" value="date" />
+    </inspection_tool>
+  </profile>
+</component>

+ 13 - 0
.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: ch.qos.logback:logback-classic:1.2.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-classic/1.2.3/logback-classic-1.2.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: ch.qos.logback:logback-core:1.2.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/ch/qos/logback/logback-core/1.2.3/logback-core-1.2.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__com_alibaba_fastjson_1_2_58.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.alibaba:fastjson:1.2.58">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.2.58/fastjson-1.2.58.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.2.58/fastjson-1.2.58-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/alibaba/fastjson/1.2.58/fastjson-1.2.58-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__com_belerweb_pinyin4j_2_5_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.belerweb:pinyin4j:2.5.0">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/belerweb/pinyin4j/2.5.0/pinyin4j-2.5.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/belerweb/pinyin4j/2.5.0/pinyin4j-2.5.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/belerweb/pinyin4j/2.5.0/pinyin4j-2.5.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_9_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.9.0">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-annotations/2.9.0/jackson-annotations-2.9.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_9_9.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.fasterxml.jackson.core:jackson-core:2.9.9">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.9/jackson-core-2.9.9.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.9/jackson-core-2.9.9-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-core/2.9.9/jackson-core-2.9.9-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_9_9_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.fasterxml.jackson.core:jackson-databind:2.9.9.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.9.3/jackson-databind-2.9.9.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.9.3/jackson-databind-2.9.9.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/fasterxml/jackson/core/jackson-databind/2.9.9.3/jackson-databind-2.9.9.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__com_google_code_gson_gson_2_8_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.google.code.gson:gson:2.8.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.2/gson-2.8.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.2/gson-2.8.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/google/code/gson/gson/2.8.2/gson-2.8.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__com_jayway_jsonpath_json_path_2_4_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.jayway.jsonpath:json-path:2.4.0">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/jayway/jsonpath/json-path/2.4.0/json-path-2.4.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__com_ojia_base_java_base_1_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.ojia.base:java-base:1.0">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/ojia/base/java-base/1.0/java-base-1.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/ojia/base/java-base/1.0/java-base-1.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/ojia/base/java-base/1.0/java-base-1.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__com_vaadin_external_google_android_json_0_0_20131108_vaadin1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/com/vaadin/external/google/android-json/0.0.20131108.vaadin1/android-json-0.0.20131108.vaadin1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__commons_codec_commons_codec_1_11.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: commons-codec:commons-codec:1.11">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-codec/commons-codec/1.11/commons-codec-1.11-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__commons_collections_commons_collections_3_2_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: commons-collections:commons-collections:3.2.1">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-collections/commons-collections/3.2.1/commons-collections-3.2.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__commons_fileupload_commons_fileupload_1_2_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: commons-fileupload:commons-fileupload:1.2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-fileupload/commons-fileupload/1.2.2/commons-fileupload-1.2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-fileupload/commons-fileupload/1.2.2/commons-fileupload-1.2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-fileupload/commons-fileupload/1.2.2/commons-fileupload-1.2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__commons_io_commons_io_2_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: commons-io:commons-io:2.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.2/commons-io-2.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.2/commons-io-2.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/commons-io/commons-io/2.2/commons-io-2.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__javax_activation_activation_1_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: javax.activation:activation:1.1">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1/activation-1.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1/activation-1.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/javax/activation/activation/1.1/activation-1.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: javax.annotation:javax.annotation-api:1.3.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/javax/annotation/javax.annotation-api/1.3.2/javax.annotation-api-1.3.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__javax_mail_mail_1_4.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: javax.mail:mail:1.4">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/javax/mail/mail/1.4/mail-1.4.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/javax/mail/mail/1.4/mail-1.4-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/javax/mail/mail/1.4/mail-1.4-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__jaxen_jaxen_1_1_6.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: jaxen:jaxen:1.1.6">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/jaxen/jaxen/1.1.6/jaxen-1.1.6.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/jaxen/jaxen/1.1.6/jaxen-1.1.6-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/jaxen/jaxen/1.1.6/jaxen-1.1.6-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__junit_junit_4_12.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: junit:junit:4.12">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.12/junit-4.12.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.12/junit-4.12-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/junit/junit/4.12/junit-4.12-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__mysql_mysql_connector_java_6_0_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: mysql:mysql-connector-java:6.0.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/mysql/mysql-connector-java/6.0.3/mysql-connector-java-6.0.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/mysql/mysql-connector-java/6.0.3/mysql-connector-java-6.0.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/mysql/mysql-connector-java/6.0.3/mysql-connector-java-6.0.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_9_16.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: net.bytebuddy:byte-buddy:1.9.16">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy/1.9.16/byte-buddy-1.9.16.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy/1.9.16/byte-buddy-1.9.16-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy/1.9.16/byte-buddy-1.9.16-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__net_bytebuddy_byte_buddy_agent_1_9_16.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: net.bytebuddy:byte-buddy-agent:1.9.16">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy-agent/1.9.16/byte-buddy-agent-1.9.16.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy-agent/1.9.16/byte-buddy-agent-1.9.16-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/net/bytebuddy/byte-buddy-agent/1.9.16/byte-buddy-agent-1.9.16-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__net_minidev_accessors_smart_1_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: net.minidev:accessors-smart:1.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/net/minidev/accessors-smart/1.2/accessors-smart-1.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/net/minidev/accessors-smart/1.2/accessors-smart-1.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/net/minidev/accessors-smart/1.2/accessors-smart-1.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__net_minidev_json_smart_2_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: net.minidev:json-smart:2.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/net/minidev/json-smart/2.3/json-smart-2.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/net/minidev/json-smart/2.3/json-smart-2.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/net/minidev/json-smart/2.3/json-smart-2.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_commons_commons_email_1_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.commons:commons-email:1.1">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-email/1.1/commons-email-1.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-email/1.1/commons-email-1.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-email/1.1/commons-email-1.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_commons_commons_lang3_3_3_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.commons:commons-lang3:3.3.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-lang3/3.3.2/commons-lang3-3.3.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_commons_commons_pool2_2_6_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.commons:commons-pool2:2.6.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.6.2/commons-pool2-2.6.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.6.2/commons-pool2-2.6.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-pool2/2.6.2/commons-pool2-2.6.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_commons_commons_text_1_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.commons:commons-text:1.1">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-text/1.1/commons-text-1.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-text/1.1/commons-text-1.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/commons/commons-text/1.1/commons-text-1.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.httpcomponents:httpclient:4.5.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpclient/4.5.3/httpclient-4.5.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_12.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.httpcomponents:httpcore:4.4.12">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.12/httpcore-4.4.12.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.12/httpcore-4.4.12-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpcore/4.4.12/httpcore-4.4.12-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_httpcomponents_httpmime_4_5_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.httpcomponents:httpmime:4.5.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpmime/4.5.3/httpmime-4.5.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpmime/4.5.3/httpmime-4.5.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/httpcomponents/httpmime/4.5.3/httpmime-4.5.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_11_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.logging.log4j:log4j-api:2.11.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-api/2.11.2/log4j-api-2.11.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_11_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.11.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.11.2/log4j-to-slf4j-2.11.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.11.2/log4j-to-slf4j-2.11.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/logging/log4j/log4j-to-slf4j/2.11.2/log4j-to-slf4j-2.11.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_apache_thrift_libthrift_0_9_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.apache.thrift:libthrift:0.9.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/thrift/libthrift/0.9.2/libthrift-0.9.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/thrift/libthrift/0.9.2/libthrift-0.9.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/apache/thrift/libthrift/0.9.2/libthrift-0.9.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_assertj_assertj_core_3_11_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.assertj:assertj-core:3.11.1">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/assertj/assertj-core/3.11.1/assertj-core-3.11.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/assertj/assertj-core/3.11.1/assertj-core-3.11.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/assertj/assertj-core/3.11.1/assertj-core-3.11.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_dom4j_dom4j_2_1_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.dom4j:dom4j:2.1.0">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/dom4j/dom4j/2.1.0/dom4j-2.1.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/dom4j/dom4j/2.1.0/dom4j-2.1.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/dom4j/dom4j/2.1.0/dom4j-2.1.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_hamcrest_hamcrest_core_1_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.hamcrest:hamcrest-core:1.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-core/1.3/hamcrest-core-1.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_hamcrest_hamcrest_library_1_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.hamcrest:hamcrest-library:1.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/hamcrest/hamcrest-library/1.3/hamcrest-library-1.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_jsoup_jsoup_1_11_2.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.jsoup:jsoup:1.11.2">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/jsoup/jsoup/1.11.2/jsoup-1.11.2.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/jsoup/jsoup/1.11.2/jsoup-1.11.2-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/jsoup/jsoup/1.11.2/jsoup-1.11.2-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_mockito_mockito_core_2_23_4.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.mockito:mockito-core:2.23.4">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-core/2.23.4/mockito-core-2.23.4.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-core/2.23.4/mockito-core-2.23.4-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/mockito/mockito-core/2.23.4/mockito-core-2.23.4-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_objenesis_objenesis_2_6.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.objenesis:objenesis:2.6">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/objenesis/objenesis/2.6/objenesis-2.6.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/objenesis/objenesis/2.6/objenesis-2.6-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/objenesis/objenesis/2.6/objenesis-2.6-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_ow2_asm_asm_5_0_4.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.ow2.asm:asm:5.0.4">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/5.0.4/asm-5.0.4.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/5.0.4/asm-5.0.4-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/ow2/asm/asm/5.0.4/asm-5.0.4-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_skyscreamer_jsonassert_1_5_0.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.skyscreamer:jsonassert:1.5.0">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_28.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.slf4j:jul-to-slf4j:1.7.28">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.28/jul-to-slf4j-1.7.28.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.28/jul-to-slf4j-1.7.28-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/jul-to-slf4j/1.7.28/jul-to-slf4j-1.7.28-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_28.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.slf4j:slf4j-api:1.7.28">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.28/slf4j-api-1.7.28.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.28/slf4j-api-1.7.28-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/slf4j/slf4j-api/1.7.28/slf4j-api-1.7.28-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_boot_spring_boot_2_1_9_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.boot:spring-boot:2.1.9.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.1.9.RELEASE/spring-boot-2.1.9.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.1.9.RELEASE/spring-boot-2.1.9.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot/2.1.9.RELEASE/spring-boot-2.1.9.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_1_9_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.1.9.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.1.9.RELEASE/spring-boot-autoconfigure-2.1.9.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.1.9.RELEASE/spring-boot-autoconfigure-2.1.9.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-autoconfigure/2.1.9.RELEASE/spring-boot-autoconfigure-2.1.9.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_1_9_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.boot:spring-boot-starter:2.1.9.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.1.9.RELEASE/spring-boot-starter-2.1.9.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.1.9.RELEASE/spring-boot-starter-2.1.9.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter/2.1.9.RELEASE/spring-boot-starter-2.1.9.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_1_9_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.boot:spring-boot-starter-logging:2.1.9.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.1.9.RELEASE/spring-boot-starter-logging-2.1.9.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.1.9.RELEASE/spring-boot-starter-logging-2.1.9.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-logging/2.1.9.RELEASE/spring-boot-starter-logging-2.1.9.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_test_2_1_9_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.boot:spring-boot-starter-test:2.1.9.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-test/2.1.9.RELEASE/spring-boot-starter-test-2.1.9.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-test/2.1.9.RELEASE/spring-boot-starter-test-2.1.9.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-starter-test/2.1.9.RELEASE/spring-boot-starter-test-2.1.9.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_boot_spring_boot_test_2_1_9_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.boot:spring-boot-test:2.1.9.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test/2.1.9.RELEASE/spring-boot-test-2.1.9.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test/2.1.9.RELEASE/spring-boot-test-2.1.9.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test/2.1.9.RELEASE/spring-boot-test-2.1.9.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_boot_spring_boot_test_autoconfigure_2_1_9_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.1.9.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test-autoconfigure/2.1.9.RELEASE/spring-boot-test-autoconfigure-2.1.9.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test-autoconfigure/2.1.9.RELEASE/spring-boot-test-autoconfigure-2.1.9.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/boot/spring-boot-test-autoconfigure/2.1.9.RELEASE/spring-boot-test-autoconfigure-2.1.9.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_spring_aop_5_1_10_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework:spring-aop:5.1.10.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.1.10.RELEASE/spring-aop-5.1.10.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.1.10.RELEASE/spring-aop-5.1.10.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-aop/5.1.10.RELEASE/spring-aop-5.1.10.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_spring_beans_5_1_10_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework:spring-beans:5.1.10.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.1.10.RELEASE/spring-beans-5.1.10.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.1.10.RELEASE/spring-beans-5.1.10.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-beans/5.1.10.RELEASE/spring-beans-5.1.10.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_spring_context_5_1_10_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework:spring-context:5.1.10.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.1.10.RELEASE/spring-context-5.1.10.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.1.10.RELEASE/spring-context-5.1.10.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-context/5.1.10.RELEASE/spring-context-5.1.10.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_spring_core_5_1_10_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework:spring-core:5.1.10.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.1.10.RELEASE/spring-core-5.1.10.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.1.10.RELEASE/spring-core-5.1.10.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-core/5.1.10.RELEASE/spring-core-5.1.10.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_spring_expression_5_1_10_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework:spring-expression:5.1.10.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.1.10.RELEASE/spring-expression-5.1.10.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.1.10.RELEASE/spring-expression-5.1.10.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-expression/5.1.10.RELEASE/spring-expression-5.1.10.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_spring_jcl_5_1_10_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework:spring-jcl:5.1.10.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.1.10.RELEASE/spring-jcl-5.1.10.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.1.10.RELEASE/spring-jcl-5.1.10.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-jcl/5.1.10.RELEASE/spring-jcl-5.1.10.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_springframework_spring_test_5_1_10_RELEASE.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.springframework:spring-test:5.1.10.RELEASE">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-test/5.1.10.RELEASE/spring-test-5.1.10.RELEASE.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-test/5.1.10.RELEASE/spring-test-5.1.10.RELEASE-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/springframework/spring-test/5.1.10.RELEASE/spring-test-5.1.10.RELEASE-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_xmlunit_xmlunit_core_2_6_3.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.xmlunit:xmlunit-core:2.6.3">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/xmlunit/xmlunit-core/2.6.3/xmlunit-core-2.6.3.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/xmlunit/xmlunit-core/2.6.3/xmlunit-core-2.6.3-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/xmlunit/xmlunit-core/2.6.3/xmlunit-core-2.6.3-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__org_yaml_snakeyaml_1_23.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: org.yaml:snakeyaml:1.23">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.23/snakeyaml-1.23.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.23/snakeyaml-1.23-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/org/yaml/snakeyaml/1.23/snakeyaml-1.23-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/libraries/Maven__redis_clients_jedis_2_7_1.xml

@@ -0,0 +1,13 @@
+<component name="libraryTable">
+  <library name="Maven: redis.clients:jedis:2.7.1">
+    <CLASSES>
+      <root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/2.7.1/jedis-2.7.1.jar!/" />
+    </CLASSES>
+    <JAVADOC>
+      <root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/2.7.1/jedis-2.7.1-javadoc.jar!/" />
+    </JAVADOC>
+    <SOURCES>
+      <root url="jar://$MAVEN_REPOSITORY$/redis/clients/jedis/2.7.1/jedis-2.7.1-sources.jar!/" />
+    </SOURCES>
+  </library>
+</component>

+ 13 - 0
.idea/misc.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="MavenProjectsManager">
+    <option name="originalFiles">
+      <list>
+        <option value="$PROJECT_DIR$/pom.xml" />
+      </list>
+    </option>
+  </component>
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+    <output url="file://$PROJECT_DIR$/out" />
+  </component>
+</project>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/texiu-data-migration.iml" filepath="$PROJECT_DIR$/texiu-data-migration.iml" />
+    </modules>
+  </component>
+</project>

+ 124 - 0
.idea/uiDesigner.xml

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

+ 1453 - 0
.idea/workspace.xml

@@ -0,0 +1,1453 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="BookmarkManager">
+    <bookmark url="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchUploadStaticResourceWorker.java" line="64" mnemonic="1" />
+  </component>
+  <component name="ChangeListManager">
+    <list default="true" id="7f86fa79-2437-4921-b8e2-a447fb3bb97d" name="Default Changelist" comment="" />
+    <ignored path="$PROJECT_DIR$/out/" />
+    <ignored path="$PROJECT_DIR$/target/" />
+    <option name="EXCLUDED_CONVERTED_TO_IGNORED" value="true" />
+    <option name="SHOW_DIALOG" value="false" />
+    <option name="HIGHLIGHT_CONFLICTS" value="true" />
+    <option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
+    <option name="LAST_RESOLUTION" value="IGNORE" />
+  </component>
+  <component name="DefaultGradleProjectSettings">
+    <option name="isMigrated" value="true" />
+  </component>
+  <component name="FileEditorManager">
+    <leaf SIDE_TABS_SIZE_LIMIT_KEY="300">
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchUploadStaticResourceWorker.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="1615">
+              <caret line="188" column="37" lean-forward="true" selection-start-line="188" selection-start-column="37" selection-end-line="188" selection-end-column="37" />
+              <folding>
+                <element signature="imports" expanded="true" />
+                <element signature="method#handleTemplateUrl#0;class#BatchUploadStaticResourceWorker#0" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/resources/db-config/texuan_home.xml">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="738">
+              <caret line="76" column="24" selection-start-line="76" selection-start-column="24" selection-end-line="76" selection-end-column="24" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="true">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/base/BaseTaskWorker.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="517">
+              <caret line="88" column="35" lean-forward="true" selection-start-line="88" selection-start-column="35" selection-end-line="88" selection-end-column="35" />
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/resources/db-config/hiyd_cms.xml">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="476">
+              <caret line="28" column="36" lean-forward="true" selection-start-line="28" selection-start-column="36" selection-end-line="28" selection-end-column="36" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/FileUtil.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="585">
+              <caret line="174" selection-start-line="174" selection-end-line="174" />
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/UploadApiResult.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="687">
+              <caret line="68" column="38" lean-forward="true" selection-start-line="68" selection-start-column="38" selection-end-line="68" selection-end-column="38" />
+              <folding>
+                <element signature="imports" expanded="true" />
+                <element signature="e#415#416#0" expanded="true" />
+                <element signature="e#433#434#0" expanded="true" />
+                <element signature="e#467#468#0" expanded="true" />
+                <element signature="e#490#491#0" expanded="true" />
+                <element signature="e#520#521#0" expanded="true" />
+                <element signature="e#538#539#0" expanded="true" />
+                <element signature="e#577#578#0" expanded="true" />
+                <element signature="e#600#601#0" expanded="true" />
+                <element signature="e#627#628#0" expanded="true" />
+                <element signature="e#647#648#0" expanded="true" />
+                <element signature="e#710#711#0" expanded="true" />
+                <element signature="e#737#738#0" expanded="true" />
+                <element signature="e#912#913#0" expanded="true" />
+                <element signature="e#934#935#0" expanded="true" />
+                <element signature="e#976#977#0" expanded="true" />
+                <element signature="e#1005#1006#0" expanded="true" />
+                <element signature="e#1030#1031#0" expanded="true" />
+                <element signature="e#1049#1050#0" expanded="true" />
+                <element signature="e#1105#1106#0" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/DBUtil.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="183">
+              <caret line="42" column="40" selection-start-line="42" selection-start-column="40" selection-end-line="42" selection-end-column="40" />
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/resources/code.properties">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="374">
+              <caret line="22" column="95" selection-start-line="22" selection-start-column="95" selection-end-line="22" selection-end-column="95" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/SqlUtil.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="183">
+              <caret line="54" selection-start-line="54" selection-end-line="54" />
+              <folding>
+                <element signature="imports" expanded="true" />
+              </folding>
+            </state>
+          </provider>
+        </entry>
+      </file>
+      <file pinned="false" current-in-tab="false">
+        <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/Constants.java">
+          <provider selected="true" editor-type-id="text-editor">
+            <state relative-caret-position="187">
+              <caret line="11" column="47" selection-start-line="11" selection-start-column="38" selection-end-line="11" selection-end-column="47" />
+            </state>
+          </provider>
+        </entry>
+      </file>
+    </leaf>
+  </component>
+  <component name="FileTemplateManagerImpl">
+    <option name="RECENT_TEMPLATES">
+      <list>
+        <option value="Class" />
+      </list>
+    </option>
+  </component>
+  <component name="FindBugs-IDEA-Workspace">
+    <toolWindowScrollToSource>false</toolWindowScrollToSource>
+  </component>
+  <component name="FindInProjectRecents">
+    <findStrings>
+      <find>student</find>
+      <find>lock</find>
+      <find>state</find>
+      <find>Fair</find>
+      <find>FASTDFS_DOMAIN</find>
+      <find>upload2AliServer</find>
+      <find>'0000</find>
+      <find>id</find>
+      <find>GET http://14.17.106.12:8089/user/getByPhone</find>
+      <find>VideoInfo</find>
+      <find>duration</find>
+      <find>开始执行任务!</find>
+      <find>开始处理</find>
+      <find>getExtensionName</find>
+      <find>http</find>
+      <find>template_log</find>
+      <find>articles</find>
+      <find>food_info</find>
+      <find>template</find>
+      <find>System</find>
+      <find>doRead</find>
+      <find>出</find>
+    </findStrings>
+    <replaceStrings>
+      <replace>table</replace>
+      <replace>VideoInfoFF</replace>
+      <replace>处理</replace>
+    </replaceStrings>
+  </component>
+  <component name="Git.Settings">
+    <option name="ROOT_SYNC" value="DONT_SYNC" />
+  </component>
+  <component name="IdeDocumentHistory">
+    <option name="CHANGED_PATHS">
+      <list>
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/Test.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/file2" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/HttpResponseEntity.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/TestBingFa.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/file.md" />
+        <option value="$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/Test.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/TestThread.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/RedisHelper.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/ProLock.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/RedisLock.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/lock/RedisLock.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/DistributedLock.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/config/application-prod2.yml" />
+        <option value="$PROJECT_DIR$/src/main/resources/config/application-aliyun.yml" />
+        <option value="$PROJECT_DIR$/src/main/resources/config/application-prod.yml" />
+        <option value="$PROJECT_DIR$/src/main/resources/config/admin/application-prod.yml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/CommonThreadPool.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/HttpClientService.java" />
+        <option value="$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/GetAndRefreshInCache.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/HttpClient.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/model/TableInfo.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/sql.txt" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/model/VideoInfo.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/HttpUtils.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/ddd.txt" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/dd" />
+        <option value="$PROJECT_DIR$/src/main/resources/table.xml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/model/VideoInfoFF.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/FFmpegUtils.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/ServiceException.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/VideoConstant.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchHandleVideo.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/ZipUtil.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/model/EditJsonInfo.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchHandleVideoTask.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/model/ErrorInfo.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/redis.conf" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/PropertiesUtil.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/DBUtil.java" />
+        <option value="$PROJECT_DIR$/pom.xml" />
+        <option value="$PROJECT_DIR$/src/main/resources/db-config/hiyd_home.xml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/TextUtil.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/Constants.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/SqlUtil.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchUploadStaticResourceWorker.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/db-config/texuan_home.xml" />
+        <option value="$PROJECT_DIR$/src/main/resources/code.properties" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/FileUtil.java" />
+        <option value="$PROJECT_DIR$/src/main/resources/db-config/hiyd_cms.xml" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/UploadApiResult.java" />
+        <option value="$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/base/BaseTaskWorker.java" />
+      </list>
+    </option>
+  </component>
+  <component name="MavenImportPreferences">
+    <option name="generalSettings">
+      <MavenGeneralSettings>
+        <option name="mavenHome" value="D:/dev-software/apache-maven-3.6.1" />
+        <option name="userSettingsFile" value="D:\dev-software\apache-maven-3.6.1\conf\settings.xml" />
+      </MavenGeneralSettings>
+    </option>
+    <option name="importingSettings">
+      <MavenImportingSettings>
+        <option name="importAutomatically" value="true" />
+      </MavenImportingSettings>
+    </option>
+  </component>
+  <component name="MavenProjectNavigator">
+    <treeState>
+      <expand>
+        <path>
+          <item name="" type="16c1761:MavenProjectsStructure$RootNode" />
+          <item name="texiu-data-migration" type="9519ce18:MavenProjectsStructure$ProjectNode" />
+        </path>
+        <path>
+          <item name="" type="16c1761:MavenProjectsStructure$RootNode" />
+          <item name="texiu-data-migration" type="9519ce18:MavenProjectsStructure$ProjectNode" />
+          <item name="Lifecycle" type="58874e2:MavenProjectsStructure$LifecycleNode" />
+        </path>
+      </expand>
+      <select />
+    </treeState>
+  </component>
+  <component name="ProjectFrameBounds" extendedState="6">
+    <option name="x" value="528" />
+    <option name="width" value="1400" />
+    <option name="height" value="1000" />
+  </component>
+  <component name="ProjectView">
+    <navigator proportions="" version="1">
+      <foldersAlwaysOnTop value="true" />
+    </navigator>
+    <panes>
+      <pane id="ProjectPane">
+        <subPane>
+          <expand>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="java" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="java" type="462c0819:PsiDirectoryNode" />
+              <item name="com" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="java" type="462c0819:PsiDirectoryNode" />
+              <item name="com" type="462c0819:PsiDirectoryNode" />
+              <item name="duowan" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="java" type="462c0819:PsiDirectoryNode" />
+              <item name="com" type="462c0819:PsiDirectoryNode" />
+              <item name="duowan" type="462c0819:PsiDirectoryNode" />
+              <item name="texiu" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="java" type="462c0819:PsiDirectoryNode" />
+              <item name="com" type="462c0819:PsiDirectoryNode" />
+              <item name="duowan" type="462c0819:PsiDirectoryNode" />
+              <item name="texiu" type="462c0819:PsiDirectoryNode" />
+              <item name="data" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="java" type="462c0819:PsiDirectoryNode" />
+              <item name="com" type="462c0819:PsiDirectoryNode" />
+              <item name="duowan" type="462c0819:PsiDirectoryNode" />
+              <item name="texiu" type="462c0819:PsiDirectoryNode" />
+              <item name="data" type="462c0819:PsiDirectoryNode" />
+              <item name="migration" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="java" type="462c0819:PsiDirectoryNode" />
+              <item name="com" type="462c0819:PsiDirectoryNode" />
+              <item name="duowan" type="462c0819:PsiDirectoryNode" />
+              <item name="texiu" type="462c0819:PsiDirectoryNode" />
+              <item name="data" type="462c0819:PsiDirectoryNode" />
+              <item name="migration" type="462c0819:PsiDirectoryNode" />
+              <item name="script" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="resources" type="462c0819:PsiDirectoryNode" />
+            </path>
+            <path>
+              <item name="texiu-data-migration" type="b2602c69:ProjectViewProjectNode" />
+              <item name="texiu-data-migration" type="462c0819:PsiDirectoryNode" />
+              <item name="src" type="462c0819:PsiDirectoryNode" />
+              <item name="main" type="462c0819:PsiDirectoryNode" />
+              <item name="resources" type="462c0819:PsiDirectoryNode" />
+              <item name="db-config" type="462c0819:PsiDirectoryNode" />
+            </path>
+          </expand>
+          <select />
+        </subPane>
+      </pane>
+      <pane id="Scope" />
+      <pane id="PackagesPane" />
+    </panes>
+  </component>
+  <component name="PropertiesComponent">
+    <property name="WebServerToolWindowFactoryState" value="false" />
+    <property name="aspect.path.notification.shown" value="true" />
+    <property name="last_opened_file_path" value="$PROJECT_DIR$/src/main/resources/config/admin" />
+    <property name="nodejs_interpreter_path.stuck_in_default_project" value="undefined stuck path" />
+    <property name="nodejs_npm_path_reset_for_default_project" value="true" />
+    <property name="nodejs_package_manager_path" value="npm" />
+    <property name="settings.editor.selected.configurable" value="EclipseFormatter" />
+  </component>
+  <component name="RecentsManager">
+    <key name="CopyFile.RECENT_KEYS">
+      <recent name="E:\code\dw\demo\texiu\texiu-data-migration\src\main\resources\config\admin" />
+      <recent name="E:\code\dw\demo\texiu\texiu-data-migration\src\main\resources\config" />
+    </key>
+    <key name="CopyClassDialog.RECENTS_KEY">
+      <recent name="com.duowan.texiu.data.migration.tools" />
+      <recent name="com.duowan.texiu.data.migration.model" />
+    </key>
+    <key name="MoveFile.RECENT_KEYS">
+      <recent name="E:\code\dw\demo\texiu\texiu-data-migration\src\main\resources\db-config" />
+      <recent name="E:\code\dw\demo\texiu\texiu-data-migration\src\main\resources\config\api" />
+    </key>
+  </component>
+  <component name="RunDashboard">
+    <option name="ruleStates">
+      <list>
+        <RuleState>
+          <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
+        </RuleState>
+        <RuleState>
+          <option name="name" value="StatusDashboardGroupingRule" />
+        </RuleState>
+      </list>
+    </option>
+  </component>
+  <component name="RunManager" selected="Application.BatchUploadStaticResourceWorker">
+    <configuration name="BaseTaskWorker" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.duowan.texiu.data.migration.script.base.BaseTaskWorker" />
+      <module name="texiu-data-migration" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.duowan.texiu.data.migration.script.base.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="BatchUploadStaticResourceWorker" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.duowan.texiu.data.migration.script.BatchUploadStaticResourceWorker" />
+      <module name="texiu-data-migration" />
+      <option name="VM_PARAMETERS" value="-Dorg.apache.commons.logging.Log=org.apache.commons.logging.impl.SimpleLog -Dorg.apache.commons.logging.simplelog.showdatetime=false -Dorg.apache.commons.logging.simplelog.log.org.apache.http=ERROR -Dorg.apache.commons.logging.simplelog.log.org.apache.http.wire=ERROR " />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.duowan.texiu.data.migration.script.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="Constants" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.duowan.texiu.data.migration.tools.Constants" />
+      <module name="texiu-data-migration" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.duowan.texiu.data.migration.tools.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="FileUtil" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.duowan.texiu.data.migration.tools.FileUtil" />
+      <module name="texiu-data-migration" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.duowan.texiu.data.migration.tools.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="SqlUtil" type="Application" factoryName="Application" temporary="true" nameIsGenerated="true">
+      <option name="MAIN_CLASS_NAME" value="com.duowan.texiu.data.migration.tools.SqlUtil" />
+      <module name="texiu-data-migration" />
+      <extension name="coverage">
+        <pattern>
+          <option name="PATTERN" value="com.duowan.texiu.data.migration.tools.*" />
+          <option name="ENABLED" value="true" />
+        </pattern>
+      </extension>
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <configuration name="TexiuDataMigrationApplication" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
+      <module name="texiu-data-migration" />
+      <option name="SPRING_BOOT_MAIN_CLASS" value="com.duowan.texiu.data.migration.TexiuDataMigrationApplication" />
+      <method v="2">
+        <option name="Make" enabled="true" />
+      </method>
+    </configuration>
+    <list>
+      <item itemvalue="Application.FileUtil" />
+      <item itemvalue="Application.Constants" />
+      <item itemvalue="Application.BatchUploadStaticResourceWorker" />
+      <item itemvalue="Spring Boot.TexiuDataMigrationApplication" />
+      <item itemvalue="Application.SqlUtil" />
+      <item itemvalue="Application.BaseTaskWorker" />
+    </list>
+    <recent_temporary>
+      <list>
+        <item itemvalue="Application.BatchUploadStaticResourceWorker" />
+        <item itemvalue="Application.BaseTaskWorker" />
+        <item itemvalue="Application.Constants" />
+        <item itemvalue="Application.SqlUtil" />
+        <item itemvalue="Application.FileUtil" />
+      </list>
+    </recent_temporary>
+  </component>
+  <component name="SvnConfiguration">
+    <configuration />
+  </component>
+  <component name="TaskManager">
+    <task active="true" id="Default" summary="Default task">
+      <changelist id="7f86fa79-2437-4921-b8e2-a447fb3bb97d" name="Default Changelist" comment="" />
+      <created>1570678877234</created>
+      <option name="number" value="Default" />
+      <option name="presentableId" value="Default" />
+      <updated>1570678877234</updated>
+      <workItem from="1570678881164" duration="52320000" />
+      <workItem from="1571102912189" duration="7071000" />
+      <workItem from="1571463206571" duration="16112000" />
+      <workItem from="1571641325927" duration="4465000" />
+      <workItem from="1571739767915" duration="2002000" />
+      <workItem from="1571996323253" duration="97267000" />
+      <workItem from="1573126972555" duration="12353000" />
+      <workItem from="1573285473728" duration="6178000" />
+      <workItem from="1573436174968" duration="25335000" />
+      <workItem from="1573521682280" duration="25496000" />
+      <workItem from="1573608355652" duration="15461000" />
+      <workItem from="1573722084696" duration="12033000" />
+      <workItem from="1573809227407" duration="7311000" />
+      <workItem from="1574236759890" duration="2846000" />
+      <workItem from="1574243202465" duration="787000" />
+      <workItem from="1574304000638" duration="8728000" />
+      <workItem from="1574388336553" duration="2689000" />
+      <workItem from="1574414855646" duration="10203000" />
+      <workItem from="1574662095360" duration="53958000" />
+    </task>
+    <servers />
+  </component>
+  <component name="TimeTrackingManager">
+    <option name="totallyTimeSpent" value="362615000" />
+  </component>
+  <component name="ToolWindowManager">
+    <frame x="-8" y="-8" width="1936" height="1056" extended-state="6" />
+    <editor active="true" />
+    <layout>
+      <window_info content_ui="combo" id="Project" order="0" visible="true" weight="0.19669509" />
+      <window_info id="Structure" order="1" side_tool="true" weight="0.25" />
+      <window_info id="Designer" order="2" />
+      <window_info id="Image Layers" order="3" />
+      <window_info id="Capture Tool" order="4" />
+      <window_info id="UI Designer" order="5" />
+      <window_info id="Favorites" order="6" side_tool="true" />
+      <window_info anchor="bottom" id="Message" order="0" />
+      <window_info anchor="bottom" id="Find" order="1" weight="0.32900432" />
+      <window_info anchor="bottom" id="Run" order="2" sideWeight="0.49946696" weight="0.482684" />
+      <window_info anchor="bottom" id="Debug" order="3" weight="0.3538961" />
+      <window_info anchor="bottom" id="Cvs" order="4" weight="0.25" />
+      <window_info anchor="bottom" id="Inspection" order="5" weight="0.4" />
+      <window_info anchor="bottom" id="TODO" order="6" />
+      <window_info anchor="bottom" id="FindBugs-IDEA" order="7" weight="0.32900432" />
+      <window_info anchor="bottom" id="Spring" order="8" />
+      <window_info anchor="bottom" id="Terminal" order="9" weight="0.32900432" />
+      <window_info anchor="bottom" id="Docker" order="10" show_stripe_button="false" />
+      <window_info anchor="bottom" id="Event Log" order="11" sideWeight="0.50053304" side_tool="true" weight="0.39718616" />
+      <window_info anchor="bottom" id="Messages" order="12" weight="0.32900432" />
+      <window_info anchor="bottom" id="Database Changes" order="13" />
+      <window_info anchor="bottom" id="Version Control" order="14" />
+      <window_info anchor="right" id="Commander" internal_type="SLIDING" order="0" type="SLIDING" weight="0.4" />
+      <window_info anchor="right" id="Ant Build" order="1" weight="0.25" />
+      <window_info anchor="right" content_ui="combo" id="Hierarchy" order="2" weight="0.25" />
+      <window_info anchor="right" id="Maven" order="3" visible="true" weight="0.11886994" />
+      <window_info anchor="right" id="Palette" order="4" />
+      <window_info anchor="right" id="Capture Analysis" order="5" />
+      <window_info anchor="right" id="Database" order="6" />
+      <window_info anchor="right" id="Palette&#9;" order="7" />
+      <window_info anchor="right" id="Theme Preview" order="8" />
+    </layout>
+  </component>
+  <component name="TypeScriptGeneratedFilesManager">
+    <option name="version" value="1" />
+  </component>
+  <component name="XDebuggerManager">
+    <breakpoint-manager>
+      <breakpoints>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/SqlUtil.java</url>
+          <line>83</line>
+          <properties />
+          <option name="timeStamp" value="16" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchUploadStaticResourceWorker.java</url>
+          <line>249</line>
+          <properties />
+          <option name="timeStamp" value="32" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchUploadStaticResourceWorker.java</url>
+          <line>138</line>
+          <properties />
+          <option name="timeStamp" value="34" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchUploadStaticResourceWorker.java</url>
+          <line>96</line>
+          <properties />
+          <option name="timeStamp" value="35" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-line">
+          <url>file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchUploadStaticResourceWorker.java</url>
+          <line>101</line>
+          <properties />
+          <option name="timeStamp" value="36" />
+        </line-breakpoint>
+        <line-breakpoint enabled="true" type="java-field">
+          <url>file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/DBUtil.java</url>
+          <line>15</line>
+          <properties field="URL" class="com.duowan.texiu.data.migration.tools.DBUtil" />
+          <option name="timeStamp" value="17" />
+        </line-breakpoint>
+      </breakpoints>
+    </breakpoint-manager>
+    <watches-manager>
+      <configuration name="Application">
+        <watch expression="Constants.DB_CONFIG" language="JAVA" />
+      </configuration>
+    </watches-manager>
+  </component>
+  <component name="debuggerHistoryManager">
+    <expressions id="watch">
+      <expression>
+        <expression-string>Constants.DB_CONFIG</expression-string>
+        <language-id>JAVA</language-id>
+        <evaluation-mode>EXPRESSION</evaluation-mode>
+      </expression>
+    </expressions>
+  </component>
+  <component name="editorHistoryManager">
+    <entry file="file://$PROJECT_DIR$/src/main/resources/config/api/application-aliyun-db.yml">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/config/api/application-prod.yml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="402">
+          <caret line="44" lean-forward="true" selection-start-line="44" selection-end-line="86" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/config/admin/application-prod.yml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="340">
+          <caret line="20" column="7" selection-start-line="20" selection-start-column="7" selection-end-line="20" selection-end-column="7" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/CommonThreadPool.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="357">
+          <caret line="22" column="23" selection-start-line="22" selection-start-column="23" selection-end-line="22" selection-end-column="23" />
+          <folding>
+            <element signature="e#1641#1642#0" expanded="true" />
+            <element signature="e#1676#1677#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/HttpClientService.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="2465">
+          <caret line="147" column="17" selection-start-line="147" selection-start-column="17" selection-end-line="147" selection-end-column="17" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/RedisLock.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="510">
+          <caret line="32" selection-start-line="32" selection-end-line="32" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/RedisHelper.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="323">
+          <caret line="21" selection-start-line="21" selection-end-line="21" />
+          <folding>
+            <element signature="e#172#173#0" expanded="true" />
+            <element signature="e#199#200#0" expanded="true" />
+            <element signature="e#331#332#0" expanded="true" />
+            <element signature="e#358#359#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/ProLock.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1088">
+          <caret line="64" column="2" selection-start-line="64" selection-start-column="2" selection-end-line="64" selection-end-column="2" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://D:/dev-software/jdk1.8/src.zip!/java/util/function/BiConsumer.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="405">
+          <caret line="52" column="9" selection-start-line="52" selection-start-column="9" selection-end-line="52" selection-end-column="9" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/DistributedLock.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="578">
+          <caret line="36" column="59" selection-start-line="36" selection-start-column="59" selection-end-line="36" selection-end-column="59" />
+          <folding>
+            <element signature="e#309#310#0" expanded="true" />
+            <element signature="e#345#346#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/config/admin/application-prod-aliyun-db.yml">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/HttpUtils.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="485">
+          <caret line="42" column="9" lean-forward="true" selection-start-line="42" selection-start-column="9" selection-end-line="42" selection-end-column="9" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="jar://D:/dev-software/jdk1.8/src.zip!/java/util/ArrayList.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="461">
+          <caret line="173" column="77" selection-start-line="173" selection-start-column="77" selection-end-line="173" selection-end-column="77" />
+          <folding>
+            <element signature="e#11079#11080#0" expanded="true" />
+            <element signature="e#11117#11118#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/ddd.txt" />
+    <entry file="jar://$MAVEN_REPOSITORY$/mysql/mysql-connector-java/6.0.3/mysql-connector-java-6.0.3.jar!/com/mysql/cj/jdbc/Driver.class">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="102">
+          <caret line="10" column="13" selection-start-line="10" selection-start-column="13" selection-end-line="10" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/dd">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="340">
+          <caret line="20" column="27" selection-start-line="20" selection-start-column="27" selection-end-line="20" selection-end-column="27" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/TexiuDataMigrationApplication.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="85">
+          <caret line="6" column="13" selection-start-line="6" selection-start-column="13" selection-end-line="6" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/model/TableInfo.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="153">
+          <caret line="9" column="13" selection-start-line="9" selection-start-column="13" selection-end-line="9" selection-end-column="13" />
+          <folding>
+            <element signature="e#294#295#0" expanded="true" />
+            <element signature="e#326#327#0" expanded="true" />
+            <element signature="e#376#377#0" expanded="true" />
+            <element signature="e#418#419#0" expanded="true" />
+            <element signature="e#455#456#0" expanded="true" />
+            <element signature="e#488#489#0" expanded="true" />
+            <element signature="e#540#541#0" expanded="true" />
+            <element signature="e#584#585#0" expanded="true" />
+            <element signature="e#621#622#0" expanded="true" />
+            <element signature="e#648#649#0" expanded="true" />
+            <element signature="e#694#695#0" expanded="true" />
+            <element signature="e#726#727#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/test/java/com/duowan/texiu/data/migration/GetAndRefreshInCache.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1479">
+          <caret line="87" column="2" selection-start-line="87" selection-start-column="2" selection-end-line="87" selection-end-column="2" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/ServiceException.java">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/model/VideoInfoFF.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="6817">
+          <caret line="629" column="40" selection-start-line="629" selection-start-column="40" selection-end-line="629" selection-end-column="40" />
+          <folding>
+            <element signature="imports" expanded="true" />
+            <element signature="e#2669#2670#0" expanded="true" />
+            <element signature="e#2698#2699#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/FFmpegUtils.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="170">
+          <caret line="10" selection-start-line="10" selection-end-line="10" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/VideoConstant.java">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/model/VideoInfo.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="153">
+          <caret line="9" column="13" selection-start-line="9" selection-start-column="13" selection-end-line="9" selection-end-column="13" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchHandleVideo.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="714">
+          <caret line="52" column="5" selection-start-line="52" selection-start-column="5" selection-end-line="52" selection-end-column="5" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/model/ErrorInfo.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="187">
+          <caret line="11" selection-start-line="11" selection-end-line="11" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/model/EditJsonInfo.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="187">
+          <caret line="11" column="3" selection-start-line="11" selection-start-column="3" selection-end-line="11" selection-end-column="3" />
+          <folding>
+            <element signature="e#2561#2562#0" expanded="true" />
+            <element signature="e#2586#2587#0" expanded="true" />
+            <element signature="e#2622#2623#0" expanded="true" />
+            <element signature="e#2650#2651#0" expanded="true" />
+            <element signature="e#2680#2681#0" expanded="true" />
+            <element signature="e#2706#2707#0" expanded="true" />
+            <element signature="e#2744#2745#0" expanded="true" />
+            <element signature="e#2774#2775#0" expanded="true" />
+            <element signature="e#2809#2810#0" expanded="true" />
+            <element signature="e#2840#2841#0" expanded="true" />
+            <element signature="e#2888#2889#0" expanded="true" />
+            <element signature="e#2928#2929#0" expanded="true" />
+            <element signature="e#2961#2962#0" expanded="true" />
+            <element signature="e#2993#2994#0" expanded="true" />
+            <element signature="e#3040#3041#0" expanded="true" />
+            <element signature="e#3082#3083#0" expanded="true" />
+            <element signature="e#3112#3113#0" expanded="true" />
+            <element signature="e#3141#3142#0" expanded="true" />
+            <element signature="e#3182#3183#0" expanded="true" />
+            <element signature="e#3218#3219#0" expanded="true" />
+            <element signature="e#3247#3248#0" expanded="true" />
+            <element signature="e#3275#3276#0" expanded="true" />
+            <element signature="e#3314#3315#0" expanded="true" />
+            <element signature="e#3348#3349#0" expanded="true" />
+            <element signature="e#3381#3382#0" expanded="true" />
+            <element signature="e#3408#3409#0" expanded="true" />
+            <element signature="e#3450#3451#0" expanded="true" />
+            <element signature="e#3482#3483#0" expanded="true" />
+            <element signature="e#3516#3517#0" expanded="true" />
+            <element signature="e#3549#3550#0" expanded="true" />
+            <element signature="e#3598#3599#0" expanded="true" />
+            <element signature="e#3642#3643#0" expanded="true" />
+            <element signature="e#3673#3674#0" expanded="true" />
+            <element signature="e#3703#3704#0" expanded="true" />
+            <element signature="e#3746#3747#0" expanded="true" />
+            <element signature="e#3784#3785#0" expanded="true" />
+            <element signature="e#3813#3814#0" expanded="true" />
+            <element signature="e#3841#3842#0" expanded="true" />
+            <element signature="e#3880#3881#0" expanded="true" />
+            <element signature="e#3914#3915#0" expanded="true" />
+            <element signature="e#3955#3956#0" expanded="true" />
+            <element signature="e#3983#3984#0" expanded="true" />
+            <element signature="e#4034#4035#0" expanded="true" />
+            <element signature="e#4068#4069#0" expanded="true" />
+            <element signature="e#4615#4616#0" expanded="true" />
+            <element signature="e#4647#4648#0" expanded="true" />
+            <element signature="e#4682#4683#0" expanded="true" />
+            <element signature="e#4716#4717#0" expanded="true" />
+            <element signature="e#4745#4746#0" expanded="true" />
+            <element signature="e#4777#4778#0" expanded="true" />
+            <element signature="e#4812#4813#0" expanded="true" />
+            <element signature="e#4846#4847#0" expanded="true" />
+            <element signature="e#4875#4876#0" expanded="true" />
+            <element signature="e#4907#4908#0" expanded="true" />
+            <element signature="e#4942#4943#0" expanded="true" />
+            <element signature="e#4976#4977#0" expanded="true" />
+            <element signature="e#5005#5006#0" expanded="true" />
+            <element signature="e#5037#5038#0" expanded="true" />
+            <element signature="e#5072#5073#0" expanded="true" />
+            <element signature="e#5106#5107#0" expanded="true" />
+            <element signature="e#5136#5137#0" expanded="true" />
+            <element signature="e#5169#5170#0" expanded="true" />
+            <element signature="e#5206#5207#0" expanded="true" />
+            <element signature="e#5242#5243#0" expanded="true" />
+            <element signature="e#5274#5275#0" expanded="true" />
+            <element signature="e#5309#5310#0" expanded="true" />
+            <element signature="e#5350#5351#0" expanded="true" />
+            <element signature="e#5390#5391#0" expanded="true" />
+            <element signature="e#5422#5423#0" expanded="true" />
+            <element signature="e#5454#5455#0" expanded="true" />
+            <element signature="e#5492#5493#0" expanded="true" />
+            <element signature="e#5526#5527#0" expanded="true" />
+            <element signature="e#5555#5556#0" expanded="true" />
+            <element signature="e#5587#5588#0" expanded="true" />
+            <element signature="e#5622#5623#0" expanded="true" />
+            <element signature="e#5656#5657#0" expanded="true" />
+            <element signature="e#5685#5686#0" expanded="true" />
+            <element signature="e#5717#5718#0" expanded="true" />
+            <element signature="e#5752#5753#0" expanded="true" />
+            <element signature="e#5786#5787#0" expanded="true" />
+            <element signature="e#5815#5816#0" expanded="true" />
+            <element signature="e#5847#5848#0" expanded="true" />
+            <element signature="e#5882#5883#0" expanded="true" />
+            <element signature="e#5916#5917#0" expanded="true" />
+            <element signature="e#5945#5946#0" expanded="true" />
+            <element signature="e#5977#5978#0" expanded="true" />
+            <element signature="e#6012#6013#0" expanded="true" />
+            <element signature="e#6046#6047#0" expanded="true" />
+            <element signature="e#6600#6601#0" expanded="true" />
+            <element signature="e#6632#6633#0" expanded="true" />
+            <element signature="e#6667#6668#0" expanded="true" />
+            <element signature="e#6701#6702#0" expanded="true" />
+            <element signature="e#6730#6731#0" expanded="true" />
+            <element signature="e#6762#6763#0" expanded="true" />
+            <element signature="e#6797#6798#0" expanded="true" />
+            <element signature="e#6831#6832#0" expanded="true" />
+            <element signature="e#6860#6861#0" expanded="true" />
+            <element signature="e#6892#6893#0" expanded="true" />
+            <element signature="e#6927#6928#0" expanded="true" />
+            <element signature="e#6961#6962#0" expanded="true" />
+            <element signature="e#6990#6991#0" expanded="true" />
+            <element signature="e#7022#7023#0" expanded="true" />
+            <element signature="e#7057#7058#0" expanded="true" />
+            <element signature="e#7091#7092#0" expanded="true" />
+            <element signature="e#7121#7122#0" expanded="true" />
+            <element signature="e#7154#7155#0" expanded="true" />
+            <element signature="e#7191#7192#0" expanded="true" />
+            <element signature="e#7227#7228#0" expanded="true" />
+            <element signature="e#7259#7260#0" expanded="true" />
+            <element signature="e#7294#7295#0" expanded="true" />
+            <element signature="e#7335#7336#0" expanded="true" />
+            <element signature="e#7375#7376#0" expanded="true" />
+            <element signature="e#7407#7408#0" expanded="true" />
+            <element signature="e#7439#7440#0" expanded="true" />
+            <element signature="e#7477#7478#0" expanded="true" />
+            <element signature="e#7511#7512#0" expanded="true" />
+            <element signature="e#7540#7541#0" expanded="true" />
+            <element signature="e#7572#7573#0" expanded="true" />
+            <element signature="e#7607#7608#0" expanded="true" />
+            <element signature="e#7641#7642#0" expanded="true" />
+            <element signature="e#7670#7671#0" expanded="true" />
+            <element signature="e#7702#7703#0" expanded="true" />
+            <element signature="e#7737#7738#0" expanded="true" />
+            <element signature="e#7771#7772#0" expanded="true" />
+            <element signature="e#7800#7801#0" expanded="true" />
+            <element signature="e#7832#7833#0" expanded="true" />
+            <element signature="e#7867#7868#0" expanded="true" />
+            <element signature="e#7901#7902#0" expanded="true" />
+            <element signature="e#7930#7931#0" expanded="true" />
+            <element signature="e#7962#7963#0" expanded="true" />
+            <element signature="e#7997#7998#0" expanded="true" />
+            <element signature="e#8031#8032#0" expanded="true" />
+            <element signature="e#9187#9188#0" expanded="true" />
+            <element signature="e#9226#9227#0" expanded="true" />
+            <element signature="e#9275#9276#0" expanded="true" />
+            <element signature="e#9323#9324#0" expanded="true" />
+            <element signature="e#9359#9360#0" expanded="true" />
+            <element signature="e#9398#9399#0" expanded="true" />
+            <element signature="e#9447#9448#0" expanded="true" />
+            <element signature="e#9495#9496#0" expanded="true" />
+            <element signature="e#9533#9534#0" expanded="true" />
+            <element signature="e#9574#9575#0" expanded="true" />
+            <element signature="e#9627#9628#0" expanded="true" />
+            <element signature="e#9679#9680#0" expanded="true" />
+            <element signature="e#9708#9709#0" expanded="true" />
+            <element signature="e#9740#9741#0" expanded="true" />
+            <element signature="e#9775#9776#0" expanded="true" />
+            <element signature="e#9809#9810#0" expanded="true" />
+            <element signature="e#9838#9839#0" expanded="true" />
+            <element signature="e#9870#9871#0" expanded="true" />
+            <element signature="e#9905#9906#0" expanded="true" />
+            <element signature="e#9939#9940#0" expanded="true" />
+            <element signature="e#9972#9973#0" expanded="true" />
+            <element signature="e#10005#10006#0" expanded="true" />
+            <element signature="e#10045#10046#0" expanded="true" />
+            <element signature="e#10081#10082#0" expanded="true" />
+            <element signature="e#10114#10115#0" expanded="true" />
+            <element signature="e#10147#10148#0" expanded="true" />
+            <element signature="e#10187#10188#0" expanded="true" />
+            <element signature="e#10223#10224#0" expanded="true" />
+            <element signature="e#10252#10253#0" expanded="true" />
+            <element signature="e#10284#10285#0" expanded="true" />
+            <element signature="e#10319#10320#0" expanded="true" />
+            <element signature="e#10353#10354#0" expanded="true" />
+            <element signature="e#10382#10383#0" expanded="true" />
+            <element signature="e#10414#10415#0" expanded="true" />
+            <element signature="e#10449#10450#0" expanded="true" />
+            <element signature="e#10483#10484#0" expanded="true" />
+            <element signature="e#10513#10514#0" expanded="true" />
+            <element signature="e#10546#10547#0" expanded="true" />
+            <element signature="e#10583#10584#0" expanded="true" />
+            <element signature="e#10619#10620#0" expanded="true" />
+            <element signature="e#10651#10652#0" expanded="true" />
+            <element signature="e#10686#10687#0" expanded="true" />
+            <element signature="e#10727#10728#0" expanded="true" />
+            <element signature="e#10767#10768#0" expanded="true" />
+            <element signature="e#10796#10797#0" expanded="true" />
+            <element signature="e#10828#10829#0" expanded="true" />
+            <element signature="e#10863#10864#0" expanded="true" />
+            <element signature="e#10897#10898#0" expanded="true" />
+            <element signature="e#10926#10927#0" expanded="true" />
+            <element signature="e#10958#10959#0" expanded="true" />
+            <element signature="e#10993#10994#0" expanded="true" />
+            <element signature="e#11027#11028#0" expanded="true" />
+            <element signature="e#11056#11057#0" expanded="true" />
+            <element signature="e#11088#11089#0" expanded="true" />
+            <element signature="e#11123#11124#0" expanded="true" />
+            <element signature="e#11157#11158#0" expanded="true" />
+            <element signature="e#11186#11187#0" expanded="true" />
+            <element signature="e#11218#11219#0" expanded="true" />
+            <element signature="e#11253#11254#0" expanded="true" />
+            <element signature="e#11287#11288#0" expanded="true" />
+            <element signature="e#11332#11333#0" expanded="true" />
+            <element signature="e#11368#11369#0" expanded="true" />
+            <element signature="e#11423#11424#0" expanded="true" />
+            <element signature="e#11465#11466#0" expanded="true" />
+            <element signature="e#11503#11504#0" expanded="true" />
+            <element signature="e#11540#11541#0" expanded="true" />
+            <element signature="e#11589#11590#0" expanded="true" />
+            <element signature="e#11633#11634#0" expanded="true" />
+            <element signature="e#12495#12496#0" expanded="true" />
+            <element signature="e#12535#12536#0" expanded="true" />
+            <element signature="e#12574#12575#0" expanded="true" />
+            <element signature="e#12616#12617#0" expanded="true" />
+            <element signature="e#12649#12650#0" expanded="true" />
+            <element signature="e#12689#12690#0" expanded="true" />
+            <element signature="e#12728#12729#0" expanded="true" />
+            <element signature="e#12770#12771#0" expanded="true" />
+            <element signature="e#12807#12808#0" expanded="true" />
+            <element signature="e#12848#12849#0" expanded="true" />
+            <element signature="e#12892#12893#0" expanded="true" />
+            <element signature="e#12936#12937#0" expanded="true" />
+            <element signature="e#12969#12970#0" expanded="true" />
+            <element signature="e#13009#13010#0" expanded="true" />
+            <element signature="e#13048#13049#0" expanded="true" />
+            <element signature="e#13090#13091#0" expanded="true" />
+            <element signature="e#13123#13124#0" expanded="true" />
+            <element signature="e#13163#13164#0" expanded="true" />
+            <element signature="e#13202#13203#0" expanded="true" />
+            <element signature="e#13244#13245#0" expanded="true" />
+            <element signature="e#13278#13279#0" expanded="true" />
+            <element signature="e#13319#13320#0" expanded="true" />
+            <element signature="e#13360#13361#0" expanded="true" />
+            <element signature="e#13404#13405#0" expanded="true" />
+            <element signature="e#13440#13441#0" expanded="true" />
+            <element signature="e#13483#13484#0" expanded="true" />
+            <element signature="e#13528#13529#0" expanded="true" />
+            <element signature="e#13576#13577#0" expanded="true" />
+            <element signature="e#13609#13610#0" expanded="true" />
+            <element signature="e#13649#13650#0" expanded="true" />
+            <element signature="e#13688#13689#0" expanded="true" />
+            <element signature="e#13730#13731#0" expanded="true" />
+            <element signature="e#13763#13764#0" expanded="true" />
+            <element signature="e#13803#13804#0" expanded="true" />
+            <element signature="e#13842#13843#0" expanded="true" />
+            <element signature="e#13884#13885#0" expanded="true" />
+            <element signature="e#13917#13918#0" expanded="true" />
+            <element signature="e#13957#13958#0" expanded="true" />
+            <element signature="e#13996#13997#0" expanded="true" />
+            <element signature="e#14038#14039#0" expanded="true" />
+            <element signature="e#14071#14072#0" expanded="true" />
+            <element signature="e#14111#14112#0" expanded="true" />
+            <element signature="e#14150#14151#0" expanded="true" />
+            <element signature="e#14192#14193#0" expanded="true" />
+            <element signature="e#14243#14244#0" expanded="true" />
+            <element signature="e#14288#14289#0" expanded="true" />
+            <element signature="e#14350#14351#0" expanded="true" />
+            <element signature="e#14402#14403#0" expanded="true" />
+            <element signature="e#15190#15191#0" expanded="true" />
+            <element signature="e#15238#15239#0" expanded="true" />
+            <element signature="e#15281#15282#0" expanded="true" />
+            <element signature="e#15331#15332#0" expanded="true" />
+            <element signature="e#15368#15369#0" expanded="true" />
+            <element signature="e#15416#15417#0" expanded="true" />
+            <element signature="e#15459#15460#0" expanded="true" />
+            <element signature="e#15509#15510#0" expanded="true" />
+            <element signature="e#15546#15547#0" expanded="true" />
+            <element signature="e#15594#15595#0" expanded="true" />
+            <element signature="e#15637#15638#0" expanded="true" />
+            <element signature="e#15687#15688#0" expanded="true" />
+            <element signature="e#15724#15725#0" expanded="true" />
+            <element signature="e#15772#15773#0" expanded="true" />
+            <element signature="e#15815#15816#0" expanded="true" />
+            <element signature="e#15865#15866#0" expanded="true" />
+            <element signature="e#15903#15904#0" expanded="true" />
+            <element signature="e#15952#15953#0" expanded="true" />
+            <element signature="e#15997#15998#0" expanded="true" />
+            <element signature="e#16049#16050#0" expanded="true" />
+            <element signature="e#16089#16090#0" expanded="true" />
+            <element signature="e#16140#16141#0" expanded="true" />
+            <element signature="e#16189#16190#0" expanded="true" />
+            <element signature="e#16245#16246#0" expanded="true" />
+            <element signature="e#16285#16286#0" expanded="true" />
+            <element signature="e#16333#16334#0" expanded="true" />
+            <element signature="e#16379#16380#0" expanded="true" />
+            <element signature="e#16429#16430#0" expanded="true" />
+            <element signature="e#16466#16467#0" expanded="true" />
+            <element signature="e#16514#16515#0" expanded="true" />
+            <element signature="e#16557#16558#0" expanded="true" />
+            <element signature="e#16607#16608#0" expanded="true" />
+            <element signature="e#16644#16645#0" expanded="true" />
+            <element signature="e#16692#16693#0" expanded="true" />
+            <element signature="e#16735#16736#0" expanded="true" />
+            <element signature="e#16785#16786#0" expanded="true" />
+            <element signature="e#16822#16823#0" expanded="true" />
+            <element signature="e#16870#16871#0" expanded="true" />
+            <element signature="e#16913#16914#0" expanded="true" />
+            <element signature="e#16963#16964#0" expanded="true" />
+            <element signature="e#17000#17001#0" expanded="true" />
+            <element signature="e#17048#17049#0" expanded="true" />
+            <element signature="e#17091#17092#0" expanded="true" />
+            <element signature="e#17141#17142#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/TestBingFa.java" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/ZipUtil.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="3196">
+          <caret line="195" column="8" selection-start-line="195" selection-start-column="8" selection-end-line="195" selection-end-column="8" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/file.md" />
+    <entry file="file://$PROJECT_DIR$/src/main/resources/redis.conf" />
+    <entry file="file://$PROJECT_DIR$/src/main/resources/sql.txt" />
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchHandleVideoTask.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="772">
+          <caret line="71" lean-forward="true" selection-start-line="71" selection-end-line="71" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/PropertiesUtil.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="425">
+          <caret line="29" column="15" selection-start-line="29" selection-start-column="15" selection-end-line="29" selection-end-column="15" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/application.properties">
+      <provider selected="true" editor-type-id="text-editor" />
+    </entry>
+    <entry file="uml://MAVEN/com.duowan:texiu-data-migration:0.0.1-SNAPSHOT">
+      <provider selected="true" editor-type-id="UmlEditorProvider">
+        <state>
+          <ID>MAVEN</ID>
+          <OriginalElement>com.duowan:texiu-data-migration:0.0.1-SNAPSHOT</OriginalElement>
+          <nodes>
+            <node x="" y="">com.duowan:texiu-data-migration:0.0.1-SNAPSHOT</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot:jar:2.1.9.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot:jar:2.1.9.RELEASE/org.springframework:spring-context:jar:5.1.10.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot:jar:2.1.9.RELEASE/org.springframework:spring-context:jar:5.1.10.RELEASE/org.springframework:spring-aop:jar:5.1.10.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot:jar:2.1.9.RELEASE/org.springframework:spring-context:jar:5.1.10.RELEASE/org.springframework:spring-beans:jar:5.1.10.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot:jar:2.1.9.RELEASE/org.springframework:spring-context:jar:5.1.10.RELEASE/org.springframework:spring-expression:jar:5.1.10.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot-autoconfigure:jar:2.1.9.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot-starter-logging:jar:2.1.9.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot-starter-logging:jar:2.1.9.RELEASE/ch.qos.logback:logback-classic:jar:1.2.3</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot-starter-logging:jar:2.1.9.RELEASE/ch.qos.logback:logback-classic:jar:1.2.3/ch.qos.logback:logback-core:jar:1.2.3</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot-starter-logging:jar:2.1.9.RELEASE/org.apache.logging.log4j:log4j-to-slf4j:jar:2.11.2</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot-starter-logging:jar:2.1.9.RELEASE/org.apache.logging.log4j:log4j-to-slf4j:jar:2.11.2/org.apache.logging.log4j:log4j-api:jar:2.11.2</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot-starter-logging:jar:2.1.9.RELEASE/org.slf4j:jul-to-slf4j:jar:1.7.28</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/javax.annotation:javax.annotation-api:jar:1.3.2</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework:spring-core:jar:5.1.10.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.springframework:spring-core:jar:5.1.10.RELEASE/org.springframework:spring-jcl:jar:5.1.10.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter:jar:2.1.9.RELEASE/org.yaml:snakeyaml:jar:1.23</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot-test:jar:2.1.9.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.springframework.boot:spring-boot-test-autoconfigure:jar:2.1.9.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/com.jayway.jsonpath:json-path:jar:2.4.0</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/com.jayway.jsonpath:json-path:jar:2.4.0/net.minidev:json-smart:jar:2.3</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/com.jayway.jsonpath:json-path:jar:2.4.0/net.minidev:json-smart:jar:2.3/net.minidev:accessors-smart:jar:1.2</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/com.jayway.jsonpath:json-path:jar:2.4.0/net.minidev:json-smart:jar:2.3/net.minidev:accessors-smart:jar:1.2/org.ow2.asm:asm:jar:5.0.4</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/com.jayway.jsonpath:json-path:jar:2.4.0/org.slf4j:slf4j-api:jar:1.7.28</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/junit:junit:jar:4.12</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.assertj:assertj-core:jar:3.11.1</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.mockito:mockito-core:jar:2.23.4</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.mockito:mockito-core:jar:2.23.4/net.bytebuddy:byte-buddy:jar:1.9.16</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.mockito:mockito-core:jar:2.23.4/net.bytebuddy:byte-buddy-agent:jar:1.9.16</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.mockito:mockito-core:jar:2.23.4/org.objenesis:objenesis:jar:2.6</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.hamcrest:hamcrest-core:jar:1.3</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.hamcrest:hamcrest-library:jar:1.3</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.skyscreamer:jsonassert:jar:1.5.0</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.skyscreamer:jsonassert:jar:1.5.0/com.vaadin.external.google:android-json:jar:0.0.20131108.vaadin1</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.springframework:spring-test:jar:5.1.10.RELEASE</node>
+            <node x="" y="">org.springframework.boot:spring-boot-starter-test:jar:2.1.9.RELEASE/org.xmlunit:xmlunit-core:jar:2.6.3</node>
+            <node x="" y="">mysql:mysql-connector-java:jar:6.0.3</node>
+            <node x="" y="">com.alibaba:fastjson:jar:1.2.58</node>
+            <node x="" y="">org.apache.commons:commons-lang3:jar:3.3.2</node>
+            <node x="" y="">org.dom4j:dom4j:jar:2.1.0</node>
+            <node x="" y="">org.dom4j:dom4j:jar:2.1.0/jaxen:jaxen:jar:1.1.6</node>
+            <node x="" y="">org.apache.httpcomponents:httpclient:jar:4.5.3</node>
+            <node x="" y="">org.apache.httpcomponents:httpclient:jar:4.5.3/org.apache.httpcomponents:httpcore:jar:4.4.12</node>
+            <node x="" y="">org.apache.httpcomponents:httpclient:jar:4.5.3/commons-codec:commons-codec:jar:1.11</node>
+            <node x="" y="">org.apache.httpcomponents:httpmime:jar:4.5.3</node>
+            <node x="" y="">org.apache.httpcomponents:httpmime:jar:4.5.3/org.apache.httpcomponents:httpclient:jar:4.5.10</node>
+            <node x="" y="">com.fasterxml.jackson.core:jackson-databind:jar:2.9.9.3</node>
+            <node x="" y="">com.fasterxml.jackson.core:jackson-databind:jar:2.9.9.3/com.fasterxml.jackson.core:jackson-annotations:jar:2.9.0</node>
+            <node x="" y="">com.fasterxml.jackson.core:jackson-databind:jar:2.9.9.3/com.fasterxml.jackson.core:jackson-core:jar:2.9.9</node>
+            <node x="" y="">redis.clients:jedis:jar:2.7.1</node>
+            <node x="" y="">redis.clients:jedis:jar:2.7.1/org.apache.commons:commons-pool2:jar:2.6.2</node>
+            <node x="" y="">com.google.code.gson:gson:jar:2.8.2</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/com.alibaba:fastjson:jar:1.2.4</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/commons-io:commons-io:jar:2.2</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/commons-fileupload:commons-fileupload:jar:1.2.2</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/commons-collections:commons-collections:jar:3.2.1</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/org.apache.commons:commons-email:jar:1.1</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/org.apache.commons:commons-email:jar:1.1/javax.mail:mail:jar:1.4</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/org.apache.commons:commons-email:jar:1.1/javax.activation:activation:jar:1.1</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/org.apache.commons:commons-lang3:jar:3.8.1</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/org.apache.commons:commons-text:jar:1.1</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/org.apache.commons:commons-text:jar:1.1/org.apache.commons:commons-lang3:jar:3.3.2</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/com.belerweb:pinyin4j:jar:2.5.0</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/redis.clients:jedis:jar:2.9.3</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/org.apache.thrift:libthrift:jar:0.9.2</node>
+            <node x="" y="">com.ojia.base:java-base:jar:1.0/org.apache.thrift:libthrift:jar:0.9.2/org.apache.httpcomponents:httpclient:jar:4.5.3</node>
+          </nodes>
+          <notes />
+          <edges />
+          <settings layout="Hierarchic Group" zoom="1.0" x="469.0" y="824.0" />
+          <SelectedNodes />
+          <Categories />
+          <VISIBILITY>All</VISIBILITY>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/HttpClient.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="506">
+          <caret line="65" column="32" selection-start-line="65" selection-start-column="32" selection-end-line="65" selection-end-column="32" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/pom.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="682">
+          <caret line="112" selection-start-line="112" selection-end-line="112" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/db-config/hiyd_home.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="654">
+          <caret line="104" column="4" selection-start-line="104" selection-start-column="4" selection-end-line="104" selection-end-column="4" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/TextUtil.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="411">
+          <caret line="33" column="35" selection-start-line="33" selection-start-column="25" selection-end-line="33" selection-end-column="35" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/Constants.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="187">
+          <caret line="11" column="47" selection-start-line="11" selection-start-column="38" selection-end-line="11" selection-end-column="47" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/DBUtil.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="183">
+          <caret line="42" column="40" selection-start-line="42" selection-start-column="40" selection-end-line="42" selection-end-column="40" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/SqlUtil.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="183">
+          <caret line="54" selection-start-line="54" selection-end-line="54" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/db-config/texuan_home.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="738">
+          <caret line="76" column="24" selection-start-line="76" selection-start-column="24" selection-end-line="76" selection-end-column="24" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/../../../trunk/hiyd_project_publish/aliyun-prod/center_thrift/config/log4j.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="73">
+          <caret line="23" column="31" lean-forward="true" selection-start-line="23" selection-start-column="31" selection-end-line="23" selection-end-column="31" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/code.properties">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="374">
+          <caret line="22" column="95" selection-start-line="22" selection-start-column="95" selection-end-line="22" selection-end-column="95" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/FileUtil.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="585">
+          <caret line="174" selection-start-line="174" selection-end-line="174" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/resources/db-config/hiyd_cms.xml">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="476">
+          <caret line="28" column="36" lean-forward="true" selection-start-line="28" selection-start-column="36" selection-end-line="28" selection-end-column="36" />
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/tools/UploadApiResult.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="687">
+          <caret line="68" column="38" lean-forward="true" selection-start-line="68" selection-start-column="38" selection-end-line="68" selection-end-column="38" />
+          <folding>
+            <element signature="imports" expanded="true" />
+            <element signature="e#415#416#0" expanded="true" />
+            <element signature="e#433#434#0" expanded="true" />
+            <element signature="e#467#468#0" expanded="true" />
+            <element signature="e#490#491#0" expanded="true" />
+            <element signature="e#520#521#0" expanded="true" />
+            <element signature="e#538#539#0" expanded="true" />
+            <element signature="e#577#578#0" expanded="true" />
+            <element signature="e#600#601#0" expanded="true" />
+            <element signature="e#627#628#0" expanded="true" />
+            <element signature="e#647#648#0" expanded="true" />
+            <element signature="e#710#711#0" expanded="true" />
+            <element signature="e#737#738#0" expanded="true" />
+            <element signature="e#912#913#0" expanded="true" />
+            <element signature="e#934#935#0" expanded="true" />
+            <element signature="e#976#977#0" expanded="true" />
+            <element signature="e#1005#1006#0" expanded="true" />
+            <element signature="e#1030#1031#0" expanded="true" />
+            <element signature="e#1049#1050#0" expanded="true" />
+            <element signature="e#1105#1106#0" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/BatchUploadStaticResourceWorker.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="1615">
+          <caret line="188" column="37" lean-forward="true" selection-start-line="188" selection-start-column="37" selection-end-line="188" selection-end-column="37" />
+          <folding>
+            <element signature="imports" expanded="true" />
+            <element signature="method#handleTemplateUrl#0;class#BatchUploadStaticResourceWorker#0" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+    <entry file="file://$PROJECT_DIR$/src/main/java/com/duowan/texiu/data/migration/script/base/BaseTaskWorker.java">
+      <provider selected="true" editor-type-id="text-editor">
+        <state relative-caret-position="517">
+          <caret line="88" column="35" lean-forward="true" selection-start-line="88" selection-start-column="35" selection-end-line="88" selection-end-column="35" />
+          <folding>
+            <element signature="imports" expanded="true" />
+          </folding>
+        </state>
+      </provider>
+    </entry>
+  </component>
+  <component name="masterDetails">
+    <states>
+      <state key="ProjectJDKs.UI">
+        <settings>
+          <last-edited>1.8</last-edited>
+          <splitter-proportions>
+            <option name="proportions">
+              <list>
+                <option value="0.2" />
+              </list>
+            </option>
+          </splitter-proportions>
+        </settings>
+      </state>
+    </states>
+  </component>
+</project>

+ 124 - 0
pom.xml

@@ -0,0 +1,124 @@
+<?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.1.9.RELEASE</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.duowan</groupId>
+    <artifactId>texiu-data-migration</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>texiu-data-migration</name>
+    <description>特秀数据迁移</description>
+
+    <properties>
+        <java.version>1.8</java.version>
+    </properties>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>6.0.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.58</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.9</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>2.1.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
+            <version>4.5.3</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpmime</artifactId>
+            <version>4.5.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+            <version>2.7.1</version><!--版本号可根据实际情况填写-->
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <version>3.3.2</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
+            <version>2.8.2</version>
+        </dependency>
+        <!-- 基础 -->
+        <dependency>
+            <groupId>com.ojia.base</groupId>
+            <artifactId>java-base</artifactId>
+            <version>1.0</version>
+            <exclusions>
+                <exclusion>
+                    <groupId>log4j</groupId>
+                    <artifactId>log4j</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-api</artifactId>
+                </exclusion>
+                <exclusion>
+                    <groupId>org.slf4j</groupId>
+                    <artifactId>slf4j-log4j12</artifactId>
+                </exclusion>
+            </exclusions>
+        </dependency>
+        <dependency>
+            <groupId>org.jsoup</groupId>
+            <artifactId>jsoup</artifactId>
+            <version>1.11.2</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 13 - 0
src/main/java/com/duowan/texiu/data/migration/TexiuDataMigrationApplication.java

@@ -0,0 +1,13 @@
+package com.duowan.texiu.data.migration;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class TexiuDataMigrationApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(TexiuDataMigrationApplication.class, args);
+    }
+
+}

+ 775 - 0
src/main/java/com/duowan/texiu/data/migration/model/EditJsonInfo.java

@@ -0,0 +1,775 @@
+package com.duowan.texiu.data.migration.model;
+
+import java.util.List;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/11/21
+ */
+public class EditJsonInfo {
+
+    /**
+     * bg : {"e":0,"h":0,"o":0,"r":0,"tt":0,"type":0,"v":"color.mp4","w":0,"x":0,"y":0,"z":4}
+     * bgm : bgm.aac
+     * endFrame : 642.99
+     * frameRate : 25
+     * height : 1920
+     * items : [{"comps":[{"images":[{"e":0,"h":1920,"o":0,"r":0,"tt":0,"type":2,"v":"edit_video_4_44_comp_0_cover.png","w":1080,"x":0,"y":0,"z":0}],"e":1,"h":957,"id":"edit_video_4_44_comp_0","o":0,"r":-21,"tt":0,"type":11,"w":538,"x":560,"y":960,"z":0}],"endFrame":642,"frames":[],"getFrame":42,"startFrame":556,"e":0,"h":1920,"id":"edit_video_4_44_comp_0","nm":"edit_video_4","o":0,"r":0,"tt":0,"type":11,"w":1080,"x":0,"y":0,"z":3},{"comps":[{"images":[{"e":0,"h":1920,"o":0,"r":0,"tt":0,"type":2,"v":"edit_video_3_51_comp_5_cover.png","w":1080,"x":0,"y":0,"z":0}],"e":1,"h":957,"id":"edit_video_3_51_comp_5","o":0,"r":-20,"tt":0,"type":11,"w":538,"x":540,"y":960,"z":0}],"endFrame":503,"frames":[],"getFrame":62,"startFrame":378,"e":0,"h":1920,"id":"edit_video_3_51_comp_5","nm":"edit_video_3","o":0,"r":0,"tt":0,"type":11,"w":1080,"x":0,"y":0,"z":2},{"comps":[{"images":[{"e":0,"h":1920,"o":0,"r":0,"tt":0,"type":2,"v":"edit_video_2_58_comp_11_cover.png","w":1080,"x":0,"y":0,"z":0}],"e":1,"h":957,"id":"edit_video_2_58_comp_11","o":0,"r":-22,"tt":0,"type":11,"w":538,"x":554,"y":960,"z":0}],"endFrame":341,"frames":[],"getFrame":57,"startFrame":225,"e":0,"h":1920,"id":"edit_video_2_58_comp_11","nm":"edit_video_2","o":0,"r":0,"tt":0,"type":11,"w":1080,"x":0,"y":0,"z":1},{"comps":[{"images":[{"e":0,"h":1920,"o":0,"r":0,"tt":0,"type":2,"v":"edit_video_1_65_comp_17_cover.png","w":1080,"x":0,"y":0,"z":0}],"e":1,"h":957,"id":"edit_video_1_65_comp_17","o":0,"r":-21,"tt":0,"type":11,"w":538,"x":556,"y":960,"z":0}],"endFrame":186,"frames":[],"getFrame":52,"startFrame":80,"e":0,"h":1920,"id":"edit_video_1_65_comp_17","nm":"edit_video_1","o":0,"r":0,"tt":0,"type":11,"w":1080,"x":0,"y":0,"z":0}]
+     * layer : 6
+     * mask : {"e":0,"h":0,"o":0,"r":0,"tt":0,"type":0,"v":"mask.mp4","w":0,"x":0,"y":0,"z":4}
+     * startFrame : 0
+     * version : 1
+     * width : 1080
+     */
+
+    private BgBean bg;
+    private String bgm;
+    private double endFrame;
+    private int frameRate;
+    private int height;
+    private int layer;
+    private MaskBean mask;
+    private int startFrame;
+    private int version;
+    private int width;
+    private List<ItemsBean> items;
+
+    public BgBean getBg() {
+        return bg;
+    }
+
+    public void setBg(BgBean bg) {
+        this.bg = bg;
+    }
+
+    public String getBgm() {
+        return bgm;
+    }
+
+    public void setBgm(String bgm) {
+        this.bgm = bgm;
+    }
+
+    public double getEndFrame() {
+        return endFrame;
+    }
+
+    public void setEndFrame(double endFrame) {
+        this.endFrame = endFrame;
+    }
+
+    public int getFrameRate() {
+        return frameRate;
+    }
+
+    public void setFrameRate(int frameRate) {
+        this.frameRate = frameRate;
+    }
+
+    public int getHeight() {
+        return height;
+    }
+
+    public void setHeight(int height) {
+        this.height = height;
+    }
+
+    public int getLayer() {
+        return layer;
+    }
+
+    public void setLayer(int layer) {
+        this.layer = layer;
+    }
+
+    public MaskBean getMask() {
+        return mask;
+    }
+
+    public void setMask(MaskBean mask) {
+        this.mask = mask;
+    }
+
+    public int getStartFrame() {
+        return startFrame;
+    }
+
+    public void setStartFrame(int startFrame) {
+        this.startFrame = startFrame;
+    }
+
+    public int getVersion() {
+        return version;
+    }
+
+    public void setVersion(int version) {
+        this.version = version;
+    }
+
+    public int getWidth() {
+        return width;
+    }
+
+    public void setWidth(int width) {
+        this.width = width;
+    }
+
+    public List<ItemsBean> getItems() {
+        return items;
+    }
+
+    public void setItems(List<ItemsBean> items) {
+        this.items = items;
+    }
+
+    public static class BgBean {
+        /**
+         * e : 0
+         * h : 0
+         * o : 0
+         * r : 0
+         * tt : 0
+         * type : 0
+         * v : color.mp4
+         * w : 0
+         * x : 0
+         * y : 0
+         * z : 4
+         */
+
+        private int e;
+        private int h;
+        private int o;
+        private int r;
+        private int tt;
+        private int type;
+        private String v;
+        private int w;
+        private int x;
+        private int y;
+        private int z;
+
+        public int getE() {
+            return e;
+        }
+
+        public void setE(int e) {
+            this.e = e;
+        }
+
+        public int getH() {
+            return h;
+        }
+
+        public void setH(int h) {
+            this.h = h;
+        }
+
+        public int getO() {
+            return o;
+        }
+
+        public void setO(int o) {
+            this.o = o;
+        }
+
+        public int getR() {
+            return r;
+        }
+
+        public void setR(int r) {
+            this.r = r;
+        }
+
+        public int getTt() {
+            return tt;
+        }
+
+        public void setTt(int tt) {
+            this.tt = tt;
+        }
+
+        public int getType() {
+            return type;
+        }
+
+        public void setType(int type) {
+            this.type = type;
+        }
+
+        public String getV() {
+            return v;
+        }
+
+        public void setV(String v) {
+            this.v = v;
+        }
+
+        public int getW() {
+            return w;
+        }
+
+        public void setW(int w) {
+            this.w = w;
+        }
+
+        public int getX() {
+            return x;
+        }
+
+        public void setX(int x) {
+            this.x = x;
+        }
+
+        public int getY() {
+            return y;
+        }
+
+        public void setY(int y) {
+            this.y = y;
+        }
+
+        public int getZ() {
+            return z;
+        }
+
+        public void setZ(int z) {
+            this.z = z;
+        }
+    }
+
+    public static class MaskBean {
+        /**
+         * e : 0
+         * h : 0
+         * o : 0
+         * r : 0
+         * tt : 0
+         * type : 0
+         * v : mask.mp4
+         * w : 0
+         * x : 0
+         * y : 0
+         * z : 4
+         */
+
+        private int e;
+        private int h;
+        private int o;
+        private int r;
+        private int tt;
+        private int type;
+        private String v;
+        private int w;
+        private int x;
+        private int y;
+        private int z;
+
+        public int getE() {
+            return e;
+        }
+
+        public void setE(int e) {
+            this.e = e;
+        }
+
+        public int getH() {
+            return h;
+        }
+
+        public void setH(int h) {
+            this.h = h;
+        }
+
+        public int getO() {
+            return o;
+        }
+
+        public void setO(int o) {
+            this.o = o;
+        }
+
+        public int getR() {
+            return r;
+        }
+
+        public void setR(int r) {
+            this.r = r;
+        }
+
+        public int getTt() {
+            return tt;
+        }
+
+        public void setTt(int tt) {
+            this.tt = tt;
+        }
+
+        public int getType() {
+            return type;
+        }
+
+        public void setType(int type) {
+            this.type = type;
+        }
+
+        public String getV() {
+            return v;
+        }
+
+        public void setV(String v) {
+            this.v = v;
+        }
+
+        public int getW() {
+            return w;
+        }
+
+        public void setW(int w) {
+            this.w = w;
+        }
+
+        public int getX() {
+            return x;
+        }
+
+        public void setX(int x) {
+            this.x = x;
+        }
+
+        public int getY() {
+            return y;
+        }
+
+        public void setY(int y) {
+            this.y = y;
+        }
+
+        public int getZ() {
+            return z;
+        }
+
+        public void setZ(int z) {
+            this.z = z;
+        }
+    }
+
+    public static class ItemsBean {
+        /**
+         * comps : [{"images":[{"e":0,"h":1920,"o":0,"r":0,"tt":0,"type":2,"v":"edit_video_4_44_comp_0_cover.png","w":1080,"x":0,"y":0,"z":0}],"e":1,"h":957,"id":"edit_video_4_44_comp_0","o":0,"r":-21,"tt":0,"type":11,"w":538,"x":560,"y":960,"z":0}]
+         * endFrame : 642
+         * frames : []
+         * getFrame : 42
+         * startFrame : 556
+         * e : 0
+         * h : 1920
+         * id : edit_video_4_44_comp_0
+         * nm : edit_video_4
+         * o : 0
+         * r : 0
+         * tt : 0
+         * type : 11
+         * w : 1080
+         * x : 0
+         * y : 0
+         * z : 3
+         */
+
+        private int endFrame;
+        private int getFrame;
+        private int startFrame;
+        private int e;
+        private int h;
+        private String id;
+        private String nm;
+        private int o;
+        private int r;
+        private int tt;
+        private int type;
+        private int w;
+        private int x;
+        private int y;
+        private int z;
+        private List<CompsBean> comps;
+        private List<?> frames;
+
+        public int getEndFrame() {
+            return endFrame;
+        }
+
+        public void setEndFrame(int endFrame) {
+            this.endFrame = endFrame;
+        }
+
+        public int getGetFrame() {
+            return getFrame;
+        }
+
+        public void setGetFrame(int getFrame) {
+            this.getFrame = getFrame;
+        }
+
+        public int getStartFrame() {
+            return startFrame;
+        }
+
+        public void setStartFrame(int startFrame) {
+            this.startFrame = startFrame;
+        }
+
+        public int getE() {
+            return e;
+        }
+
+        public void setE(int e) {
+            this.e = e;
+        }
+
+        public int getH() {
+            return h;
+        }
+
+        public void setH(int h) {
+            this.h = h;
+        }
+
+        public String getId() {
+            return id;
+        }
+
+        public void setId(String id) {
+            this.id = id;
+        }
+
+        public String getNm() {
+            return nm;
+        }
+
+        public void setNm(String nm) {
+            this.nm = nm;
+        }
+
+        public int getO() {
+            return o;
+        }
+
+        public void setO(int o) {
+            this.o = o;
+        }
+
+        public int getR() {
+            return r;
+        }
+
+        public void setR(int r) {
+            this.r = r;
+        }
+
+        public int getTt() {
+            return tt;
+        }
+
+        public void setTt(int tt) {
+            this.tt = tt;
+        }
+
+        public int getType() {
+            return type;
+        }
+
+        public void setType(int type) {
+            this.type = type;
+        }
+
+        public int getW() {
+            return w;
+        }
+
+        public void setW(int w) {
+            this.w = w;
+        }
+
+        public int getX() {
+            return x;
+        }
+
+        public void setX(int x) {
+            this.x = x;
+        }
+
+        public int getY() {
+            return y;
+        }
+
+        public void setY(int y) {
+            this.y = y;
+        }
+
+        public int getZ() {
+            return z;
+        }
+
+        public void setZ(int z) {
+            this.z = z;
+        }
+
+        public List<CompsBean> getComps() {
+            return comps;
+        }
+
+        public void setComps(List<CompsBean> comps) {
+            this.comps = comps;
+        }
+
+        public List<?> getFrames() {
+            return frames;
+        }
+
+        public void setFrames(List<?> frames) {
+            this.frames = frames;
+        }
+
+        public static class CompsBean {
+            /**
+             * images : [{"e":0,"h":1920,"o":0,"r":0,"tt":0,"type":2,"v":"edit_video_4_44_comp_0_cover.png","w":1080,"x":0,"y":0,"z":0}]
+             * e : 1
+             * h : 957
+             * id : edit_video_4_44_comp_0
+             * o : 0
+             * r : -21
+             * tt : 0
+             * type : 11
+             * w : 538
+             * x : 560
+             * y : 960
+             * z : 0
+             */
+
+            private int e;
+            private int h;
+            private String id;
+            private int o;
+            private int r;
+            private int tt;
+            private int type;
+            private int w;
+            private int x;
+            private int y;
+            private int z;
+            private List<ImagesBean> images;
+
+            public int getE() {
+                return e;
+            }
+
+            public void setE(int e) {
+                this.e = e;
+            }
+
+            public int getH() {
+                return h;
+            }
+
+            public void setH(int h) {
+                this.h = h;
+            }
+
+            public String getId() {
+                return id;
+            }
+
+            public void setId(String id) {
+                this.id = id;
+            }
+
+            public int getO() {
+                return o;
+            }
+
+            public void setO(int o) {
+                this.o = o;
+            }
+
+            public int getR() {
+                return r;
+            }
+
+            public void setR(int r) {
+                this.r = r;
+            }
+
+            public int getTt() {
+                return tt;
+            }
+
+            public void setTt(int tt) {
+                this.tt = tt;
+            }
+
+            public int getType() {
+                return type;
+            }
+
+            public void setType(int type) {
+                this.type = type;
+            }
+
+            public int getW() {
+                return w;
+            }
+
+            public void setW(int w) {
+                this.w = w;
+            }
+
+            public int getX() {
+                return x;
+            }
+
+            public void setX(int x) {
+                this.x = x;
+            }
+
+            public int getY() {
+                return y;
+            }
+
+            public void setY(int y) {
+                this.y = y;
+            }
+
+            public int getZ() {
+                return z;
+            }
+
+            public void setZ(int z) {
+                this.z = z;
+            }
+
+            public List<ImagesBean> getImages() {
+                return images;
+            }
+
+            public void setImages(List<ImagesBean> images) {
+                this.images = images;
+            }
+
+            public static class ImagesBean {
+                /**
+                 * e : 0
+                 * h : 1920
+                 * o : 0
+                 * r : 0
+                 * tt : 0
+                 * type : 2
+                 * v : edit_video_4_44_comp_0_cover.png
+                 * w : 1080
+                 * x : 0
+                 * y : 0
+                 * z : 0
+                 */
+
+                private int e;
+                private int h;
+                private int o;
+                private int r;
+                private int tt;
+                private int type;
+                private String v;
+                private int w;
+                private int x;
+                private int y;
+                private int z;
+
+                public int getE() {
+                    return e;
+                }
+
+                public void setE(int e) {
+                    this.e = e;
+                }
+
+                public int getH() {
+                    return h;
+                }
+
+                public void setH(int h) {
+                    this.h = h;
+                }
+
+                public int getO() {
+                    return o;
+                }
+
+                public void setO(int o) {
+                    this.o = o;
+                }
+
+                public int getR() {
+                    return r;
+                }
+
+                public void setR(int r) {
+                    this.r = r;
+                }
+
+                public int getTt() {
+                    return tt;
+                }
+
+                public void setTt(int tt) {
+                    this.tt = tt;
+                }
+
+                public int getType() {
+                    return type;
+                }
+
+                public void setType(int type) {
+                    this.type = type;
+                }
+
+                public String getV() {
+                    return v;
+                }
+
+                public void setV(String v) {
+                    this.v = v;
+                }
+
+                public int getW() {
+                    return w;
+                }
+
+                public void setW(int w) {
+                    this.w = w;
+                }
+
+                public int getX() {
+                    return x;
+                }
+
+                public void setX(int x) {
+                    this.x = x;
+                }
+
+                public int getY() {
+                    return y;
+                }
+
+                public void setY(int y) {
+                    this.y = y;
+                }
+
+                public int getZ() {
+                    return z;
+                }
+
+                public void setZ(int z) {
+                    this.z = z;
+                }
+            }
+        }
+    }
+}

+ 11 - 0
src/main/java/com/duowan/texiu/data/migration/model/ErrorInfo.java

@@ -0,0 +1,11 @@
+package com.duowan.texiu.data.migration.model;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/11/21
+ */
+public class ErrorInfo {
+
+}
+

+ 39 - 0
src/main/java/com/duowan/texiu/data/migration/model/TableInfo.java

@@ -0,0 +1,39 @@
+package com.duowan.texiu.data.migration.model;
+
+import java.util.List;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/11/11
+ */
+public class TableInfo {
+
+    private String tableName;
+    private String primaryKey;
+    private List<String> cols;
+
+    public String getTableName() {
+        return tableName;
+    }
+
+    public void setTableName(String tableName) {
+        this.tableName = tableName;
+    }
+
+    public String getPrimaryKey() {
+        return primaryKey;
+    }
+
+    public void setPrimaryKey(String primaryKey) {
+        this.primaryKey = primaryKey;
+    }
+
+    public List<String> getCols() {
+        return cols;
+    }
+
+    public void setCols(List<String> cols) {
+        this.cols = cols;
+    }
+}

Fichier diff supprimé car celui-ci est trop grand
+ 13 - 0
src/main/java/com/duowan/texiu/data/migration/model/VideoInfo.java


+ 787 - 0
src/main/java/com/duowan/texiu/data/migration/model/VideoInfoFF.java

@@ -0,0 +1,787 @@
+package com.duowan.texiu.data.migration.model;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/7/31
+ */
+public class VideoInfoFF implements Serializable {
+
+    /**
+     * streams : [{"index":0,"codec_name":"h264","codec_long_name":"H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10","profile":"Main","codec_type":"video","codec_time_base":"1/60","codec_tag_string":"avc1","codec_tag":"0x31637661","width":816,"height":1440,"coded_width":816,"coded_height":1440,"has_b_frames":1,"pix_fmt":"yuv420p","level":41,"color_range":"tv","color_space":"bt709","color_transfer":"bt709","color_primaries":"bt709","chroma_location":"left","refs":1,"is_avc":"true","nal_length_size":"4","r_frame_rate":"30/1","avg_frame_rate":"30/1","time_base":"1/30000","start_pts":0,"start_time":"0.000000","duration_ts":597000,"duration":"19.900000","bit_rate":"10008157","bits_per_raw_sample":"8","nb_frames":"597","disposition":{"default":1,"dub":0,"original":0,"comment":0,"lyrics":0,"karaoke":0,"forced":0,"hearing_impaired":0,"visual_impaired":0,"clean_effects":0,"attached_pic":0,"timed_thumbnails":0},"tags":{"creation_time":"2019-07-01T07:17:11.000000Z","language":"eng","handler_name":"\u001fMainconcept Video Media Handler","encoder":"AVC Coding"}},{"index":1,"codec_name":"aac","codec_long_name":"AAC (Advanced Audio Coding)","profile":"LC","codec_type":"audio","codec_time_base":"1/48000","codec_tag_string":"mp4a","codec_tag":"0x6134706d","sample_fmt":"fltp","sample_rate":"48000","channels":2,"channel_layout":"stereo","bits_per_sample":0,"r_frame_rate":"0/0","avg_frame_rate":"0/0","time_base":"1/48000","start_pts":0,"start_time":"0.000000","duration_ts":955200,"duration":"19.900000","bit_rate":"317375","max_bit_rate":"385500","nb_frames":"935","disposition":{"default":1,"dub":0,"original":0,"comment":0,"lyrics":0,"karaoke":0,"forced":0,"hearing_impaired":0,"visual_impaired":0,"clean_effects":0,"attached_pic":0,"timed_thumbnails":0},"tags":{"creation_time":"2019-07-01T07:17:11.000000Z","language":"eng","handler_name":"#Mainconcept MP4 Sound Media Handler"}}]
+     * format : {"filename":"F:\\resources\\test\\e3d741da868a5128a42d7e03cb56e3ba_len39009900.mp4","nb_streams":2,"nb_programs":0,"format_name":"mov,mp4,m4a,3gp,3g2,mj2","format_long_name":"QuickTime / MOV","start_time":"0.000000","duration":"19.946667","size":"39009900","bit_rate":"15645681","probe_score":100,"tags":{"major_brand":"mp42","minor_version":"0","compatible_brands":"mp42mp41","creation_time":"2019-07-01T07:17:11.000000Z"}}
+     */
+
+    private FormatBean format;
+    private List<StreamsBean> streams;
+
+    public FormatBean getFormat() {
+        return format;
+    }
+
+    public void setFormat(FormatBean format) {
+        this.format = format;
+    }
+
+    public List<StreamsBean> getStreams() {
+        return streams;
+    }
+
+    public void setStreams(List<StreamsBean> streams) {
+        this.streams = streams;
+    }
+
+    public static class FormatBean {
+        /**
+         * filename : F:\resources\test\e3d741da868a5128a42d7e03cb56e3ba_len39009900.mp4
+         * nb_streams : 2
+         * nb_programs : 0
+         * format_name : mov,mp4,m4a,3gp,3g2,mj2
+         * format_long_name : QuickTime / MOV
+         * start_time : 0.000000
+         * duration : 19.946667
+         * size : 39009900
+         * bit_rate : 15645681
+         * probe_score : 100
+         * tags : {"major_brand":"mp42","minor_version":"0","compatible_brands":"mp42mp41","creation_time":"2019-07-01T07:17:11.000000Z"}
+         */
+
+        private String filename;
+        private int nb_streams;
+        private int nb_programs;
+        private String format_name;
+        private String format_long_name;
+        private String start_time;
+        private String duration;
+        private String size;
+        private String bit_rate;
+        private int probe_score;
+        private TagsBean tags;
+
+        public String getFilename() {
+            return filename;
+        }
+
+        public void setFilename(String filename) {
+            this.filename = filename;
+        }
+
+        public int getNb_streams() {
+            return nb_streams;
+        }
+
+        public void setNb_streams(int nb_streams) {
+            this.nb_streams = nb_streams;
+        }
+
+        public int getNb_programs() {
+            return nb_programs;
+        }
+
+        public void setNb_programs(int nb_programs) {
+            this.nb_programs = nb_programs;
+        }
+
+        public String getFormat_name() {
+            return format_name;
+        }
+
+        public void setFormat_name(String format_name) {
+            this.format_name = format_name;
+        }
+
+        public String getFormat_long_name() {
+            return format_long_name;
+        }
+
+        public void setFormat_long_name(String format_long_name) {
+            this.format_long_name = format_long_name;
+        }
+
+        public String getStart_time() {
+            return start_time;
+        }
+
+        public void setStart_time(String start_time) {
+            this.start_time = start_time;
+        }
+
+        public String getDuration() {
+            return duration;
+        }
+
+        public void setDuration(String duration) {
+            this.duration = duration;
+        }
+
+        public String getSize() {
+            return size;
+        }
+
+        public void setSize(String size) {
+            this.size = size;
+        }
+
+        public String getBit_rate() {
+            return bit_rate;
+        }
+
+        public void setBit_rate(String bit_rate) {
+            this.bit_rate = bit_rate;
+        }
+
+        public int getProbe_score() {
+            return probe_score;
+        }
+
+        public void setProbe_score(int probe_score) {
+            this.probe_score = probe_score;
+        }
+
+        public TagsBean getTags() {
+            return tags;
+        }
+
+        public void setTags(TagsBean tags) {
+            this.tags = tags;
+        }
+
+        public static class TagsBean {
+            /**
+             * major_brand : mp42
+             * minor_version : 0
+             * compatible_brands : mp42mp41
+             * creation_time : 2019-07-01T07:17:11.000000Z
+             */
+
+            private String major_brand;
+            private String minor_version;
+            private String compatible_brands;
+            private String creation_time;
+
+            public String getMajor_brand() {
+                return major_brand;
+            }
+
+            public void setMajor_brand(String major_brand) {
+                this.major_brand = major_brand;
+            }
+
+            public String getMinor_version() {
+                return minor_version;
+            }
+
+            public void setMinor_version(String minor_version) {
+                this.minor_version = minor_version;
+            }
+
+            public String getCompatible_brands() {
+                return compatible_brands;
+            }
+
+            public void setCompatible_brands(String compatible_brands) {
+                this.compatible_brands = compatible_brands;
+            }
+
+            public String getCreation_time() {
+                return creation_time;
+            }
+
+            public void setCreation_time(String creation_time) {
+                this.creation_time = creation_time;
+            }
+        }
+    }
+
+    public static class StreamsBean {
+        /**
+         * index : 0
+         * codec_name : h264
+         * codec_long_name : H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10
+         * profile : Main
+         * codec_type : video
+         * codec_time_base : 1/60
+         * codec_tag_string : avc1
+         * codec_tag : 0x31637661
+         * width : 816
+         * height : 1440
+         * coded_width : 816
+         * coded_height : 1440
+         * has_b_frames : 1
+         * pix_fmt : yuv420p
+         * level : 41
+         * color_range : tv
+         * color_space : bt709
+         * color_transfer : bt709
+         * color_primaries : bt709
+         * chroma_location : left
+         * refs : 1
+         * is_avc : true
+         * nal_length_size : 4
+         * r_frame_rate : 30/1
+         * avg_frame_rate : 30/1
+         * time_base : 1/30000
+         * start_pts : 0
+         * start_time : 0.000000
+         * duration_ts : 597000
+         * duration : 19.900000
+         * bit_rate : 10008157
+         * bits_per_raw_sample : 8
+         * nb_frames : 597
+         * disposition : {"default":1,"dub":0,"original":0,"comment":0,"lyrics":0,"karaoke":0,"forced":0,"hearing_impaired":0,"visual_impaired":0,"clean_effects":0,"attached_pic":0,"timed_thumbnails":0}
+         * tags : {"creation_time":"2019-07-01T07:17:11.000000Z","language":"eng","handler_name":"\u001fMainconcept Video Media Handler","encoder":"AVC Coding"}
+         * sample_fmt : fltp
+         * sample_rate : 48000
+         * channels : 2
+         * channel_layout : stereo
+         * bits_per_sample : 0
+         * max_bit_rate : 385500
+         */
+
+        private int index;
+        private String codec_name;
+        private String codec_long_name;
+        private String profile;
+        private String codec_type;
+        private String codec_time_base;
+        private String codec_tag_string;
+        private String codec_tag;
+        private int width;
+        private int height;
+        private int coded_width;
+        private int coded_height;
+        private int has_b_frames;
+        private String pix_fmt;
+        private int level;
+        private String color_range;
+        private String color_space;
+        private String color_transfer;
+        private String color_primaries;
+        private String chroma_location;
+        private int refs;
+        private String is_avc;
+        private String nal_length_size;
+        private String r_frame_rate;
+        private String avg_frame_rate;
+        private String time_base;
+        private int start_pts;
+        private String start_time;
+        private int duration_ts;
+        private String duration;
+        private String bit_rate;
+        private String bits_per_raw_sample;
+        private String nb_frames;
+        private DispositionBean disposition;
+        private TagsBeanX tags;
+        private String sample_fmt;
+        private String sample_rate;
+        private int channels;
+        private String channel_layout;
+        private int bits_per_sample;
+        private String max_bit_rate;
+
+        public int getIndex() {
+            return index;
+        }
+
+        public void setIndex(int index) {
+            this.index = index;
+        }
+
+        public String getCodec_name() {
+            return codec_name;
+        }
+
+        public void setCodec_name(String codec_name) {
+            this.codec_name = codec_name;
+        }
+
+        public String getCodec_long_name() {
+            return codec_long_name;
+        }
+
+        public void setCodec_long_name(String codec_long_name) {
+            this.codec_long_name = codec_long_name;
+        }
+
+        public String getProfile() {
+            return profile;
+        }
+
+        public void setProfile(String profile) {
+            this.profile = profile;
+        }
+
+        public String getCodec_type() {
+            return codec_type;
+        }
+
+        public void setCodec_type(String codec_type) {
+            this.codec_type = codec_type;
+        }
+
+        public String getCodec_time_base() {
+            return codec_time_base;
+        }
+
+        public void setCodec_time_base(String codec_time_base) {
+            this.codec_time_base = codec_time_base;
+        }
+
+        public String getCodec_tag_string() {
+            return codec_tag_string;
+        }
+
+        public void setCodec_tag_string(String codec_tag_string) {
+            this.codec_tag_string = codec_tag_string;
+        }
+
+        public String getCodec_tag() {
+            return codec_tag;
+        }
+
+        public void setCodec_tag(String codec_tag) {
+            this.codec_tag = codec_tag;
+        }
+
+        public int getWidth() {
+            return width;
+        }
+
+        public void setWidth(int width) {
+            this.width = width;
+        }
+
+        public int getHeight() {
+            return height;
+        }
+
+        public void setHeight(int height) {
+            this.height = height;
+        }
+
+        public int getCoded_width() {
+            return coded_width;
+        }
+
+        public void setCoded_width(int coded_width) {
+            this.coded_width = coded_width;
+        }
+
+        public int getCoded_height() {
+            return coded_height;
+        }
+
+        public void setCoded_height(int coded_height) {
+            this.coded_height = coded_height;
+        }
+
+        public int getHas_b_frames() {
+            return has_b_frames;
+        }
+
+        public void setHas_b_frames(int has_b_frames) {
+            this.has_b_frames = has_b_frames;
+        }
+
+        public String getPix_fmt() {
+            return pix_fmt;
+        }
+
+        public void setPix_fmt(String pix_fmt) {
+            this.pix_fmt = pix_fmt;
+        }
+
+        public int getLevel() {
+            return level;
+        }
+
+        public void setLevel(int level) {
+            this.level = level;
+        }
+
+        public String getColor_range() {
+            return color_range;
+        }
+
+        public void setColor_range(String color_range) {
+            this.color_range = color_range;
+        }
+
+        public String getColor_space() {
+            return color_space;
+        }
+
+        public void setColor_space(String color_space) {
+            this.color_space = color_space;
+        }
+
+        public String getColor_transfer() {
+            return color_transfer;
+        }
+
+        public void setColor_transfer(String color_transfer) {
+            this.color_transfer = color_transfer;
+        }
+
+        public String getColor_primaries() {
+            return color_primaries;
+        }
+
+        public void setColor_primaries(String color_primaries) {
+            this.color_primaries = color_primaries;
+        }
+
+        public String getChroma_location() {
+            return chroma_location;
+        }
+
+        public void setChroma_location(String chroma_location) {
+            this.chroma_location = chroma_location;
+        }
+
+        public int getRefs() {
+            return refs;
+        }
+
+        public void setRefs(int refs) {
+            this.refs = refs;
+        }
+
+        public String getIs_avc() {
+            return is_avc;
+        }
+
+        public void setIs_avc(String is_avc) {
+            this.is_avc = is_avc;
+        }
+
+        public String getNal_length_size() {
+            return nal_length_size;
+        }
+
+        public void setNal_length_size(String nal_length_size) {
+            this.nal_length_size = nal_length_size;
+        }
+
+        public String getR_frame_rate() {
+            return r_frame_rate;
+        }
+
+        public void setR_frame_rate(String r_frame_rate) {
+            this.r_frame_rate = r_frame_rate;
+        }
+
+        public String getAvg_frame_rate() {
+            return avg_frame_rate;
+        }
+
+        public void setAvg_frame_rate(String avg_frame_rate) {
+            this.avg_frame_rate = avg_frame_rate;
+        }
+
+        public String getTime_base() {
+            return time_base;
+        }
+
+        public void setTime_base(String time_base) {
+            this.time_base = time_base;
+        }
+
+        public int getStart_pts() {
+            return start_pts;
+        }
+
+        public void setStart_pts(int start_pts) {
+            this.start_pts = start_pts;
+        }
+
+        public String getStart_time() {
+            return start_time;
+        }
+
+        public void setStart_time(String start_time) {
+            this.start_time = start_time;
+        }
+
+        public int getDuration_ts() {
+            return duration_ts;
+        }
+
+        public void setDuration_ts(int duration_ts) {
+            this.duration_ts = duration_ts;
+        }
+
+        public String getDuration() {
+            return duration;
+        }
+
+        public void setDuration(String duration) {
+            this.duration = duration;
+        }
+
+        public String getBit_rate() {
+            return bit_rate;
+        }
+
+        public void setBit_rate(String bit_rate) {
+            this.bit_rate = bit_rate;
+        }
+
+        public String getBits_per_raw_sample() {
+            return bits_per_raw_sample;
+        }
+
+        public void setBits_per_raw_sample(String bits_per_raw_sample) {
+            this.bits_per_raw_sample = bits_per_raw_sample;
+        }
+
+        public String getNb_frames() {
+            return nb_frames;
+        }
+
+        public void setNb_frames(String nb_frames) {
+            this.nb_frames = nb_frames;
+        }
+
+        public DispositionBean getDisposition() {
+            return disposition;
+        }
+
+        public void setDisposition(DispositionBean disposition) {
+            this.disposition = disposition;
+        }
+
+        public TagsBeanX getTags() {
+            return tags;
+        }
+
+        public void setTags(TagsBeanX tags) {
+            this.tags = tags;
+        }
+
+        public String getSample_fmt() {
+            return sample_fmt;
+        }
+
+        public void setSample_fmt(String sample_fmt) {
+            this.sample_fmt = sample_fmt;
+        }
+
+        public String getSample_rate() {
+            return sample_rate;
+        }
+
+        public void setSample_rate(String sample_rate) {
+            this.sample_rate = sample_rate;
+        }
+
+        public int getChannels() {
+            return channels;
+        }
+
+        public void setChannels(int channels) {
+            this.channels = channels;
+        }
+
+        public String getChannel_layout() {
+            return channel_layout;
+        }
+
+        public void setChannel_layout(String channel_layout) {
+            this.channel_layout = channel_layout;
+        }
+
+        public int getBits_per_sample() {
+            return bits_per_sample;
+        }
+
+        public void setBits_per_sample(int bits_per_sample) {
+            this.bits_per_sample = bits_per_sample;
+        }
+
+        public String getMax_bit_rate() {
+            return max_bit_rate;
+        }
+
+        public void setMax_bit_rate(String max_bit_rate) {
+            this.max_bit_rate = max_bit_rate;
+        }
+
+        public static class DispositionBean {
+            /**
+             * default : 1
+             * dub : 0
+             * original : 0
+             * comment : 0
+             * lyrics : 0
+             * karaoke : 0
+             * forced : 0
+             * hearing_impaired : 0
+             * visual_impaired : 0
+             * clean_effects : 0
+             * attached_pic : 0
+             * timed_thumbnails : 0
+             */
+
+            @com.google.gson.annotations.SerializedName("default")
+            private int defaultX;
+            private int dub;
+            private int original;
+            private int comment;
+            private int lyrics;
+            private int karaoke;
+            private int forced;
+            private int hearing_impaired;
+            private int visual_impaired;
+            private int clean_effects;
+            private int attached_pic;
+            private int timed_thumbnails;
+
+            public int getDefaultX() {
+                return defaultX;
+            }
+
+            public void setDefaultX(int defaultX) {
+                this.defaultX = defaultX;
+            }
+
+            public int getDub() {
+                return dub;
+            }
+
+            public void setDub(int dub) {
+                this.dub = dub;
+            }
+
+            public int getOriginal() {
+                return original;
+            }
+
+            public void setOriginal(int original) {
+                this.original = original;
+            }
+
+            public int getComment() {
+                return comment;
+            }
+
+            public void setComment(int comment) {
+                this.comment = comment;
+            }
+
+            public int getLyrics() {
+                return lyrics;
+            }
+
+            public void setLyrics(int lyrics) {
+                this.lyrics = lyrics;
+            }
+
+            public int getKaraoke() {
+                return karaoke;
+            }
+
+            public void setKaraoke(int karaoke) {
+                this.karaoke = karaoke;
+            }
+
+            public int getForced() {
+                return forced;
+            }
+
+            public void setForced(int forced) {
+                this.forced = forced;
+            }
+
+            public int getHearing_impaired() {
+                return hearing_impaired;
+            }
+
+            public void setHearing_impaired(int hearing_impaired) {
+                this.hearing_impaired = hearing_impaired;
+            }
+
+            public int getVisual_impaired() {
+                return visual_impaired;
+            }
+
+            public void setVisual_impaired(int visual_impaired) {
+                this.visual_impaired = visual_impaired;
+            }
+
+            public int getClean_effects() {
+                return clean_effects;
+            }
+
+            public void setClean_effects(int clean_effects) {
+                this.clean_effects = clean_effects;
+            }
+
+            public int getAttached_pic() {
+                return attached_pic;
+            }
+
+            public void setAttached_pic(int attached_pic) {
+                this.attached_pic = attached_pic;
+            }
+
+            public int getTimed_thumbnails() {
+                return timed_thumbnails;
+            }
+
+            public void setTimed_thumbnails(int timed_thumbnails) {
+                this.timed_thumbnails = timed_thumbnails;
+            }
+        }
+
+        public static class TagsBeanX {
+            /**
+             * creation_time : 2019-07-01T07:17:11.000000Z
+             * language : eng
+             * handler_name : Mainconcept Video Media Handler
+             * encoder : AVC Coding
+             */
+
+            private String creation_time;
+            private String language;
+            private String handler_name;
+            private String encoder;
+
+            public String getCreation_time() {
+                return creation_time;
+            }
+
+            public void setCreation_time(String creation_time) {
+                this.creation_time = creation_time;
+            }
+
+            public String getLanguage() {
+                return language;
+            }
+
+            public void setLanguage(String language) {
+                this.language = language;
+            }
+
+            public String getHandler_name() {
+                return handler_name;
+            }
+
+            public void setHandler_name(String handler_name) {
+                this.handler_name = handler_name;
+            }
+
+            public String getEncoder() {
+                return encoder;
+            }
+
+            public void setEncoder(String encoder) {
+                this.encoder = encoder;
+            }
+        }
+    }
+}

+ 54 - 0
src/main/java/com/duowan/texiu/data/migration/script/BatchHandleVideo.java

@@ -0,0 +1,54 @@
+package com.duowan.texiu.data.migration.script;
+
+import com.duowan.texiu.data.migration.model.TableInfo;
+import com.duowan.texiu.data.migration.model.VideoInfoFF;
+import com.duowan.texiu.data.migration.tools.*;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/11/20
+ */
+public class BatchHandleVideo {
+
+
+    private final static String BASE_PATH = "E:\\tmp\\test\\";
+
+    public static void main(String[] args) throws SQLException, InterruptedException, IOException, ServiceException {
+        TableInfo tableInfo = new TableInfo();
+        tableInfo.setTableName("template");
+        ArrayList<String> arrayList = new ArrayList<>();
+        arrayList.add("url");
+        arrayList.add("flag");
+        tableInfo.setCols(arrayList);
+
+        String selectSql = SqlUtil.getSelectSql(tableInfo.getTableName(), tableInfo.getCols());
+        List<Map<String, Object>> maps = DBUtil.queryList(selectSql);
+
+        for (Map<String, Object> map : maps) {
+            String url = (String) map.get("url");
+            String flag = (String) map.get("flag");
+
+            if (StringUtils.isBlank(url)) {
+                continue;
+            }
+
+            String inputPath = BASE_PATH + flag + ".mp4";
+            FileUtil.downloadLocalDirectory(url, inputPath);
+
+            VideoInfoFF videoInfoFF = FFmpegUtils.getVideoInfoFF(inputPath);
+            String duration = videoInfoFF.getFormat().getDuration();
+
+            String sql = String.format("update template set duration=%s where flag = \"%s\";\n", Double.valueOf(duration).intValue(), flag);
+            TextUtil.saveAsFileWriter("template1", sql);
+        }
+    }
+}

+ 71 - 0
src/main/java/com/duowan/texiu/data/migration/script/BatchHandleVideoTask.java

@@ -0,0 +1,71 @@
+package com.duowan.texiu.data.migration.script;
+
+import com.alibaba.fastjson.JSON;
+import com.duowan.texiu.data.migration.model.EditJsonInfo;
+import com.duowan.texiu.data.migration.model.TableInfo;
+import com.duowan.texiu.data.migration.model.VideoInfoFF;
+import com.duowan.texiu.data.migration.tools.*;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.File;
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/11/21
+ */
+public class BatchHandleVideoTask {
+    private final static String BASE_PATH = "E:\\tmp\\zip\\";
+
+    public static void main(String[] args) throws SQLException, InterruptedException, IOException, ServiceException {
+        TableInfo tableInfo = new TableInfo();
+        tableInfo.setTableName("template");
+        ArrayList<String> arrayList = new ArrayList<>();
+        arrayList.add("sourceUrl");
+        arrayList.add("type");
+        arrayList.add("flag");
+        arrayList.add("musicId");
+        tableInfo.setCols(arrayList);
+
+        String selectSql = SqlUtil.getSelectSql(tableInfo.getTableName(), tableInfo.getCols());
+        List<Map<String, Object>> maps = DBUtil.queryList(selectSql);
+
+        for (Map<String, Object> map : maps) {
+            Integer type = (Integer) map.get("type");
+            int size;
+            String flag = (String) map.get("flag");
+            if (type == 9) {
+                Long musicId = (Long) map.get("musicId");
+                String sql = "select cp.* from music m left join cardPoint cp on m.flag = cp.musicFlag where m.id = " + musicId;
+
+                List<Map<String, Object>> maps1 = DBUtil.queryList(sql);
+                size = maps1.size();
+            } else {
+                String sourceUrl = (String) map.get("sourceUrl");
+
+                if (StringUtils.isBlank(sourceUrl)) {
+                    continue;
+                }
+                String inputPath = BASE_PATH + flag + ".zip";
+
+                File file = new File(inputPath);
+                if (!file.exists()) {
+                    FileUtil.downloadLocalDirectory(sourceUrl, inputPath);
+                }
+                ZipUtil.unZipFiles(new File(inputPath));
+                String editJsonFilePath = BASE_PATH + flag + File.separator + "edit.json";
+                String editJson = TextUtil.file2String(new File(editJsonFilePath), "UTF-8");
+
+                EditJsonInfo editJsonInfo = JSON.parseObject(editJson, EditJsonInfo.class);
+                size = editJsonInfo.getItems().size();
+            }
+            String sql = String.format("update template set fragment =%s where flag = \"%s\";\n", size, flag);
+            TextUtil.saveAsFileWriter("template2", sql);
+        }
+    }
+}

+ 338 - 0
src/main/java/com/duowan/texiu/data/migration/script/BatchUploadStaticResourceWorker.java

@@ -0,0 +1,338 @@
+package com.duowan.texiu.data.migration.script;
+
+import java.io.IOException;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
+
+import org.jsoup.Jsoup;
+import org.jsoup.nodes.Element;
+import org.jsoup.select.Elements;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.duowan.texiu.data.migration.model.TableInfo;
+import com.duowan.texiu.data.migration.model.VideoInfo;
+import com.duowan.texiu.data.migration.script.base.BaseTaskWorker;
+import com.duowan.texiu.data.migration.tools.*;
+import com.ojia.base.exception.HttpClientException;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/10/10
+ */
+public class BatchUploadStaticResourceWorker extends BaseTaskWorker {
+
+	public static void main(String[] args) throws Exception {
+		BatchUploadStaticResourceWorker batchUploadStaticResourceWorker = new BatchUploadStaticResourceWorker();
+		batchUploadStaticResourceWorker.initEnv();
+		batchUploadStaticResourceWorker.enter();
+	}
+
+	private void initEnv() {
+		System.out.println("请选择要迁移的数据库,根据提示,输入相应的文字编号:\n" + "\t【1】特炫-texuan_home\n" + "\t【2】hi运动-hiyd-home\n"
+				+ "\t【3】hi运动-hiyd-cms");
+		System.out.println("请输入");
+		Scanner scanner = new Scanner(System.in);
+		String prefix = "";
+		int i = scanner.nextInt();
+		switch (i) {
+		case 1:
+			prefix = "texuan";
+			System.out.println("您选择了【特炫-texuan_home】");
+			break;
+		case 2:
+			prefix = "hiyd_home";
+			System.out.println("您选择了【hi运动-hiyd-home】");
+			break;
+		case 3:
+			prefix = "hiyd_cms";
+			System.out.println("您选择了【hi运动-hiyd-cms】");
+			break;
+		default:
+			System.out.println("命令不存在,请根据提示重新输入");
+			initEnv();
+		}
+		Constants.init(prefix);
+	}
+
+	private void enter() throws Exception {
+		System.out.println("请选执行的业务,根据提示,输入相应的文字编号:\n" + "\t【1】迁移静态资源\n" + "\t【2】迁移静态资源【静态资源url包含在html内容里面】\n"
+				+ "\t【3】迁移静态资源【静态资源url包含在json内容里面】\n" + "\t【4】批量生成sql更新语句");
+		System.out.println("请输入");
+		Scanner scanner = new Scanner(System.in);
+		int i = scanner.nextInt();
+		switch (i) {
+		case 1:
+			this.migrateStaticResources();
+			break;
+		case 2:
+			this.migrateStaticResourcesWithHtml();
+			break;
+		case 3:
+			this.migrateStaticResourcesWithArrayJson();
+			break;
+		case 4:
+			this.generateUpdateSql();
+			break;
+		default:
+			System.out.println("命令不存在,请根据提示重新输入");
+			enter();
+		}
+		Thread.sleep(Integer.MAX_VALUE);
+	}
+
+	/**
+	 * 迁移静态资源
+	 *
+	 * @throws Exception
+	 */
+	private void migrateStaticResources() throws Exception {
+		handle((tableInfo) -> {
+			try {
+				doHandleMigrateStaticResources(tableInfo);
+			} catch (SQLException e) {
+				e.printStackTrace();
+			}
+		});
+	}
+
+	/**
+	 * 迁移静态资源【静态资源url包含在html内容里面】
+	 *
+	 * @throws Exception
+	 */
+	private void migrateStaticResourcesWithHtml() throws Exception {
+		handle((tableInfo) -> {
+			try {
+				doHandleMigrateStaticResourcesWithHtml(tableInfo);
+			} catch (SQLException e) {
+				e.printStackTrace();
+			}
+		});
+	}
+
+	/**
+	 * 迁移静态资源【静态资源url包含在json内容里面】
+	 *
+	 * @throws Exception
+	 */
+	private void migrateStaticResourcesWithArrayJson() throws Exception {
+		handle((tableInfo) -> {
+			try {
+				doHandleMigrateStaticResourcesWithArrayJson(tableInfo);
+			} catch (SQLException e) {
+				e.printStackTrace();
+			}
+		});
+	}
+
+	/**
+	 * 生成sql更新语句
+	 *
+	 * @throws Exception
+	 */
+	private void generateUpdateSql() throws Exception {
+		handle((tableInfo) -> {
+			try {
+				doHandleGenerateUpdateSql(tableInfo);
+			} catch (SQLException e) {
+				e.printStackTrace();
+			}
+		});
+	}
+
+	private void generateBatchModifyValueSql() throws Exception {
+		handle((tableInfo) -> {
+			try {
+				doHandleGenerateBatchModifyValueSql(tableInfo);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		});
+	}
+
+	private void doHandleMigrateStaticResourcesWithArrayJson(TableInfo tableInfo) throws SQLException {
+		System.out.println(String.format("开始处理%s", tableInfo.getTableName()));
+
+		// 读取表的所有数据,并处理相应的业务逻辑
+		int total = doReadTable(tableInfo, maps -> {
+			for (Map<String, Object> map : maps) {
+				for (Map.Entry<String, Object> entry : map.entrySet()) {
+					if (entry.getKey().equals(tableInfo.getPrimaryKey())) {
+						continue;
+					}
+					String value = (String) entry.getValue();
+					if ("{}".equals(value)) {
+						continue;
+					}
+					JSONArray objects = JSONArray.parseArray(value);
+					JSONObject content = (JSONObject) objects.get(0);
+					String small = content.getString("small");
+					String big = content.getString("big");
+
+					String smallUrl = FileUtil.downloadFileWithUrl(tableInfo, entry.getKey(),
+							map.get(tableInfo.getPrimaryKey()), small);
+					String bigUrl = FileUtil.downloadFileWithUrl(tableInfo, entry.getKey(),
+							map.get(tableInfo.getPrimaryKey()), big);
+
+					content.put("big", bigUrl);
+					content.put("small", smallUrl);
+
+					entry.setValue(TextUtil.formatText(objects.toJSONString()));
+					try {
+						// 更新表数据
+						String updateSql = SqlUtil.getUpdateSql(tableInfo.getTableName(), tableInfo.getPrimaryKey(),
+								map);
+						System.out.println(updateSql);
+						DBUtil.update(updateSql);
+					} catch (SQLException e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		});
+		System.out.println(String.format("%s表处理完毕, 一共处理了%s条数据", tableInfo.getTableName(), total));
+	}
+
+	private void doHandleMigrateStaticResourcesWithHtml(TableInfo tableInfo) throws SQLException {
+		System.out.println(String.format("开始处理%s", tableInfo.getTableName()));
+
+		// 读取表的所有数据,并处理相应的业务逻辑
+		int total = doReadTable(tableInfo, maps -> {
+			for (Map<String, Object> map : maps) {
+				for (Map.Entry<String, Object> entry : map.entrySet()) {
+					if (entry.getKey().equals(tableInfo.getPrimaryKey())) {
+						continue;
+					}
+					String value = (String) entry.getValue();
+					org.jsoup.nodes.Document document = Jsoup.parse(value);
+					Elements imgEls = document.select("img");
+
+					for (Element imgEle : imgEls) {
+						// 获取html内容的图片地址
+						String imgSrc = imgEle.attr("src");
+						String url = FileUtil.downloadFileWithUrl(tableInfo, entry.getKey(),
+								map.get(tableInfo.getPrimaryKey()), imgSrc);
+						imgEle.attr("src", url);
+					}
+
+					// 替换标签内容
+					String str = document.toString();
+					String ret = TextUtil.formatText(str);
+					entry.setValue(ret);
+					try {
+						// 更新表数据
+						String updateSql = SqlUtil.getUpdateSql(tableInfo.getTableName(), tableInfo.getPrimaryKey(),
+								map);
+						System.out.println(updateSql);
+						DBUtil.update(updateSql);
+					} catch (SQLException e) {
+						e.printStackTrace();
+					}
+				}
+			}
+		});
+		System.out.println(String.format("%s表处理完毕, 一共处理了%s条数据", tableInfo.getTableName(), total));
+	}
+
+	private void doHandleGenerateBatchModifyValueSql(TableInfo tableInfo) {
+		SqlUtil.getBathModifyValuSql(tableInfo.getTableName(), tableInfo.getPrimaryKey(), tableInfo.getCols());
+	}
+
+	/**
+	 * 生成SQL更新语句
+	 */
+	private void doHandleGenerateUpdateSql(TableInfo tableInfo) throws SQLException {
+		// 1, 拼接查询SQL,查询tableName表的cols列
+		System.out.println(String.format("开始处理=====================================%s", tableInfo.getTableName()));
+
+		int total = doReadTable(tableInfo, maps -> {
+			// 3,生成sql更新语句
+			for (Map<String, Object> map : maps) {
+				String updateSql = SqlUtil.getUpdateSql(tableInfo.getTableName(), tableInfo.getPrimaryKey(), map);
+				// 把sql文件写入到text中
+				TextUtil.saveAsFileWriter(tableInfo.getTableName(), updateSql);
+			}
+		});
+		System.out.println(String.format("%s表处理完毕, 一共处理了%s条数据", tableInfo.getTableName(), total));
+	}
+
+	/**
+	 * 静态资源文件迁移
+	 *
+	 * @throws SQLException
+	 */
+	private void doHandleMigrateStaticResources(TableInfo tableInfo) throws SQLException {
+		System.out.println(String.format("开始处理%s", tableInfo.getTableName()));
+
+		// 读取表的所有数据,并处理相应的业务逻辑
+		int total = doReadTable(tableInfo, maps -> {
+			for (Map<String, Object> map : maps) {
+				try {
+					// 下载文件 && 上传文件到阿里云服务器
+					FileUtil.downloadAndUploadFile(tableInfo, map);
+
+					// 更新表数据
+					String updateSql = SqlUtil.getUpdateSql(tableInfo.getTableName(), tableInfo.getPrimaryKey(), map);
+					DBUtil.update(updateSql);
+				} catch (SQLException | IOException e) {
+					e.printStackTrace();
+				}
+			}
+		});
+		System.out.println(String.format("%s表处理完毕, 一共处理了%s条数据", tableInfo.getTableName(), total));
+	}
+
+	/**
+	 * 单独处理Template表的url字段
+	 *
+	 * @throws SQLException
+	 */
+	private void handleTemplateUrl() throws SQLException, IOException, HttpClientException {
+
+		TableInfo tableInfo = new TableInfo();
+		ArrayList<String> cols = new ArrayList<>();
+		tableInfo.setTableName("template");
+		tableInfo.setPrimaryKey("flag");
+		cols.add("url");
+		cols.add("vid");
+		cols.add("flag");
+		tableInfo.setCols(cols);
+
+		String type = "yuanhua";
+
+		String selectSql = SqlUtil.getSelectSql(tableInfo.getTableName(), tableInfo.getCols());
+		System.out.println(selectSql);
+		List<Map<String, Object>> maps = DBUtil.queryList(selectSql);
+		for (Map<String, Object> map : maps) {
+			// 根据多玩vid拿到转码后台的多玩视频地址
+			String selectDwVideoSql = "select dwVid from video where id = " + map.get("vid");
+			List<Map<String, Object>> maps1 = DBUtil.queryList(selectDwVideoSql);
+			Map<String, Object> dwVideoMap = maps1.get(0);
+
+			VideoInfo dwVideoInfo = HttpUtils.getDwVideoInfo((Long) dwVideoMap.get("dwVid"));
+			List<VideoInfo.ResultBean.ItemsBean> items = dwVideoInfo.getResult().getItems();
+			for (VideoInfo.ResultBean.ItemsBean item : items) {
+				if (type.equals(item.getDefinition())) {
+					// 获取转码后的视频地址,并更新到缓存
+					map.put("url", item.getTranscode().getUrls().get(0));
+					break;
+				}
+			}
+
+			tableInfo.getCols().remove("vid");
+			// 下载文件 && 上传文件
+			FileUtil.downloadAndUploadFile(tableInfo, map, 1);
+
+			// 更新表数据
+			String updateSql = SqlUtil.getUpdateSql(tableInfo.getTableName(), tableInfo.getPrimaryKey(), map);
+			DBUtil.update(updateSql);
+			System.out.println(updateSql);
+		}
+		System.out.println(String.format("%s表处理完毕", tableInfo.getTableName()));
+	}
+}

+ 103 - 0
src/main/java/com/duowan/texiu/data/migration/script/base/BaseTaskWorker.java

@@ -0,0 +1,103 @@
+package com.duowan.texiu.data.migration.script.base;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.function.Consumer;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.xpath.XPath;
+import javax.xml.xpath.XPathConstants;
+import javax.xml.xpath.XPathExpression;
+import javax.xml.xpath.XPathFactory;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.StopWatch;
+import org.w3c.dom.Document;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+import com.duowan.texiu.data.migration.model.TableInfo;
+import com.duowan.texiu.data.migration.tools.Constants;
+import com.duowan.texiu.data.migration.tools.DBUtil;
+import com.duowan.texiu.data.migration.tools.SqlUtil;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/11/26
+ */
+public abstract class BaseTaskWorker {
+
+    private StopWatch stopWatch = new StopWatch();
+
+	protected void handle(Consumer<TableInfo> consumer) throws Exception {
+		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+		DocumentBuilder bulider = dbf.newDocumentBuilder();
+		Document doc = bulider
+				.parse(Thread.currentThread().getContextClassLoader().getResourceAsStream(Constants.DB_CONFIG));
+		XPathFactory factory = XPathFactory.newInstance();
+		XPath xpath = factory.newXPath();
+
+		// 选取table节点
+		XPathExpression compile = xpath.compile("//table");
+
+		// 获取table节点的所有节点
+		NodeList nodes = (NodeList) compile.evaluate(doc, XPathConstants.NODESET);
+		for (int i = 0; i < nodes.getLength(); i++) {
+
+			NamedNodeMap attributes = nodes.item(i).getAttributes();
+			String tableName = attributes.getNamedItem("name").getNodeValue().trim();
+			String primaryKey = attributes.getNamedItem("primaryKey").getNodeValue().trim();
+			List<String> colList = new ArrayList<>();
+			NodeList childNodes = nodes.item(i).getChildNodes();
+
+			// 遍历所有子节点,获取节点的名称与数据,将其存与tables对象的属性进行匹配并存入到该对象
+			for (int j = 0; j < childNodes.getLength(); j++) {
+				Node node = childNodes.item(j);
+				if (StringUtils.isNotBlank(node.getTextContent())) {
+					colList.add(node.getTextContent().trim());
+				}
+			}
+			TableInfo tableInfo = new TableInfo();
+			tableInfo.setPrimaryKey(primaryKey);
+			tableInfo.setTableName(tableName);
+			tableInfo.setCols(colList);
+
+			// 开始处理业务
+            stopWatch.start(tableName);
+			consumer.accept(tableInfo);
+		    stopWatch.stop();
+		}
+        System.out.println(stopWatch.prettyPrint());
+	}
+
+	protected int doReadTable(TableInfo tableInfo, Consumer<List<Map<String, Object>>> consumer) throws SQLException {
+	    int per = 200;
+		Object lastId = Integer.valueOf(14515);
+		String selectSql;
+		int total = 0;
+		while (true) {
+			selectSql = SqlUtil.getSelectSql(tableInfo.getTableName(), tableInfo.getCols(), tableInfo.getPrimaryKey(),
+					per, lastId);
+			System.out.println(selectSql);
+			List<Map<String, Object>> maps = DBUtil.queryList(selectSql);
+
+			if (maps.size() <= 0) {
+				break;
+			}
+			// 处理业务
+			consumer.accept(maps);
+			lastId = maps.get(maps.size() - 1).get(tableInfo.getPrimaryKey());
+
+			total += maps.size();
+		}
+
+		return total;
+	}
+
+
+}

+ 35 - 0
src/main/java/com/duowan/texiu/data/migration/script/dd

@@ -0,0 +1,35 @@
+#!/bin/bash
+
+abspath=`pwd`/$0
+homepath="/data/webapps/eureka.server"
+jarpath="/data/webapps/eureka.server/lib/eureka-server-1.0.jar"
+JAVA_HOME=/home/service/jdk1.8.0_211
+JAVA_LIB=$JAVA_HOME/lib
+
+libpath="$homepath/lib"
+OPT="-Xmx500M -Xms128M"
+classpath="$homepath"
+piddir="$homepath/var"
+mkdir $piddir 2>/dev/null
+
+PROFILE=""
+while getopts ":p:" opt
+do
+    case $opt in
+        p)
+		PROFILE = "-Dspring.profiles.active=$OPTARG"
+        echo "参数a的值$OPTARG"
+        ;;
+        ?)
+        echo "未知参数"
+        exit 1;;
+    esac
+done
+
+
+if [ -f $piddir/server.pid ]
+then
+        echo "server is ready running!"
+        exit
+fi
+$JAVA_HOME/bin/java -cp $classpath $OPT $PROFILE -jar $jarpath&

+ 64 - 0
src/main/java/com/duowan/texiu/data/migration/tools/CommonThreadPool.java

@@ -0,0 +1,64 @@
+package com.duowan.texiu.data.migration.tools;
+
+import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicInteger;
+
+/**
+ * 通用线程池
+ */
+public class CommonThreadPool {
+    private static ThreadPoolExecutor executor = null;
+    private static BlockingQueue<Runnable> workQueue = null;
+    /**
+     * 队列容量
+     */
+    private final static int THREAD_QUEUE_SIZE = Integer.MAX_VALUE;
+    /**
+     * 池中线程数
+     */
+    private final static int CORE_POOL_SIZE = 10;
+    /**
+     * 最大线程数
+     */
+    private final static int MAX_POOL_SIZE = 15;
+
+    private static void init() {
+        ThreadFactory namedThreadFactory = new ThreadFactory() {
+            AtomicInteger counter = new AtomicInteger(0);
+
+            @Override
+            public Thread newThread(Runnable r) {
+                return new Thread(r, "Common-Task-Thread-" + counter.addAndGet(1));
+            }
+        };
+        try {
+            if (workQueue == null) {
+                workQueue = new ArrayBlockingQueue<>(000);
+            }
+            if (executor == null) {
+                executor = new ThreadPoolExecutor(CORE_POOL_SIZE, MAX_POOL_SIZE, 10, TimeUnit.SECONDS, workQueue,
+                        namedThreadFactory, new ThreadPoolExecutor.AbortPolicy());
+                executor.allowCoreThreadTimeOut(true);
+            }
+        } catch (Exception t) {
+            // log.error("初始化线程池时出现异常......" + t.getMessage(), t);
+        }
+    }
+
+    public static void execute(Runnable runnable) {
+        if (executor == null || workQueue == null) {
+            init();
+        }
+        executor.execute(runnable);
+    }
+
+    public static void shutdown() {
+        executor.shutdown();
+    }
+
+    public static void wait4AllThreadFinished() throws InterruptedException {
+        shutdown();
+        executor.awaitTermination(1, TimeUnit.HOURS);
+    }
+
+}

+ 38 - 0
src/main/java/com/duowan/texiu/data/migration/tools/Constants.java

@@ -0,0 +1,38 @@
+package com.duowan.texiu.data.migration.tools;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/11/25
+ */
+public class Constants {
+
+
+//    private static String prefix = "texuan";
+//    private static String prefix = "hiyd_home";
+//    private static String prefix = "hiyd_cms";
+    private static String env = "test";
+
+    public static String DB_CONFIG;
+    public static String SQL_FILE_EXPORT_PATH;
+    public static String DB_USER_NAME;
+    public static String DB_USER_PASSWORD;
+    public static String DB_CONNECTION_URL;
+    public static String BASE_FILE_PATH;
+
+    public static void init(String prefix){
+        DB_CONFIG = PropertiesUtil.getProperty(prefix + ".db.config");
+        SQL_FILE_EXPORT_PATH = PropertiesUtil.getProperty(prefix + ".sql.file.export.path");
+        BASE_FILE_PATH = PropertiesUtil.getProperty(prefix + ".base.file.path");
+        DB_USER_NAME = PropertiesUtil.getProperty(prefix + "." + env + ".db.user.name");
+        DB_USER_PASSWORD = PropertiesUtil.getProperty(prefix + "." + env + ".db.user.password");
+        DB_CONNECTION_URL = PropertiesUtil.getProperty(prefix + "." + env + ".db.connection.url");
+    }
+
+    public static void main(String[] args) {
+        System.out.println(DB_USER_PASSWORD);
+        System.out.println(DB_USER_NAME);
+        System.out.println(DB_CONNECTION_URL);
+        System.out.println(DB_CONFIG);
+    }
+}

+ 66 - 0
src/main/java/com/duowan/texiu/data/migration/tools/DBUtil.java

@@ -0,0 +1,66 @@
+package com.duowan.texiu.data.migration.tools;
+
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/10/10
+ */
+public class DBUtil {
+
+	// private static final String URL =
+	// "jdbc:mysql://47.97.96.155:3306/texiu_home_prod?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false";
+	// 特炫 测试环境
+	// private static final String URL =
+	// "jdbc:mysql://61.160.36.19:3306/texiu_home?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false";
+
+	// 特炫 阿里云环境
+	// private static final String URL =
+	// "jdbc:mysql://rm-wz9aky1r32bcp7c.mysql.rds.aliyuncs.com:3306?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false";
+
+	private static Connection conn = null;
+
+	// 静态代码块(将加载驱动、连接数据库放入静态块中)
+	static {
+		try {
+			// 1.加载驱动程序
+			Class.forName("com.mysql.cj.jdbc.Driver");
+			// 2.获得数据库的连接
+			conn = DriverManager.getConnection(Constants.DB_CONNECTION_URL, Constants.DB_USER_NAME,
+					Constants.DB_USER_PASSWORD);
+		} catch (ClassNotFoundException | SQLException e) {
+			e.printStackTrace();
+		}
+	}
+
+	public static List<Map<String, Object>> queryList(String selectSql) throws SQLException {
+		Statement statement = conn.createStatement();
+		ResultSet resultSet = statement.executeQuery(selectSql);
+		List<Map<String, Object>> list = new ArrayList<>();
+
+		// 获得结果集结构信息,元数据
+		ResultSetMetaData md = resultSet.getMetaData();
+
+		// 获得列数
+		int columnCount = md.getColumnCount();
+		while (resultSet.next()) {
+			Map<String, Object> rowData = new HashMap<>();
+			for (int i = 1; i <= columnCount; i++) {
+				rowData.put(md.getColumnName(i), resultSet.getObject(i));
+			}
+			list.add(rowData);
+		}
+		return list;
+	}
+
+	public static void update(String executeSql) throws SQLException {
+		Statement statement = conn.createStatement();
+		statement.executeUpdate(executeSql);
+	}
+
+}

+ 105 - 0
src/main/java/com/duowan/texiu/data/migration/tools/FFmpegUtils.java

@@ -0,0 +1,105 @@
+package com.duowan.texiu.data.migration.tools;
+
+import java.io.File;
+import java.io.IOException;
+
+import com.duowan.texiu.data.migration.model.VideoInfoFF;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.alibaba.fastjson.JSON;
+import com.ojia.base.util.CommandLineTools;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/7/30
+ */
+public class FFmpegUtils {
+	private static final Logger log = LoggerFactory.getLogger(FFmpegUtils.class);
+
+	public static void main(String[] args) throws InterruptedException, IOException, ServiceException {
+		// getVideoInfoFF("F:\\resources\\test\\e3d741da868a5128a42d7e03cb56e3ba_len39009900.mp4");
+		screenshot("F:\\resources\\test\\e3d741da868a5128a42d7e03cb56e3ba_len39009900.mp4",
+				"F:\\resources\\test\\output\\123.jpg", 19);
+	}
+
+	/**
+	 * 获取视频信息详情
+	 *
+	 * @param inputFile
+	 * @return
+	 * @throws InterruptedException
+	 * @throws ServiceException
+	 * @throws IOException
+	 */
+	public static VideoInfoFF getVideoInfoFF(String inputFile) throws InterruptedException, ServiceException, IOException {
+		if (!checkfile(inputFile)) {
+			throw new ServiceException(inputFile + " is not file");
+		}
+		String command = String.format(VideoConstant.Command.GET_VIDEO_INFO, inputFile);
+		String s = CommandLineTools.execCommand(command);
+		VideoInfoFF VideoInfoFF = JSON.parseObject(s, VideoInfoFF.class);
+		System.out.println(s);
+		return VideoInfoFF;
+	}
+
+	/**
+	 * 获取视频截图
+	 *
+	 * @param inputFile
+	 * @param outputFile
+	 * @param seconds
+	 * @return
+	 * @throws InterruptedException
+	 * @throws IOException
+	 * @throws ServiceException
+	 */
+	public static String screenshot(String inputFile, String outputFile, int seconds)
+			throws InterruptedException, IOException, ServiceException {
+		return screenshot(inputFile, outputFile, true, 0, 0, seconds);
+	}
+
+	/**
+	 * 视频截图
+	 *
+	 * @param inputFile
+	 * @param outputFile
+	 * @param isOriginalSize
+	 * @param width
+	 * @param height
+	 * @param seconds
+	 * @return
+	 * @throws InterruptedException
+	 * @throws ServiceException
+	 * @throws IOException
+	 */
+	public static String screenshot(String inputFile, String outputFile, boolean isOriginalSize, int width, int height,
+			double seconds) throws InterruptedException, ServiceException, IOException {
+		VideoInfoFF VideoInfoFF = getVideoInfoFF(inputFile);
+		if (isOriginalSize) {
+			for (VideoInfoFF.StreamsBean streamsBean : VideoInfoFF.getStreams()) {
+				if (streamsBean.getCodec_type().equals("video")) {
+					height = streamsBean.getCoded_height();
+					width = streamsBean.getCoded_width();
+					break;
+				}
+			}
+		}
+		if (width <= 0 || height <= 0) {
+			throw new ServiceException("图片的高度或宽度不能小于0!");
+		}
+		Double duration = Double.valueOf(VideoInfoFF.getFormat().getDuration());
+		if (seconds > duration) {
+			throw new ServiceException("截取的时间不能大于视频播放长度!");
+		}
+		String command = String.format(VideoConstant.Command.SCREENSHOT, inputFile, seconds, width, height, outputFile);
+		return CommandLineTools.execCommand(command);
+	}
+
+	private static boolean checkfile(String path) {
+		File file = new File(path);
+		return file.isFile();
+	}
+
+}

+ 185 - 0
src/main/java/com/duowan/texiu/data/migration/tools/FileUtil.java

@@ -0,0 +1,185 @@
+package com.duowan.texiu.data.migration.tools;
+
+import java.io.*;
+import java.net.URL;
+import java.util.Map;
+
+import org.apache.commons.lang3.StringUtils;
+
+import com.alibaba.fastjson.JSONObject;
+import com.duowan.texiu.data.migration.model.TableInfo;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/10/10
+ */
+public class FileUtil {
+
+	public static Map<String, Object> downloadAndUploadFile(TableInfo tableInfo, Map<String, Object> map)
+			throws IOException {
+		return downloadAndUploadFile(tableInfo, map, 0);
+	}
+
+	public static Map<String, Object> downloadAndUploadFile(TableInfo tableInfo, Map<String, Object> map,
+			int isTemplate) throws IOException {
+		long vid = 0;
+		for (Map.Entry<String, Object> entry : map.entrySet()) {
+			if (tableInfo.getPrimaryKey().equals(entry.getKey()) || "vid".equals(entry.getKey())) {
+				continue;
+			}
+
+			String url = (String) entry.getValue();
+			// 如果url为空,则跳过
+			if (StringUtils.isBlank(url)) {
+				map.put(entry.getKey(), url);
+				continue;
+			}
+
+			if (StringUtils.isBlank(getExtensionName(url))) {
+				System.out.println(url);
+				continue;
+			}
+
+			System.out.println("===============> " + url);
+			// 下载资源到本地
+			// 判断下载目录是否存在,不存在则创建目录
+			File filePath = new File(Constants.BASE_FILE_PATH + File.separator + tableInfo.getTableName()
+					+ File.separator + entry.getKey());
+			if (!filePath.exists()) {
+				boolean mkdirs = filePath.mkdirs();
+				if (mkdirs) {
+					System.out.println("创建文件夹成功");
+				}
+			}
+
+			String downloadPath = Constants.BASE_FILE_PATH + File.separator + tableInfo.getTableName() + File.separator
+					+ entry.getKey() + File.separator + map.get(tableInfo.getPrimaryKey()) + "."
+					+ getExtensionName(url);
+
+			// 下载资源文件,如果资源下载失败,则直接跳过
+			if (!downloadLocalDirectory(url, downloadPath)) {
+				System.out.println(String.format("文件【%s】下载失败", url));
+				continue;
+			}
+
+			UploadApiResult.DataBean dataBean = upload2AliServer(downloadPath, isTemplate);
+			// 调用的上传接口,返回的是一个fastdfs的一个fileid,需要拼接一个域名
+			url = dataBean.getFdfsId();
+			map.put(entry.getKey(), url);
+			vid = dataBean.getVid();
+		}
+		if (isTemplate == 1) {
+			map.put("vid", vid);
+			map.put("transUrl", map.get("url"));
+		}
+		return map;
+	}
+
+	public static boolean downloadLocalDirectory(String url, String outPath) {
+		if (url == null || StringUtils.isBlank(url)) {
+			throw new RuntimeException("urls不能为空");
+		}
+		return downloadFileFromUrl(url, outPath);
+	}
+
+	/**
+	 * 链接url下载静态资源
+	 *
+	 * @param urlAddress
+	 * @param outPath
+	 */
+	public static boolean downloadFileFromUrl(String urlAddress, String outPath) {
+		URL url;
+		boolean isDownloadSuccess = false;
+		try {
+			url = new URL(urlAddress);
+			DataInputStream dataInputStream = new DataInputStream(url.openStream());
+
+			FileOutputStream fileOutputStream = new FileOutputStream(new File(outPath));
+			ByteArrayOutputStream output = new ByteArrayOutputStream();
+
+			byte[] buffer = new byte[1024];
+			int length;
+
+			while ((length = dataInputStream.read(buffer)) > 0) {
+				output.write(buffer, 0, length);
+			}
+			fileOutputStream.write(output.toByteArray());
+			dataInputStream.close();
+			fileOutputStream.close();
+
+			isDownloadSuccess = true;
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+
+		return isDownloadSuccess;
+	}
+
+
+	public static String downloadFileWithUrl(TableInfo tableInfo, String field, Object primaryKeyValue, String url) {
+		// 下载资源到本地
+		// 判断下载目录是否存在,不存在则创建目录
+		File filePath = new File(Constants.BASE_FILE_PATH + File.separator + tableInfo.getTableName()
+				+ File.separator + field);
+		if (!filePath.exists()) {
+			boolean mkdirs = filePath.mkdirs();
+			if (mkdirs) {
+				System.out.println("创建文件夹成功");
+			}
+		}
+
+		String downloadPath = Constants.BASE_FILE_PATH + File.separator + tableInfo.getTableName()
+				+ File.separator + field + File.separator + primaryKeyValue
+				+ "." + FileUtil.getExtensionName(url);
+
+		// 下载资源文件,如果资源下载失败,则直接返回原理的静态资源地址
+		if (!FileUtil.downloadLocalDirectory(url, downloadPath)) {
+			System.out.println(String.format("文件【%s】下载失败", url));
+			return url;
+		}
+
+		UploadApiResult.DataBean dataBean = null;
+		try {
+			dataBean = FileUtil.upload2AliServer(downloadPath, 0);
+		} catch (IOException e) {
+			e.printStackTrace();
+		}
+		// 调用的上传接口,返回的是一个fastdfs的一个fileid,需要拼接一个域名
+		return dataBean.getFdfsId();
+	}
+
+	/**
+	 * 获取文件的后缀名
+	 *
+	 * @param filename
+	 * @return
+	 */
+	public static String getExtensionName(String filename) {
+		if ((filename != null) && (filename.length() > 0)) {
+			int dot = filename.lastIndexOf('.');
+			if ((dot > -1) && (dot < (filename.length() - 1))) {
+				return filename.substring(dot + 1);
+			}
+		}
+		return "";
+	}
+
+	public static UploadApiResult.DataBean upload2AliServer(String filePath, int isTemplate) throws IOException {
+		if (filePath == null || StringUtils.isBlank(filePath)) {
+			throw new RuntimeException("filePaths不能为空");
+		}
+		String result = HttpClient.uploadFile(filePath, isTemplate);
+		UploadApiResult uploadApiResult = JSONObject.parseObject(result, UploadApiResult.class);
+		if (0 != uploadApiResult.getCode()) {
+			throw new RuntimeException("文件上传失败!");
+		}
+		return uploadApiResult.getData();
+	}
+
+	public static void main(String[] args) {
+		System.out.println(
+				getExtensionName("http://image.yy.com/ojiastoreimage/cef9276dcdfa70fb5146311e2d03bc68_stamp."));
+	}
+}

+ 88 - 0
src/main/java/com/duowan/texiu/data/migration/tools/HttpClient.java

@@ -0,0 +1,88 @@
+package com.duowan.texiu.data.migration.tools;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.http.HttpEntity;
+import org.apache.http.client.ClientProtocolException;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/10/12
+ */
+public class HttpClient {
+
+	private final static String UPLOAD_FILE_API = "http://localhost:8888/proxy/api/uploadFile";
+	private final static Integer RESPONSE_OK = 200;
+	private final static String ACCESS_TOKEN = "zwaXnoi5OM-s";
+
+
+	/**
+	 * 上传文件
+	 *
+	 * @param localFilePath
+	 * @return
+	 * @throws ClientProtocolException
+	 * @throws IOException
+	 */
+	public static String uploadFile(String localFilePath, int isTemplate) throws ClientProtocolException, IOException {
+		CloseableHttpClient httpClient = HttpClientBuilder.create().build();
+		RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(200000).setSocketTimeout(200000)
+				.build();
+
+		CloseableHttpResponse httpResponse = null;
+		String result = null;
+		try {
+			HttpPost httpPost = new HttpPost(UPLOAD_FILE_API);
+			httpPost.setConfig(requestConfig);
+			MultipartEntityBuilder multipartEntityBuilder = MultipartEntityBuilder.create();
+
+			File file = new File(localFilePath);
+
+			multipartEntityBuilder.addBinaryBody("file", file);
+			multipartEntityBuilder.addTextBody("isTemplate", String.valueOf(isTemplate));
+			multipartEntityBuilder.addTextBody("token", ACCESS_TOKEN);
+			HttpEntity httpEntity = multipartEntityBuilder.build();
+			httpPost.setEntity(httpEntity);
+
+			httpResponse = httpClient.execute(httpPost);
+			HttpEntity responseEntity = httpResponse.getEntity();
+			int statusCode = httpResponse.getStatusLine().getStatusCode();
+			if (statusCode == RESPONSE_OK) {
+				BufferedReader reader = new BufferedReader(new InputStreamReader(responseEntity.getContent()));
+				StringBuffer buffer = new StringBuffer();
+				String str = "";
+				while (StringUtils.isNotBlank(str = reader.readLine())) {
+					buffer.append(str);
+				}
+				result = buffer.toString();
+			}
+		} finally {
+			httpClient.close();
+			if (httpResponse != null) {
+				httpResponse.close();
+			}
+		}
+		return result;
+	}
+
+	public static void main(String[] args) throws IOException {
+		String s = uploadFile("F:\\resources\\test\\dw_video\\20190812102406_七夕.jpeg", 0);
+		System.out.println(s);
+		UploadApiResult uploadApiResult = JSONObject.parseObject(s, UploadApiResult.class);
+		System.out.println(uploadApiResult.getData());
+
+	}
+}

+ 234 - 0
src/main/java/com/duowan/texiu/data/migration/tools/HttpClientService.java

@@ -0,0 +1,234 @@
+package com.duowan.texiu.data.migration.tools;
+
+import java.io.IOException;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.concurrent.locks.ReentrantLock;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.http.Consts;
+import org.apache.http.NameValuePair;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.client.methods.HttpPut;
+import org.apache.http.client.utils.URIBuilder;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.message.BasicHeader;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * HttpClient 服务类
+ *
+ * @author ZENG.QING.HUA DigestUtils 曾庆华
+ */
+public class HttpClientService {
+	private static final Log log = LogFactory.getLog("HttpClientService");
+	/**
+	 * 定义CloseableHttpClient
+	 */
+	private CloseableHttpClient httpClient = HttpClients.createDefault();
+	/**
+	 * 定义ObjectMapper操作json
+	 */
+	private ObjectMapper objectMapper = new ObjectMapper();
+
+	private HttpClientService() {
+
+	}
+
+	public static HttpClientService newInstance() {
+		return SingletonHolder.INSTANCE;
+	}
+
+	private static class SingletonHolder {
+		public static HttpClientService INSTANCE = new HttpClientService();
+	}
+
+	/**
+	 * 发送get请求
+	 *
+	 * @throws Exception
+	 */
+	public HttpResponseEntity sendGet(String uri, Map<String, String> params) {
+		CloseableHttpResponse response = null;
+		try {
+			URIBuilder uriBuilder = new URIBuilder(uri);
+
+			if (params != null && params.size() > 0) {
+				// 设置请求参数
+				Set<Entry<String, String>> entrySet = params.entrySet();
+				for (Entry<String, String> entry : entrySet) {
+					uriBuilder.addParameter(entry.getKey(), entry.getValue());
+				}
+			}
+			// 创建HttpGet对象
+			HttpGet httpGet = new HttpGet(uriBuilder.build());
+
+			// 使用HttpClient运行这个对象
+			response = httpClient.execute(httpGet);
+
+			String data = (response.getEntity() != null) ? EntityUtils.toString(response.getEntity(), Consts.UTF_8)
+					: null;
+			return new HttpResponseEntity(response.getStatusLine().getStatusCode(), data);
+		} catch (Exception e) {
+			throw new RuntimeException();
+		} finally {
+			try {
+				if (response != null) {
+					response.close();
+				}
+			} catch (IOException e) {
+				throw new RuntimeException();
+			}
+		}
+	}
+
+	/**
+	 * 利用HttpClient发送Post请求
+	 *
+	 * @param uri
+	 *            请求URL
+	 * @param params
+	 *            请求参数
+	 * @return 响应实体
+	 */
+	public HttpResponseEntity sendPost(String uri, Map<String, Object> params, boolean json) {
+		return sendPost(uri, params, null, json);
+	}
+
+	/**
+	 * 利用HttpClient发送Post请求
+	 *
+	 * @param uri
+	 *            请求URL
+	 * @param params
+	 *            请求参数
+	 * @param headerParams
+	 *            请求参数
+	 * @return 响应实体
+	 */
+	public HttpResponseEntity sendPost(String uri, Map<String, Object> params, Map<String, String> headerParams,
+			boolean json) {
+		CloseableHttpResponse response = null;
+		try {
+			// 创建HttpPost请求对象
+			HttpPost httpPost = new HttpPost(uri);
+			// 设置http请求头
+			if (headerParams != null) {
+				for (Entry<String, String> entry : headerParams.entrySet()) {
+					httpPost.setHeader(new BasicHeader(entry.getKey(), entry.getValue()));
+				}
+			}
+			// 判断是否需要设置请求参数
+			if (params != null && params.size() > 0) {
+				if (json) {
+					// 直接传一个json数据过去
+					httpPost.setEntity(
+							new StringEntity(objectMapper.writeValueAsString(params), ContentType.APPLICATION_JSON));
+				} else {
+					// 传的是表单数据
+					// 创建集合封装请求参数
+					List<NameValuePair> nvpair = new ArrayList<NameValuePair>();
+					Set<Entry<String, Object>> entrySet = params.entrySet();
+					for (Entry<String, Object> entry : entrySet) {
+						// 添加请求参数
+						nvpair.add(new BasicNameValuePair(entry.getKey(), entry.getValue().toString()));
+					}
+					UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nvpair, Consts.UTF_8);
+					httpPost.setEntity(formEntity);
+				}
+			}
+			// 执行请求,得到响应对象
+			response = httpClient.execute(httpPost);
+			// 获取响应结果
+			String data = (response.getEntity() != null) ? EntityUtils.toString(response.getEntity(), Consts.UTF_8)
+					: null;
+			// 返回响应结果
+			return new HttpResponseEntity(response.getStatusLine().getStatusCode(), data);
+
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new RuntimeException();
+		} finally {
+			try {
+				if (response != null) {
+					response.close();
+				}
+			} catch (IOException e) {
+				throw new RuntimeException();
+			}
+		}
+	}
+
+	/**
+	 * 利用HttpClient发送put请求
+	 *
+	 * @param uri
+	 *            请求地址
+	 * @param params
+	 *            请求参数
+	 * @return 响应数据
+	 */
+	public HttpResponseEntity sendPut(String uri, Map<String, String> params, boolean json) {
+		CloseableHttpResponse response = null;
+		try {
+			HttpPut httpPut = new HttpPut(uri);
+
+			if (params != null && params.size() > 0) {
+				if (json) {
+					httpPut.setEntity(
+							new StringEntity(objectMapper.writeValueAsString(params), ContentType.APPLICATION_JSON));
+				} else {
+					List<NameValuePair> nvpair = new ArrayList<NameValuePair>();
+					Set<Entry<String, String>> entrySet = params.entrySet();
+					for (Entry<String, String> entry : entrySet) {
+						// 设置请求参数
+						nvpair.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
+					}
+					// 设置请求参数
+					UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nvpair, Consts.UTF_8);
+					httpPut.setEntity(formEntity);
+				}
+				ReentrantLock reentrantLock = new ReentrantLock();
+				reentrantLock.lock();
+			}
+			response = httpClient.execute(httpPut);
+
+			String data = (response.getEntity() != null) ? EntityUtils.toString(response.getEntity(), Consts.UTF_8)
+					: null;
+			return new HttpResponseEntity(response.getStatusLine().getStatusCode(), data);
+		} catch (Exception e) {
+			throw new RuntimeException();
+		} finally {
+			try {
+				if (response != null) {
+					response.close();
+				}
+			} catch (IOException e) {
+				throw new RuntimeException();
+			}
+		}
+	}
+
+	/**
+	 * 发送delete请求
+	 */
+
+	public HttpResponseEntity sendDelete(String uri, Map<String, Object> params) {
+		if (params == null) {
+			params = new HashMap<>();
+		}
+		// 利用POST请求模拟发送delete请求
+		params.put("_method", "delete");
+		return sendPost(uri, params, false);
+	}
+}

+ 39 - 0
src/main/java/com/duowan/texiu/data/migration/tools/HttpResponseEntity.java

@@ -0,0 +1,39 @@
+package com.duowan.texiu.data.migration.tools;
+
+public class HttpResponseEntity {
+	/** 定义响应状态码 */
+	private int statusCode;
+
+	/** 定义响应内容 */
+	private String content;
+
+	public int getStatusCode() {
+		return statusCode;
+	}
+
+	public void setStatusCode(int statusCode) {
+		this.statusCode = statusCode;
+	}
+
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+
+	public HttpResponseEntity() {}
+
+	public HttpResponseEntity(int statusCode, String content) {
+		this.statusCode = statusCode;
+		this.content = content;
+	}
+	@Override
+	public String toString() {
+		return "HttpResponseEntity [statusCode=" + statusCode + ", content=" + content + "]";
+	}
+
+
+
+}

+ 64 - 0
src/main/java/com/duowan/texiu/data/migration/tools/HttpUtils.java

@@ -0,0 +1,64 @@
+package com.duowan.texiu.data.migration.tools;
+
+import java.io.IOException;
+
+import com.duowan.texiu.data.migration.model.VideoInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ojia.base.exception.HttpClientException;
+import com.ojia.base.http.HttpHelper;
+import com.ojia.base.http.HttpMethod;
+
+/**
+ * http工具类
+ *
+ * @Author: linjiazhi
+ * @Date: 2019/6/28
+ */
+public class HttpUtils {
+
+	public static final Logger log = LoggerFactory.getLogger(HttpUtils.class);
+
+	/**
+	 * 获取多玩视频信息
+	 *
+	 * @param dwVid
+	 *            多玩视频id
+	 */
+	public static VideoInfo getDwVideoInfo(long dwVid)
+			throws  HttpClientException {
+		String url = "http://playapi.v.duowan.com/?r=play/video&partner=dw&vid=" + dwVid;
+
+		byte[] rsp = null;
+
+		for (int i = 0; i < 2; i++) {
+			try {
+				rsp = HttpHelper.http(url, HttpMethod.GET, null, null);
+				break;
+			} catch (IOException e) {
+				// log.error("", e);
+			}
+		}
+		if (null == rsp) {
+			log.error(String.format("http get video info error url=%s", url));
+			throw new RuntimeException("http get video info error url");
+		}
+		String repStr = new String(rsp);
+		VideoInfo videoInfo = JSONObject.parseObject(repStr, VideoInfo.class);
+
+		int code = videoInfo.getCode();
+		String msg = videoInfo.getMessage();
+		if (0 == code) {
+			log.error(String.format("http get video info error msg=%s,vid=%d", msg, dwVid));
+			if ("deleted".equals(msg)) {
+				throw new RuntimeException("http get video info error url");
+			} else {
+				throw new RuntimeException("http get video info error url");
+			}
+		}
+		return videoInfo;
+	}
+
+}

+ 32 - 0
src/main/java/com/duowan/texiu/data/migration/tools/PropertiesUtil.java

@@ -0,0 +1,32 @@
+package com.duowan.texiu.data.migration.tools;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.util.Properties;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/11/25
+ */
+public class PropertiesUtil {
+
+    private static Properties properties = null;
+
+    static {
+        properties = new Properties();
+        InputStream inputStream = Object.class.getResourceAsStream("/code.properties");
+        InputStreamReader inputStreamReader = null;
+        try {
+            inputStreamReader = new InputStreamReader(inputStream, "GBK");
+            properties.load(inputStreamReader);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public static String getProperty(String key) {
+        return properties.getProperty(key);
+    }
+}

+ 11 - 0
src/main/java/com/duowan/texiu/data/migration/tools/ServiceException.java

@@ -0,0 +1,11 @@
+package com.duowan.texiu.data.migration.tools;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/7/31
+ */
+public class ServiceException extends Exception {
+    public ServiceException(String name) {
+    }
+}

+ 117 - 0
src/main/java/com/duowan/texiu/data/migration/tools/SqlUtil.java

@@ -0,0 +1,117 @@
+package com.duowan.texiu.data.migration.tools;
+
+import com.duowan.texiu.data.migration.model.TableInfo;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/10/10
+ */
+public class SqlUtil {
+
+	/**
+	 * 拼装查询SQL语句
+	 *
+	 * @param tableName
+	 * @param cols
+	 * @return
+	 */
+	public static String getSelectSql(String tableName, List<String> cols) {
+		return getSelectSql(tableName, cols, null, null, null);
+	}
+
+	/**
+	 * 拼装查询SQL语句
+	 *
+	 * @param tableName
+	 * @param cols
+	 * @return
+	 */
+	public static String getSelectSql(String tableName, List<String> cols, String primaryKey, Integer per,
+			Object lastId) {
+		if (cols == null || cols.size() == 0) {
+			throw new RuntimeException("cols 不能为空");
+		}
+		StringBuilder sb = new StringBuilder();
+		sb.append("select ");
+		for (int i = 0; i < cols.size(); i++) {
+			sb.append(cols.get(i));
+			if (i != (cols.size() - 1)) {
+				sb.append(", ");
+			}
+		}
+		sb.append(" from ").append(tableName);
+		if (per != null && lastId != null) {
+			sb.append(" where ").append(primaryKey).append(" > '").append(lastId).append("' order by ").append(primaryKey)
+					.append(" limit ").append(per);
+		}
+		sb.append(";");
+		return sb.toString();
+	}
+
+	/**
+	 * 拼装更新SQL语句
+	 *
+	 * @param tableName
+	 * @param primaryKey
+	 * @param mapValue
+	 * @return
+	 */
+	public static String getUpdateSql(String tableName, String primaryKey, Map<String, Object> mapValue) {
+		if (mapValue == null || mapValue.size() == 0) {
+			throw new RuntimeException("illegal parameter");
+		}
+		StringBuilder stringBuilder = new StringBuilder();
+		stringBuilder.append("update ").append(tableName).append(" set ");
+		for (Map.Entry<String, Object> entry : mapValue.entrySet()) {
+			if (primaryKey.equals(entry.getKey())) {
+				continue;
+			}
+
+			Object value = entry.getValue() == null ? "" : entry.getValue();
+			stringBuilder.append(entry.getKey()).append("=").append("\"").append(value).append("\"").append(",");
+		}
+		stringBuilder.delete(stringBuilder.length() - 1, stringBuilder.length());
+		stringBuilder.append(" where ").append(primaryKey).append(" = \"").append(mapValue.get(primaryKey))
+				.append("\";\n");
+		return stringBuilder.toString();
+	}
+
+	/**
+	 * 批量替换掉表的某个字段的值
+	 *
+	 * @param tableName
+	 * @param primaryKey
+	 * @param cols
+	 * @return
+	 */
+	public static String getBathModifyValuSql(String tableName, String primaryKey, List<String> cols) {
+		String templateSql = "UPDATE %s SET %s = REPLACE(%s, 'http://texuan-fastdfs.duowan.com', 'http://fastdfs-texuan.oxzj.com');";
+		for (String col : cols) {
+			if (col.equals(primaryKey)) {
+				continue;
+			}
+			String format = String.format(templateSql, tableName, col, col);
+			System.out.println(format);
+		}
+		return null;
+	}
+
+	public static void main(String[] args) {
+		TableInfo tableInfo = new TableInfo();
+		tableInfo.setTableName("user");
+		tableInfo.setPrimaryKey("user_id");
+
+		ArrayList<String> objects = new ArrayList<>();
+		objects.add("user_id");
+		objects.add("name");
+		tableInfo.setCols(objects);
+
+		System.out.println(getSelectSql(tableInfo.getTableName(), tableInfo.getCols()));
+	}
+
+}

+ 84 - 0
src/main/java/com/duowan/texiu/data/migration/tools/TextUtil.java

@@ -0,0 +1,84 @@
+package com.duowan.texiu.data.migration.tools;
+
+import java.io.*;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/11/11
+ */
+public class TextUtil {
+
+	public static void saveAsFileWriter(String tableName, String content) {
+		FileWriter fwriter = null;
+		try {
+			// true表示不覆盖原来的内容,而是加到文件的后面。若要覆盖原来的内容,直接省略这个参数就好
+			File file = new File(String.format(Constants.SQL_FILE_EXPORT_PATH, tableName));
+			if (!file.exists()) {
+				file.createNewFile();
+			}
+			fwriter = new FileWriter(String.format(Constants.SQL_FILE_EXPORT_PATH, tableName), true);
+			fwriter.write(content);
+		} catch (IOException ex) {
+			ex.printStackTrace();
+		} finally {
+			try {
+				fwriter.flush();
+				fwriter.close();
+			} catch (IOException ex) {
+				ex.printStackTrace();
+			}
+		}
+	}
+
+	public static String formatText(String text) {
+		String arg1 = Character.toString('\"');
+		String arg2 = "\\\\" + '"';
+		String ret = text.replaceAll(arg1, arg2);
+
+		String arg3 = Character.toString('\'');
+		String arg4 = "\\\\'";
+		return ret.replaceAll(arg3, arg4);
+	}
+
+	/**
+	 * 文本文件转换为指定编码的字符串
+	 *
+	 * @param file
+	 *            文本文件
+	 * @param encoding
+	 *            编码类型
+	 * @return 转换后的字符串
+	 * @throws IOException
+	 */
+	public static String file2String(File file, String encoding) {
+		InputStreamReader reader = null;
+		StringWriter writer = new StringWriter();
+		try {
+			if (encoding == null || "".equals(encoding.trim())) {
+				reader = new InputStreamReader(new FileInputStream(file), encoding);
+			} else {
+				reader = new InputStreamReader(new FileInputStream(file));
+			}
+			// 将输入流写入输出流
+			char[] buffer = new char[1024];
+			int n = 0;
+			while (-1 != (n = reader.read(buffer))) {
+				writer.write(buffer, 0, n);
+			}
+		} catch (Exception e) {
+			e.printStackTrace();
+			return null;
+		} finally {
+			if (reader != null)
+				try {
+					reader.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+		}
+		// 返回转换结果
+        return writer.toString();
+	}
+
+}

+ 73 - 0
src/main/java/com/duowan/texiu/data/migration/tools/UploadApiResult.java

@@ -0,0 +1,73 @@
+package com.duowan.texiu.data.migration.tools;
+
+import java.io.Serializable;
+import java.util.Random;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/10/19
+ */
+public class UploadApiResult implements Serializable {
+
+
+	/**
+	 * code : 0
+	 * data : {"fdfsId":"group1/M00/00/0B/DhFs5F3GcnaAcFYyAAAupPzrhgE37.jpeg","vid":0}
+	 * result : 1
+	 */
+
+	private int code;
+	private DataBean data;
+	private int result;
+
+	public int getCode() {
+		return code;
+	}
+
+	public void setCode(int code) {
+		this.code = code;
+	}
+
+	public DataBean getData() {
+		return data;
+	}
+
+	public void setData(DataBean data) {
+		this.data = data;
+	}
+
+	public int getResult() {
+		return result;
+	}
+
+	public void setResult(int result) {
+		this.result = result;
+	}
+
+	public static class DataBean {
+		/**
+		 * fdfsId : group1/M00/00/0B/DhFs5F3GcnaAcFYyAAAupPzrhgE37.jpeg
+		 * vid : 0
+		 */
+
+		private String fdfsId;
+		private long vid;
+
+		public String getFdfsId() {
+			return fdfsId;
+		}
+
+		public void setFdfsId(String fdfsId) {
+			this.fdfsId = fdfsId;
+		}
+
+		public long getVid() {
+			return vid;
+		}
+
+		public void setVid(long vid) {
+			this.vid = vid;
+		}
+	}
+}

+ 35 - 0
src/main/java/com/duowan/texiu/data/migration/tools/VideoConstant.java

@@ -0,0 +1,35 @@
+package com.duowan.texiu.data.migration.tools;
+
+/**
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/7/30
+ */
+public class VideoConstant {
+
+	/**
+	 * ffprobe执行命令
+	 */
+	public static final String FFPROBE_EXE = "E:\\software\\ffmpeg\\bin\\ffprobe";
+
+	/**
+	 * ffmpeg执行命令
+	 */
+	public static final String FFEMPEG_EXE = "E:\\software\\ffmpeg\\bin\\ffmpeg";
+
+	public static final String TEMPORARY_CATALOGUE = "F:\\resources\\test\\output";
+
+	public static class Command {
+		/**
+		 * 截图【1,输入的视频文件 2,截图图片的秒数 3,图片宽度 4,图片高度 5,输出的图片】
+		 */
+		public static String SCREENSHOT = VideoConstant.FFEMPEG_EXE + " -i %s -y -f image2 -ss %s -t 0.001 -s %s*%s %s";
+
+		/**
+		 * 获取视频信息【1,输入的视频文件】
+		 */
+		public static String GET_VIDEO_INFO = VideoConstant.FFPROBE_EXE
+				+ "  -v quiet -print_format json -show_format -show_streams %s";
+
+	}
+}

+ 236 - 0
src/main/java/com/duowan/texiu/data/migration/tools/ZipUtil.java

@@ -0,0 +1,236 @@
+package com.duowan.texiu.data.migration.tools;
+
+import java.io.*;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import java.util.zip.ZipOutputStream;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * ZipUtil
+ *
+ * @author Zhang Miaojie
+ * @version v1.0
+ * @date 2019/5/6
+ */
+public class ZipUtil {
+
+	private static final int BUFFER_SIZE = 2 * 1024;
+
+	/**
+	 * 压缩成ZIP 方法1
+	 *
+	 * @param srcDir
+	 *            压缩文件夹路径
+	 * @param out
+	 *            压缩文件输出流
+	 * @param keepDirStructure
+	 *            是否保留原来的目录结构,true:保留目录结构;
+	 *            false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
+	 * @throws RuntimeException
+	 *             压缩失败会抛出运行时异常
+	 */
+	private static void toZip(String srcDir, OutputStream out, boolean keepDirStructure) throws RuntimeException {
+
+		long start = System.currentTimeMillis();
+		ZipOutputStream zos = null;
+		try {
+			zos = new ZipOutputStream(out);
+			File sourceFile = new File(srcDir);
+			compress(sourceFile, zos, sourceFile.getName(), keepDirStructure);
+			long end = System.currentTimeMillis();
+			System.out.println("压缩完成,耗时:" + (end - start) + " ms");
+		} catch (Exception e) {
+			throw new RuntimeException("zip error from ZipUtil", e);
+		} finally {
+			if (zos != null) {
+				try {
+					zos.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+
+	public static void toZip(String srcDir, String outDir, boolean keepDirStructure) throws FileNotFoundException {
+		FileOutputStream fos = new FileOutputStream(new File(outDir));
+		toZip(srcDir, fos, keepDirStructure);
+	}
+
+	/**
+	 * 压缩成ZIP 方法2
+	 *
+	 * @param srcFiles
+	 *            需要压缩的文件列表
+	 * @param out
+	 *            压缩文件输出流
+	 * @throws RuntimeException
+	 *             压缩失败会抛出运行时异常
+	 */
+	public static void toZip(List<File> srcFiles, OutputStream out) throws RuntimeException {
+
+		long start = System.currentTimeMillis();
+		ZipOutputStream zos = null;
+		try {
+			zos = new ZipOutputStream(out);
+			for (File srcFile : srcFiles) {
+				byte[] buf = new byte[BUFFER_SIZE];
+				zos.putNextEntry(new ZipEntry(srcFile.getName()));
+				int len;
+				FileInputStream in = new FileInputStream(srcFile);
+				while ((len = in.read(buf)) != -1) {
+					zos.write(buf, 0, len);
+				}
+				zos.closeEntry();
+				in.close();
+			}
+			long end = System.currentTimeMillis();
+			System.out.println("压缩完成,耗时:" + (end - start) + " ms");
+		} catch (Exception e) {
+			throw new RuntimeException("zip error from ZipUtil", e);
+		} finally {
+			if (zos != null) {
+				try {
+					zos.close();
+				} catch (IOException e) {
+					e.printStackTrace();
+				}
+			}
+		}
+	}
+
+	public static void toZip(List<File> srcFiles, String filePath) throws FileNotFoundException {
+		FileOutputStream fos = new FileOutputStream(new File(filePath));
+		toZip(srcFiles, fos);
+	}
+
+	/**
+	 * 递归压缩方法
+	 *
+	 * @param sourceFile
+	 *            源文件
+	 * @param zos
+	 *            zip输出流
+	 * @param name
+	 *            压缩后的名称
+	 * @param keepDirStructure
+	 *            是否保留原来的目录结构,true:保留目录结构;
+	 *            false:所有文件跑到压缩包根目录下(注意:不保留目录结构可能会出现同名文件,会压缩失败)
+	 * @throws Exception
+	 */
+	private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean keepDirStructure, int depth)
+			throws Exception {
+		depth++;
+		byte[] buf = new byte[BUFFER_SIZE];
+		if (sourceFile.isFile()) {
+			// 向zip输出流中添加一个zip实体,构造器中name为zip实体的文件的名字
+			zos.putNextEntry(new ZipEntry(name));
+			// copy文件到zip输出流中
+			int len;
+			FileInputStream in = new FileInputStream(sourceFile);
+			while ((len = in.read(buf)) != -1) {
+				zos.write(buf, 0, len);
+			}
+			// Complete the entry
+			zos.closeEntry();
+			in.close();
+		} else {
+			File[] listFiles = sourceFile.listFiles();
+			if (listFiles == null || listFiles.length == 0) {
+				// 需要保留原来的文件结构时,需要对空文件夹进行处理
+				if (keepDirStructure) {
+					// 空文件夹的处理
+					zos.putNextEntry(new ZipEntry(name + "/"));
+					// 没有文件,不需要文件的copy
+					zos.closeEntry();
+				}
+
+			} else {
+				for (File file : listFiles) {
+					// 判断是否需要保留原来的文件结构
+					keepDirStructure = (depth != 1);
+					if (keepDirStructure) {
+						// 注意:file.getName()前面需要带上父文件夹的名字加一斜杠,
+						// 不然最后压缩包中就不能保留原来的文件结构,即:所有文件都跑到压缩包根目录下了
+						compress(file, zos, name + "/" + file.getName(), keepDirStructure, depth);
+					} else {
+						compress(file, zos, file.getName(), keepDirStructure, depth);
+					}
+				}
+			}
+		}
+	}
+
+	private static void compress(File sourceFile, ZipOutputStream zos, String name, boolean keepDirStructure) throws Exception {
+		compress(sourceFile, zos, name, keepDirStructure, 0);
+	}
+
+	/**
+	 * 解压到当前目录
+	 *
+	 * @param zipFile
+	 * @throws IOException
+	 */
+	public static void unZipFiles(File zipFile) throws IOException {
+		unZipFiles(zipFile, null);
+	}
+
+	/**
+	 * 解压文件到指定目录
+	 *
+	 * @param zipFile
+	 * @param descDir
+	 */
+	@SuppressWarnings("rawtypes")
+	public static void unZipFiles(File zipFile, String descDir) throws IOException {
+		String absolutePath = zipFile.getAbsolutePath();
+		if (!absolutePath.endsWith(".zip")) {
+			throw new RuntimeException("不是zip文件");
+		}
+		if (StringUtils.isBlank(descDir)) {
+			descDir = absolutePath.substring(0, absolutePath.lastIndexOf(".zip")) + File.separator;
+		}
+		File pathFile = new File(descDir);
+		if (!pathFile.exists()) {
+			pathFile.mkdirs();
+		}
+		ZipFile zip = new ZipFile(zipFile);
+		for (Enumeration entries = zip.entries(); entries.hasMoreElements();) {
+			ZipEntry entry = (ZipEntry) entries.nextElement();
+			String zipEntryName = entry.getName();
+			InputStream in = zip.getInputStream(entry);
+			String outPath = (descDir + zipEntryName).replaceAll("\\*", "/");
+
+			OutputStream out = new FileOutputStream(outPath);
+			byte[] buf1 = new byte[1024];
+			int len;
+			while ((len = in.read(buf1)) > 0) {
+				out.write(buf1, 0, len);
+			}
+			in.close();
+			out.close();
+		}
+		System.out.println("******************解压完毕********************");
+	}
+
+	public static void main(String[] args) throws Exception {
+		/** 测试压缩方法1 */
+		// FileOutputStream fos1 = new FileOutputStream(new
+		// File("D:\\backup\\data\\test\\mytest01.zip"));
+		// ZipUtil.toZip("D:\\document", fos1, true);
+		//
+		// /** 测试压缩方法2 */
+		// List<File> fileList = new ArrayList<>();
+		// fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/jar.exe"));
+		// fileList.add(new File("D:/Java/jdk1.7.0_45_64bit/bin/java.exe"));
+		// FileOutputStream fos2 = new FileOutputStream(new File("c:/mytest02.zip"));
+		// ZipUtil.toZip(fileList, fos2);
+
+		File zipFile = new File("E:\\document\\1-需求文档\\特秀1.0\\1-需求-素材打包\\material\\98610452.zip");
+		unZipFiles(zipFile);
+	}
+}

+ 1 - 0
src/main/resources/application.properties

@@ -0,0 +1 @@
+

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff