From 8e378a11ac6371c843d53b541008eb6986727f02 Mon Sep 17 00:00:00 2001
From: 田源 <lastanimals@163.com>
Date: 星期一, 08 四月 2024 15:09:22 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'
---
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Func.java | 2140 ++++++++++++
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ClassUtil.java | 130
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/jackson/JsonUtil.java | 705 +++
Source/platformProject/vci-platform-web/pom.xml | 401 +-
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Charsets.java | 60
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/BladeConverter.java | 77
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/BeanUtil.java | 424 ++
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/RandomType.java | 30
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedRunnable.java | 35
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/BladeConversionService.java | 51
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/jackson/BladeJavaTimeModule.java | 35
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ObjectUtil.java | 21
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Unchecked.java | 106
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/CopyProperty.java | 26
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/NumberUtil.java | 195 +
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedSupplier.java | 39
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ConcurrentDateFormat.java | 87
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/StringUtil.java | 1560 ++++++++
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/StringToEnumConverter.java | 126
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/CharPool.java | 58
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BeanProperty.java | 16
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanCopierKey.java | 20
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DatatypeConverterUtil.java | 57
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ConvertUtil.java | 81
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Exceptions.java | 99
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/CollectionUtil.java | 161
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMapEmitter.java | 192 +
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedFunction.java | 40
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedComparator.java | 38
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanCopier.java | 404 ++
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/EnumToStringConverter.java | 126
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/FileUtil.java | 383 ++
.idea/modules.xml | 4
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java | 119
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Base64Util.java | 115
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/StringPool.java | 71
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DigestUtil.java | 433 ++
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java | 1
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/IoUtil.java | 109
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/UrlUtil.java | 92
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java | 1
Source/platformProject/pom.xml | 2
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMapKey.java | 16
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/support/StrSpliter.java | 501 ++
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMap.java | 125
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedConsumer.java | 39
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Holder.java | 22
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIEngineServiceI.java | 9
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DateTimeUtil.java | 226 +
/dev/null | 0
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ReflectUtil.java | 180 +
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DateUtil.java | 634 +++
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/PlatformClientUtil.java | 1
Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedCallable.java | 38
54 files changed, 10,402 insertions(+), 259 deletions(-)
diff --git a/.idea/modules.xml b/.idea/modules.xml
index 2b810a8..bcd21f1 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -3,6 +3,10 @@
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/PLTWEB.iml" filepath="$PROJECT_DIR$/.idea/PLTWEB.iml" />
+ <module fileurl="file://$PROJECT_DIR$/Source/platformProject/platform-parent.iml" filepath="$PROJECT_DIR$/Source/platformProject/platform-parent.iml" />
+ <module fileurl="file://$PROJECT_DIR$/Source/platformProject/vci-platform-server-starter/vci-platform-server-starter.iml" filepath="$PROJECT_DIR$/Source/platformProject/vci-platform-server-starter/vci-platform-server-starter.iml" />
+ <module fileurl="file://$PROJECT_DIR$/Source/platformProject/vci-platform-starter/vci-platform-starter.iml" filepath="$PROJECT_DIR$/Source/platformProject/vci-platform-starter/vci-platform-starter.iml" />
+ <module fileurl="file://$PROJECT_DIR$/Source/platformProject/vci-platform-web/vci-platform-web.iml" filepath="$PROJECT_DIR$/Source/platformProject/vci-platform-web/vci-platform-web.iml" />
</modules>
</component>
</project>
\ No newline at end of file
diff --git a/Bin/lib/client/flatlaf-2.3.jar b/Bin/lib/client/flatlaf-2.3.jar
deleted file mode 100644
index 9f292d2..0000000
--- a/Bin/lib/client/flatlaf-2.3.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/icegridgui.jar b/Bin/lib/client/icegridgui.jar
deleted file mode 100644
index d9ede54..0000000
--- a/Bin/lib/client/icegridgui.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/jgoodies-common-1.8.1.jar b/Bin/lib/client/jgoodies-common-1.8.1.jar
deleted file mode 100644
index f6a256e..0000000
--- a/Bin/lib/client/jgoodies-common-1.8.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/jgoodies-looks-2.5.3.jar b/Bin/lib/client/jgoodies-looks-2.5.3.jar
deleted file mode 100644
index 3339053..0000000
--- a/Bin/lib/client/jgoodies-looks-2.5.3.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/jgraph.jar b/Bin/lib/client/jgraph.jar
deleted file mode 100644
index 9af266c..0000000
--- a/Bin/lib/client/jgraph.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/jgraphx-3.1.0.0.jar b/Bin/lib/client/jgraphx-3.1.0.0.jar
deleted file mode 100644
index 6637aac..0000000
--- a/Bin/lib/client/jgraphx-3.1.0.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/nativeskin.jar b/Bin/lib/client/nativeskin.jar
deleted file mode 100644
index acacc56..0000000
--- a/Bin/lib/client/nativeskin.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/pinyin4j-2.5.0.jar b/Bin/lib/client/pinyin4j-2.5.0.jar
deleted file mode 100644
index e8ede13..0000000
--- a/Bin/lib/client/pinyin4j-2.5.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/plt-client.jar b/Bin/lib/client/plt-client.jar
deleted file mode 100644
index d4286a6..0000000
--- a/Bin/lib/client/plt-client.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/plt-clientbase.jar b/Bin/lib/client/plt-clientbase.jar
deleted file mode 100644
index 50330af..0000000
--- a/Bin/lib/client/plt-clientbase.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/poi-3.9-20121203.jar b/Bin/lib/client/poi-3.9-20121203.jar
deleted file mode 100644
index 0f46288..0000000
--- a/Bin/lib/client/poi-3.9-20121203.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/poi-ooxml-3.9-20121203.jar b/Bin/lib/client/poi-ooxml-3.9-20121203.jar
deleted file mode 100644
index 8792d46..0000000
--- a/Bin/lib/client/poi-ooxml-3.9-20121203.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/poi-ooxml-schemas-3.9-20121203.jar b/Bin/lib/client/poi-ooxml-schemas-3.9-20121203.jar
deleted file mode 100644
index eda4ef4..0000000
--- a/Bin/lib/client/poi-ooxml-schemas-3.9-20121203.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/poi-scratchpad-3.9-20121203.jar b/Bin/lib/client/poi-scratchpad-3.9-20121203.jar
deleted file mode 100644
index 1520855..0000000
--- a/Bin/lib/client/poi-scratchpad-3.9-20121203.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/protege35.jar b/Bin/lib/client/protege35.jar
deleted file mode 100644
index 8e99a2e..0000000
--- a/Bin/lib/client/protege35.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/skinlf.jar b/Bin/lib/client/skinlf.jar
deleted file mode 100644
index 9bdb00f..0000000
--- a/Bin/lib/client/skinlf.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/swingx-1.6.1.jar b/Bin/lib/client/swingx-1.6.1.jar
deleted file mode 100644
index b0bcc87..0000000
--- a/Bin/lib/client/swingx-1.6.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/swixml.jar b/Bin/lib/client/swixml.jar
deleted file mode 100644
index 2f0fa2b..0000000
--- a/Bin/lib/client/swixml.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/client/uitheme-1.3.1.jar b/Bin/lib/client/uitheme-1.3.1.jar
deleted file mode 100644
index caacb71..0000000
--- a/Bin/lib/client/uitheme-1.3.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/commons-lang3-3.1.jar b/Bin/lib/common/commons-lang3-3.1.jar
deleted file mode 100644
index a85e539..0000000
--- a/Bin/lib/common/commons-lang3-3.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/dom4j-1.6.1.jar b/Bin/lib/common/dom4j-1.6.1.jar
deleted file mode 100644
index c8c4dbb..0000000
--- a/Bin/lib/common/dom4j-1.6.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/fastjson-1.2.83.jar b/Bin/lib/common/fastjson-1.2.83.jar
deleted file mode 100644
index fd843ae..0000000
--- a/Bin/lib/common/fastjson-1.2.83.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/freemarker.jar b/Bin/lib/common/freemarker.jar
deleted file mode 100644
index b13671d..0000000
--- a/Bin/lib/common/freemarker.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/icegridgui.jar b/Bin/lib/common/icegridgui.jar
deleted file mode 100644
index d9ede54..0000000
--- a/Bin/lib/common/icegridgui.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/junit-4.8.jar b/Bin/lib/common/junit-4.8.jar
deleted file mode 100644
index efdaa58..0000000
--- a/Bin/lib/common/junit-4.8.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/log4j-api-2.12.4.jar b/Bin/lib/common/log4j-api-2.12.4.jar
deleted file mode 100644
index d427c18..0000000
--- a/Bin/lib/common/log4j-api-2.12.4.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/log4j-core-2.12.4.jar b/Bin/lib/common/log4j-core-2.12.4.jar
deleted file mode 100644
index 53b1e9a..0000000
--- a/Bin/lib/common/log4j-core-2.12.4.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/mail.jar b/Bin/lib/common/mail.jar
deleted file mode 100644
index 463a64b..0000000
--- a/Bin/lib/common/mail.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common.jar b/Bin/lib/common/plt-common.jar
deleted file mode 100644
index 4a83711..0000000
--- a/Bin/lib/common/plt-common.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/META-INF/MANIFEST.MF b/Bin/lib/common/plt-common/META-INF/MANIFEST.MF
deleted file mode 100644
index 461db2a..0000000
--- a/Bin/lib/common/plt-common/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Manifest-Version: 1.0
-Ant-Version: Apache Ant 1.10.12
-Created-By: 17.0.8.1+1 (Eclipse Adoptium)
-Built-By: Jason
-Implementation-Title: platform-Common
-Built-Time: 2024.03.01.10.09
-platform-version: 2024
-
diff --git a/Bin/lib/common/plt-common/com/vci/common/ServiceNames.class b/Bin/lib/common/plt-common/com/vci/common/ServiceNames.class
deleted file mode 100644
index b2e46b2..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/ServiceNames.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/annotaion/CustomAnnotaion.class b/Bin/lib/common/plt-common/com/vci/common/annotaion/CustomAnnotaion.class
deleted file mode 100644
index c6a27af..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/annotaion/CustomAnnotaion.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/annotaion/CustomAnnotaionHelper.class b/Bin/lib/common/plt-common/com/vci/common/annotaion/CustomAnnotaionHelper.class
deleted file mode 100644
index d3479ac..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/annotaion/CustomAnnotaionHelper.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/annotaion/MethodTypeAnnotation.class b/Bin/lib/common/plt-common/com/vci/common/annotaion/MethodTypeAnnotation.class
deleted file mode 100644
index 1ed2599..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/annotaion/MethodTypeAnnotation.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/exception/LocaleCommonDisplay.class b/Bin/lib/common/plt-common/com/vci/common/exception/LocaleCommonDisplay.class
deleted file mode 100644
index 1b2a09b..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/exception/LocaleCommonDisplay.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/exception/ORAUniqueProperties.class b/Bin/lib/common/plt-common/com/vci/common/exception/ORAUniqueProperties.class
deleted file mode 100644
index 877ddb5..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/exception/ORAUniqueProperties.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/exception/VciException.class b/Bin/lib/common/plt-common/com/vci/common/exception/VciException.class
deleted file mode 100644
index c86f613..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/exception/VciException.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/exception/VciExceptionTool.class b/Bin/lib/common/plt-common/com/vci/common/exception/VciExceptionTool.class
deleted file mode 100644
index 2b99d29..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/exception/VciExceptionTool.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/file/FileDigest.class b/Bin/lib/common/plt-common/com/vci/common/file/FileDigest.class
deleted file mode 100644
index e302177..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/file/FileDigest.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/locale/LocaleDisplay.class b/Bin/lib/common/plt-common/com/vci/common/locale/LocaleDisplay.class
deleted file mode 100644
index f66fce5..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/locale/LocaleDisplay.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/log/LogByType.class b/Bin/lib/common/plt-common/com/vci/common/log/LogByType.class
deleted file mode 100644
index ce4df3e..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/log/LogByType.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/log/LogType.class b/Bin/lib/common/plt-common/com/vci/common/log/LogType.class
deleted file mode 100644
index c2f4b28..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/log/LogType.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/log/ServerWithLog4j.class b/Bin/lib/common/plt-common/com/vci/common/log/ServerWithLog4j.class
deleted file mode 100644
index 1c1f373..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/log/ServerWithLog4j.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/objects/AbstractEntity.class b/Bin/lib/common/plt-common/com/vci/common/objects/AbstractEntity.class
deleted file mode 100644
index 431e754..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/objects/AbstractEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/objects/AbstractHistorizable.class b/Bin/lib/common/plt-common/com/vci/common/objects/AbstractHistorizable.class
deleted file mode 100644
index 3399c3d..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/objects/AbstractHistorizable.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/objects/Historizable.class b/Bin/lib/common/plt-common/com/vci/common/objects/Historizable.class
deleted file mode 100644
index 39073e8..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/objects/Historizable.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/objects/QueryParam.class b/Bin/lib/common/plt-common/com/vci/common/objects/QueryParam.class
deleted file mode 100644
index 7d159b6..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/objects/QueryParam.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/objects/QueryResult.class b/Bin/lib/common/plt-common/com/vci/common/objects/QueryResult.class
deleted file mode 100644
index 6bf326c..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/objects/QueryResult.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/objects/UserEntity.class b/Bin/lib/common/plt-common/com/vci/common/objects/UserEntity.class
deleted file mode 100644
index c8f9f13..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/objects/UserEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/portal/constants/PLDefinationConstants.class b/Bin/lib/common/plt-common/com/vci/common/portal/constants/PLDefinationConstants.class
deleted file mode 100644
index 953f51d..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/portal/constants/PLDefinationConstants.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/portal/constants/PRMConstants.class b/Bin/lib/common/plt-common/com/vci/common/portal/constants/PRMConstants.class
deleted file mode 100644
index 6a67d38..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/portal/constants/PRMConstants.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/portal/constants/TemplateTypeConstants.class b/Bin/lib/common/plt-common/com/vci/common/portal/constants/TemplateTypeConstants.class
deleted file mode 100644
index ae18078..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/portal/constants/TemplateTypeConstants.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/portal/enums/AreaType.class b/Bin/lib/common/plt-common/com/vci/common/portal/enums/AreaType.class
deleted file mode 100644
index 7f722b5..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/portal/enums/AreaType.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/portal/enums/ComponentType.class b/Bin/lib/common/plt-common/com/vci/common/portal/enums/ComponentType.class
deleted file mode 100644
index 974a875..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/portal/enums/ComponentType.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/portal/enums/ControlType.class b/Bin/lib/common/plt-common/com/vci/common/portal/enums/ControlType.class
deleted file mode 100644
index a81e131..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/portal/enums/ControlType.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/portal/enums/GetByType.class b/Bin/lib/common/plt-common/com/vci/common/portal/enums/GetByType.class
deleted file mode 100644
index 6c5e569..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/portal/enums/GetByType.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/portal/enums/PortalVIType.class b/Bin/lib/common/plt-common/com/vci/common/portal/enums/PortalVIType.class
deleted file mode 100644
index 862d7be..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/portal/enums/PortalVIType.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/portal/enums/PortalVITypeFlag.class b/Bin/lib/common/plt-common/com/vci/common/portal/enums/PortalVITypeFlag.class
deleted file mode 100644
index 5cadb30..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/portal/enums/PortalVITypeFlag.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/portal/utils/PortalUtil.class b/Bin/lib/common/plt-common/com/vci/common/portal/utils/PortalUtil.class
deleted file mode 100644
index f031b6f..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/portal/utils/PortalUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/interfaces/IParserFactory.class b/Bin/lib/common/plt-common/com/vci/common/qt/interfaces/IParserFactory.class
deleted file mode 100644
index 6713304..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/interfaces/IParserFactory.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/CItemRelation.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/CItemRelation.class
deleted file mode 100644
index 3cfe931..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/CItemRelation.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/ChildrenInfo.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/ChildrenInfo.class
deleted file mode 100644
index 4447873..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/ChildrenInfo.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/ComparatorOrderInfo.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/ComparatorOrderInfo.class
deleted file mode 100644
index c320dbe..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/ComparatorOrderInfo.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/Condition.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/Condition.class
deleted file mode 100644
index f4cb735..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/Condition.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/ConditionItem.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/ConditionItem.class
deleted file mode 100644
index b12f1d3..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/ConditionItem.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/Connector.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/Connector.class
deleted file mode 100644
index 3d5655a..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/Connector.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/LeafInfo.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/LeafInfo.class
deleted file mode 100644
index 26e7390..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/LeafInfo.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/LeafValue.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/LeafValue.class
deleted file mode 100644
index 52c8f77..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/LeafValue.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/Operator.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/Operator.class
deleted file mode 100644
index 6e94988..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/Operator.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/OrderInfo.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/OrderInfo.class
deleted file mode 100644
index 3e18529..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/OrderInfo.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/PageInfo.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/PageInfo.class
deleted file mode 100644
index 759561b..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/PageInfo.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/ParserHelper.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/ParserHelper.class
deleted file mode 100644
index 52d4fa3..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/ParserHelper.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/QTConstants.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/QTConstants.class
deleted file mode 100644
index 3cbd16e..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/QTConstants.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/QueryTemplate.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/QueryTemplate.class
deleted file mode 100644
index 0d113e1..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/QueryTemplate.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/Symbol.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/Symbol.class
deleted file mode 100644
index 525f52f..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/Symbol.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/qt/object/Version.class b/Bin/lib/common/plt-common/com/vci/common/qt/object/Version.class
deleted file mode 100644
index e323986..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/qt/object/Version.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/resource/CommonProperties.class b/Bin/lib/common/plt-common/com/vci/common/resource/CommonProperties.class
deleted file mode 100644
index 09d819f..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/resource/CommonProperties.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/resource/IceClientProperties.class b/Bin/lib/common/plt-common/com/vci/common/resource/IceClientProperties.class
deleted file mode 100644
index 101d91e..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/resource/IceClientProperties.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/timer/VCITimeInterface.class b/Bin/lib/common/plt-common/com/vci/common/timer/VCITimeInterface.class
deleted file mode 100644
index 7d53756..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/timer/VCITimeInterface.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/util/CollectionUtils$EnumerationIterator.class b/Bin/lib/common/plt-common/com/vci/common/util/CollectionUtils$EnumerationIterator.class
deleted file mode 100644
index 681559e..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/util/CollectionUtils$EnumerationIterator.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/util/CollectionUtils.class b/Bin/lib/common/plt-common/com/vci/common/util/CollectionUtils.class
deleted file mode 100644
index 65637ba..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/util/CollectionUtils.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/util/IceProxyUtility.class b/Bin/lib/common/plt-common/com/vci/common/util/IceProxyUtility.class
deleted file mode 100644
index 1f560d3..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/util/IceProxyUtility.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/utility/ClassLoaderUtil.class b/Bin/lib/common/plt-common/com/vci/common/utility/ClassLoaderUtil.class
deleted file mode 100644
index e9a5bd8..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/utility/ClassLoaderUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/utility/Converter.class b/Bin/lib/common/plt-common/com/vci/common/utility/Converter.class
deleted file mode 100644
index 0992bac..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/utility/Converter.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/utility/ObjectUtility.class b/Bin/lib/common/plt-common/com/vci/common/utility/ObjectUtility.class
deleted file mode 100644
index 7f52978..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/utility/ObjectUtility.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/utility/RandomGUID20.class b/Bin/lib/common/plt-common/com/vci/common/utility/RandomGUID20.class
deleted file mode 100644
index 3da5006..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/utility/RandomGUID20.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/utility/RandomGUID36.class b/Bin/lib/common/plt-common/com/vci/common/utility/RandomGUID36.class
deleted file mode 100644
index 8d609e1..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/utility/RandomGUID36.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/utility/RandomGUID8.class b/Bin/lib/common/plt-common/com/vci/common/utility/RandomGUID8.class
deleted file mode 100644
index b2f6632..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/utility/RandomGUID8.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/common/utility/SnowFlake.class b/Bin/lib/common/plt-common/com/vci/common/utility/SnowFlake.class
deleted file mode 100644
index 957ee22..0000000
--- a/Bin/lib/common/plt-common/com/vci/common/utility/SnowFlake.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/mw/ClientContextVariable.class b/Bin/lib/common/plt-common/com/vci/mw/ClientContextVariable.class
deleted file mode 100644
index 7409b6b..0000000
--- a/Bin/lib/common/plt-common/com/vci/mw/ClientContextVariable.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/mw/IInvocationContext.class b/Bin/lib/common/plt-common/com/vci/mw/IInvocationContext.class
deleted file mode 100644
index a1c1a6c..0000000
--- a/Bin/lib/common/plt-common/com/vci/mw/IInvocationContext.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/mw/InvocationUtility.class b/Bin/lib/common/plt-common/com/vci/mw/InvocationUtility.class
deleted file mode 100644
index 57a3da1..0000000
--- a/Bin/lib/common/plt-common/com/vci/mw/InvocationUtility.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/mw/LaunchModeEnum.class b/Bin/lib/common/plt-common/com/vci/mw/LaunchModeEnum.class
deleted file mode 100644
index 360be95..0000000
--- a/Bin/lib/common/plt-common/com/vci/mw/LaunchModeEnum.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/constants/AttributeConstants.class b/Bin/lib/common/plt-common/com/vci/omd/constants/AttributeConstants.class
deleted file mode 100644
index 185bbbd..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/constants/AttributeConstants.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/constants/BusinessConstants.class b/Bin/lib/common/plt-common/com/vci/omd/constants/BusinessConstants.class
deleted file mode 100644
index 2d8af9f..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/constants/BusinessConstants.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/constants/FileObjectType.class b/Bin/lib/common/plt-common/com/vci/omd/constants/FileObjectType.class
deleted file mode 100644
index 4017c24..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/constants/FileObjectType.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/constants/LinkConstants.class b/Bin/lib/common/plt-common/com/vci/omd/constants/LinkConstants.class
deleted file mode 100644
index dfe3a1c..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/constants/LinkConstants.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/constants/LinkTypeConstants.class b/Bin/lib/common/plt-common/com/vci/omd/constants/LinkTypeConstants.class
deleted file mode 100644
index 9387bb0..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/constants/LinkTypeConstants.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/constants/OmdConstants.class b/Bin/lib/common/plt-common/com/vci/omd/constants/OmdConstants.class
deleted file mode 100644
index d5be5d1..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/constants/OmdConstants.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/constants/SystemAttribute.class b/Bin/lib/common/plt-common/com/vci/omd/constants/SystemAttribute.class
deleted file mode 100644
index 74fe7d7..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/constants/SystemAttribute.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/dataType/VTDataType.class b/Bin/lib/common/plt-common/com/vci/omd/dataType/VTDataType.class
deleted file mode 100644
index 4608634..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/dataType/VTDataType.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/objects/OtherInfo.class b/Bin/lib/common/plt-common/com/vci/omd/objects/OtherInfo.class
deleted file mode 100644
index 20374bc..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/objects/OtherInfo.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/utils/AbComparator.class b/Bin/lib/common/plt-common/com/vci/omd/utils/AbComparator.class
deleted file mode 100644
index 155d061..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/utils/AbComparator.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/utils/BTComparator.class b/Bin/lib/common/plt-common/com/vci/omd/utils/BTComparator.class
deleted file mode 100644
index 2bde5ef..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/utils/BTComparator.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/utils/LinkTypeComparator.class b/Bin/lib/common/plt-common/com/vci/omd/utils/LinkTypeComparator.class
deleted file mode 100644
index 826ccbf..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/utils/LinkTypeComparator.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/com/vci/omd/utils/ObjectTool.class b/Bin/lib/common/plt-common/com/vci/omd/utils/ObjectTool.class
deleted file mode 100644
index 1d03cbd..0000000
--- a/Bin/lib/common/plt-common/com/vci/omd/utils/ObjectTool.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/plt-common/properties/conf.properties b/Bin/lib/common/plt-common/properties/conf.properties
deleted file mode 100644
index 9098410..0000000
--- a/Bin/lib/common/plt-common/properties/conf.properties
+++ /dev/null
@@ -1,116 +0,0 @@
-#conf.properties version by Eclipse
-#Sat Oct 19 14:06:56 CST 2013
-
-
-#鏂囦欢浼犺緭鍧楀ぇ灏�
-blockLength=32
-
-########################################### 骞冲彴UIF 闇�瑕佺殑閰嶇疆 BEGIN ###########################################
-#浜哄憳淇℃伅鍏ユ椂,鏄惁闇�瑕佸瘑绾у瓧娈�
-exportSecretGrade=false
-
-# 鍔犲瘑瀵嗛挜
-encrypt.key=www.liming.portal.comwww.liming.portal.com
-# 鐧诲綍绐楀彛锛屾槸鍚︽樉绀衡�樹繚瀛樷�欏閫夋
-logon.saveBut=false
-# 绯荤粺鐢ㄦ埛鐧诲綍瓒呮椂鏃堕棿(鍗曚綅鍒嗗垎閽燂級
-logon.loginovertime=1000
-# 涓绘鏋朵笂锛屾槸鍚︽樉绀洪《閮ㄥ浘鐗�
-top.logon.image.show=false
-# 涓绘鏋朵笂锛岄《閮ㄥ浘鐗囧悕绉帮紙璇ュ浘鐗囦綅浜� com.vci.rmip.logon.client 鍖呬笅锛�
-top.logon.image.name=title.jpg
-# 涓绘鏋朵笂锛屾槸鍚︽樉绀鸿彍鍗� true:鏄剧ず false:涓嶆樉绀�
-top.menuBar.show=true
-# 涓昏彍鍗曚笅锛屾槸鍚︽樉绀衡�橀噸鏂扮櫥褰曗�� true:鏄剧ず false:涓嶆樉绀�
-top.menuBar.menuItem.relogin=true
-# 涓昏彍鍗曚笅锛屾槸鍚︽樉绀衡�樹慨鏀瑰瘑鐮佲�� true:鏄剧ず false:涓嶆樉绀�
-top.menuBar.menuItem.changePassword=true
-
-# 绯荤粺鍏充簬閰嶇疆,淇敼閰嶇疆鏄娉ㄦ剰涓枃瀛楃鐨勭紪鐮佷娇鐢╱tf-8
-system.about.title = \u5173\u4E8E
-# 鏈�浣冲浘鐗囧昂瀵�400*90锛岄粯璁ゅ�间负about.png
-system.about.imageName=about.png
-# 浜у搧鍚嶇О
-system.about.softNameProduct= VCI Innovation 2022
-# 鐗堟潈_涓枃
-system.about.softNameCopyrightC = \u5B8F\u535A\u8FDC\u8FBE \u7248\u6743\u6240\u6709
-# 鐗堟潈_鑻辨枃
-system.about.softNameCopyrightE = Copyright(C) 2011-2022 Contributors. All rights reserved.
-# 椤圭洰鍚嶇О
-system.about.softName = \u5317\u4EAC\u5B8F\u535A\u8FDC\u8FBE\u79D1\u6280\u6709\u9650\u516C\u53F8 - \u7CFB\u7EDF\u5F00\u53D1\u5E73\u53F0
-# 骞冲彴鐗堟湰
-system.about.version = v2022.01.15
-# 鍏徃缃戝潃
-system.about.visit = http://www.vci-tech.com
-
-
-# 绠$悊鍛樼敤鎴峰悕
-user.admin=admin
-# 瓒呯骇绠$悊鍛樼敤鎴峰悕
-user.developer=developer
-# 瀹夊叏绠$悊鍛樿鑹插悕绉�
-user.Sysadmin=\u5b89\u5168\u7ba1\u7406\u5458
-user.rooter=root
-
-# 鏃ュ織妯″潡锛屾槸鍚﹀惎鐢ㄦ煡璇� on:鍚敤 off:绂佺敤
-log.query.switch=off
-period=1
-# 鏃ュ織妯″潡锛屽畾鏈熷垹闄ゆ棩蹇楁椂锛屾敮鎸佺殑鍙�夊�硷紙
-log.save.periods=\ufeff1\#\u4e00\u4e2a\u6708\:\:2\#\u4e24\u4e2a\u6708\:\:3\#\u4e09\u4e2a\u6708\:\:6\#\u534a\u5e74\:\:12\#\u4e00\u5e74\:\:18\#\u4e00\u5e74\u534a\:\:24\#\u4e24\u5e74
-# 鏃ュ織妯″潡锛屽垎椤垫煡璇㈡椂锛岄〉鏁版嵁澶у皬
-log.query.pagesize=30
-# 鏃ュ織妯″潡锛屾槸鍚﹀惎鐢ㄥ畾鏃跺垹闄ゆ棩蹇� Y:鍚敤 N:绂佺敤
-log.delete.auto=N
-# 鏃ュ織妯″潡锛屽畾鏃跺垹闄ゆ棩蹇楁椂锛岃淇濈暀鏈�杩戠殑澶╂暟
-log.autoDelete.rate=7
-# 鏃ュ織鍒犻櫎鏃堕棿
-log.autoDelete.time=0\:\:0\:\:0
-
-########################################### 骞冲彴UIF 闇�瑕佺殑閰嶇疆 BEGIN ###########################################
-#鏁版嵁鏉冮檺鏄惁鐢熸晥 on:寮�鍚� off锛氬叧闂�
-right.switch=off
-#鍔熻兘妯″潡鎺堟潈楠岃瘉鏄惁璁� on锛氬紑鍚� off锛氬叧闂�
-function.right.swith=on
-#UI鎺堟潈鏄惁鐢熸晥 on:寮�鎴� off锛氬叧闂�
-ui.right.swith=on
-# tablePanel 榛樿鏀寔鐨刾ageSize鍒楄〃
-tablePanel.pageSizeList=100,200,300,500,800,1000
-#鍙傜収鎺т欢锛屽湪闆嗘垚鏃讹紝鍙嚜瀹氫箟鍙傜収鏂瑰紡锛屽�间负绫�
-engin.refObjectChoose =
-# 绯荤粺淇℃伅鎻愮ず妗嗘樉绀烘柟寮� popup:寮瑰嚭妗� ;lowerRight:鍙充笅瑙掋�� 榛樿涓哄彸涓嬭
-PromptMessage.DisplayModes=popup
-# 濡傛灉鍦ㄥ彸涓嬭鏄剧ず绯荤粺娑堟伅鏃讹紝璁剧疆娑堟伅绐楀彛鐨勬樉绀烘椂闂达紝姣銆傞粯璁や负3000姣
-PromptMessage.DisplayTime=3000
-#鍒嗙被鏍戝鑸椂锛屾敮鎸佺殑浜嬩欢鍚嶇О
-uidesign.eventKey=SelectionEvent,DBClickEvent,ClickEvent
-# 棣栭〉鑷畾涔夌被锛屽彲浠ユ湁澶氱粍锛屾瘡缁勪箣闂寸敤鍒嗗彿;鍒嗛殧锛岃嚜瀹氫箟绫讳笌鏍囬涔嬮棿鐢ㄩ�楀彿,鍒嗛殧
-# 鏍煎紡锛氳嚜瀹氫箟绫诲畬鏁磋矾寰�1,鏍囬1锛圲NOCIDE鏍煎紡锛�,鍥炬爣鏂囦欢瀹屾暣璺緞.;鑷畾涔夌被瀹屾暣璺緞2,鏍囬2锛圲NOCIDE鏍煎紡锛�,鍥炬爣鏂囦欢瀹屾暣璺緞;
-# 绀轰緥锛歱lm617.engine.HomePageForTaskMessagePanel,\u6211\u7684\u6d88\u606f\u0096\u0087,
-#HomePageClasses=plm.uif.engine.client.UILayoutPanel?type=workitem&context=workItemHomePage,\u6211\u7684\u6d88\u606f\u0096\u0087,/com/vci/base/ui/image/email.png
-########################################### 骞冲彴UIF 闇�瑕佺殑閰嶇疆 END ###########################################
-
-
-
-########################################### CS绯荤粺涓绘瀯鏋舵敮鎸佺殑鎵╁睍鏈嶅姟 BEGIN ###########################################
-# 鐧诲綍鎴愬姛鍚庝娇鐢ㄥ弽灏勬満鍒讹紝鑷姩鎵ц璇ョ被涓殑鍏叡鎺ュ彛 showMessage() 锛堟棤鍙傛暟浼犻�掞級
-# 浠ユ敮鎸佺櫥褰曟垚鍔熷悗绔嬪嵆鎵ц鐩稿叧鑷畾涔夋墿灞曢�昏緫#
-#e.g:extendservice.0=xxx.xx.xx
-extendservicecount=0
-#extendservice.0=
-#extendservice.1=
-#extendservice.1=
-########################################### CS绯荤粺涓绘瀯鏋舵敮鎸佺殑鎵╁睍鏈嶅姟 END ###########################################
-
-
-########################################### UI&鍏冩暟鎹紙妯″瀷锛夌紦瀛樼浉鍏崇殑閰嶇疆 BEGIN ###########################################
-#鍚敤UI缂撳瓨鍙婄紦瀛樺畾鏃跺埛鏂版湇鍔�
-UI.cache.enable=true
-#鏄惁姣忔璁块棶閮藉埛鏂版暟鎹簱锛宼rue浠g爜鍒锋柊锛屽惁鍒欎笉鍒锋柊
-UI.cache.refreshEveryTime=true
-#瀹氭椂鍣紝鍦ㄦ湇鍔″惎鍔ㄦ椂寮�鍚�
-time_schedule_count=2
-#鍔犺浇鏁版嵁妯″瀷鍒扮紦瀛�
-time_schedule_0=com.vci.cache.server.util.DataModelCacheTimer
-#鍔犺浇UI閰嶇疆鍒扮紦瀛�
-time_schedule_1=plm.portal.tools.UICacheTimer
-########################################### UI&鍏冩暟鎹紙妯″瀷锛夌紦瀛樼浉鍏崇殑閰嶇疆 END ###########################################
diff --git a/Bin/lib/common/plt-common/properties/log4j2.xml b/Bin/lib/common/plt-common/properties/log4j2.xml
deleted file mode 100644
index 0c48fc2..0000000
--- a/Bin/lib/common/plt-common/properties/log4j2.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<Configuration status="WARN">
- <Appenders>
- <Console name="Console" target="SYSTEM_OUT">
- <PatternLayout pattern="[%-5p] %d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
- </Console>
-
- <RollingFile name="RollingFile" filename="./logs/server_log.log" filepattern="${logPath}/server_%d{YYYYMMddHHmmss}.log">
- <PatternLayout pattern="[%-5p] %d{YYYY-MM-dd HH:mm:ss} [%t] %c{1}:%L - %msg%n" />
- <Policies>
- <SizeBasedTriggeringPolicy size="10 MB" />
- </Policies>
- <DefaultRolloverStrategy max="20" />
- </RollingFile>
-
- </Appenders>
- <Loggers>
- <Logger name="ServerLog" level="DEBUG" additivity="true">
- <AppenderRef ref="Console" />
- <AppenderRef ref="RollingFile" />
- </Logger>
- <Root level="ERROR">
- <AppenderRef ref="Console" />
- <AppenderRef ref="RollingFile" />
- </Root>
- </Loggers>
-</Configuration>
diff --git a/Bin/lib/common/plt-slice.jar b/Bin/lib/common/plt-slice.jar
deleted file mode 100644
index 96264cf..0000000
--- a/Bin/lib/common/plt-slice.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/common/spring-core-3.2.0.RELEASE.jar b/Bin/lib/common/spring-core-3.2.0.RELEASE.jar
deleted file mode 100644
index 1d4dffb..0000000
--- a/Bin/lib/common/spring-core-3.2.0.RELEASE.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/BOFService.jar b/Bin/lib/service/BOFService.jar
deleted file mode 100644
index 02856bd..0000000
--- a/Bin/lib/service/BOFService.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/CacheService.jar b/Bin/lib/service/CacheService.jar
deleted file mode 100644
index 28856b3..0000000
--- a/Bin/lib/service/CacheService.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/FrameService.jar b/Bin/lib/service/FrameService.jar
deleted file mode 100644
index e8bf9a2..0000000
--- a/Bin/lib/service/FrameService.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/OMDService.jar b/Bin/lib/service/OMDService.jar
deleted file mode 100644
index a4a1419..0000000
--- a/Bin/lib/service/OMDService.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/OQService.jar b/Bin/lib/service/OQService.jar
deleted file mode 100644
index 64cc1fe..0000000
--- a/Bin/lib/service/OQService.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/ServiceBase.jar b/Bin/lib/service/ServiceBase.jar
deleted file mode 100644
index 9b3cc0d..0000000
--- a/Bin/lib/service/ServiceBase.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService.jar b/Bin/lib/service/UIService.jar
deleted file mode 100644
index 3bdfbb9..0000000
--- a/Bin/lib/service/UIService.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/META-INF/MANIFEST.MF b/Bin/lib/service/UIService/META-INF/MANIFEST.MF
deleted file mode 100644
index 2de5caa..0000000
--- a/Bin/lib/service/UIService/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Manifest-Version: 1.0
-Ant-Version: Apache Ant 1.10.12
-Created-By: 17.0.8.1+1 (Eclipse Adoptium)
-Built-By: Jason
-Implementation-Title: platform-UIService
-Built-Time: 2024.03.01.10.07
-platform-version: 2024
-
diff --git a/Bin/lib/service/UIService/com/vci/server/UIBoxService.class b/Bin/lib/service/UIService/com/vci/server/UIBoxService.class
deleted file mode 100644
index 85ddb65..0000000
--- a/Bin/lib/service/UIService/com/vci/server/UIBoxService.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/PortalServiceImpl.class b/Bin/lib/service/UIService/com/vci/server/portal/PortalServiceImpl.class
deleted file mode 100644
index 13a505b..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/PortalServiceImpl.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/ActionCacheUtil.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/ActionCacheUtil.class
deleted file mode 100644
index 6eb1393..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/ActionCacheUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/ActionClsCacheUtil.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/ActionClsCacheUtil.class
deleted file mode 100644
index 16fde02..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/ActionClsCacheUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/ActionParamCacheUtil.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/ActionParamCacheUtil.class
deleted file mode 100644
index 2936363..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/ActionParamCacheUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/ButtonParamCacheUtil.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/ButtonParamCacheUtil.class
deleted file mode 100644
index 92ae338..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/ButtonParamCacheUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/ComponentBtnCacheUtil.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/ComponentBtnCacheUtil.class
deleted file mode 100644
index d0e8ece..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/ComponentBtnCacheUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/ComponentCacheUtil.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/ComponentCacheUtil.class
deleted file mode 100644
index e0b8eff..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/ComponentCacheUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/PortalVICacheUtil.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/PortalVICacheUtil.class
deleted file mode 100644
index d922d81..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/PortalVICacheUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/TabPageCacheUtil.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/TabPageCacheUtil.class
deleted file mode 100644
index 35e35b5..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/TabPageCacheUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/UICacheBaseUtil.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/UICacheBaseUtil.class
deleted file mode 100644
index 1b3589d..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/UICacheBaseUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/UICacheNames.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/UICacheNames.class
deleted file mode 100644
index 6173b65..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/UICacheNames.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/cache/UIContextCacheUtil.class b/Bin/lib/service/UIService/com/vci/server/portal/cache/UIContextCacheUtil.class
deleted file mode 100644
index d3d9641..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/cache/UIContextCacheUtil.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLActionClsEntityDao.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/PLActionClsEntityDao.class
deleted file mode 100644
index 42d80a7..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLActionClsEntityDao.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLActionEntityDao.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/PLActionEntityDao.class
deleted file mode 100644
index 58163bc..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLActionEntityDao.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLActionParamEntityDao.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/PLActionParamEntityDao.class
deleted file mode 100644
index 652f400..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLActionParamEntityDao.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLCommandParameterEntityDao.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/PLCommandParameterEntityDao.class
deleted file mode 100644
index d88be2a..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLCommandParameterEntityDao.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLPageDefinationEntityDao.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/PLPageDefinationEntityDao.class
deleted file mode 100644
index d5bc4ba..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLPageDefinationEntityDao.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLTabButtonEntityDao.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/PLTabButtonEntityDao.class
deleted file mode 100644
index 8c3e617..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLTabButtonEntityDao.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLTabPageEntityDao.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/PLTabPageEntityDao.class
deleted file mode 100644
index d29abfa..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLTabPageEntityDao.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLTypeActionEntityDao.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/PLTypeActionEntityDao.class
deleted file mode 100644
index 0d24a0b..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLTypeActionEntityDao.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLUILayoutEntityDao.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/PLUILayoutEntityDao.class
deleted file mode 100644
index 2e060f8..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/PLUILayoutEntityDao.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/PortalVIEntityDao.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/PortalVIEntityDao.class
deleted file mode 100644
index c172d0c..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/PortalVIEntityDao.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLActionClsEntityDaoImp.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLActionClsEntityDaoImp.class
deleted file mode 100644
index 98835d2..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLActionClsEntityDaoImp.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLActionEntityDaoImpl.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLActionEntityDaoImpl.class
deleted file mode 100644
index 295f483..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLActionEntityDaoImpl.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLActionParamEntityDaoImp.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLActionParamEntityDaoImp.class
deleted file mode 100644
index e18be54..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLActionParamEntityDaoImp.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLCommandParameterEntityDaoImpl.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLCommandParameterEntityDaoImpl.class
deleted file mode 100644
index 45c00dc..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLCommandParameterEntityDaoImpl.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLPageDefinationEntityDaoImpl.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLPageDefinationEntityDaoImpl.class
deleted file mode 100644
index b02b06c..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLPageDefinationEntityDaoImpl.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLTabButtonEntityDaoImpl.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLTabButtonEntityDaoImpl.class
deleted file mode 100644
index a5d7315..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLTabButtonEntityDaoImpl.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLTabPageEntityDaoImpl.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLTabPageEntityDaoImpl.class
deleted file mode 100644
index ac6816e..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLTabPageEntityDaoImpl.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLTypeActionEntityDaoImpl.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLTypeActionEntityDaoImpl.class
deleted file mode 100644
index cd7a92c..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLTypeActionEntityDaoImpl.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLUILayoutEntityDaoImpl.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLUILayoutEntityDaoImpl.class
deleted file mode 100644
index 87aec58..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PLUILayoutEntityDaoImpl.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PortalVIEntityDaoImpl.class b/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PortalVIEntityDaoImpl.class
deleted file mode 100644
index 41f13d8..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/dao/impl/PortalVIEntityDaoImpl.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/delegate/IPortalServiceDelegate.class b/Bin/lib/service/UIService/com/vci/server/portal/delegate/IPortalServiceDelegate.class
deleted file mode 100644
index 768075f..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/delegate/IPortalServiceDelegate.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/delegate/PortalServiceDelegate$1.class b/Bin/lib/service/UIService/com/vci/server/portal/delegate/PortalServiceDelegate$1.class
deleted file mode 100644
index 74ecfc4..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/delegate/PortalServiceDelegate$1.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/delegate/PortalServiceDelegate$2.class b/Bin/lib/service/UIService/com/vci/server/portal/delegate/PortalServiceDelegate$2.class
deleted file mode 100644
index 9601359..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/delegate/PortalServiceDelegate$2.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/delegate/PortalServiceDelegate.class b/Bin/lib/service/UIService/com/vci/server/portal/delegate/PortalServiceDelegate.class
deleted file mode 100644
index 2ca9bf2..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/delegate/PortalServiceDelegate.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLActionClsEntity.class b/Bin/lib/service/UIService/com/vci/server/portal/entity/PLActionClsEntity.class
deleted file mode 100644
index 2b74723..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLActionClsEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLActionEntity.class b/Bin/lib/service/UIService/com/vci/server/portal/entity/PLActionEntity.class
deleted file mode 100644
index 90c8a6f..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLActionEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLActionParamEntity.class b/Bin/lib/service/UIService/com/vci/server/portal/entity/PLActionParamEntity.class
deleted file mode 100644
index 9d4cb62..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLActionParamEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLCommandParameterEntity.class b/Bin/lib/service/UIService/com/vci/server/portal/entity/PLCommandParameterEntity.class
deleted file mode 100644
index 41cb0c7..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLCommandParameterEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLPageDefinationEntity.class b/Bin/lib/service/UIService/com/vci/server/portal/entity/PLPageDefinationEntity.class
deleted file mode 100644
index 61d52b5..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLPageDefinationEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLTabButtonEntity.class b/Bin/lib/service/UIService/com/vci/server/portal/entity/PLTabButtonEntity.class
deleted file mode 100644
index 516ee6d..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLTabButtonEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLTabPageEntity.class b/Bin/lib/service/UIService/com/vci/server/portal/entity/PLTabPageEntity.class
deleted file mode 100644
index 5cf7cb9..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLTabPageEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLTypeActionEntity.class b/Bin/lib/service/UIService/com/vci/server/portal/entity/PLTypeActionEntity.class
deleted file mode 100644
index 3faca4e..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLTypeActionEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLUILayoutEntity.class b/Bin/lib/service/UIService/com/vci/server/portal/entity/PLUILayoutEntity.class
deleted file mode 100644
index 8481fe1..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/entity/PLUILayoutEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/entity/PortalVIEntity.class b/Bin/lib/service/UIService/com/vci/server/portal/entity/PortalVIEntity.class
deleted file mode 100644
index 8232ff5..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/entity/PortalVIEntity.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLActionClsEntity.hbm.xml b/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLActionClsEntity.hbm.xml
deleted file mode 100644
index e978830..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLActionClsEntity.hbm.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<hibernate-mapping package="">
- <class name="com.vci.server.portal.entity.PLActionClsEntity" table="PLACTIONCLS"
- dynamic-update="true" dynamic-insert="true">
- <id name="oid" type="java.lang.String">
- <column name="OID" not-null="true"/>
- <generator class="assigned" />
- </id>
- <property name="name" type="java.lang.String">
- <column name="NAME"/>
- </property>
- <property name="pid" type="java.lang.String">
- <column name="PID"/>
- </property>
- <property name="description" type="java.lang.String">
- <column name="DESCRIPTION"/>
- </property>
- <property name="creator" type="java.lang.String">
- <column name="CREATOR"/>
- </property>
- <property name="createTime" type="java.util.Date">
- <column name="CREATETIME"/>
- </property>
- <property name="serialNo" type="java.lang.Short">
- <column name="SERIALNO"/>
- </property>
- </class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLActionEntity.hbm.xml b/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLActionEntity.hbm.xml
deleted file mode 100644
index 2009e52..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLActionEntity.hbm.xml
+++ /dev/null
@@ -1,48 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<hibernate-mapping package="">
- <class name="com.vci.server.portal.entity.PLActionEntity" table="PLACTION"
- dynamic-update="true" dynamic-insert="true">
- <id name="plOId" type="java.lang.String">
- <column name="PLOID" not-null="true" />
- <generator class="assigned" />
- </id>
- <property name="plCode" type="java.lang.String">
- <column name="PLCODE" not-null="true" />
- </property>
- <property name="plName" type="java.lang.String">
- <column name="PLNAME" not-null="true" />
- </property>
- <property name="plBSUrl" type="java.lang.String">
- <column name="PLBSURL" not-null="false" />
- </property>
- <property name="plCSClass" type="java.lang.String">
- <column name="PLCSCLASS" not-null="false" />
- </property>
- <property name="plDesc" type="java.lang.String">
- <column name="plDesc" not-null="false" />
- </property>
- <property name="plTypeType" type="java.lang.String">
- <column name="plTypeType" not-null="true" />
- </property>
- <property name="plCreateTime" type="java.util.Date">
- <column name="plCreateTime" not-null="true" />
- </property>
- <property name="plCreateUser" type="java.lang.String">
- <column name="plCreateUser" not-null="true" />
- </property>
- <property name="plModifyTime" type="java.util.Date">
- <column name="plModifyTime" not-null="true" />
- </property>
- <property name="plModifyUser" type="java.lang.String">
- <column name="plModifyUser" not-null="true" />
- </property>
- <property name="plLicensOrs" type="java.lang.String">
- <column name="plLicensOrs" not-null="false" />
- </property>
- <property name="plActionCls" type="java.lang.String">
- <column name="plActionCls" not-null="false" />
- </property>
- </class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLActionParamEntity.hbm.xml b/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLActionParamEntity.hbm.xml
deleted file mode 100644
index 0f5b318..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLActionParamEntity.hbm.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<hibernate-mapping package="">
- <class name="com.vci.server.portal.entity.PLActionParamEntity" table="PLACTIONPARAM"
- dynamic-update="true" dynamic-insert="true">
- <id name="oid" type="java.lang.String">
- <column name="OID" not-null="true"/>
- <generator class="assigned" />
- </id>
- <property name="name" type="java.lang.String">
- <column name="NAME"/>
- </property>
- <property name="defaultValue" type="java.lang.String">
- <column name="DEFAULTVALUE"/>
- </property>
- <property name="description" type="java.lang.String">
- <column name="DESCRIPTION"/>
- </property>
- <property name="action" type="java.lang.String">
- <column name="ACTION"/>
- </property>
- </class>
-</hibernate-mapping>
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLCommandParameterEntity.hbm.xml b/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLCommandParameterEntity.hbm.xml
deleted file mode 100644
index 673d4b2..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLCommandParameterEntity.hbm.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<hibernate-mapping package="">
- <class name="com.vci.server.portal.entity.PLCommandParameterEntity" table="PLCommandParameter"
- dynamic-update="true" dynamic-insert="true">
- <id name="plOId" type="java.lang.String">
- <column name="PLOID" not-null="true" />
- <generator class="assigned" />
- </id>
- <property name="plCommandOId" type="java.lang.String">
- <column name="plCommandOId" not-null="true" />
- </property>
- <property name="plKey" type="java.lang.String">
- <column name="plKey" not-null="true" />
- </property>
- <property name="plValue" type="java.lang.String">
- <column name="plValue" not-null="true" />
- </property>
- <property name="plCreateTime" type="java.util.Date">
- <column name="plCreateTime" not-null="true" />
- </property>
- <property name="plCreateUser" type="java.lang.String">
- <column name="plCreateUser" not-null="true" />
- </property>
- <property name="plModifyTime" type="java.util.Date">
- <column name="plModifyTime" not-null="true" />
- </property>
- <property name="plModifyUser" type="java.lang.String">
- <column name="plModifyUser" not-null="true" />
- </property>
- <property name="plLicensOrs" type="java.lang.String">
- <column name="plLicensOrs" not-null="false" />
- </property>
- </class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLPageDefinationEntity.hbm.xml b/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLPageDefinationEntity.hbm.xml
deleted file mode 100644
index 94c824b..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLPageDefinationEntity.hbm.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<hibernate-mapping package="">
- <class name="com.vci.server.portal.entity.PLPageDefinationEntity" table="PLPAGEDEFINATION"
- dynamic-update="true" dynamic-insert="true">
- <id name="plOId" type="java.lang.String">
- <column name="PLOID" not-null="true" />
- <generator class="assigned" />
- </id>
- <property name="plTabPageOId" type="java.lang.String">
- <column name="plPageContextOId" not-null="true" />
- </property>
- <property name="plType" type="java.lang.Short">
- <column name="plType" not-null="true" />
- </property>
- <property name="plDefination" type="text">
- <column name="plDefination" not-null="false" />
- </property>
- <property name="name" type="java.lang.String">
- <column name="plname" not-null="false" />
- </property>
- <property name="desc" type="java.lang.String">
- <column name="pldesc" not-null="false" />
- </property>
- <property name="seq" type="java.lang.Short">
- <column name="plseq" not-null="false" />
- </property>
- </class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLTabButtonEntity.hbm.xml b/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLTabButtonEntity.hbm.xml
deleted file mode 100644
index 966c7f6..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLTabButtonEntity.hbm.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<hibernate-mapping package="">
- <class name="com.vci.server.portal.entity.PLTabButtonEntity" table="PLTabButton"
- dynamic-update="true" dynamic-insert="true">
- <id name="plOId" type="java.lang.String">
- <column name="PLOID" not-null="true" />
- <generator class="assigned" />
- </id>
- <property name="plTableOId" type="java.lang.String">
- <column name="plTableOId" not-null="false" />
- </property>
- <property name="plPageOId" type="java.lang.String">
- <column name="plPageOId" not-null="false" />
- </property>
- <property name="plActionOId" type="java.lang.String">
- <column name="plActionOId" not-null="false" />
- </property>
- <property name="plLabel" type="java.lang.String">
- <column name="plLabel" not-null="false" />
- </property>
- <property name="plAreaType" type="java.lang.String">
- <column name="PLAREATYPE" not-null="false" />
- </property>
- <property name="plDesc" type="java.lang.String">
- <column name="plDesc" not-null="false" />
- </property>
- <property name="plSeq" type="java.lang.Short">
- <column name="plSeq" not-null="true" />
- </property>
- <property name="plCreateTime" type="java.util.Date">
- <column name="plCreateTime" not-null="true" />
- </property>
- <property name="plCreateUser" type="java.lang.String">
- <column name="plCreateUser" not-null="true" />
- </property>
- <property name="plModifyTime" type="java.util.Date">
- <column name="plModifyTime" not-null="true" />
- </property>
- <property name="plModifyUser" type="java.lang.String">
- <column name="plModifyUser" not-null="true" />
- </property>
- <property name="plLicensOrs" type="java.lang.String">
- <column name="plLicensOrs" not-null="false" />
- </property>
- <property name="plParentOid" type="java.lang.String">
- <column name="PLPARENTOID" not-null="false" />
- </property>
- <property name="displayMode" type="java.lang.String">
- <column name="PLDISPLAYMODE" not-null="false" />
- </property>
- <property name="iconPath" type="java.lang.String">
- <column name="PLICONPATH" not-null="false" />
- </property>
- <property name="authorization" type="java.lang.String">
- <column name="AUTHORIZATION" not-null="false" />
- </property>
- <property name="show" type="java.lang.String">
- <column name="PLSHOW" not-null="false" />
- </property>
- </class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLTabPageEntity.hbm.xml b/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLTabPageEntity.hbm.xml
deleted file mode 100644
index b13cde7..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLTabPageEntity.hbm.xml
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<hibernate-mapping package="">
- <class name="com.vci.server.portal.entity.PLTabPageEntity" table="PLTabPage"
- dynamic-update="true" dynamic-insert="true">
- <id name="plOId" type="java.lang.String">
- <column name="PLOID" not-null="true" />
- <generator class="assigned" />
- </id>
- <property name="plCode" type="java.lang.String">
- <column name="PLCODE" not-null="true" />
- </property>
- <property name="plName" type="java.lang.String">
- <column name="PLNAME" not-null="true" />
- </property>
- <property name="plIsOpen" type="java.lang.Short">
- <column name="plIsOpen" not-null="true" />
- </property>
- <property name="plLabel" type="java.lang.String">
- <column name="plLabel" not-null="false" />
- </property>
- <property name="plDesc" type="java.lang.String">
- <column name="plDesc" not-null="false" />
- </property>
- <property name="plSeq" type="java.lang.Short">
- <column name="plSeq" not-null="true" />
- </property>
- <property name="plContextOId" type="java.lang.String">
- <column name="plPageDefinationOId" not-null="true" />
- </property>
- <property name="areaType" type="java.lang.Short">
- <column name="PLAREATYPE" not-null="true" />
- </property>
- <property name="plCreateTime" type="java.util.Date">
- <column name="plCreateTime" not-null="true" />
- </property>
- <property name="plCreateUser" type="java.lang.String">
- <column name="plCreateUser" not-null="true" />
- </property>
- <property name="plModifyTime" type="java.util.Date">
- <column name="plModifyTime" not-null="true" />
- </property>
- <property name="plModifyUser" type="java.lang.String">
- <column name="plModifyUser" not-null="true" />
- </property>
- <property name="plLicensOrs" type="java.lang.String">
- <column name="plLicensOrs" not-null="false" />
- </property>
- <property name="plOpenExpression" type="java.lang.String">
- <column name="plopenexpression" not-null="false" />
- </property>
-
- <property name="plUIParser" type="java.lang.String">
- <column name="PLUIPARSER" not-null="false" />
- </property>
- <property name="plExtAttr" type="java.lang.String">
- <column name="PLEXTATTR" not-null="false" />
- </property>
- </class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLTypeActionEntity.hbm.xml b/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLTypeActionEntity.hbm.xml
deleted file mode 100644
index d60adac..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLTypeActionEntity.hbm.xml
+++ /dev/null
@@ -1,18 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<hibernate-mapping package="">
- <class name="com.vci.server.portal.entity.PLTypeActionEntity" table="PLTYPEACTION"
- dynamic-update="true" dynamic-insert="true">
- <id name="plOId" type="java.lang.String">
- <column name="PLOID" not-null="true" />
- <generator class="assigned" />
- </id>
- <property name="typeName" type="java.lang.String">
- <column name="typeName" not-null="true" />
- </property>
- <property name="actionoId" type="java.lang.String">
- <column name="actionoId" not-null="true" />
- </property>
- </class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLUILayoutEntity.hbm.xml b/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLUILayoutEntity.hbm.xml
deleted file mode 100644
index 2208118..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PLUILayoutEntity.hbm.xml
+++ /dev/null
@@ -1,51 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<hibernate-mapping package="">
- <class name="com.vci.server.portal.entity.PLUILayoutEntity" table="PLUILayout"
- dynamic-update="true" dynamic-insert="true">
- <id name="plOId" type="java.lang.String">
- <column name="PLOID" not-null="true" />
- <generator class="assigned" />
- </id>
- <property name="plCode" type="java.lang.String">
- <column name="PLCODE" not-null="true" />
- </property>
- <property name="plName" type="java.lang.String">
- <column name="PLNAME" not-null="true" />
- </property>
- <property name="plRelatedType" type="java.lang.String">
- <column name="plRelatedType" not-null="true" />
- </property>
- <property name="plStyle" type="java.lang.String">
- <column name="plStyle" />
- </property>
- <property name="plDesc" type="java.lang.String">
- <column name="plDesc" not-null="false" />
- </property>
- <property name="plIsShowTab" type="java.lang.Short">
- <column name="plIsShowTab" not-null="false" />
- </property>
- <property name="plIsShowForm" type="java.lang.Short">
- <column name="plIsShowForm" not-null="false" />
- </property>
- <property name="plIsShowNavigator" type="java.lang.Short">
- <column name="plIsShowNavigator" not-null="false" />
- </property>
- <property name="plCreateTime" type="java.util.Date">
- <column name="plCreateTime" not-null="true" />
- </property>
- <property name="plCreateUser" type="java.lang.String">
- <column name="plCreateUser" not-null="true" />
- </property>
- <property name="plModifyTime" type="java.util.Date">
- <column name="plModifyTime" not-null="true" />
- </property>
- <property name="plModifyUser" type="java.lang.String">
- <column name="plModifyUser" not-null="true" />
- </property>
- <property name="plLicensOrs" type="java.lang.String">
- <column name="plLicensOrs" not-null="false" />
- </property>
- </class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PortalVIEntity.hbm.xml b/Bin/lib/service/UIService/com/vci/server/portal/hbm/PortalVIEntity.hbm.xml
deleted file mode 100644
index b204158..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/hbm/PortalVIEntity.hbm.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-<?xml version="1.0"?>
-<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
-"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
-<hibernate-mapping package="">
- <class name="com.vci.server.portal.entity.PortalVIEntity" table="PLPORTALVI"
- dynamic-update="true" dynamic-insert="true">
- <id name="id" type="java.lang.String">
- <column name="ID" not-null="true" />
- <generator class="assigned" />
- </id>
- <property name="typeFlag" type="java.lang.Short">
- <column name="TYPEFLAG" not-null="false" />
- </property>
- <property name="typeName" type="java.lang.String">
- <column name="TYPENAME" not-null="true" />
- </property>
- <property name="viName" type="java.lang.String">
- <column name="VINAME" not-null="true" />
- </property>
- <property name="viType" type="java.lang.Short">
- <column name="VITYPE" not-null="true" />
- </property>
- <property name="prm" type="text">
- <column name="PRM" not-null="false" />
- </property>
- </class>
-</hibernate-mapping>
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/service/PLActionEntityService.class b/Bin/lib/service/UIService/com/vci/server/portal/service/PLActionEntityService.class
deleted file mode 100644
index ebaa4ce..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/service/PLActionEntityService.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/service/PLCommandParameterEntityService.class b/Bin/lib/service/UIService/com/vci/server/portal/service/PLCommandParameterEntityService.class
deleted file mode 100644
index f87e36d..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/service/PLCommandParameterEntityService.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/service/PLPageDefinationEntityService.class b/Bin/lib/service/UIService/com/vci/server/portal/service/PLPageDefinationEntityService.class
deleted file mode 100644
index a872214..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/service/PLPageDefinationEntityService.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/service/PLTabButtonEntityService.class b/Bin/lib/service/UIService/com/vci/server/portal/service/PLTabButtonEntityService.class
deleted file mode 100644
index 37429b2..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/service/PLTabButtonEntityService.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/service/PLTabPageEntityService.class b/Bin/lib/service/UIService/com/vci/server/portal/service/PLTabPageEntityService.class
deleted file mode 100644
index c9fa05e..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/service/PLTabPageEntityService.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/service/PLTypeActionEntityService.class b/Bin/lib/service/UIService/com/vci/server/portal/service/PLTypeActionEntityService.class
deleted file mode 100644
index caaf19b..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/service/PLTypeActionEntityService.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/service/PLUILayoutEntityService.class b/Bin/lib/service/UIService/com/vci/server/portal/service/PLUILayoutEntityService.class
deleted file mode 100644
index b5ca96f..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/service/PLUILayoutEntityService.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/service/PortalVIEntityService.class b/Bin/lib/service/UIService/com/vci/server/portal/service/PortalVIEntityService.class
deleted file mode 100644
index 865bf8d..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/service/PortalVIEntityService.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/service/UIDeleteService.class b/Bin/lib/service/UIService/com/vci/server/portal/service/UIDeleteService.class
deleted file mode 100644
index 136aac0..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/service/UIDeleteService.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/com/vci/server/portal/tools/ServerTool.class b/Bin/lib/service/UIService/com/vci/server/portal/tools/ServerTool.class
deleted file mode 100644
index 6feeafb..0000000
--- a/Bin/lib/service/UIService/com/vci/server/portal/tools/ServerTool.class
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/UIService/properties/PLMUIService.properties b/Bin/lib/service/UIService/properties/PLMUIService.properties
deleted file mode 100644
index f61a78b..0000000
--- a/Bin/lib/service/UIService/properties/PLMUIService.properties
+++ /dev/null
@@ -1,54 +0,0 @@
-P0010UIService-00001=\u4fdd\u5b58\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00002=\u66f4\u65b0\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00003=\u5220\u9664\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00004=\u83b7\u53d6\u6307\u5b9a\u7c7b\u578b\u4e0b\u7684\u6240\u6709\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00005=\u83b7\u53d6\u6307\u5b9aID\u7684\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00006=\u4fdd\u5b58Action\u51fa\u9519\uff1a{0}
-P0010UIService-00007=\u66f4\u65b0Action\u51fa\u9519\uff1a{0}
-P0010UIService-00008=\u5220\u9664Action\u51fa\u9519\uff1a{0}
-P0010UIService-00009=\u4fdd\u5b58command\u53c2\u6570\u51fa\u9519\uff1a{0}
-P0010UIService-00010=\u66f4\u65b0command\u53c2\u6570\u51fa\u9519\uff1a{0}
-P0010UIService-00011=\u5220\u9664command\u53c2\u6570\u51fa\u9519\uff1a{0}
-P0010UIService-00012=\u4fdd\u5b58\u9875\u9762\u5e03\u5c40\u51fa\u9519\uff1a{0}
-P0010UIService-00013=\u66f4\u65b0\u9875\u9762\u5e03\u5c40\u51fa\u9519\uff1a{0}
-P0010UIService-00014=\u5220\u9664\u9875\u9762\u5e03\u5c40\u51fa\u9519\uff1a{0}
-P0010UIService-00015=\u4fdd\u5b58\u9875\u7b7e\u6309\u94ae\u51fa\u9519\uff1a{0}
-P0010UIService-00016=\u66f4\u65b0\u9875\u7b7e\u6309\u94ae\u51fa\u9519\uff1a{0}
-P0010UIService-00017=\u5220\u9664\u9875\u7b7e\u6309\u94ae\u51fa\u9519\uff1a{0}
-P0010UIService-00018=\u4fdd\u5b58\u9875\u7b7e\u51fa\u9519\uff1a{0}
-P0010UIService-00019=\u66f4\u65b0\u9875\u7b7e\u51fa\u9519\uff1a{0}
-P0010UIService-00020=\u5220\u9664\u9875\u7b7e\u51fa\u9519\uff1a{0}
-P0010UIService-00021=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLAction\u51fa\u9519\uff1a{0}
-P0010UIService-00022=\u83b7\u53d6\u6240\u6709PLAction\u51fa\u9519\uff1a{0}
-P0010UIService-00023=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLCommandParameter\u51fa\u9519\uff1a{0}
-P0010UIService-00024=\u6839\u636eplCommandOId\u83b7\u53d6PLCommandParameterArray\u51fa\u9519\uff1a{0}
-P0010UIService-00025=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLPageLayoutDefination\u51fa\u9519\uff1a{0}
-P0010UIService-00026=\u6839\u636e\u5173\u8054\u7c7b\u578b\u83b7\u53d6PLPageLayoutDefinationArray\u51fa\u9519\uff1a{0}
-P0010UIService-00027=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLTabPage\u51fa\u9519\uff1a{0}
-P0010UIService-00028=\u6839\u636eplPageDefinationOId\u83b7\u53d6PLPageLayoutDefinationArray\u51fa\u9519\uff1a{0}
-P0010UIService-00029=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLTabButton\u51fa\u9519\uff1a{0}
-P0010UIService-00030=\u6839\u636eplTableOId\u83b7\u53d6PLTabButtonArray\u51fa\u9519\uff1a{0}
-P0010UIService-00031=\u4fdd\u5b58\u754c\u9762\u51fa\u9519\uff1a{0}
-P0010UIService-00032=\u66f4\u65b0\u754c\u9762\u51fa\u9519\uff1a{0}
-P0010UIService-00033=\u5220\u9664\u754c\u9762\u51fa\u9519\uff1a{0}
-P0010UIService-00034=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLPageDefination\u51fa\u9519\uff1a{0}
-P0010UIService-00035=\u6839\u636eplPageContextOId\u83b7\u53d6\u6307\u5b9a\u7684PLPageDefinationArray\u51fa\u9519\uff1a{0}
-P0010UIService-00036=\u6839\u636etype,code\u83b7\u53d6\u6307\u5b9a\u7684PLTabPage\u51fa\u9519\uff1a{0}
-P0010UIService-00037=\u6839\u636e\u7c7b\u578b\u540d\u548c\u89c6\u56fe\u540d\u83b7\u53d6\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00038=\u6839\u636e\u7ea6\u675f\u6761\u4ef6\u7ec4\u67e5\u8be2\u6570\u7ec4, \u67e5\u8be2PLActions\u51fa\u9519\uff1a{0}
-P0010UIService-00039=\u6839\u636e\u7ed9\u5b9a\u503c\u6a21\u7cca\u67e5\u8be2\u6570\u7ec4, \u67e5\u8be2PLPageDefinationArray\u51fa\u9519\uff1a{0}
-P0010UIService-00040=\u4fdd\u5b58\u7c7b\u578b\u4e0eaction\u5173\u7cfb\u65f6\u51fa\u9519\uff1a{0}
-P0010UIService-00041=\u5220\u9664\u7c7b\u578b\u4e0eaction\u5173\u7cfb\u65f6\u51fa\u9519\uff1a{0}
-P0010UIService-00042=\u901a\u8fc7\u7c7b\u578b\u67e5\u8be2\u6240\u6709\u7684action\u5bf9\u8c61\u65f6\u51fa\u9519\uff1a{0}
-P0010UIService-00043=\u5224\u65ad\u8868\u5355\u8868\u683c\u4fee\u6539\u540d\u79f0\u65f6\u662f\u5426\u5df2\u7ecf\u88ab\u5f15\u7528\uff1a{0}
-P0010UIService-00044=\u5224\u65ad\u5220\u9664\u8868\u5355\u65f6\u8be5\u8868\u5355\u662f\u5426\u5df2\u7ecf\u88ab\u8868\u683c\u5f15\u7528\uff1a{0}
-P0010UIService-00045=\u6839\u636e\u5173\u8054\u7c7b\u578b\u548c\u7f16\u53f7\u83b7\u53d6PLPageLayoutDefinationArray\u51fa\u9519\uff1a{0}
-P0010UIService-00046=\u91cd\u65b0\u52a0\u8f7d\u7f13\u5b58\u51fa\u73b0\u9519\u8bef\uff0c\u8bf7\u518d\u6b21\u52a0\u8f7d\u6216\u8054\u7cfb\u7ba1\u7406\u5458\u3002{0}
-
-P0010UIService-00047=\u590d\u5236\u9875\u7b7e\u5230\u4e0a\u4e0b\u6587\u65f6\u53d1\u751f\u9519\u8bef\uff01{0}
-P0010UIService-00048=\u590d\u5236\u7ec4\u4ef6\u5230\u9875\u7b7e\u65f6\u53d1\u751f\u9519\u8bef\uff01{0}
-
-common.msg.executingHasError=\u6267\u884c{0}\u65f6\u53d1\u751f\u9519\u8bef\uff01\n{1}
-common.msg.pleaseChooseData=\u8bf7\u5148\u9009\u62e9\u6570\u636e\uff01{0}
-common.msg.onlyChooseOneDataToSomeOpt=\u4e00\u6b21\u53ea\u80fd\u9009\u62e9\u4e00\u6761\u6570\u636e\u8fdb\u884c\u6b64\u64cd\u4f5c\uff01{0}
-common.msg.confirmDelete=\u786e\u5b9a\u8981\u6267\u884c\u5220\u9664\u5417\uff1f{0}
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/properties/PLMUIService_zh.properties b/Bin/lib/service/UIService/properties/PLMUIService_zh.properties
deleted file mode 100644
index f61a78b..0000000
--- a/Bin/lib/service/UIService/properties/PLMUIService_zh.properties
+++ /dev/null
@@ -1,54 +0,0 @@
-P0010UIService-00001=\u4fdd\u5b58\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00002=\u66f4\u65b0\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00003=\u5220\u9664\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00004=\u83b7\u53d6\u6307\u5b9a\u7c7b\u578b\u4e0b\u7684\u6240\u6709\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00005=\u83b7\u53d6\u6307\u5b9aID\u7684\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00006=\u4fdd\u5b58Action\u51fa\u9519\uff1a{0}
-P0010UIService-00007=\u66f4\u65b0Action\u51fa\u9519\uff1a{0}
-P0010UIService-00008=\u5220\u9664Action\u51fa\u9519\uff1a{0}
-P0010UIService-00009=\u4fdd\u5b58command\u53c2\u6570\u51fa\u9519\uff1a{0}
-P0010UIService-00010=\u66f4\u65b0command\u53c2\u6570\u51fa\u9519\uff1a{0}
-P0010UIService-00011=\u5220\u9664command\u53c2\u6570\u51fa\u9519\uff1a{0}
-P0010UIService-00012=\u4fdd\u5b58\u9875\u9762\u5e03\u5c40\u51fa\u9519\uff1a{0}
-P0010UIService-00013=\u66f4\u65b0\u9875\u9762\u5e03\u5c40\u51fa\u9519\uff1a{0}
-P0010UIService-00014=\u5220\u9664\u9875\u9762\u5e03\u5c40\u51fa\u9519\uff1a{0}
-P0010UIService-00015=\u4fdd\u5b58\u9875\u7b7e\u6309\u94ae\u51fa\u9519\uff1a{0}
-P0010UIService-00016=\u66f4\u65b0\u9875\u7b7e\u6309\u94ae\u51fa\u9519\uff1a{0}
-P0010UIService-00017=\u5220\u9664\u9875\u7b7e\u6309\u94ae\u51fa\u9519\uff1a{0}
-P0010UIService-00018=\u4fdd\u5b58\u9875\u7b7e\u51fa\u9519\uff1a{0}
-P0010UIService-00019=\u66f4\u65b0\u9875\u7b7e\u51fa\u9519\uff1a{0}
-P0010UIService-00020=\u5220\u9664\u9875\u7b7e\u51fa\u9519\uff1a{0}
-P0010UIService-00021=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLAction\u51fa\u9519\uff1a{0}
-P0010UIService-00022=\u83b7\u53d6\u6240\u6709PLAction\u51fa\u9519\uff1a{0}
-P0010UIService-00023=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLCommandParameter\u51fa\u9519\uff1a{0}
-P0010UIService-00024=\u6839\u636eplCommandOId\u83b7\u53d6PLCommandParameterArray\u51fa\u9519\uff1a{0}
-P0010UIService-00025=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLPageLayoutDefination\u51fa\u9519\uff1a{0}
-P0010UIService-00026=\u6839\u636e\u5173\u8054\u7c7b\u578b\u83b7\u53d6PLPageLayoutDefinationArray\u51fa\u9519\uff1a{0}
-P0010UIService-00027=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLTabPage\u51fa\u9519\uff1a{0}
-P0010UIService-00028=\u6839\u636eplPageDefinationOId\u83b7\u53d6PLPageLayoutDefinationArray\u51fa\u9519\uff1a{0}
-P0010UIService-00029=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLTabButton\u51fa\u9519\uff1a{0}
-P0010UIService-00030=\u6839\u636eplTableOId\u83b7\u53d6PLTabButtonArray\u51fa\u9519\uff1a{0}
-P0010UIService-00031=\u4fdd\u5b58\u754c\u9762\u51fa\u9519\uff1a{0}
-P0010UIService-00032=\u66f4\u65b0\u754c\u9762\u51fa\u9519\uff1a{0}
-P0010UIService-00033=\u5220\u9664\u754c\u9762\u51fa\u9519\uff1a{0}
-P0010UIService-00034=\u6839\u636eID\u83b7\u53d6\u6307\u5b9a\u7684PLPageDefination\u51fa\u9519\uff1a{0}
-P0010UIService-00035=\u6839\u636eplPageContextOId\u83b7\u53d6\u6307\u5b9a\u7684PLPageDefinationArray\u51fa\u9519\uff1a{0}
-P0010UIService-00036=\u6839\u636etype,code\u83b7\u53d6\u6307\u5b9a\u7684PLTabPage\u51fa\u9519\uff1a{0}
-P0010UIService-00037=\u6839\u636e\u7c7b\u578b\u540d\u548c\u89c6\u56fe\u540d\u83b7\u53d6\u89c6\u56fe\u51fa\u9519\uff1a{0}
-P0010UIService-00038=\u6839\u636e\u7ea6\u675f\u6761\u4ef6\u7ec4\u67e5\u8be2\u6570\u7ec4, \u67e5\u8be2PLActions\u51fa\u9519\uff1a{0}
-P0010UIService-00039=\u6839\u636e\u7ed9\u5b9a\u503c\u6a21\u7cca\u67e5\u8be2\u6570\u7ec4, \u67e5\u8be2PLPageDefinationArray\u51fa\u9519\uff1a{0}
-P0010UIService-00040=\u4fdd\u5b58\u7c7b\u578b\u4e0eaction\u5173\u7cfb\u65f6\u51fa\u9519\uff1a{0}
-P0010UIService-00041=\u5220\u9664\u7c7b\u578b\u4e0eaction\u5173\u7cfb\u65f6\u51fa\u9519\uff1a{0}
-P0010UIService-00042=\u901a\u8fc7\u7c7b\u578b\u67e5\u8be2\u6240\u6709\u7684action\u5bf9\u8c61\u65f6\u51fa\u9519\uff1a{0}
-P0010UIService-00043=\u5224\u65ad\u8868\u5355\u8868\u683c\u4fee\u6539\u540d\u79f0\u65f6\u662f\u5426\u5df2\u7ecf\u88ab\u5f15\u7528\uff1a{0}
-P0010UIService-00044=\u5224\u65ad\u5220\u9664\u8868\u5355\u65f6\u8be5\u8868\u5355\u662f\u5426\u5df2\u7ecf\u88ab\u8868\u683c\u5f15\u7528\uff1a{0}
-P0010UIService-00045=\u6839\u636e\u5173\u8054\u7c7b\u578b\u548c\u7f16\u53f7\u83b7\u53d6PLPageLayoutDefinationArray\u51fa\u9519\uff1a{0}
-P0010UIService-00046=\u91cd\u65b0\u52a0\u8f7d\u7f13\u5b58\u51fa\u73b0\u9519\u8bef\uff0c\u8bf7\u518d\u6b21\u52a0\u8f7d\u6216\u8054\u7cfb\u7ba1\u7406\u5458\u3002{0}
-
-P0010UIService-00047=\u590d\u5236\u9875\u7b7e\u5230\u4e0a\u4e0b\u6587\u65f6\u53d1\u751f\u9519\u8bef\uff01{0}
-P0010UIService-00048=\u590d\u5236\u7ec4\u4ef6\u5230\u9875\u7b7e\u65f6\u53d1\u751f\u9519\u8bef\uff01{0}
-
-common.msg.executingHasError=\u6267\u884c{0}\u65f6\u53d1\u751f\u9519\u8bef\uff01\n{1}
-common.msg.pleaseChooseData=\u8bf7\u5148\u9009\u62e9\u6570\u636e\uff01{0}
-common.msg.onlyChooseOneDataToSomeOpt=\u4e00\u6b21\u53ea\u80fd\u9009\u62e9\u4e00\u6761\u6570\u636e\u8fdb\u884c\u6b64\u64cd\u4f5c\uff01{0}
-common.msg.confirmDelete=\u786e\u5b9a\u8981\u6267\u884c\u5220\u9664\u5417\uff1f{0}
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/properties/PLMUIService_zhNative.properties b/Bin/lib/service/UIService/properties/PLMUIService_zhNative.properties
deleted file mode 100644
index 1333aa1..0000000
--- a/Bin/lib/service/UIService/properties/PLMUIService_zhNative.properties
+++ /dev/null
@@ -1,54 +0,0 @@
-P0010UIService-00001=淇濆瓨瑙嗗浘鍑洪敊锛歿0}
-P0010UIService-00002=鏇存柊瑙嗗浘鍑洪敊锛歿0}
-P0010UIService-00003=鍒犻櫎瑙嗗浘鍑洪敊锛歿0}
-P0010UIService-00004=鑾峰彇鎸囧畾绫诲瀷涓嬬殑鎵�鏈夎鍥惧嚭閿欙細{0}
-P0010UIService-00005=鑾峰彇鎸囧畾ID鐨勮鍥惧嚭閿欙細{0}
-P0010UIService-00006=淇濆瓨Action鍑洪敊锛歿0}
-P0010UIService-00007=鏇存柊Action鍑洪敊锛歿0}
-P0010UIService-00008=鍒犻櫎Action鍑洪敊锛歿0}
-P0010UIService-00009=淇濆瓨command鍙傛暟鍑洪敊锛歿0}
-P0010UIService-00010=鏇存柊command鍙傛暟鍑洪敊锛歿0}
-P0010UIService-00011=鍒犻櫎command鍙傛暟鍑洪敊锛歿0}
-P0010UIService-00012=淇濆瓨椤甸潰甯冨眬鍑洪敊锛歿0}
-P0010UIService-00013=鏇存柊椤甸潰甯冨眬鍑洪敊锛歿0}
-P0010UIService-00014=鍒犻櫎椤甸潰甯冨眬鍑洪敊锛歿0}
-P0010UIService-00015=淇濆瓨椤电鎸夐挳鍑洪敊锛歿0}
-P0010UIService-00016=鏇存柊椤电鎸夐挳鍑洪敊锛歿0}
-P0010UIService-00017=鍒犻櫎椤电鎸夐挳鍑洪敊锛歿0}
-P0010UIService-00018=淇濆瓨椤电鍑洪敊锛歿0}
-P0010UIService-00019=鏇存柊椤电鍑洪敊锛歿0}
-P0010UIService-00020=鍒犻櫎椤电鍑洪敊锛歿0}
-P0010UIService-00021=鏍规嵁ID鑾峰彇鎸囧畾鐨凱LAction鍑洪敊锛歿0}
-P0010UIService-00022=鑾峰彇鎵�鏈塒LAction鍑洪敊锛歿0}
-P0010UIService-00023=鏍规嵁ID鑾峰彇鎸囧畾鐨凱LCommandParameter鍑洪敊锛歿0}
-P0010UIService-00024=鏍规嵁plCommandOId鑾峰彇PLCommandParameterArray鍑洪敊锛歿0}
-P0010UIService-00025=鏍规嵁ID鑾峰彇鎸囧畾鐨凱LPageLayoutDefination鍑洪敊锛歿0}
-P0010UIService-00026=鏍规嵁鍏宠仈绫诲瀷鑾峰彇PLPageLayoutDefinationArray鍑洪敊锛歿0}
-P0010UIService-00027=鏍规嵁ID鑾峰彇鎸囧畾鐨凱LTabPage鍑洪敊锛歿0}
-P0010UIService-00028=鏍规嵁plPageDefinationOId鑾峰彇PLPageLayoutDefinationArray鍑洪敊锛歿0}
-P0010UIService-00029=鏍规嵁ID鑾峰彇鎸囧畾鐨凱LTabButton鍑洪敊锛歿0}
-P0010UIService-00030=鏍规嵁plTableOId鑾峰彇PLTabButtonArray鍑洪敊锛歿0}
-P0010UIService-00031=淇濆瓨鐣岄潰鍑洪敊锛歿0}
-P0010UIService-00032=鏇存柊鐣岄潰鍑洪敊锛歿0}
-P0010UIService-00033=鍒犻櫎鐣岄潰鍑洪敊锛歿0}
-P0010UIService-00034=鏍规嵁ID鑾峰彇鎸囧畾鐨凱LPageDefination鍑洪敊锛歿0}
-P0010UIService-00035=鏍规嵁plPageContextOId鑾峰彇鎸囧畾鐨凱LPageDefinationArray鍑洪敊锛歿0}
-P0010UIService-00036=鏍规嵁type,code鑾峰彇鎸囧畾鐨凱LTabPage鍑洪敊锛歿0}
-P0010UIService-00037=鏍规嵁绫诲瀷鍚嶅拰瑙嗗浘鍚嶈幏鍙栬鍥惧嚭閿欙細{0}
-P0010UIService-00038=鏍规嵁绾︽潫鏉′欢缁勬煡璇㈡暟缁�, 鏌ヨPLActions鍑洪敊锛歿0}
-P0010UIService-00039=鏍规嵁缁欏畾鍊兼ā绯婃煡璇㈡暟缁�, 鏌ヨPLPageDefinationArray鍑洪敊锛歿0}
-P0010UIService-00040=淇濆瓨绫诲瀷涓巃ction鍏崇郴鏃跺嚭閿欙細{0}
-P0010UIService-00041=鍒犻櫎绫诲瀷涓巃ction鍏崇郴鏃跺嚭閿欙細{0}
-P0010UIService-00042=閫氳繃绫诲瀷鏌ヨ鎵�鏈夌殑action瀵硅薄鏃跺嚭閿欙細{0}
-P0010UIService-00043=鍒ゆ柇琛ㄥ崟琛ㄦ牸淇敼鍚嶇О鏃舵槸鍚﹀凡缁忚寮曠敤锛歿0}
-P0010UIService-00044=鍒ゆ柇鍒犻櫎琛ㄥ崟鏃惰琛ㄥ崟鏄惁宸茬粡琚〃鏍煎紩鐢細{0}
-P0010UIService-00045=鏍规嵁鍏宠仈绫诲瀷鍜岀紪鍙疯幏鍙朠LPageLayoutDefinationArray鍑洪敊锛歿0}
-P0010UIService-00046=閲嶆柊鍔犺浇缂撳瓨鍑虹幇閿欒锛岃鍐嶆鍔犺浇鎴栬仈绯荤鐞嗗憳銆倇0}
-
-P0010UIService-00047=澶嶅埗椤电鍒颁笂涓嬫枃鏃跺彂鐢熼敊璇紒{0}
-P0010UIService-00048=澶嶅埗缁勪欢鍒伴〉绛炬椂鍙戠敓閿欒锛亄0}
-
-common.msg.executingHasError=鎵ц{0}鏃跺彂鐢熼敊璇紒\n{1}
-common.msg.pleaseChooseData=璇峰厛閫夋嫨鏁版嵁锛亄0}
-common.msg.onlyChooseOneDataToSomeOpt=涓�娆″彧鑳介�夋嫨涓�鏉℃暟鎹繘琛屾鎿嶄綔锛亄0}
-common.msg.confirmDelete=纭畾瑕佹墽琛屽垹闄ゅ悧锛焮0}
\ No newline at end of file
diff --git a/Bin/lib/service/UIService/properties/hibernate.map.xml b/Bin/lib/service/UIService/properties/hibernate.map.xml
deleted file mode 100644
index 74f90a9..0000000
--- a/Bin/lib/service/UIService/properties/hibernate.map.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<hbmfiles>
- <!-- portal_START-->
- <mapping resource="com/vci/server/portal/hbm/PLActionClsEntity.hbm.xml"/>
- <mapping resource="com/vci/server/portal/hbm/PLActionParamEntity.hbm.xml"/>
- <mapping resource="com/vci/server/portal/hbm/PLTypeActionEntity.hbm.xml"/>
- <mapping resource="com/vci/server/portal/hbm/PortalVIEntity.hbm.xml"/>
- <mapping resource="com/vci/server/portal/hbm/PLActionEntity.hbm.xml"/>
- <mapping resource="com/vci/server/portal/hbm/PLUILayoutEntity.hbm.xml"/>
- <mapping resource="com/vci/server/portal/hbm/PLTabPageEntity.hbm.xml"/>
- <mapping resource="com/vci/server/portal/hbm/PLTabButtonEntity.hbm.xml"/>
- <mapping resource="com/vci/server/portal/hbm/PLCommandParameterEntity.hbm.xml"/>
- <mapping resource="com/vci/server/portal/hbm/PLPageDefinationEntity.hbm.xml"/>
-</hbmfiles>
\ No newline at end of file
diff --git a/Bin/lib/service/VciServiceMain.jar b/Bin/lib/service/VciServiceMain.jar
deleted file mode 100644
index e4bd80e..0000000
--- a/Bin/lib/service/VciServiceMain.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/VolumeService.jar b/Bin/lib/service/VolumeService.jar
deleted file mode 100644
index ab4afc4..0000000
--- a/Bin/lib/service/VolumeService.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/WFPlugins.jar b/Bin/lib/service/WFPlugins.jar
deleted file mode 100644
index 8042853..0000000
--- a/Bin/lib/service/WFPlugins.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/service/WFService.jar b/Bin/lib/service/WFService.jar
deleted file mode 100644
index 25dbf09..0000000
--- a/Bin/lib/service/WFService.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/IKAnalyzer2012FF_u1.jar b/Bin/lib/thrid/IKAnalyzer2012FF_u1.jar
deleted file mode 100644
index 9ec77c8..0000000
--- a/Bin/lib/thrid/IKAnalyzer2012FF_u1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/XmlSchema-1.1.jar b/Bin/lib/thrid/XmlSchema-1.1.jar
deleted file mode 100644
index a52c562..0000000
--- a/Bin/lib/thrid/XmlSchema-1.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/activation.jar b/Bin/lib/thrid/activation.jar
deleted file mode 100644
index df8003b..0000000
--- a/Bin/lib/thrid/activation.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/antlr-2.7.6.jar b/Bin/lib/thrid/antlr-2.7.6.jar
deleted file mode 100644
index 3702b64..0000000
--- a/Bin/lib/thrid/antlr-2.7.6.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/avalon-framework-4.1.5.jar b/Bin/lib/thrid/avalon-framework-4.1.5.jar
deleted file mode 100644
index a24b1c7..0000000
--- a/Bin/lib/thrid/avalon-framework-4.1.5.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/axis-ant.jar b/Bin/lib/thrid/axis-ant.jar
deleted file mode 100644
index 17527ff..0000000
--- a/Bin/lib/thrid/axis-ant.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/axis.jar b/Bin/lib/thrid/axis.jar
deleted file mode 100644
index 20b09a5..0000000
--- a/Bin/lib/thrid/axis.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/bsf-2.3.0.jar b/Bin/lib/thrid/bsf-2.3.0.jar
deleted file mode 100644
index caa4dea..0000000
--- a/Bin/lib/thrid/bsf-2.3.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/bsh.jar b/Bin/lib/thrid/bsh.jar
deleted file mode 100644
index e326510..0000000
--- a/Bin/lib/thrid/bsh.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/c3p0-0.9.1.jar b/Bin/lib/thrid/c3p0-0.9.1.jar
deleted file mode 100644
index 693667a..0000000
--- a/Bin/lib/thrid/c3p0-0.9.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/commons-codec-1.3.jar b/Bin/lib/thrid/commons-codec-1.3.jar
deleted file mode 100644
index 957b675..0000000
--- a/Bin/lib/thrid/commons-codec-1.3.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/commons-collections-3.1.jar b/Bin/lib/thrid/commons-collections-3.1.jar
deleted file mode 100644
index 41e230f..0000000
--- a/Bin/lib/thrid/commons-collections-3.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/commons-dbcp-1.1.jar b/Bin/lib/thrid/commons-dbcp-1.1.jar
deleted file mode 100644
index c3c4d1f..0000000
--- a/Bin/lib/thrid/commons-dbcp-1.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/commons-discovery-0.2.jar b/Bin/lib/thrid/commons-discovery-0.2.jar
deleted file mode 100644
index b885548..0000000
--- a/Bin/lib/thrid/commons-discovery-0.2.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/commons-fileupload-1.2.2.jar b/Bin/lib/thrid/commons-fileupload-1.2.2.jar
deleted file mode 100644
index 131f192..0000000
--- a/Bin/lib/thrid/commons-fileupload-1.2.2.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/commons-httpclient-3.0.jar b/Bin/lib/thrid/commons-httpclient-3.0.jar
deleted file mode 100644
index 54a9300..0000000
--- a/Bin/lib/thrid/commons-httpclient-3.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/commons-io-2.0.1.jar b/Bin/lib/thrid/commons-io-2.0.1.jar
deleted file mode 100644
index 5b64b7d..0000000
--- a/Bin/lib/thrid/commons-io-2.0.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/commons-logging-1.0.4.jar b/Bin/lib/thrid/commons-logging-1.0.4.jar
deleted file mode 100644
index b73a80f..0000000
--- a/Bin/lib/thrid/commons-logging-1.0.4.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/commons-net-1.4.1.jar b/Bin/lib/thrid/commons-net-1.4.1.jar
deleted file mode 100644
index 9666a92..0000000
--- a/Bin/lib/thrid/commons-net-1.4.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/commons-pool2-2.6.2.jar b/Bin/lib/thrid/commons-pool2-2.6.2.jar
deleted file mode 100644
index 4233f08..0000000
--- a/Bin/lib/thrid/commons-pool2-2.6.2.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/geronimo-stax-api_1.0_spec-1.0.jar b/Bin/lib/thrid/geronimo-stax-api_1.0_spec-1.0.jar
deleted file mode 100644
index 0d6d374..0000000
--- a/Bin/lib/thrid/geronimo-stax-api_1.0_spec-1.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/guava-20.0.jar b/Bin/lib/thrid/guava-20.0.jar
deleted file mode 100644
index 632772f..0000000
--- a/Bin/lib/thrid/guava-20.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/hibernate-jpa-2.0-api-1.0.1.Final.jar b/Bin/lib/thrid/hibernate-jpa-2.0-api-1.0.1.Final.jar
deleted file mode 100644
index 1e9f71b..0000000
--- a/Bin/lib/thrid/hibernate-jpa-2.0-api-1.0.1.Final.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/hibernate3.jar b/Bin/lib/thrid/hibernate3.jar
deleted file mode 100644
index 73df7b1..0000000
--- a/Bin/lib/thrid/hibernate3.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/inforbroker-core-5.1.0.jar b/Bin/lib/thrid/inforbroker-core-5.1.0.jar
deleted file mode 100644
index 352b2a5..0000000
--- a/Bin/lib/thrid/inforbroker-core-5.1.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/javassist-3.12.0.GA.jar b/Bin/lib/thrid/javassist-3.12.0.GA.jar
deleted file mode 100644
index 8f692f4..0000000
--- a/Bin/lib/thrid/javassist-3.12.0.GA.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jaxen-1.1-beta-9.jar b/Bin/lib/thrid/jaxen-1.1-beta-9.jar
deleted file mode 100644
index e290706..0000000
--- a/Bin/lib/thrid/jaxen-1.1-beta-9.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jaxrpc.jar b/Bin/lib/thrid/jaxrpc.jar
deleted file mode 100644
index a2c13d9..0000000
--- a/Bin/lib/thrid/jaxrpc.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jbpm-4.3.2.jar b/Bin/lib/thrid/jbpm-4.3.2.jar
deleted file mode 100644
index 21ccd58..0000000
--- a/Bin/lib/thrid/jbpm-4.3.2.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jcalendar-1.3.3.jar b/Bin/lib/thrid/jcalendar-1.3.3.jar
deleted file mode 100644
index 2e13b77..0000000
--- a/Bin/lib/thrid/jcalendar-1.3.3.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jcommon-1.0.17.jar b/Bin/lib/thrid/jcommon-1.0.17.jar
deleted file mode 100644
index f1bd165..0000000
--- a/Bin/lib/thrid/jcommon-1.0.17.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jdom-1.0.jar b/Bin/lib/thrid/jdom-1.0.jar
deleted file mode 100644
index 30d3977..0000000
--- a/Bin/lib/thrid/jdom-1.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jdsl.jar b/Bin/lib/thrid/jdsl.jar
deleted file mode 100644
index c225421..0000000
--- a/Bin/lib/thrid/jdsl.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jedis-2.9.0.jar b/Bin/lib/thrid/jedis-2.9.0.jar
deleted file mode 100644
index f4d27d3..0000000
--- a/Bin/lib/thrid/jedis-2.9.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jee-management-1.1.jar b/Bin/lib/thrid/jee-management-1.1.jar
deleted file mode 100644
index 1911f08..0000000
--- a/Bin/lib/thrid/jee-management-1.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jfreechart-1.0.14.jar b/Bin/lib/thrid/jfreechart-1.0.14.jar
deleted file mode 100644
index 0e4d020..0000000
--- a/Bin/lib/thrid/jfreechart-1.0.14.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jms-1.1.jar b/Bin/lib/thrid/jms-1.1.jar
deleted file mode 100644
index dad227f..0000000
--- a/Bin/lib/thrid/jms-1.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/jta-1.1.jar b/Bin/lib/thrid/jta-1.1.jar
deleted file mode 100644
index 6d225b7..0000000
--- a/Bin/lib/thrid/jta-1.1.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/juel-engine.jar b/Bin/lib/thrid/juel-engine.jar
deleted file mode 100644
index d1de8a7..0000000
--- a/Bin/lib/thrid/juel-engine.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/juel-impl.jar b/Bin/lib/thrid/juel-impl.jar
deleted file mode 100644
index 53c3522..0000000
--- a/Bin/lib/thrid/juel-impl.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/juel.jar b/Bin/lib/thrid/juel.jar
deleted file mode 100644
index 6fda56c..0000000
--- a/Bin/lib/thrid/juel.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/livetribe-jsr223.jar b/Bin/lib/thrid/livetribe-jsr223.jar
deleted file mode 100644
index 8d38ba1..0000000
--- a/Bin/lib/thrid/livetribe-jsr223.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/logkit-1.2.jar b/Bin/lib/thrid/logkit-1.2.jar
deleted file mode 100644
index 67d4866..0000000
--- a/Bin/lib/thrid/logkit-1.2.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/ognl-2.6.11.jar b/Bin/lib/thrid/ognl-2.6.11.jar
deleted file mode 100644
index 19cd379..0000000
--- a/Bin/lib/thrid/ognl-2.6.11.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/ojdbc8.jar b/Bin/lib/thrid/ojdbc8.jar
deleted file mode 100644
index bf41243..0000000
--- a/Bin/lib/thrid/ojdbc8.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/picocontainer-1.2.jar b/Bin/lib/thrid/picocontainer-1.2.jar
deleted file mode 100644
index fbb1c92..0000000
--- a/Bin/lib/thrid/picocontainer-1.2.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/plugin.jar b/Bin/lib/thrid/plugin.jar
deleted file mode 100644
index 52a401b..0000000
--- a/Bin/lib/thrid/plugin.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/poi-3.9-20121203.jar b/Bin/lib/thrid/poi-3.9-20121203.jar
deleted file mode 100644
index 0f46288..0000000
--- a/Bin/lib/thrid/poi-3.9-20121203.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/poi-ooxml-3.9-20121203.jar b/Bin/lib/thrid/poi-ooxml-3.9-20121203.jar
deleted file mode 100644
index 8792d46..0000000
--- a/Bin/lib/thrid/poi-ooxml-3.9-20121203.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/poi-ooxml-schemas-3.9-20121203.jar b/Bin/lib/thrid/poi-ooxml-schemas-3.9-20121203.jar
deleted file mode 100644
index eda4ef4..0000000
--- a/Bin/lib/thrid/poi-ooxml-schemas-3.9-20121203.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/poi-scratchpad-3.9-20121203.jar b/Bin/lib/thrid/poi-scratchpad-3.9-20121203.jar
deleted file mode 100644
index 1520855..0000000
--- a/Bin/lib/thrid/poi-scratchpad-3.9-20121203.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/portalcustom.jar b/Bin/lib/thrid/portalcustom.jar
deleted file mode 100644
index 2c0af22..0000000
--- a/Bin/lib/thrid/portalcustom.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/proxool-0.8.3.jar b/Bin/lib/thrid/proxool-0.8.3.jar
deleted file mode 100644
index c4f700c..0000000
--- a/Bin/lib/thrid/proxool-0.8.3.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/quartz-all-1.8.6.jar b/Bin/lib/thrid/quartz-all-1.8.6.jar
deleted file mode 100644
index 86901d1..0000000
--- a/Bin/lib/thrid/quartz-all-1.8.6.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/rsyntax.jar b/Bin/lib/thrid/rsyntax.jar
deleted file mode 100644
index 6903d1a..0000000
--- a/Bin/lib/thrid/rsyntax.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/saaj.jar b/Bin/lib/thrid/saaj.jar
deleted file mode 100644
index 4ea696e..0000000
--- a/Bin/lib/thrid/saaj.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/sapjco.jar b/Bin/lib/thrid/sapjco.jar
deleted file mode 100644
index e18912e..0000000
--- a/Bin/lib/thrid/sapjco.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/slf4j-api-1.7.14.jar b/Bin/lib/thrid/slf4j-api-1.7.14.jar
deleted file mode 100644
index d5d64c4..0000000
--- a/Bin/lib/thrid/slf4j-api-1.7.14.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/slf4j-jdk14-1.7.14.jar b/Bin/lib/thrid/slf4j-jdk14-1.7.14.jar
deleted file mode 100644
index 720f7fd..0000000
--- a/Bin/lib/thrid/slf4j-jdk14-1.7.14.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/xml-apis.jar b/Bin/lib/thrid/xml-apis.jar
deleted file mode 100644
index d42c0ea..0000000
--- a/Bin/lib/thrid/xml-apis.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/xmlbeans-2.3.0.jar b/Bin/lib/thrid/xmlbeans-2.3.0.jar
deleted file mode 100644
index ccd8163..0000000
--- a/Bin/lib/thrid/xmlbeans-2.3.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/xmlsec-1.3.0.jar b/Bin/lib/thrid/xmlsec-1.3.0.jar
deleted file mode 100644
index 6b69b80..0000000
--- a/Bin/lib/thrid/xmlsec-1.3.0.jar
+++ /dev/null
Binary files differ
diff --git a/Bin/lib/thrid/xstream-1.3.1.jar b/Bin/lib/thrid/xstream-1.3.1.jar
deleted file mode 100644
index 4ef4219..0000000
--- a/Bin/lib/thrid/xstream-1.3.1.jar
+++ /dev/null
Binary files differ
diff --git a/Source/platformProject/pom.xml b/Source/platformProject/pom.xml
index 8a37391..b5e7b23 100644
--- a/Source/platformProject/pom.xml
+++ b/Source/platformProject/pom.xml
@@ -20,6 +20,8 @@
<old.spring.version>3.2.0.RELEASE</old.spring.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<java.version>1.8</java.version>
+ <lombok.version>1.18.22</lombok.version>
+ <jackson.version>2.13.3</jackson.version>
</properties>
<!-- <distributionManagement>
diff --git a/Source/platformProject/vci-platform-web/pom.xml b/Source/platformProject/vci-platform-web/pom.xml
index 2923196..7043531 100644
--- a/Source/platformProject/vci-platform-web/pom.xml
+++ b/Source/platformProject/vci-platform-web/pom.xml
@@ -12,183 +12,192 @@
<artifactId>vci-platform-web</artifactId>
<dependencies>
- <dependency>
- <groupId>com.vci</groupId>
- <artifactId>vci-starter-parent</artifactId>
- <version>1.0-SNAPSHOT</version>
- <type>pom</type>
- </dependency>
- <dependency>
- <groupId>com.vci.corba</groupId>
- <artifactId>plt-slice</artifactId>
- <version>1.0.RELEASE</version>
- </dependency>
+ <dependency>
+ <groupId>com.vci</groupId>
+ <artifactId>vci-starter-parent</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <type>pom</type>
+ </dependency>
+ <dependency>
+ <groupId>com.vci.corba</groupId>
+ <artifactId>plt-slice</artifactId>
+ <version>1.0.RELEASE</version>
+ </dependency>
- <dependency>
- <groupId>com.vci</groupId>
- <artifactId>vci-starter-web</artifactId>
- <version>1.0-SNAPSHOT</version>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- <exclusion>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.vci</groupId>
- <artifactId>vci-starter-corba</artifactId>
- <version>1.0-SNAPSHOT</version>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency><!--鏂囦欢鐨勪俊鎭�-->
- <groupId>com.vci</groupId>
- <artifactId>vci-file-api</artifactId>
- <version>1.0-SNAPSHOT</version>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </exclusion>
- <exclusion>
- <groupId>org.apache.logging.log4j</groupId>
- <artifactId>*</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.vci</groupId>
- <artifactId>vci-file-integration</artifactId>
- <version>1.0-SNAPSHOT</version>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.vci</groupId>
- <artifactId>vci-starter-word</artifactId>
- <version>1.0-SNAPSHOT</version>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </exclusion>
- <exclusion>
- <groupId>com.vci</groupId>
- <artifactId>vci-starter-web</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.vci</groupId>
- <artifactId>vci-starter-poi</artifactId>
- <version>1.0-SNAPSHOT</version>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-thymeleaf</artifactId>
- </exclusion>
- <exclusion>
- <groupId>com.vci</groupId>
- <artifactId>vci-starter-web</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>eu.bitwalker</groupId>
- <artifactId>UserAgentUtils</artifactId>
- <version>1.20</version>
- </dependency>
- <!--寮�鍚� cache 缂撳瓨 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-cache</artifactId>
- <version>2.1.3.RELEASE</version>
- </dependency>
+ <dependency>
+ <groupId>com.vci</groupId>
+ <artifactId>vci-starter-web</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-thymeleaf</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>com.google.guava</groupId>
+ <artifactId>guava</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.vci</groupId>
+ <artifactId>vci-starter-corba</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-thymeleaf</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency><!--鏂囦欢鐨勪俊鎭�-->
+ <groupId>com.vci</groupId>
+ <artifactId>vci-file-api</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-thymeleaf</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.apache.logging.log4j</groupId>
+ <artifactId>*</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.vci</groupId>
+ <artifactId>vci-file-integration</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-thymeleaf</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.vci</groupId>
+ <artifactId>vci-starter-word</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-thymeleaf</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>com.vci</groupId>
+ <artifactId>vci-starter-web</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.vci</groupId>
+ <artifactId>vci-starter-poi</artifactId>
+ <version>1.0-SNAPSHOT</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-thymeleaf</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>com.vci</groupId>
+ <artifactId>vci-starter-web</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>eu.bitwalker</groupId>
+ <artifactId>UserAgentUtils</artifactId>
+ <version>1.20</version>
+ </dependency>
+ <!--寮�鍚� cache 缂撳瓨 -->
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-cache</artifactId>
+ <version>2.1.3.RELEASE</version>
+ </dependency>
- <!-- ehcache缂撳瓨 -->
- <dependency>
- <groupId>net.sf.ehcache</groupId>
- <artifactId>ehcache</artifactId>
- <version>2.9.1</version><!--$NO-MVN-MAN-VER$ -->
- </dependency>
+ <!-- ehcache缂撳瓨 -->
+ <dependency>
+ <groupId>net.sf.ehcache</groupId>
+ <artifactId>ehcache</artifactId>
+ <version>2.9.1</version><!--$NO-MVN-MAN-VER$ -->
+ </dependency>
- <dependency><!--java bean 鍜寈ml杞崲-->
- <groupId>com.thoughtworks.xstream</groupId>
- <artifactId>xstream</artifactId>
- <version>1.4.10</version>
- </dependency>
- <dependency><!--浠g爜鐢熸垚鍣ㄦ墍闇�妯℃澘-->
- <artifactId>velocity</artifactId>
- <groupId>org.apache.velocity</groupId>
- <version>1.7</version>
- </dependency>
- <dependency><!--鏁版嵁搴撴搷浣滃伐鍏�-->
- <groupId>com.vci.platform</groupId>
- <artifactId>ddlTool-client</artifactId>
- <version>${vciplt.version}</version>
- </dependency>
- <dependency><!--鏁版嵁搴撴搷浣滃伐鍏�-->
- <groupId>com.vci.platform</groupId>
- <artifactId>ddlTool-common</artifactId>
- <version>${vciplt.version}</version>
- </dependency>
- <dependency>
- <groupId>com.vci.client</groupId>
- <artifactId>plt-clientbase</artifactId>
- <version>1.0.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>com.zeroc</groupId>
- <artifactId>icegridgui</artifactId>
- <version>1.0.RELEASE</version>
- </dependency>
+ <dependency><!--java bean 鍜寈ml杞崲-->
+ <groupId>com.thoughtworks.xstream</groupId>
+ <artifactId>xstream</artifactId>
+ <version>1.4.10</version>
+ </dependency>
+ <dependency><!--浠g爜鐢熸垚鍣ㄦ墍闇�妯℃澘-->
+ <artifactId>velocity</artifactId>
+ <groupId>org.apache.velocity</groupId>
+ <version>1.7</version>
+ </dependency>
+ <dependency><!--鏁版嵁搴撴搷浣滃伐鍏�-->
+ <groupId>com.vci.platform</groupId>
+ <artifactId>ddlTool-client</artifactId>
+ <version>${vciplt.version}</version>
+ </dependency>
+ <dependency><!--鏁版嵁搴撴搷浣滃伐鍏�-->
+ <groupId>com.vci.platform</groupId>
+ <artifactId>ddlTool-common</artifactId>
+ <version>${vciplt.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.vci.client</groupId>
+ <artifactId>plt-clientbase</artifactId>
+ <version>1.0.RELEASE</version>
+ </dependency>
+ <dependency>
+ <groupId>com.zeroc</groupId>
+ <artifactId>icegridgui</artifactId>
+ <version>1.0.RELEASE</version>
+ </dependency>
<dependency>
<groupId>com.vci.common</groupId>
<artifactId>plt-common</artifactId>
<version>1.0.RELEASE</version>
</dependency>
- <dependency>
- <groupId>com.vci</groupId>
- <artifactId>vci-platform-starter</artifactId>
- <version>2022.1-SNAPSHOT</version>
- </dependency>
+ <dependency>
+ <groupId>com.vci</groupId>
+ <artifactId>vci-platform-starter</artifactId>
+ <version>2022.1-SNAPSHOT</version>
+ </dependency>
+ <dependency>
+ <groupId>org.reflections</groupId>
+ <artifactId>reflections</artifactId>
+ <version>0.9.11</version>
+ </dependency>
+ <dependency>
+ <groupId>org.projectlombok</groupId>
+ <artifactId>lombok</artifactId>
+ <version>${lombok.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>${jackson.version}</version>
+ </dependency>
- <dependency>
- <groupId>org.reflections</groupId>
- <artifactId>reflections</artifactId>
- <version>0.9.11</version>
- </dependency>
-
- <!--redis start-->
- <dependency>
- <groupId>org.springframework.data</groupId>
- <artifactId>spring-data-redis</artifactId>
- <version>2.1.5.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- <version>2.9.0</version>
- </dependency>
- <!--redis end-->
- </dependencies>
+ <!--redis start-->
+ <dependency>
+ <groupId>org.springframework.data</groupId>
+ <artifactId>spring-data-redis</artifactId>
+ <version>2.1.5.RELEASE</version>
+ </dependency>
+ <dependency>
+ <groupId>redis.clients</groupId>
+ <artifactId>jedis</artifactId>
+ <version>2.9.0</version>
+ </dependency>
+ <!--redis end-->
+ </dependencies>
<build>
<finalName>vci-platform-web</finalName>
@@ -211,34 +220,34 @@
</excludes>
</configuration>
</plugin>
-<!-- <plugin>-->
-<!-- <groupId>org.springframework.boot</groupId>-->
-<!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
-<!-- <configuration>-->
-<!-- <!–閲嶅啓鍖呭惈渚濊禆锛屽寘鍚笉瀛樺湪鐨勪緷璧栵紝jar閲屾病鏈塸om閲岀殑渚濊禆–>-->
-<!-- <includes>-->
-<!-- <include>-->
-<!-- <groupId>null</groupId>-->
-<!-- <artifactId>null</artifactId>-->
-<!-- </include>-->
-<!-- </includes>-->
-<!-- <layout>ZIP</layout>-->
-<!-- <!–浣跨敤澶栭儴閰嶇疆鏂囦欢锛宩ar鍖呴噷娌℃湁璧勬簮鏂囦欢–>-->
-<!-- <addResources>true</addResources>-->
-<!-- </configuration>-->
-<!-- <executions>-->
-<!-- <execution>-->
-<!-- <goals>-->
-<!-- <goal>repackage</goal>-->
-<!-- </goals>-->
-<!-- <configuration>-->
-<!-- <!–閰嶇疆jar鍖呯壒娈婃爣璇� 閰嶇疆鍚庯紝淇濈暀鍘熸枃浠讹紝鐢熸垚鏂版枃浠� *-run.jar –>-->
-<!-- <!–閰嶇疆jar鍖呯壒娈婃爣璇� 涓嶉厤缃紝鍘熸枃浠跺懡鍚嶄负 *.jar.original锛岀敓鎴愭柊鏂囦欢 *.jar –>-->
-<!-- <!–<classifier>run</classifier>–>-->
-<!-- </configuration>-->
-<!-- </execution>-->
-<!-- </executions>-->
-<!-- </plugin>-->
+ <!-- <plugin>-->
+ <!-- <groupId>org.springframework.boot</groupId>-->
+ <!-- <artifactId>spring-boot-maven-plugin</artifactId>-->
+ <!-- <configuration>-->
+ <!-- <!–閲嶅啓鍖呭惈渚濊禆锛屽寘鍚笉瀛樺湪鐨勪緷璧栵紝jar閲屾病鏈塸om閲岀殑渚濊禆–>-->
+ <!-- <includes>-->
+ <!-- <include>-->
+ <!-- <groupId>null</groupId>-->
+ <!-- <artifactId>null</artifactId>-->
+ <!-- </include>-->
+ <!-- </includes>-->
+ <!-- <layout>ZIP</layout>-->
+ <!-- <!–浣跨敤澶栭儴閰嶇疆鏂囦欢锛宩ar鍖呴噷娌℃湁璧勬簮鏂囦欢–>-->
+ <!-- <addResources>true</addResources>-->
+ <!-- </configuration>-->
+ <!-- <executions>-->
+ <!-- <execution>-->
+ <!-- <goals>-->
+ <!-- <goal>repackage</goal>-->
+ <!-- </goals>-->
+ <!-- <configuration>-->
+ <!-- <!–閰嶇疆jar鍖呯壒娈婃爣璇� 閰嶇疆鍚庯紝淇濈暀鍘熸枃浠讹紝鐢熸垚鏂版枃浠� *-run.jar –>-->
+ <!-- <!–閰嶇疆jar鍖呯壒娈婃爣璇� 涓嶉厤缃紝鍘熸枃浠跺懡鍚嶄负 *.jar.original锛岀敓鎴愭柊鏂囦欢 *.jar –>-->
+ <!-- <!–<classifier>run</classifier>–>-->
+ <!-- </configuration>-->
+ <!-- </execution>-->
+ <!-- </executions>-->
+ <!-- </plugin>-->
</plugins>
</build>
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java
index 3d9b040..9cfa35f 100644
--- a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/controller/WebUIDataController.java
@@ -43,6 +43,7 @@
* @return 鍒楄〃鏁版嵁
*/
@PostMapping("/dataGridQuery")
+ @VciUnCheckRight
@VciBusinessLog(operateName = "鍒楄〃鏁版嵁鐨勬煡璇�",description = "${param.btmname}閲岀殑${param.tableDefineId}")
public DataGrid dataGrid(UIDataGridQuery dataGridQuery){
return uiDataService.getDataForGrid(dataGridQuery);
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIEngineServiceI.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIEngineServiceI.java
index dbce492..07010d9 100644
--- a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIEngineServiceI.java
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/UIEngineServiceI.java
@@ -1,13 +1,10 @@
package com.vci.web.service;
-
-import com.vci.corba.common.VCIError;
-import com.vci.corba.portal.data.PLAction;
import com.vci.corba.portal.data.PLTabButton;
import com.vci.corba.portal.data.PLUILayout;
import com.vci.corba.portal.data.PortalVI;
+import com.vci.corba.portal.data.PLAction;
import com.vci.web.pageModel.*;
-import plm.corba.portal.PLPageLayoutDefination;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -127,14 +124,14 @@
* @param actions 鏁版嵁瀵硅薄
* @return 鏄剧ず瀵硅薄
*/
- List<UIActionVO> actionDO2VOs(Collection<com.vci.corba.portal.data.PLAction> actions);
+ List<UIActionVO> actionDO2VOs(Collection<PLAction> actions);
/**
* action鏁版嵁瀵硅薄杞崲涓烘樉绀哄璞�
* @param action 鏁版嵁瀵硅薄
* @return 鏄剧ず瀵硅薄
*/
- UIActionVO actionDO2VO(com.vci.corba.portal.data.PLAction action);
+ UIActionVO actionDO2VO(PLAction action);
/**
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java
index 7c79482..5e6e69a 100644
--- a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIDataServiceImpl.java
@@ -5,7 +5,6 @@
import com.vci.frameworkcore.lcstatuspck.FrameworkDataLCStatus;
import com.vci.frameworkcore.lcstatuspck.ReleaseDataLCStatus;
import com.vci.starter.revision.bo.TreeWrapperOptions;
-import com.vci.starter.revision.service.RevisionModelUtil;
import com.vci.starter.web.annotation.bus.VciChangeDataAfter;
import com.vci.starter.web.annotation.bus.VciChangeDataBefore;
import com.vci.starter.web.annotation.bus.VciChangeDataPlugin;
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java
index ea1e16f..a4f664c 100644
--- a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/service/impl/UIEngineServiceImpl.java
@@ -6,6 +6,7 @@
import com.thoughtworks.xstream.io.xml.XppDriver;
import com.vci.client.common.providers.ServiceProvider;
import com.vci.corba.common.VCIError;
+import com.vci.corba.portal.data.PLTabButton;
import com.vci.corba.portal.data.PLUILayout;
import com.vci.starter.web.annotation.log.VciUnLog;
import com.vci.starter.web.exception.VciBaseException;
@@ -39,6 +40,11 @@
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
+import com.vci.corba.portal.data.PortalVI;
+import com.vci.corba.portal.data.PLTabPage;
+import com.vci.corba.portal.data.PLAction;
+import com.vci.corba.portal.data.PLPageDefination;
+import com.vci.corba.portal.data.PLCommandParameter;
import plm.corba.portal.*;
import java.util.*;
@@ -53,7 +59,7 @@
*
*/
@Service
-public class UIEngineServiceImpl implements UIEngineServiceI {
+public class UIEngineServiceImpl implements UIEngineServiceI {
/**
* 鏄惁浠庣紦瀛樹腑鏌ヨ
@@ -137,7 +143,8 @@
public void checkInvalidXmlVI() {
PortalVI[] portalVIS = null;
try {
- portalVIS = platformClientUtil.getPortalService().getAllPortalVI();
+ portalVIS = ServiceProvider.getUIService().getAllPortalVI();
+ // portalVIS = platformClientUtil.getPortalService().getAllPortalVI();
} catch (VCIError vciError) {
throw WebUtil.getVciBaseException(vciError);
}
@@ -159,13 +166,13 @@
@Override
@VciUnLog
public List<UIFormDefineVO> selectAllForm() {
- com.vci.corba.portal.data.PortalVI[] portalVIS = null;
+ PortalVI[] portalVIS = null;
try {
portalVIS = ServiceProvider.getUIService().getAllPortalVI();
} catch (VCIError vciError) {
throw WebUtil.getVciBaseException(vciError);
}
- List<com.vci.corba.portal.data.PortalVI> portalVIList = Arrays.stream(portalVIS).filter(portal -> 1 == portal.viType).collect(Collectors.toList());
+ List<PortalVI> portalVIList = Arrays.stream(portalVIS).filter(portal -> 1 == portal.viType).collect(Collectors.toList());
return formDO2VOs(portalVIList);
}
@@ -187,9 +194,9 @@
* @return 鏄剧ず瀵硅薄
*/
@Override
- public List<UIFormDefineVO> formDO2VOs(Collection<com.vci.corba.portal.data.PortalVI> portalVIS) {
+ public List<UIFormDefineVO> formDO2VOs(Collection<PortalVI> portalVIS) {
List<UIFormDefineVO> formDefineVOList = new ArrayList<>();
- Optional.ofNullable(portalVIS).orElseGet(()->new ArrayList<com.vci.corba.portal.data.PortalVI>()).stream().forEach(portal->{
+ Optional.ofNullable(portalVIS).orElseGet(()->new ArrayList<PortalVI>()).stream().forEach(portal->{
try {
UIFormDefineVO defineVO = formDO2VO(portal);
formDefineVOList.add(defineVO);
@@ -210,7 +217,7 @@
*/
@Override
@VciUnLog
- public UIFormDefineVO formDO2VO(com.vci.corba.portal.data.PortalVI portal) {
+ public UIFormDefineVO formDO2VO(PortalVI portal) {
if(portal == null ||StringUtils.isBlank(portal.prm)){
throw new VciBaseException("琛ㄥ崟鍙兘涓嶅瓨鍦紝鍥犱负鏈兘鑾峰彇鍒板畠鐨勪俊鎭�");
}
@@ -410,7 +417,7 @@
return null;
}
if(!QUERY_BY_CACHE){
- com.vci.corba.portal.data.PortalVI portalVI = null;
+ PortalVI portalVI = null;
try {
portalVI = ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmId, id);
} catch (VCIError vciError) {
@@ -453,13 +460,13 @@
@Cacheable(value = VCI_OBJECT_SERVICE,key = CacheKeyConstant.ALL_TABLE,unless = "#result == null")
@VciUnLog
public List<UITableDefineVO> selectAllTable() {
- com.vci.corba.portal.data.PortalVI[] portalVIS = null;
+ PortalVI[] portalVIS = null;
try {
portalVIS = ServiceProvider.getUIService().getAllPortalVI();
} catch (VCIError vciError) {
throw WebUtil.getVciBaseException(vciError);
}
- List<com.vci.corba.portal.data.PortalVI> portalVIList = Arrays.stream(portalVIS).filter(portal -> 0 == portal.viType).collect(Collectors.toList());
+ List<PortalVI> portalVIList = Arrays.stream(portalVIS).filter(portal -> 0 == portal.viType).collect(Collectors.toList());
return tableDO2VOs(portalVIList,false);
}
@@ -482,9 +489,9 @@
*/
@Override
@VciUnLog
- public List<UITableDefineVO> tableDO2VOs(Collection<com.vci.corba.portal.data.PortalVI> prms, boolean queryDetail) {
+ public List<UITableDefineVO> tableDO2VOs(Collection<PortalVI> prms, boolean queryDetail) {
List<UITableDefineVO> tableDefineVOList = new ArrayList<>();
- Optional.ofNullable(prms).orElseGet(()->new ArrayList<com.vci.corba.portal.data.PortalVI>()).stream().forEach(portal->{
+ Optional.ofNullable(prms).orElseGet(()->new ArrayList<PortalVI>()).stream().forEach(portal->{
UITableDefineVO defineVO = tableDO2VO(portal,queryDetail);
tableDefineVOList.add(defineVO);
});
@@ -500,7 +507,10 @@
*/
@Override
@VciUnLog
- public UITableDefineVO tableDO2VO(com.vci.corba.portal.data.PortalVI portal, boolean queryDetail) {
+ public UITableDefineVO tableDO2VO(PortalVI portal, boolean queryDetail) {
+ if(null != null){
+
+ }
UITableDefineVO tableDefineVO = new UITableDefineVO();
tableDefineVO.setOid(portal.id);
tableDefineVO.setId(portal.viName);
@@ -730,7 +740,7 @@
return null;
}
if(!QUERY_BY_CACHE){
- com.vci.corba.portal.data.PortalVI portalVI = null;
+ PortalVI portalVI = null;
try {
portalVI = ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmId, id);
} catch (VCIError vciError) {
@@ -799,7 +809,7 @@
*/
@Override
@VciUnLog
- public List<UIActionVO> actionDO2VOs(Collection<com.vci.corba.portal.data.PLAction> actions) {
+ public List<UIActionVO> actionDO2VOs(Collection<PLAction> actions) {
List<UIActionVO> actionVOS = new ArrayList<>();
Optional.ofNullable(actions).orElseGet(()->new ArrayList<>()).stream().forEach(action->{
UIActionVO actionVO = actionDO2VO(action);
@@ -816,7 +826,7 @@
*/
@Override
@VciUnLog
- public UIActionVO actionDO2VO(com.vci.corba.portal.data.PLAction action) {
+ public UIActionVO actionDO2VO(PLAction action) {
UIActionVO actionVO = new UIActionVO();
if(action!=null){
actionVO.setOid(action.plOId);
@@ -829,8 +839,8 @@
actionVO.setCreator(action.plCreateUser);
actionVO.setLastModifier(action.plModifyUser);
try {
- actionVO.setCreateTime(new Date(action.plCreateTime));
- actionVO.setLastModifyTime(new Date(action.plCreateTime));
+ actionVO.setCreateTime(VciDateUtil.str2Date(String.valueOf(action.plCreateTime), VciDateUtil.DateTimeFormat));
+ actionVO.setLastModifyTime(VciDateUtil.str2Date(String.valueOf(action.plCreateTime), VciDateUtil.DateTimeFormat));
}catch (Throwable e){
logger.error("杞崲鏃堕棿",e);
}
@@ -914,8 +924,8 @@
contentVO.setDescription(pageLayoutDefination.plDesc);
contentVO.setCreator(pageLayoutDefination.plCreateUser);
try {
- contentVO.setCreateTime(new Date(pageLayoutDefination.plCreateTime));
- contentVO.setLastModifyTime(new Date(pageLayoutDefination.plModifyTime));
+ contentVO.setCreateTime(VciDateUtil.str2Date(String.valueOf(pageLayoutDefination.plCreateTime),VciDateUtil.DateTimeFormat));
+ contentVO.setLastModifyTime(VciDateUtil.str2Date(String.valueOf(pageLayoutDefination.plModifyTime),VciDateUtil.DateTimeFormat));
} catch (Exception e) {
e.printStackTrace();
}
@@ -998,24 +1008,24 @@
return contentVO;
}
-// private List<UILayoutVO> swapLayArea(List<UILayoutVO> layoutVOS){
-// List<UILayoutVO> layoutVOList = new ArrayList<>();
-// //1 瀵艰埅鍖�
-// //2 涓诲唴瀹瑰尯
-// //3 椤电鍖�
-// if(!CollectionUtils.isEmpty(layoutVOS)){
-// //鍙湁涓�涓尯鍩熺殑鏃跺�欙紝閮芥斁鍦╟enter閲岋紝鍝�曟湰韬槸瀵艰埅鍖�
-// if(layoutVOS.size() == 1){
-// layoutVOS.get(0).setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue());
-// layoutVOList.add(layoutVOS.get(0));
-// }else{
-// Map<String,List<UILayoutVO>> layoutAreaMap = layoutVOS.stream().collect(Collectors.groupingBy(UILayoutVO::getLayoutAreaType));
-// if(layoutAreaMap.containsKey("1")){
-// //
-// }
-// }
-// }
-// }
+ // private List<UILayoutVO> swapLayArea(List<UILayoutVO> layoutVOS){
+ // List<UILayoutVO> layoutVOList = new ArrayList<>();
+ // //1 瀵艰埅鍖�
+ // //2 涓诲唴瀹瑰尯
+ // //3 椤电鍖�
+ // if(!CollectionUtils.isEmpty(layoutVOS)){
+ // //鍙湁涓�涓尯鍩熺殑鏃跺�欙紝閮芥斁鍦╟enter閲岋紝鍝�曟湰韬槸瀵艰埅鍖�
+ // if(layoutVOS.size() == 1){
+ // layoutVOS.get(0).setLayoutAreaType(UILayoutAreaTypeEnum.CENTER.getValue());
+ // layoutVOList.add(layoutVOS.get(0));
+ // }else{
+ // Map<String,List<UILayoutVO>> layoutAreaMap = layoutVOS.stream().collect(Collectors.groupingBy(UILayoutVO::getLayoutAreaType));
+ // if(layoutAreaMap.containsKey("1")){
+ // //
+ // }
+ // }
+ // }
+ // }
/**
* 鑾峰彇鏌愪釜UI涓婁笅鏂囩殑鍖哄煙
@@ -1082,9 +1092,9 @@
* @param pages 鍖哄煙鐨勬暟鎹璞�
* @return 鏄剧ず瀵硅薄
*/
- private List<UILayoutVO> UILayoutDO2VOs(Collection<com.vci.corba.portal.data.PLTabPage> pages, boolean queryDetail){
+ private List<UILayoutVO> UILayoutDO2VOs(Collection<PLTabPage> pages, boolean queryDetail){
List<UILayoutVO> contentVOS = new ArrayList<>();
- Optional.ofNullable(pages).orElseGet(()->new ArrayList<com.vci.corba.portal.data.PLTabPage>()).stream().forEach(page->{
+ Optional.ofNullable(pages).orElseGet(()->new ArrayList<PLTabPage>()).stream().forEach(page->{
UILayoutVO layoutVO = UILayoutDO2VO(page, queryDetail);
if(layoutVO.isEnableStatus()) {
contentVOS.add(layoutVO);
@@ -1108,7 +1118,7 @@
* @return 鍖哄煙鐨勬樉绀哄璞�
*/
@VciUnLog
- private UILayoutVO UILayoutDO2VO(com.vci.corba.portal.data.PLTabPage page, boolean queryDetail){
+ private UILayoutVO UILayoutDO2VO(PLTabPage page, boolean queryDetail){
UILayoutVO layoutVO = new UILayoutVO();
if(page !=null ){
layoutVO.setOid(page.plOId);
@@ -1136,8 +1146,8 @@
}
layoutVO.setCreator(page.plCreateUser);
try {
- layoutVO.setCreateTime(new Date(page.plCreateTime));
- layoutVO.setLastModifyTime(new Date(page.plModifyTime));
+ layoutVO.setCreateTime(VciDateUtil.str2Date(String.valueOf(page.plCreateTime),VciDateUtil.DateTimeFormat));
+ layoutVO.setLastModifyTime(VciDateUtil.str2Date(String.valueOf(page.plModifyTime),VciDateUtil.DateTimeFormat));
} catch (Exception e) {
e.printStackTrace();
}
@@ -1196,8 +1206,7 @@
}
if(!QUERY_BY_CACHE){
try {
- platformClientUtil.getPortalService().getPLPageDefinationById(componentOid);
- return uiComponentDO2VO(null,true);
+ return uiComponentDO2VO(ServiceProvider.getUIService().getPLPageDefinationById(componentOid),true);
} catch (VCIError vciError) {
throw WebUtil.getVciBaseException(vciError);
}
@@ -1216,7 +1225,7 @@
* @param pages 鏁版嵁瀵硅薄
* @return 鏄剧ず瀵硅薄
*/
- private List<UIComponentVO> uiComponentDO2VOs(Collection<com.vci.corba.portal.data.PLPageDefination> pages, boolean queryDetail){
+ private List<UIComponentVO> uiComponentDO2VOs(Collection<PLPageDefination> pages, boolean queryDetail){
List<UIComponentVO> componentVOS = new ArrayList<>();
pages.stream().forEach(page->{
componentVOS.add(uiComponentDO2VO(page,queryDetail));
@@ -1230,7 +1239,7 @@
* @return 鏄剧ず瀵硅薄
*/
@VciUnLog
- private UIComponentVO uiComponentDO2VO(com.vci.corba.portal.data.PLPageDefination page, boolean queryDetail){
+ private UIComponentVO uiComponentDO2VO(PLPageDefination page, boolean queryDetail){
UIComponentVO componentVO = new UIComponentVO();
if(page !=null){
componentVO.setOid(page.plOId);
@@ -1270,6 +1279,7 @@
}else{
try {
componentVO.setTableDefineVO(tableDO2VO(ServiceProvider.getUIService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true));
+ //componentVO.setTableDefineVO(tableDO2VO(platformClientUtil.getPortalService().getPortalVIByTypeNameAndVIName(btmType,componentDefineXO.getTemplateId()),true));
} catch (VCIError vciError) {
throw WebUtil.getVciBaseException(vciError);
}
@@ -1426,8 +1436,6 @@
}
}
-
-
/**
* 鎸夐挳鐨勬暟鎹璞¤浆鎹负鏄剧ず瀵硅薄
* @param buttons 鎸夐挳鐨勬暟鎹璞�
@@ -1448,10 +1456,10 @@
* @return 鏄剧ず瀵硅薄
*/
@Override
- public UIButtonDefineVO buttonDO2VO(com.vci.corba.portal.data.PLTabButton button) {
+ public UIButtonDefineVO buttonDO2VO(PLTabButton button) {
UIButtonDefineVO buttonVO = new UIButtonDefineVO();
Map<String, UIActionVO> actionVOMap = self.selectAllActionMap();
-// Map<String, UIActionVO> actionVOMap = ServiceProvider.getUIService().getAllPLAction();
+ //Map<String, UIActionVO> actionVOMap = ServiceProvider.getUIService().getAllPLAction();
if(button !=null){
buttonVO.setOid(button.plOId);
buttonVO.setPkComponent(button.plTableOId);
@@ -1482,10 +1490,10 @@
//鏌ユ壘鍙傛暟
Map<String,String> params = new HashMap<>();
try {
-// PLCommandParameter[] parameters = platformClientUtil.getPortalService().getPLCommandParametersByCommandOId(buttonVO.getOid());
- com.vci.corba.portal.data.PLCommandParameter[] parameters = ServiceProvider.getUIService().getPLCommandParametersByCommandOId(buttonVO.getOid());
+ //PLCommandParameter[] parameters = platformClientUtil.getPortalService().getPLCommandParametersByCommandOId(buttonVO.getOid());
+ PLCommandParameter[] parameters = ServiceProvider.getUIService().getPLCommandParametersByCommandOId(buttonVO.getOid());
if(parameters!=null && parameters.length > 0){
- for(com.vci.corba.portal.data.PLCommandParameter parameter: parameters){
+ for(PLCommandParameter parameter: parameters){
params.put(parameter.plKey,parameter.plValue);
}
}
@@ -1560,8 +1568,9 @@
break;
}
}
-// return UIContentDO2VO(context,true);
+ //return UIContentDO2VO(context,true);
return UIContentDO2VO(null,true);
}
+
}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/support/StrSpliter.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/support/StrSpliter.java
new file mode 100644
index 0000000..86ba0db
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/support/StrSpliter.java
@@ -0,0 +1,501 @@
+package com.vci.web.support;
+
+import com.vci.web.util.StringUtil;
+import com.vci.web.util.Func;
+import com.vci.web.util.StringPool;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 瀛楃涓插垏鍒嗗櫒
+ *
+ * @author Looly
+ */
+public class StrSpliter {
+
+ //---------------------------------------------------------------------------------------------- Split by char
+
+ /**
+ * 鍒囧垎瀛楃涓茶矾寰勶紝浠呮敮鎸乁nix鍒嗙晫绗︼細/
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> splitPath(String str) {
+ return splitPath(str, 0);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓茶矾寰勶紝浠呮敮鎸乁nix鍒嗙晫绗︼細/
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static String[] splitPathToArray(String str) {
+ return toArray(splitPath(str));
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓茶矾寰勶紝浠呮敮鎸乁nix鍒嗙晫绗︼細/
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> splitPath(String str, int limit) {
+ return split(str, StringPool.SLASH, limit, true, true);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓茶矾寰勶紝浠呮敮鎸乁nix鍒嗙晫绗︼細/
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static String[] splitPathToArray(String str, int limit) {
+ return toArray(splitPath(str, limit));
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.1
+ */
+ public static List<String> splitTrim(String str, char separator, boolean ignoreEmpty) {
+ return split(str, separator, 0, true, ignoreEmpty);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> split(String str, char separator, boolean isTrim, boolean ignoreEmpty) {
+ return split(str, separator, 0, isTrim, ignoreEmpty);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝澶у皬鍐欐晱鎰燂紝鍘婚櫎姣忎釜鍏冪礌涓よ竟绌虹櫧绗�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁帮紝-1涓嶉檺鍒�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> splitTrim(String str, char separator, int limit, boolean ignoreEmpty) {
+ return split(str, separator, limit, true, ignoreEmpty, false);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝澶у皬鍐欐晱鎰�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁帮紝-1涓嶉檺鍒�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> split(String str, char separator, int limit, boolean isTrim, boolean ignoreEmpty) {
+ return split(str, separator, limit, isTrim, ignoreEmpty, false);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝蹇界暐澶у皬鍐�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁帮紝-1涓嶉檺鍒�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.1
+ */
+ public static List<String> splitIgnoreCase(String str, char separator, int limit, boolean isTrim, boolean ignoreEmpty) {
+ return split(str, separator, limit, isTrim, ignoreEmpty, true);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁帮紝-1涓嶉檺鍒�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @param ignoreCase 鏄惁蹇界暐澶у皬鍐�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.1
+ */
+ public static List<String> split(String str, char separator, int limit, boolean isTrim, boolean ignoreEmpty, boolean ignoreCase) {
+ if (StringUtil.isEmpty(str)) {
+ return new ArrayList<String>(0);
+ }
+ if (limit == 1) {
+ return addToList(new ArrayList<String>(1), str, isTrim, ignoreEmpty);
+ }
+
+ final ArrayList<String> list = new ArrayList<>(limit > 0 ? limit : 16);
+ int len = str.length();
+ int start = 0;
+ for (int i = 0; i < len; i++) {
+ if (Func.equals(separator, str.charAt(i))) {
+ addToList(list, str.substring(start, i), isTrim, ignoreEmpty);
+ start = i + 1;
+
+ //妫�鏌ユ槸鍚﹁秴鍑鸿寖鍥达紙鏈�澶у厑璁竘imit-1涓紝鍓╀笅涓�涓暀缁欐湯灏惧瓧绗︿覆锛�
+ if (limit > 0 && list.size() > limit - 2) {
+ break;
+ }
+ }
+ }
+ return addToList(list, str.substring(start, len), isTrim, ignoreEmpty);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓蹭负瀛楃涓叉暟缁�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static String[] splitToArray(String str, char separator, int limit, boolean isTrim, boolean ignoreEmpty) {
+ return toArray(split(str, separator, limit, isTrim, ignoreEmpty));
+ }
+
+ //---------------------------------------------------------------------------------------------- Split by String
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝涓嶅拷鐣ュぇ灏忓啓
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗︿覆
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> split(String str, String separator, boolean isTrim, boolean ignoreEmpty) {
+ return split(str, separator, -1, isTrim, ignoreEmpty, false);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝鍘婚櫎姣忎釜鍏冪礌涓よ竟绌烘牸锛屽拷鐣ュぇ灏忓啓
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗︿覆
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.1
+ */
+ public static List<String> splitTrim(String str, String separator, boolean ignoreEmpty) {
+ return split(str, separator, true, ignoreEmpty);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝涓嶅拷鐣ュぇ灏忓啓
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗︿覆
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> split(String str, String separator, int limit, boolean isTrim, boolean ignoreEmpty) {
+ return split(str, separator, limit, isTrim, ignoreEmpty, false);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝鍘婚櫎姣忎釜鍏冪礌涓よ竟绌烘牸锛屽拷鐣ュぇ灏忓啓
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗︿覆
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.1
+ */
+ public static List<String> splitTrim(String str, String separator, int limit, boolean ignoreEmpty) {
+ return split(str, separator, limit, true, ignoreEmpty);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝蹇界暐澶у皬鍐�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗︿覆
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.1
+ */
+ public static List<String> splitIgnoreCase(String str, String separator, int limit, boolean isTrim, boolean ignoreEmpty) {
+ return split(str, separator, limit, isTrim, ignoreEmpty, true);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝鍘婚櫎姣忎釜鍏冪礌涓よ竟绌烘牸锛屽拷鐣ュぇ灏忓啓
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗︿覆
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.1
+ */
+ public static List<String> splitTrimIgnoreCase(String str, String separator, int limit, boolean ignoreEmpty) {
+ return split(str, separator, limit, true, ignoreEmpty, true);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗︿覆
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @param ignoreCase 鏄惁蹇界暐澶у皬鍐�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.1
+ */
+ public static List<String> split(String str, String separator, int limit, boolean isTrim, boolean ignoreEmpty, boolean ignoreCase) {
+ if (StringUtil.isEmpty(str)) {
+ return new ArrayList<String>(0);
+ }
+ if (limit == 1) {
+ return addToList(new ArrayList<String>(1), str, isTrim, ignoreEmpty);
+ }
+
+ if (StringUtil.isEmpty(separator)) {
+ return split(str, limit);
+ } else if (separator.length() == 1) {
+ return split(str, separator.charAt(0), limit, isTrim, ignoreEmpty, ignoreCase);
+ }
+
+ final ArrayList<String> list = new ArrayList<>();
+ int len = str.length();
+ int separatorLen = separator.length();
+ int start = 0;
+ int i = 0;
+ while (i < len) {
+ i = StringUtil.indexOf(str, separator, start, ignoreCase);
+ if (i > -1) {
+ addToList(list, str.substring(start, i), isTrim, ignoreEmpty);
+ start = i + separatorLen;
+
+ //妫�鏌ユ槸鍚﹁秴鍑鸿寖鍥达紙鏈�澶у厑璁竘imit-1涓紝鍓╀笅涓�涓暀缁欐湯灏惧瓧绗︿覆锛�
+ if (limit > 0 && list.size() > limit - 2) {
+ break;
+ }
+ } else {
+ break;
+ }
+ }
+ return addToList(list, str.substring(start, len), isTrim, ignoreEmpty);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓蹭负瀛楃涓叉暟缁�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static String[] splitToArray(String str, String separator, int limit, boolean isTrim, boolean ignoreEmpty) {
+ return toArray(split(str, separator, limit, isTrim, ignoreEmpty));
+ }
+
+ //---------------------------------------------------------------------------------------------- Split by Whitespace
+
+ /**
+ * 浣跨敤绌虹櫧绗﹀垏鍒嗗瓧绗︿覆<br>
+ * 鍒囧垎鍚庣殑瀛楃涓蹭袱杈逛笉鍖呭惈绌虹櫧绗︼紝绌轰覆鎴栫┖鐧界涓插苟涓嶅仛涓哄厓绱犱箣涓�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> split(String str, int limit) {
+ if (StringUtil.isEmpty(str)) {
+ return new ArrayList<String>(0);
+ }
+ if (limit == 1) {
+ return addToList(new ArrayList<String>(1), str, true, true);
+ }
+
+ final ArrayList<String> list = new ArrayList<>();
+ int len = str.length();
+ int start = 0;
+ for (int i = 0; i < len; i++) {
+ if (Func.isEmpty(str.charAt(i))) {
+ addToList(list, str.substring(start, i), true, true);
+ start = i + 1;
+ if (limit > 0 && list.size() > limit - 2) {
+ break;
+ }
+ }
+ }
+ return addToList(list, str.substring(start, len), true, true);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓蹭负瀛楃涓叉暟缁�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static String[] splitToArray(String str, int limit) {
+ return toArray(split(str, limit));
+ }
+
+ //---------------------------------------------------------------------------------------------- Split by regex
+
+ /**
+ * 閫氳繃姝e垯鍒囧垎瀛楃涓�
+ *
+ * @param str 瀛楃涓�
+ * @param separatorPattern 鍒嗛殧绗︽鍒檣@link Pattern}
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> split(String str, Pattern separatorPattern, int limit, boolean isTrim, boolean ignoreEmpty) {
+ if (StringUtil.isEmpty(str)) {
+ return new ArrayList<String>(0);
+ }
+ if (limit == 1) {
+ return addToList(new ArrayList<String>(1), str, isTrim, ignoreEmpty);
+ }
+
+ if (null == separatorPattern) {
+ return split(str, limit);
+ }
+
+ final Matcher matcher = separatorPattern.matcher(str);
+ final ArrayList<String> list = new ArrayList<>();
+ int len = str.length();
+ int start = 0;
+ while (matcher.find()) {
+ addToList(list, str.substring(start, matcher.start()), isTrim, ignoreEmpty);
+ start = matcher.end();
+
+ if (limit > 0 && list.size() > limit - 2) {
+ break;
+ }
+ }
+ return addToList(list, str.substring(start, len), isTrim, ignoreEmpty);
+ }
+
+ /**
+ * 閫氳繃姝e垯鍒囧垎瀛楃涓蹭负瀛楃涓叉暟缁�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separatorPattern 鍒嗛殧绗︽鍒檣@link Pattern}
+ * @param limit 闄愬埗鍒嗙墖鏁�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static String[] splitToArray(String str, Pattern separatorPattern, int limit, boolean isTrim, boolean ignoreEmpty) {
+ return toArray(split(str, separatorPattern, limit, isTrim, ignoreEmpty));
+ }
+
+ //---------------------------------------------------------------------------------------------- Split by length
+
+ /**
+ * 鏍规嵁缁欏畾闀垮害锛屽皢缁欏畾瀛楃涓叉埅鍙栦负澶氫釜閮ㄥ垎
+ *
+ * @param str 瀛楃涓�
+ * @param len 姣忎竴涓皬鑺傜殑闀垮害
+ * @return 鎴彇鍚庣殑瀛楃涓叉暟缁�
+ */
+ public static String[] splitByLength(String str, int len) {
+ int partCount = str.length() / len;
+ int lastPartCount = str.length() % len;
+ int fixPart = 0;
+ if (lastPartCount != 0) {
+ fixPart = 1;
+ }
+
+ final String[] strs = new String[partCount + fixPart];
+ for (int i = 0; i < partCount + fixPart; i++) {
+ if (i == partCount + fixPart - 1 && lastPartCount != 0) {
+ strs[i] = str.substring(i * len, i * len + lastPartCount);
+ } else {
+ strs[i] = str.substring(i * len, i * len + len);
+ }
+ }
+ return strs;
+ }
+
+ //---------------------------------------------------------------------------------------------------------- Private method start
+
+ /**
+ * 灏嗗瓧绗︿覆鍔犲叆List涓�
+ *
+ * @param list 鍒楄〃
+ * @param part 琚姞鍏ョ殑閮ㄥ垎
+ * @param isTrim 鏄惁鍘婚櫎涓ょ绌虹櫧绗�
+ * @param ignoreEmpty 鏄惁鐣ヨ繃绌哄瓧绗︿覆锛堢┖瀛楃涓蹭笉鍋氫负涓�涓厓绱狅級
+ * @return 鍒楄〃
+ */
+ private static List<String> addToList(List<String> list, String part, boolean isTrim, boolean ignoreEmpty) {
+ part = part.toString();
+ if (isTrim) {
+ part = part.trim();
+ }
+ if (false == ignoreEmpty || false == part.isEmpty()) {
+ list.add(part);
+ }
+ return list;
+ }
+
+ /**
+ * List杞珹rray
+ *
+ * @param list List
+ * @return Array
+ */
+ private static String[] toArray(List<String> list) {
+ return list.toArray(new String[list.size()]);
+ }
+ //---------------------------------------------------------------------------------------------------------- Private method end
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Base64Util.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Base64Util.java
new file mode 100644
index 0000000..56a3003
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Base64Util.java
@@ -0,0 +1,115 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+package com.vci.web.util;
+
+/**
+ * Base64宸ュ叿
+ *
+ * @author L.cm
+ */
+public class Base64Util extends org.springframework.util.Base64Utils {
+
+ /**
+ * 缂栫爜
+ *
+ * @param value 瀛楃涓�
+ * @return {String}
+ */
+ public static String encode(String value) {
+ return Base64Util.encode(value, Charsets.UTF_8);
+ }
+
+ /**
+ * 缂栫爜
+ *
+ * @param value 瀛楃涓�
+ * @param charset 瀛楃闆�
+ * @return {String}
+ */
+ public static String encode(String value, java.nio.charset.Charset charset) {
+ byte[] val = value.getBytes(charset);
+ return new String(Base64Util.encode(val), charset);
+ }
+
+ /**
+ * 缂栫爜URL瀹夊叏
+ *
+ * @param value 瀛楃涓�
+ * @return {String}
+ */
+ public static String encodeUrlSafe(String value) {
+ return Base64Util.encodeUrlSafe(value, Charsets.UTF_8);
+ }
+
+ /**
+ * 缂栫爜URL瀹夊叏
+ *
+ * @param value 瀛楃涓�
+ * @param charset 瀛楃闆�
+ * @return {String}
+ */
+ public static String encodeUrlSafe(String value, java.nio.charset.Charset charset) {
+ byte[] val = value.getBytes(charset);
+ return new String(Base64Util.encodeUrlSafe(val), charset);
+ }
+
+ /**
+ * 瑙g爜
+ *
+ * @param value 瀛楃涓�
+ * @return {String}
+ */
+ public static String decode(String value) {
+ return Base64Util.decode(value, Charsets.UTF_8);
+ }
+
+ /**
+ * 瑙g爜
+ *
+ * @param value 瀛楃涓�
+ * @param charset 瀛楃闆�
+ * @return {String}
+ */
+ public static String decode(String value, java.nio.charset.Charset charset) {
+ byte[] val = value.getBytes(charset);
+ byte[] decodedValue = Base64Util.decode(val);
+ return new String(decodedValue, charset);
+ }
+
+ /**
+ * 瑙g爜URL瀹夊叏
+ *
+ * @param value 瀛楃涓�
+ * @return {String}
+ */
+ public static String decodeUrlSafe(String value) {
+ return Base64Util.decodeUrlSafe(value, Charsets.UTF_8);
+ }
+
+ /**
+ * 瑙g爜URL瀹夊叏
+ *
+ * @param value 瀛楃涓�
+ * @param charset 瀛楃闆�
+ * @return {String}
+ */
+ public static String decodeUrlSafe(String value, java.nio.charset.Charset charset) {
+ byte[] val = value.getBytes(charset);
+ byte[] decodedValue = Base64Util.decodeUrlSafe(val);
+ return new String(decodedValue, charset);
+ }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/BeanUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/BeanUtil.java
new file mode 100644
index 0000000..da93b8c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/BeanUtil.java
@@ -0,0 +1,424 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+package com.vci.web.util;
+
+
+import com.vci.web.util.beans.BeanProperty;
+import com.vci.web.util.beans.BladeBeanCopier;
+import com.vci.web.util.convert.BladeConverter;
+import com.vci.web.util.beans.BladeBeanMap;
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.BeansException;
+import org.springframework.beans.PropertyAccessorFactory;
+import org.springframework.cglib.beans.BeanGenerator;
+import org.springframework.lang.Nullable;
+
+import java.util.*;
+
+/**
+ * 瀹炰綋宸ュ叿绫�
+ *
+ * @author L.cm
+ */
+public class BeanUtil extends org.springframework.beans.BeanUtils {
+
+ /**
+ * 瀹炰緥鍖栧璞�
+ *
+ * @param clazz 绫�
+ * @param <T> 娉涘瀷鏍囪
+ * @return 瀵硅薄
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> T newInstance(Class<?> clazz) {
+ return (T) instantiateClass(clazz);
+ }
+
+ /**
+ * 瀹炰緥鍖栧璞�
+ *
+ * @param clazzStr 绫诲悕
+ * @param <T> 娉涘瀷鏍囪
+ * @return 瀵硅薄
+ */
+ public static <T> T newInstance(String clazzStr) {
+ try {
+ Class<?> clazz = ClassUtil.forName(clazzStr, null);
+ return newInstance(clazz);
+ } catch (ClassNotFoundException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ /**
+ * 鑾峰彇Bean鐨勫睘鎬�, 鏀寔 propertyName 澶氱骇 锛歵est.user.name
+ *
+ * @param bean bean
+ * @param propertyName 灞炴�у悕
+ * @return 灞炴�у��
+ */
+ @Nullable
+ public static Object getProperty(@Nullable Object bean, String propertyName) {
+ if (bean == null) {
+ return null;
+ }
+ BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(bean);
+ return beanWrapper.getPropertyValue(propertyName);
+ }
+
+ /**
+ * 璁剧疆Bean灞炴��, 鏀寔 propertyName 澶氱骇 锛歵est.user.name
+ *
+ * @param bean bean
+ * @param propertyName 灞炴�у悕
+ * @param value 灞炴�у��
+ */
+ public static void setProperty(Object bean, String propertyName, Object value) {
+ Objects.requireNonNull(bean, "bean Could not null");
+ BeanWrapper beanWrapper = PropertyAccessorFactory.forBeanPropertyAccess(bean);
+ beanWrapper.setPropertyValue(propertyName, value);
+ }
+
+ /**
+ * 娣卞鍒�
+ *
+ * <p>
+ * 鏀寔 map bean
+ * </p>
+ *
+ * @param source 婧愬璞�
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ */
+ @SuppressWarnings("unchecked")
+ @Nullable
+ public static <T> T clone(@Nullable T source) {
+ if (source == null) {
+ return null;
+ }
+ return (T) BeanUtil.copy(source, source.getClass());
+ }
+
+ /**
+ * copy 瀵硅薄灞炴�э紝榛樿涓嶄娇鐢–onvert
+ *
+ * <p>
+ * 鏀寔 map bean copy
+ * </p>
+ *
+ * @param source 婧愬璞�
+ * @param clazz 绫诲悕
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ */
+ @Nullable
+ public static <T> T copy(@Nullable Object source, Class<T> clazz) {
+ if (source == null) {
+ return null;
+ }
+ return BeanUtil.copy(source, source.getClass(), clazz);
+ }
+
+ /**
+ * copy 瀵硅薄灞炴�э紝榛樿涓嶄娇鐢–onvert
+ *
+ * <p>
+ * 鏀寔 map bean copy
+ * </p>
+ *
+ * @param source 婧愬璞�
+ * @param sourceClazz 婧愮被鍨�
+ * @param targetClazz 杞崲鎴愮殑绫诲瀷
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ */
+ @Nullable
+ public static <T> T copy(@Nullable Object source, Class sourceClazz, Class<T> targetClazz) {
+ if (source == null) {
+ return null;
+ }
+ BladeBeanCopier copier = BladeBeanCopier.create(sourceClazz, targetClazz, false);
+ T to = newInstance(targetClazz);
+ copier.copy(source, to, null);
+ return to;
+ }
+
+ /**
+ * copy 鍒楄〃瀵硅薄锛岄粯璁や笉浣跨敤Convert
+ *
+ * <p>
+ * 鏀寔 map bean copy
+ * </p>
+ *
+ * @param sourceList 婧愬垪琛�
+ * @param targetClazz 杞崲鎴愮殑绫诲瀷
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ */
+ public static <T> List<T> copy(@Nullable Collection<?> sourceList, Class<T> targetClazz) {
+ if (sourceList == null || sourceList.isEmpty()) {
+ return Collections.emptyList();
+ }
+ List<T> outList = new ArrayList<>(sourceList.size());
+ Class<?> sourceClazz = null;
+ for (Object source : sourceList) {
+ if (source == null) {
+ continue;
+ }
+ if (sourceClazz == null) {
+ sourceClazz = source.getClass();
+ }
+ T bean = BeanUtil.copy(source, sourceClazz, targetClazz);
+ outList.add(bean);
+ }
+ return outList;
+ }
+
+ /**
+ * 鎷疯礉瀵硅薄
+ *
+ * <p>
+ * 鏀寔 map bean copy
+ * </p>
+ *
+ * @param source 婧愬璞�
+ * @param targetBean 闇�瑕佽祴鍊肩殑瀵硅薄
+ */
+ public static void copy(@Nullable Object source, @Nullable Object targetBean) {
+ if (source == null || targetBean == null) {
+ return;
+ }
+ BladeBeanCopier copier = BladeBeanCopier
+ .create(source.getClass(), targetBean.getClass(), false);
+
+ copier.copy(source, targetBean, null);
+ }
+
+ /**
+ * 鎷疯礉瀵硅薄锛宻ource 灞炴�у仛 null 鍒ゆ柇锛孧ap 涓嶆敮鎸侊紝map 浼氬仛 instanceof 鍒ゆ柇锛屼笉浼�
+ *
+ * <p>
+ * 鏀寔 bean copy
+ * </p>
+ *
+ * @param source 婧愬璞�
+ * @param targetBean 闇�瑕佽祴鍊肩殑瀵硅薄
+ */
+ public static void copyNonNull(@Nullable Object source, @Nullable Object targetBean) {
+ if (source == null || targetBean == null) {
+ return;
+ }
+ BladeBeanCopier copier = BladeBeanCopier
+ .create(source.getClass(), targetBean.getClass(), false, true);
+
+ copier.copy(source, targetBean, null);
+ }
+
+ /**
+ * 鎷疯礉瀵硅薄骞跺涓嶅悓绫诲瀷灞炴�ц繘琛岃浆鎹�
+ *
+ * <p>
+ * 鏀寔 map bean copy
+ * </p>
+ *
+ * @param source 婧愬璞�
+ * @param targetClazz 杞崲鎴愮殑绫�
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ */
+ @Nullable
+ public static <T> T copyWithConvert(@Nullable Object source, Class<T> targetClazz) {
+ if (source == null) {
+ return null;
+ }
+ return BeanUtil.copyWithConvert(source, source.getClass(), targetClazz);
+ }
+
+ /**
+ * 鎷疯礉瀵硅薄骞跺涓嶅悓绫诲瀷灞炴�ц繘琛岃浆鎹�
+ *
+ * <p>
+ * 鏀寔 map bean copy
+ * </p>
+ *
+ * @param source 婧愬璞�
+ * @param sourceClazz 婧愮被
+ * @param targetClazz 杞崲鎴愮殑绫�
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ */
+ @Nullable
+ public static <T> T copyWithConvert(@Nullable Object source, Class<?> sourceClazz, Class<T> targetClazz) {
+ if (source == null) {
+ return null;
+ }
+ BladeBeanCopier copier = BladeBeanCopier.create(sourceClazz, targetClazz, true);
+ T to = newInstance(targetClazz);
+ copier.copy(source, to, new BladeConverter(sourceClazz, targetClazz));
+ return to;
+ }
+
+ /**
+ * 鎷疯礉鍒楄〃骞跺涓嶅悓绫诲瀷灞炴�ц繘琛岃浆鎹�
+ *
+ * <p>
+ * 鏀寔 map bean copy
+ * </p>
+ *
+ * @param sourceList 婧愬璞″垪琛�
+ * @param targetClazz 杞崲鎴愮殑绫�
+ * @param <T> 娉涘瀷鏍囪
+ * @return List
+ */
+ public static <T> List<T> copyWithConvert(@Nullable Collection<?> sourceList, Class<T> targetClazz) {
+ if (sourceList == null || sourceList.isEmpty()) {
+ return Collections.emptyList();
+ }
+ List<T> outList = new ArrayList<>(sourceList.size());
+ Class<?> sourceClazz = null;
+ for (Object source : sourceList) {
+ if (source == null) {
+ continue;
+ }
+ if (sourceClazz == null) {
+ sourceClazz = source.getClass();
+ }
+ T bean = BeanUtil.copyWithConvert(source, sourceClazz, targetClazz);
+ outList.add(bean);
+ }
+ return outList;
+ }
+
+ /**
+ * Copy the property values of the given source bean into the target class.
+ * <p>Note: The source and target classes do not have to match or even be derived
+ * from each other, as long as the properties match. Any bean properties that the
+ * source bean exposes but the target bean does not will silently be ignored.
+ * <p>This is just a convenience method. For more complex transfer needs,
+ *
+ * @param source the source bean
+ * @param targetClazz the target bean class
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ * @throws BeansException if the copying failed
+ */
+ @Nullable
+ public static <T> T copyProperties(@Nullable Object source, Class<T> targetClazz) throws BeansException {
+ if (source == null) {
+ return null;
+ }
+ T to = newInstance(targetClazz);
+ BeanUtil.copyProperties(source, to);
+ return to;
+ }
+
+ /**
+ * Copy the property values of the given source bean into the target class.
+ * <p>Note: The source and target classes do not have to match or even be derived
+ * from each other, as long as the properties match. Any bean properties that the
+ * source bean exposes but the target bean does not will silently be ignored.
+ * <p>This is just a convenience method. For more complex transfer needs,
+ *
+ * @param sourceList the source list bean
+ * @param targetClazz the target bean class
+ * @param <T> 娉涘瀷鏍囪
+ * @return List
+ * @throws BeansException if the copying failed
+ */
+ public static <T> List<T> copyProperties(@Nullable Collection<?> sourceList, Class<T> targetClazz) throws BeansException {
+ if (sourceList == null || sourceList.isEmpty()) {
+ return Collections.emptyList();
+ }
+ List<T> outList = new ArrayList<>(sourceList.size());
+ for (Object source : sourceList) {
+ if (source == null) {
+ continue;
+ }
+ T bean = BeanUtil.copyProperties(source, targetClazz);
+ outList.add(bean);
+ }
+ return outList;
+ }
+
+ /**
+ * 灏嗗璞¤鎴恗ap褰㈠紡
+ *
+ * @param bean 婧愬璞�
+ * @return {Map}
+ */
+ @SuppressWarnings("unchecked")
+ public static Map<String, Object> toMap(@Nullable Object bean) {
+ if (bean == null) {
+ return new HashMap<>(0);
+ }
+ return BladeBeanMap.create(bean);
+ }
+
+ /**
+ * 灏唌ap 杞负 bean
+ *
+ * @param beanMap map
+ * @param valueType 瀵硅薄绫诲瀷
+ * @param <T> 娉涘瀷鏍囪
+ * @return {T}
+ */
+ public static <T> T toBean(Map<String, Object> beanMap, Class<T> valueType) {
+ Objects.requireNonNull(beanMap, "beanMap Could not null");
+ T to = newInstance(valueType);
+ if (beanMap.isEmpty()) {
+ return to;
+ }
+ BeanUtil.copy(beanMap, to);
+ return to;
+ }
+
+ /**
+ * 缁欎竴涓狟ean娣诲姞瀛楁
+ *
+ * @param superBean 鐖剁骇Bean
+ * @param props 鏂板灞炴��
+ * @return {Object}
+ */
+ @Nullable
+ public static Object generator(@Nullable Object superBean, BeanProperty... props) {
+ if (superBean == null) {
+ return null;
+ }
+ Class<?> superclass = superBean.getClass();
+ Object genBean = generator(superclass, props);
+ BeanUtil.copy(superBean, genBean);
+ return genBean;
+ }
+
+ /**
+ * 缁欎竴涓猚lass娣诲姞瀛楁
+ *
+ * @param superclass 鐖剁骇
+ * @param props 鏂板灞炴��
+ * @return {Object}
+ */
+ public static Object generator(Class<?> superclass, BeanProperty... props) {
+ BeanGenerator generator = new BeanGenerator();
+ generator.setSuperclass(superclass);
+ generator.setUseCache(true);
+ for (BeanProperty prop : props) {
+ generator.addProperty(prop.getName(), prop.getType());
+ }
+ return generator.create();
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/CharPool.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/CharPool.java
new file mode 100644
index 0000000..dd99d9a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/CharPool.java
@@ -0,0 +1,58 @@
+package com.vci.web.util;
+
+/**
+ * char 甯搁噺姹�
+ *
+ * @author L.cm
+ */
+public interface CharPool {
+
+ // @formatter:off
+ char UPPER_A = 'A';
+ char LOWER_A = 'a';
+ char UPPER_Z = 'Z';
+ char LOWER_Z = 'z';
+ char DOT = '.';
+ char AT = '@';
+ char LEFT_BRACE = '{';
+ char RIGHT_BRACE = '}';
+ char LEFT_BRACKET = '(';
+ char RIGHT_BRACKET = ')';
+ char DASH = '-';
+ char PERCENT = '%';
+ char PIPE = '|';
+ char PLUS = '+';
+ char QUESTION_MARK = '?';
+ char EXCLAMATION_MARK = '!';
+ char EQUALS = '=';
+ char AMPERSAND = '&';
+ char ASTERISK = '*';
+ char STAR = ASTERISK;
+ char BACK_SLASH = '\\';
+ char COLON = ':';
+ char COMMA = ',';
+ char DOLLAR = '$';
+ char SLASH = '/';
+ char HASH = '#';
+ char HAT = '^';
+ char LEFT_CHEV = '<';
+ char NEWLINE = '\n';
+ char N = 'n';
+ char Y = 'y';
+ char QUOTE = '\"';
+ char RETURN = '\r';
+ char TAB = '\t';
+ char RIGHT_CHEV = '>';
+ char SEMICOLON = ';';
+ char SINGLE_QUOTE = '\'';
+ char BACKTICK = '`';
+ char SPACE = ' ';
+ char TILDA = '~';
+ char LEFT_SQ_BRACKET = '[';
+ char RIGHT_SQ_BRACKET = ']';
+ char UNDERSCORE = '_';
+ char ONE = '1';
+ char ZERO = '0';
+ // @formatter:on
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Charsets.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Charsets.java
new file mode 100644
index 0000000..1a18b47
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Charsets.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+package com.vci.web.util;
+
+
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.nio.charset.UnsupportedCharsetException;
+
+/**
+ * 瀛楃闆嗗伐鍏风被
+ *
+ * @author L.cm
+ */
+public class Charsets {
+
+ /**
+ * 瀛楃闆咺SO-8859-1
+ */
+ public static final Charset ISO_8859_1 = StandardCharsets.ISO_8859_1;
+ public static final String ISO_8859_1_NAME = ISO_8859_1.name();
+
+ /**
+ * 瀛楃闆咷BK
+ */
+ public static final Charset GBK = Charset.forName(StringPool.GBK);
+ public static final String GBK_NAME = GBK.name();
+
+ /**
+ * 瀛楃闆唘tf-8
+ */
+ public static final Charset UTF_8 = StandardCharsets.UTF_8;
+ public static final String UTF_8_NAME = UTF_8.name();
+
+ /**
+ * 杞崲涓篊harset瀵硅薄
+ *
+ * @param charsetName 瀛楃闆嗭紝涓虹┖鍒欒繑鍥為粯璁ゅ瓧绗﹂泦
+ * @return Charsets
+ * @throws UnsupportedCharsetException 缂栫爜涓嶆敮鎸�
+ */
+ public static Charset charset(String charsetName) throws UnsupportedCharsetException {
+ return StringUtil.isBlank(charsetName) ? Charset.defaultCharset() : Charset.forName(charsetName);
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ClassUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ClassUtil.java
new file mode 100644
index 0000000..23d23b2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ClassUtil.java
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+package com.vci.web.util;
+
+import org.springframework.core.BridgeMethodResolver;
+import org.springframework.core.DefaultParameterNameDiscoverer;
+import org.springframework.core.MethodParameter;
+import org.springframework.core.ParameterNameDiscoverer;
+import org.springframework.core.annotation.AnnotatedElementUtils;
+import org.springframework.core.annotation.SynthesizingMethodParameter;
+import org.springframework.web.method.HandlerMethod;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+
+/**
+ * 绫绘搷浣滃伐鍏�
+ *
+ * @author L.cm
+ */
+public class ClassUtil extends org.springframework.util.ClassUtils {
+
+ private static final ParameterNameDiscoverer PARAMETER_NAME_DISCOVERER = new DefaultParameterNameDiscoverer();
+
+ /**
+ * 鑾峰彇鏂规硶鍙傛暟淇℃伅
+ *
+ * @param constructor 鏋勯�犲櫒
+ * @param parameterIndex 鍙傛暟搴忓彿
+ * @return {MethodParameter}
+ */
+ public static MethodParameter getMethodParameter(Constructor<?> constructor, int parameterIndex) {
+ MethodParameter methodParameter = new SynthesizingMethodParameter(constructor, parameterIndex);
+ methodParameter.initParameterNameDiscovery(PARAMETER_NAME_DISCOVERER);
+ return methodParameter;
+ }
+
+ /**
+ * 鑾峰彇鏂规硶鍙傛暟淇℃伅
+ *
+ * @param method 鏂规硶
+ * @param parameterIndex 鍙傛暟搴忓彿
+ * @return {MethodParameter}
+ */
+ public static MethodParameter getMethodParameter(Method method, int parameterIndex) {
+ MethodParameter methodParameter = new SynthesizingMethodParameter(method, parameterIndex);
+ methodParameter.initParameterNameDiscovery(PARAMETER_NAME_DISCOVERER);
+ return methodParameter;
+ }
+
+ /**
+ * 鑾峰彇Annotation
+ *
+ * @param method Method
+ * @param annotationType 娉ㄨВ绫�
+ * @param <A> 娉涘瀷鏍囪
+ * @return {Annotation}
+ */
+ public static <A extends Annotation> A getAnnotation(Method method, Class<A> annotationType) {
+ Class<?> targetClass = method.getDeclaringClass();
+ // The method may be on an interface, but we need attributes from the target class.
+ // If the target class is null, the method will be unchanged.
+ Method specificMethod = ClassUtil.getMostSpecificMethod(method, targetClass);
+ // If we are dealing with method with generic parameters, find the original method.
+ specificMethod = BridgeMethodResolver.findBridgedMethod(specificMethod);
+ // 鍏堟壘鏂规硶锛屽啀鎵炬柟娉曚笂鐨勭被
+ A annotation = AnnotatedElementUtils.findMergedAnnotation(specificMethod, annotationType);
+ ;
+ if (null != annotation) {
+ return annotation;
+ }
+ // 鑾峰彇绫讳笂闈㈢殑Annotation锛屽彲鑳藉寘鍚粍鍚堟敞瑙o紝鏁呴噰鐢╯pring鐨勫伐鍏风被
+ return AnnotatedElementUtils.findMergedAnnotation(specificMethod.getDeclaringClass(), annotationType);
+ }
+
+ /**
+ * 鑾峰彇Annotation
+ *
+ * @param handlerMethod HandlerMethod
+ * @param annotationType 娉ㄨВ绫�
+ * @param <A> 娉涘瀷鏍囪
+ * @return {Annotation}
+ */
+ public static <A extends Annotation> A getAnnotation(HandlerMethod handlerMethod, Class<A> annotationType) {
+ // 鍏堟壘鏂规硶锛屽啀鎵炬柟娉曚笂鐨勭被
+ A annotation = handlerMethod.getMethodAnnotation(annotationType);
+ if (null != annotation) {
+ return annotation;
+ }
+ // 鑾峰彇绫讳笂闈㈢殑Annotation锛屽彲鑳藉寘鍚粍鍚堟敞瑙o紝鏁呴噰鐢╯pring鐨勫伐鍏风被
+ Class<?> beanType = handlerMethod.getBeanType();
+ return AnnotatedElementUtils.findMergedAnnotation(beanType, annotationType);
+ }
+
+
+ /**
+ * 鍒ゆ柇鏄惁鏈夋敞瑙� Annotation
+ *
+ * @param method Method
+ * @param annotationType 娉ㄨВ绫�
+ * @param <A> 娉涘瀷鏍囪
+ * @return {boolean}
+ */
+ public static <A extends Annotation> boolean isAnnotated(Method method, Class<A> annotationType) {
+ // 鍏堟壘鏂规硶锛屽啀鎵炬柟娉曚笂鐨勭被
+ boolean isMethodAnnotated = AnnotatedElementUtils.isAnnotated(method, annotationType);
+ if (isMethodAnnotated) {
+ return true;
+ }
+ // 鑾峰彇绫讳笂闈㈢殑Annotation锛屽彲鑳藉寘鍚粍鍚堟敞瑙o紝鏁呴噰鐢╯pring鐨勫伐鍏风被
+ Class<?> targetClass = method.getDeclaringClass();
+ return AnnotatedElementUtils.isAnnotated(targetClass, annotationType);
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/CollectionUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/CollectionUtil.java
new file mode 100644
index 0000000..2b4aae9
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/CollectionUtil.java
@@ -0,0 +1,161 @@
+package com.vci.web.util;
+
+import org.springframework.lang.Nullable;
+import org.springframework.util.CollectionUtils;
+
+import java.lang.reflect.Array;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 闆嗗悎宸ュ叿绫�
+ *
+ * @author L.cm
+ */
+public class CollectionUtil extends CollectionUtils {
+
+ /**
+ * Return {@code true} if the supplied Collection is not {@code null} or empty.
+ * Otherwise, return {@code false}.
+ *
+ * @param collection the Collection to check
+ * @return whether the given Collection is not empty
+ */
+ public static boolean isNotEmpty(@Nullable Collection<?> collection) {
+ return !CollectionUtil.isEmpty(collection);
+ }
+
+ /**
+ * Return {@code true} if the supplied Map is not {@code null} or empty.
+ * Otherwise, return {@code false}.
+ *
+ * @param map the Map to check
+ * @return whether the given Map is not empty
+ */
+ public static boolean isNotEmpty(@Nullable Map<?, ?> map) {
+ return !CollectionUtil.isEmpty(map);
+ }
+
+ /**
+ * Check whether the given Array contains the given element.
+ *
+ * @param array the Array to check
+ * @param element the element to look for
+ * @param <T> The generic tag
+ * @return {@code true} if found, {@code false} else
+ */
+ public static <T> boolean contains(@Nullable T[] array, final T element) {
+ if (array == null) {
+ return false;
+ }
+ return Arrays.stream(array).anyMatch(x -> ObjectUtil.nullSafeEquals(x, element));
+ }
+
+ /**
+ * Concatenates 2 arrays
+ *
+ * @param one 鏁扮粍1
+ * @param other 鏁扮粍2
+ * @return 鏂版暟缁�
+ */
+ public static String[] concat(String[] one, String[] other) {
+ return concat(one, other, String.class);
+ }
+
+ /**
+ * Concatenates 2 arrays
+ *
+ * @param one 鏁扮粍1
+ * @param other 鏁扮粍2
+ * @param clazz 鏁扮粍绫�
+ * @return 鏂版暟缁�
+ */
+ public static <T> T[] concat(T[] one, T[] other, Class<T> clazz) {
+ T[] target = (T[]) Array.newInstance(clazz, one.length + other.length);
+ System.arraycopy(one, 0, target, 0, one.length);
+ System.arraycopy(other, 0, target, one.length, other.length);
+ return target;
+ }
+
+ /**
+ * 瀵硅薄鏄惁涓烘暟缁勫璞�
+ *
+ * @param obj 瀵硅薄
+ * @return 鏄惁涓烘暟缁勫璞★紝濡傛灉涓簕@code null} 杩斿洖false
+ */
+ public static boolean isArray(Object obj) {
+ if (null == obj) {
+ return false;
+ }
+ return obj.getClass().isArray();
+ }
+
+ /**
+ * 涓嶅彲鍙� Set
+ *
+ * @param es 瀵硅薄
+ * @param <E> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ @SafeVarargs
+ public static <E> Set<E> ofImmutableSet(E... es) {
+ Objects.requireNonNull(es, "args es is null.");
+ return Arrays.stream(es).collect(Collectors.toSet());
+ }
+
+ /**
+ * 涓嶅彲鍙� List
+ *
+ * @param es 瀵硅薄
+ * @param <E> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ @SafeVarargs
+ public static <E> List<E> ofImmutableList(E... es) {
+ Objects.requireNonNull(es, "args es is null.");
+ return Arrays.stream(es).collect(Collectors.toList());
+ }
+
+ /**
+ * Iterable 杞崲涓篖ist闆嗗悎
+ *
+ * @param elements Iterable
+ * @param <E> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ public static <E> List<E> toList(Iterable<E> elements) {
+ Objects.requireNonNull(elements, "elements es is null.");
+ if (elements instanceof Collection) {
+ return new ArrayList((Collection) elements);
+ }
+ Iterator<E> iterator = elements.iterator();
+ List<E> list = new ArrayList<>();
+ while (iterator.hasNext()) {
+ list.add(iterator.next());
+ }
+ return list;
+ }
+
+ /**
+ * 灏唊ey value 鏁扮粍杞负 map
+ *
+ * @param keysValues key value 鏁扮粍
+ * @param <K> key
+ * @param <V> value
+ * @return map 闆嗗悎
+ */
+ public static <K, V> Map<K, V> toMap(Object... keysValues) {
+ int kvLength = keysValues.length;
+ if (kvLength % 2 != 0) {
+ throw new IllegalArgumentException("wrong number of arguments for met, keysValues length can not be odd");
+ }
+ Map<K, V> keyValueMap = new HashMap<>(kvLength);
+ for (int i = kvLength - 2; i >= 0; i -= 2) {
+ Object key = keysValues[i];
+ Object value = keysValues[i + 1];
+ keyValueMap.put((K) key, (V) value);
+ }
+ return keyValueMap;
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ConcurrentDateFormat.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ConcurrentDateFormat.java
new file mode 100644
index 0000000..722de89
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ConcurrentDateFormat.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+package com.vci.web.util;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+import java.util.Queue;
+import java.util.TimeZone;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+/**
+ * 鍙傝�僼omcat8涓殑骞跺彂DateFormat
+ * <p>
+ * {@link SimpleDateFormat}鐨勭嚎绋嬪畨鍏ㄥ寘瑁呭櫒銆�
+ * 涓嶄娇鐢═hreadLocal锛屽垱寤鸿冻澶熺殑SimpleDateFormat瀵硅薄鏉ユ弧瓒冲苟鍙戞�ц姹傘��
+ * </p>
+ *
+ * @author L.cm
+ */
+public class ConcurrentDateFormat {
+ private final String format;
+ private final Locale locale;
+ private final TimeZone timezone;
+ private final Queue<SimpleDateFormat> queue = new ConcurrentLinkedQueue<>();
+
+ private ConcurrentDateFormat(String format, Locale locale, TimeZone timezone) {
+ this.format = format;
+ this.locale = locale;
+ this.timezone = timezone;
+ SimpleDateFormat initial = createInstance();
+ queue.add(initial);
+ }
+
+ public static ConcurrentDateFormat of(String format) {
+ return new ConcurrentDateFormat(format, Locale.getDefault(), TimeZone.getDefault());
+ }
+
+ public static ConcurrentDateFormat of(String format, TimeZone timezone) {
+ return new ConcurrentDateFormat(format, Locale.getDefault(), timezone);
+ }
+
+ public static ConcurrentDateFormat of(String format, Locale locale, TimeZone timezone) {
+ return new ConcurrentDateFormat(format, locale, timezone);
+ }
+
+ public String format(Date date) {
+ SimpleDateFormat sdf = queue.poll();
+ if (sdf == null) {
+ sdf = createInstance();
+ }
+ String result = sdf.format(date);
+ queue.add(sdf);
+ return result;
+ }
+
+ public Date parse(String source) throws ParseException {
+ SimpleDateFormat sdf = queue.poll();
+ if (sdf == null) {
+ sdf = createInstance();
+ }
+ Date result = sdf.parse(source);
+ queue.add(sdf);
+ return result;
+ }
+
+ private SimpleDateFormat createInstance() {
+ SimpleDateFormat sdf = new SimpleDateFormat(format, locale);
+ sdf.setTimeZone(timezone);
+ return sdf;
+ }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ConvertUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ConvertUtil.java
new file mode 100644
index 0000000..77556a0
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ConvertUtil.java
@@ -0,0 +1,81 @@
+package com.vci.web.util;
+
+import com.vci.web.util.convert.BladeConversionService;
+import org.springframework.core.convert.TypeDescriptor;
+import org.springframework.core.convert.support.GenericConversionService;
+import org.springframework.lang.Nullable;
+
+/**
+ * 鍩轰簬 spring ConversionService 绫诲瀷杞崲
+ *
+ * @author L.cm
+ */
+@SuppressWarnings("unchecked")
+public class ConvertUtil {
+
+ /**
+ * Convenience operation for converting a source object to the specified targetType.
+ * {@link TypeDescriptor#forObject(Object)}.
+ * @param source the source object
+ * @param targetType the target type
+ * @param <T> 娉涘瀷鏍囪
+ * @return the converted value
+ * @throws IllegalArgumentException if targetType is {@code null},
+ * or sourceType is {@code null} but source is not {@code null}
+ */
+ @Nullable
+ public static <T> T convert(@Nullable Object source, Class<T> targetType) {
+ if (source == null) {
+ return null;
+ }
+ if (ClassUtil.isAssignableValue(targetType, source)) {
+ return (T) source;
+ }
+ GenericConversionService conversionService = BladeConversionService.getInstance();
+ return conversionService.convert(source, targetType);
+ }
+
+ /**
+ * Convenience operation for converting a source object to the specified targetType,
+ * where the target type is a descriptor that provides additional conversion context.
+ * {@link TypeDescriptor#forObject(Object)}.
+ * @param source the source object
+ * @param sourceType the source type
+ * @param targetType the target type
+ * @param <T> 娉涘瀷鏍囪
+ * @return the converted value
+ * @throws IllegalArgumentException if targetType is {@code null},
+ * or sourceType is {@code null} but source is not {@code null}
+ */
+ @Nullable
+ public static <T> T convert(@Nullable Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
+ if (source == null) {
+ return null;
+ }
+ GenericConversionService conversionService = BladeConversionService.getInstance();
+ return (T) conversionService.convert(source, sourceType, targetType);
+ }
+
+ /**
+ * Convenience operation for converting a source object to the specified targetType,
+ * where the target type is a descriptor that provides additional conversion context.
+ * Simply delegates to {@link #convert(Object, TypeDescriptor, TypeDescriptor)} and
+ * encapsulates the construction of the source type descriptor using
+ * {@link TypeDescriptor#forObject(Object)}.
+ * @param source the source object
+ * @param targetType the target type
+ * @param <T> 娉涘瀷鏍囪
+ * @return the converted value
+ * @throws IllegalArgumentException if targetType is {@code null},
+ * or sourceType is {@code null} but source is not {@code null}
+ */
+ @Nullable
+ public static <T> T convert(@Nullable Object source, TypeDescriptor targetType) {
+ if (source == null) {
+ return null;
+ }
+ GenericConversionService conversionService = BladeConversionService.getInstance();
+ return (T) conversionService.convert(source, targetType);
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DatatypeConverterUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DatatypeConverterUtil.java
new file mode 100644
index 0000000..47d545c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DatatypeConverterUtil.java
@@ -0,0 +1,57 @@
+package com.vci.web.util;
+
+/**
+ * 鏁版嵁绫诲瀷杞崲宸ュ叿绫�
+ *
+ * @author Chill
+ */
+public class DatatypeConverterUtil {
+
+ /**
+ * hex鏂囨湰杞崲涓轰簩杩涘埗
+ *
+ * @param hexStr hex鏂囨湰
+ * @return byte[]
+ */
+ public static byte[] parseHexBinary(String hexStr) {
+ final int len = hexStr.length();
+
+ if (len % 2 != 0) {
+ throw new IllegalArgumentException("hexBinary needs to be even-length: " + hexStr);
+ }
+
+ byte[] out = new byte[len / 2];
+
+ for (int i = 0; i < len; i += 2) {
+ int h = hexToBin(hexStr.charAt(i));
+ int l = hexToBin(hexStr.charAt(i + 1));
+ if (h == -1 || l == -1) {
+ throw new IllegalArgumentException("contains illegal character for hexBinary: " + hexStr);
+ }
+
+ out[i / 2] = (byte) (h * 16 + l);
+ }
+
+ return out;
+ }
+
+ /**
+ * hex鏂囨湰杞崲涓篿nt
+ *
+ * @param ch hex鏂囨湰
+ * @return int
+ */
+ private static int hexToBin(char ch) {
+ if ('0' <= ch && ch <= '9') {
+ return ch - '0';
+ }
+ if ('A' <= ch && ch <= 'F') {
+ return ch - 'A' + 10;
+ }
+ if ('a' <= ch && ch <= 'f') {
+ return ch - 'a' + 10;
+ }
+ return -1;
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DateTimeUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DateTimeUtil.java
new file mode 100644
index 0000000..09c62d5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DateTimeUtil.java
@@ -0,0 +1,226 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+package com.vci.web.util;
+
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.Temporal;
+import java.time.temporal.TemporalAccessor;
+import java.util.Date;
+
+/**
+ * DateTime 宸ュ叿绫�
+ *
+ * @author L.cm
+ */
+public class DateTimeUtil {
+ public static final DateTimeFormatter DATETIME_FORMAT = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATETIME);
+ public static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATE);
+ public static final DateTimeFormatter TIME_FORMAT = DateTimeFormatter.ofPattern(DateUtil.PATTERN_TIME);
+
+ /**
+ * 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDateTime(TemporalAccessor temporal) {
+ return DATETIME_FORMAT.format(temporal);
+ }
+
+ /**
+ * 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDate(TemporalAccessor temporal) {
+ return DATE_FORMAT.format(temporal);
+ }
+
+ /**
+ * 鏃堕棿鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatTime(TemporalAccessor temporal) {
+ return TIME_FORMAT.format(temporal);
+ }
+
+ /**
+ * 鏃ユ湡鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @param pattern 琛ㄨ揪寮�
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String format(TemporalAccessor temporal, String pattern) {
+ return DateTimeFormatter.ofPattern(pattern).format(temporal);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param pattern 琛ㄨ揪寮�
+ * @return 鏃堕棿
+ */
+ public static LocalDateTime parseDateTime(String dateStr, String pattern) {
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+ return DateTimeUtil.parseDateTime(dateStr, formatter);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param formatter DateTimeFormatter
+ * @return 鏃堕棿
+ */
+ public static LocalDateTime parseDateTime(String dateStr, DateTimeFormatter formatter) {
+ return LocalDateTime.parse(dateStr, formatter);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @return 鏃堕棿
+ */
+ public static LocalDateTime parseDateTime(String dateStr) {
+ return DateTimeUtil.parseDateTime(dateStr, DateTimeUtil.DATETIME_FORMAT);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param pattern 琛ㄨ揪寮�
+ * @return 鏃堕棿
+ */
+ public static LocalDate parseDate(String dateStr, String pattern) {
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+ return DateTimeUtil.parseDate(dateStr, formatter);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param formatter DateTimeFormatter
+ * @return 鏃堕棿
+ */
+ public static LocalDate parseDate(String dateStr, DateTimeFormatter formatter) {
+ return LocalDate.parse(dateStr, formatter);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘棩鏈�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @return 鏃堕棿
+ */
+ public static LocalDate parseDate(String dateStr) {
+ return DateTimeUtil.parseDate(dateStr, DateTimeUtil.DATE_FORMAT);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param pattern 鏃堕棿姝e垯
+ * @return 鏃堕棿
+ */
+ public static LocalTime parseTime(String dateStr, String pattern) {
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern);
+ return DateTimeUtil.parseTime(dateStr, formatter);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param formatter DateTimeFormatter
+ * @return 鏃堕棿
+ */
+ public static LocalTime parseTime(String dateStr, DateTimeFormatter formatter) {
+ return LocalTime.parse(dateStr, formatter);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @return 鏃堕棿
+ */
+ public static LocalTime parseTime(String dateStr) {
+ return DateTimeUtil.parseTime(dateStr, DateTimeUtil.TIME_FORMAT);
+ }
+
+ /**
+ * 鏃堕棿杞� Instant
+ *
+ * @param dateTime 鏃堕棿
+ * @return Instant
+ */
+ public static Instant toInstant(LocalDateTime dateTime) {
+ return dateTime.atZone(ZoneId.systemDefault()).toInstant();
+ }
+
+ /**
+ * Instant 杞� 鏃堕棿
+ *
+ * @param instant Instant
+ * @return Instant
+ */
+ public static LocalDateTime toDateTime(Instant instant) {
+ return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+ }
+
+ /**
+ * 杞崲鎴� date
+ *
+ * @param dateTime LocalDateTime
+ * @return Date
+ */
+ public static Date toDate(LocalDateTime dateTime) {
+ return Date.from(DateTimeUtil.toInstant(dateTime));
+ }
+
+ /**
+ * 姣旇緝2涓椂闂村樊锛岃法搴︽瘮杈冨皬
+ *
+ * @param startInclusive 寮�濮嬫椂闂�
+ * @param endExclusive 缁撴潫鏃堕棿
+ * @return 鏃堕棿闂撮殧
+ */
+ public static Duration between(Temporal startInclusive, Temporal endExclusive) {
+ return Duration.between(startInclusive, endExclusive);
+ }
+
+ /**
+ * 姣旇緝2涓椂闂村樊锛岃法搴︽瘮杈冨ぇ锛屽勾鏈堟棩涓哄崟浣�
+ *
+ * @param startDate 寮�濮嬫椂闂�
+ * @param endDate 缁撴潫鏃堕棿
+ * @return 鏃堕棿闂撮殧
+ */
+ public static Period between(LocalDate startDate, LocalDate endDate) {
+ return Period.between(startDate, endDate);
+ }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DateUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DateUtil.java
new file mode 100644
index 0000000..6b86fbe
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DateUtil.java
@@ -0,0 +1,634 @@
+package com.vci.web.util;
+
+import org.springframework.util.Assert;
+
+import java.text.ParseException;
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.Temporal;
+import java.time.temporal.TemporalAccessor;
+import java.time.temporal.TemporalAmount;
+import java.time.temporal.TemporalQuery;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+/**
+ * 鏃ユ湡宸ュ叿绫�
+ *
+ * @author L.cm
+ */
+public class DateUtil {
+
+ public static final String PATTERN_DATETIME = "yyyy-MM-dd HH:mm:ss";
+ public static final String PATTERN_DATETIME_MINI = "yyyyMMddHHmmss";
+ public static final String PATTERN_DATE = "yyyy-MM-dd";
+ public static final String PATTERN_TIME = "HH:mm:ss";
+ /**
+ * 鑰� date 鏍煎紡鍖�
+ */
+ public static final ConcurrentDateFormat DATETIME_FORMAT = ConcurrentDateFormat.of(PATTERN_DATETIME);
+ public static final ConcurrentDateFormat DATETIME_MINI_FORMAT = ConcurrentDateFormat.of(PATTERN_DATETIME_MINI);
+ public static final ConcurrentDateFormat DATE_FORMAT = ConcurrentDateFormat.of(PATTERN_DATE);
+ public static final ConcurrentDateFormat TIME_FORMAT = ConcurrentDateFormat.of(PATTERN_TIME);
+ /**
+ * java 8 鏃堕棿鏍煎紡鍖�
+ */
+ public static final DateTimeFormatter DATETIME_FORMATTER = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATETIME);
+ public static final DateTimeFormatter DATETIME_MINI_FORMATTER = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATETIME_MINI);
+ public static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern(DateUtil.PATTERN_DATE);
+ public static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern(DateUtil.PATTERN_TIME);
+
+ /**
+ * 鑾峰彇褰撳墠鏃ユ湡
+ *
+ * @return 褰撳墠鏃ユ湡
+ */
+ public static Date now() {
+ return new Date();
+ }
+
+ /**
+ * 娣诲姞骞�
+ *
+ * @param date 鏃堕棿
+ * @param yearsToAdd 娣诲姞鐨勫勾鏁�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date plusYears(Date date, int yearsToAdd) {
+ return DateUtil.set(date, Calendar.YEAR, yearsToAdd);
+ }
+
+ /**
+ * 娣诲姞鏈�
+ *
+ * @param date 鏃堕棿
+ * @param monthsToAdd 娣诲姞鐨勬湀鏁�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date plusMonths(Date date, int monthsToAdd) {
+ return DateUtil.set(date, Calendar.MONTH, monthsToAdd);
+ }
+
+ /**
+ * 娣诲姞鍛�
+ *
+ * @param date 鏃堕棿
+ * @param weeksToAdd 娣诲姞鐨勫懆鏁�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date plusWeeks(Date date, int weeksToAdd) {
+ return DateUtil.plus(date, Period.ofWeeks(weeksToAdd));
+ }
+
+ /**
+ * 娣诲姞澶�
+ *
+ * @param date 鏃堕棿
+ * @param daysToAdd 娣诲姞鐨勫ぉ鏁�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date plusDays(Date date, long daysToAdd) {
+ return DateUtil.plus(date, Duration.ofDays(daysToAdd));
+ }
+
+ /**
+ * 娣诲姞灏忔椂
+ *
+ * @param date 鏃堕棿
+ * @param hoursToAdd 娣诲姞鐨勫皬鏃舵暟
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date plusHours(Date date, long hoursToAdd) {
+ return DateUtil.plus(date, Duration.ofHours(hoursToAdd));
+ }
+
+ /**
+ * 娣诲姞鍒嗛挓
+ *
+ * @param date 鏃堕棿
+ * @param minutesToAdd 娣诲姞鐨勫垎閽熸暟
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date plusMinutes(Date date, long minutesToAdd) {
+ return DateUtil.plus(date, Duration.ofMinutes(minutesToAdd));
+ }
+
+ /**
+ * 娣诲姞绉�
+ *
+ * @param date 鏃堕棿
+ * @param secondsToAdd 娣诲姞鐨勭鏁�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date plusSeconds(Date date, long secondsToAdd) {
+ return DateUtil.plus(date, Duration.ofSeconds(secondsToAdd));
+ }
+
+ /**
+ * 娣诲姞姣
+ *
+ * @param date 鏃堕棿
+ * @param millisToAdd 娣诲姞鐨勬绉掓暟
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date plusMillis(Date date, long millisToAdd) {
+ return DateUtil.plus(date, Duration.ofMillis(millisToAdd));
+ }
+
+ /**
+ * 娣诲姞绾崇
+ *
+ * @param date 鏃堕棿
+ * @param nanosToAdd 娣诲姞鐨勭撼绉掓暟
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date plusNanos(Date date, long nanosToAdd) {
+ return DateUtil.plus(date, Duration.ofNanos(nanosToAdd));
+ }
+
+ /**
+ * 鏃ユ湡娣诲姞鏃堕棿閲�
+ *
+ * @param date 鏃堕棿
+ * @param amount 鏃堕棿閲�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date plus(Date date, TemporalAmount amount) {
+ Instant instant = date.toInstant();
+ return Date.from(instant.plus(amount));
+ }
+
+ /**
+ * 鍑忓皯骞�
+ *
+ * @param date 鏃堕棿
+ * @param years 鍑忓皯鐨勫勾鏁�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date minusYears(Date date, int years) {
+ return DateUtil.set(date, Calendar.YEAR, -years);
+ }
+
+ /**
+ * 鍑忓皯鏈�
+ *
+ * @param date 鏃堕棿
+ * @param months 鍑忓皯鐨勬湀鏁�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date minusMonths(Date date, int months) {
+ return DateUtil.set(date, Calendar.MONTH, -months);
+ }
+
+ /**
+ * 鍑忓皯鍛�
+ *
+ * @param date 鏃堕棿
+ * @param weeks 鍑忓皯鐨勫懆鏁�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date minusWeeks(Date date, int weeks) {
+ return DateUtil.minus(date, Period.ofWeeks(weeks));
+ }
+
+ /**
+ * 鍑忓皯澶�
+ *
+ * @param date 鏃堕棿
+ * @param days 鍑忓皯鐨勫ぉ鏁�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date minusDays(Date date, long days) {
+ return DateUtil.minus(date, Duration.ofDays(days));
+ }
+
+ /**
+ * 鍑忓皯灏忔椂
+ *
+ * @param date 鏃堕棿
+ * @param hours 鍑忓皯鐨勫皬鏃舵暟
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date minusHours(Date date, long hours) {
+ return DateUtil.minus(date, Duration.ofHours(hours));
+ }
+
+ /**
+ * 鍑忓皯鍒嗛挓
+ *
+ * @param date 鏃堕棿
+ * @param minutes 鍑忓皯鐨勫垎閽熸暟
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date minusMinutes(Date date, long minutes) {
+ return DateUtil.minus(date, Duration.ofMinutes(minutes));
+ }
+
+ /**
+ * 鍑忓皯绉�
+ *
+ * @param date 鏃堕棿
+ * @param seconds 鍑忓皯鐨勭鏁�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date minusSeconds(Date date, long seconds) {
+ return DateUtil.minus(date, Duration.ofSeconds(seconds));
+ }
+
+ /**
+ * 鍑忓皯姣
+ *
+ * @param date 鏃堕棿
+ * @param millis 鍑忓皯鐨勬绉掓暟
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date minusMillis(Date date, long millis) {
+ return DateUtil.minus(date, Duration.ofMillis(millis));
+ }
+
+ /**
+ * 鍑忓皯绾崇
+ *
+ * @param date 鏃堕棿
+ * @param nanos 鍑忓皯鐨勭撼绉掓暟
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date minusNanos(Date date, long nanos) {
+ return DateUtil.minus(date, Duration.ofNanos(nanos));
+ }
+
+ /**
+ * 鏃ユ湡鍑忓皯鏃堕棿閲�
+ *
+ * @param date 鏃堕棿
+ * @param amount 鏃堕棿閲�
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ public static Date minus(Date date, TemporalAmount amount) {
+ Instant instant = date.toInstant();
+ return Date.from(instant.minus(amount));
+ }
+
+ /**
+ * 璁剧疆鏃ユ湡灞炴��
+ *
+ * @param date 鏃堕棿
+ * @param calendarField 鏇存敼鐨勫睘鎬�
+ * @param amount 鏇存敼鏁帮紝-1琛ㄧず鍑忓皯
+ * @return 璁剧疆鍚庣殑鏃堕棿
+ */
+ private static Date set(Date date, int calendarField, int amount) {
+ Assert.notNull(date, "The date must not be null");
+ Calendar c = Calendar.getInstance();
+ c.setLenient(false);
+ c.setTime(date);
+ c.add(calendarField, amount);
+ return c.getTime();
+ }
+
+ /**
+ * 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ *
+ * @param date 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDateTime(Date date) {
+ return DATETIME_FORMAT.format(date);
+ }
+
+ /**
+ * 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ *
+ * @param date 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDateTimeMini(Date date) {
+ return DATETIME_MINI_FORMAT.format(date);
+ }
+
+ /**
+ * 鏃ユ湡鏍煎紡鍖�
+ *
+ * @param date 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDate(Date date) {
+ return DATE_FORMAT.format(date);
+ }
+
+ /**
+ * 鏃堕棿鏍煎紡鍖�
+ *
+ * @param date 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatTime(Date date) {
+ return TIME_FORMAT.format(date);
+ }
+
+ /**
+ * 鏃ユ湡鏍煎紡鍖�
+ *
+ * @param date 鏃堕棿
+ * @param pattern 琛ㄨ揪寮�
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String format(Date date, String pattern) {
+ return ConcurrentDateFormat.of(pattern).format(date);
+ }
+
+ /**
+ * java8 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDateTime(TemporalAccessor temporal) {
+ return DATETIME_FORMATTER.format(temporal);
+ }
+
+ /**
+ * java8 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDateTimeMini(TemporalAccessor temporal) {
+ return DATETIME_MINI_FORMATTER.format(temporal);
+ }
+
+ /**
+ * java8 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDate(TemporalAccessor temporal) {
+ return DATE_FORMATTER.format(temporal);
+ }
+
+ /**
+ * java8 鏃堕棿鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatTime(TemporalAccessor temporal) {
+ return TIME_FORMATTER.format(temporal);
+ }
+
+ /**
+ * java8 鏃ユ湡鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @param pattern 琛ㄨ揪寮�
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String format(TemporalAccessor temporal, String pattern) {
+ return DateTimeFormatter.ofPattern(pattern).format(temporal);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param pattern 琛ㄨ揪寮�
+ * @return 鏃堕棿
+ */
+ public static Date parse(String dateStr, String pattern) {
+ ConcurrentDateFormat format = ConcurrentDateFormat.of(pattern);
+ try {
+ return format.parse(dateStr);
+ } catch (ParseException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param format ConcurrentDateFormat
+ * @return 鏃堕棿
+ */
+ public static Date parse(String dateStr, ConcurrentDateFormat format) {
+ try {
+ return format.parse(dateStr);
+ } catch (ParseException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param pattern 琛ㄨ揪寮�
+ * @return 鏃堕棿
+ */
+ public static <T> T parse(String dateStr, String pattern, TemporalQuery<T> query) {
+ return DateTimeFormatter.ofPattern(pattern).parse(dateStr, query);
+ }
+
+ /**
+ * 鏃堕棿杞� Instant
+ *
+ * @param dateTime 鏃堕棿
+ * @return Instant
+ */
+ public static Instant toInstant(LocalDateTime dateTime) {
+ return dateTime.atZone(ZoneId.systemDefault()).toInstant();
+ }
+
+ /**
+ * Instant 杞� 鏃堕棿
+ *
+ * @param instant Instant
+ * @return Instant
+ */
+ public static LocalDateTime toDateTime(Instant instant) {
+ return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+ }
+
+ /**
+ * 杞崲鎴� date
+ *
+ * @param dateTime LocalDateTime
+ * @return Date
+ */
+ public static Date toDate(LocalDateTime dateTime) {
+ return Date.from(DateUtil.toInstant(dateTime));
+ }
+
+ /**
+ * 杞崲鎴� date
+ *
+ * @param localDate LocalDate
+ * @return Date
+ */
+ public static Date toDate(final LocalDate localDate) {
+ return Date.from(localDate.atStartOfDay(ZoneId.systemDefault()).toInstant());
+ }
+
+ /**
+ * Converts local date time to Calendar.
+ */
+ public static Calendar toCalendar(final LocalDateTime localDateTime) {
+ return GregorianCalendar.from(ZonedDateTime.of(localDateTime, ZoneId.systemDefault()));
+ }
+
+ /**
+ * localDateTime 杞崲鎴愭绉掓暟
+ *
+ * @param localDateTime LocalDateTime
+ * @return long
+ */
+ public static long toMilliseconds(final LocalDateTime localDateTime) {
+ return localDateTime.atZone(ZoneId.systemDefault()).toInstant().toEpochMilli();
+ }
+
+ /**
+ * localDate 杞崲鎴愭绉掓暟
+ *
+ * @param localDate LocalDate
+ * @return long
+ */
+ public static long toMilliseconds(LocalDate localDate) {
+ return toMilliseconds(localDate.atStartOfDay());
+ }
+
+ /**
+ * 杞崲鎴恓ava8 鏃堕棿
+ *
+ * @param calendar 鏃ュ巻
+ * @return LocalDateTime
+ */
+ public static LocalDateTime fromCalendar(final Calendar calendar) {
+ TimeZone tz = calendar.getTimeZone();
+ ZoneId zid = tz == null ? ZoneId.systemDefault() : tz.toZoneId();
+ return LocalDateTime.ofInstant(calendar.toInstant(), zid);
+ }
+
+ /**
+ * 杞崲鎴恓ava8 鏃堕棿
+ *
+ * @param instant Instant
+ * @return LocalDateTime
+ */
+ public static LocalDateTime fromInstant(final Instant instant) {
+ return LocalDateTime.ofInstant(instant, ZoneId.systemDefault());
+ }
+
+ /**
+ * 杞崲鎴恓ava8 鏃堕棿
+ *
+ * @param date Date
+ * @return LocalDateTime
+ */
+ public static LocalDateTime fromDate(final Date date) {
+ return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
+ }
+
+ /**
+ * 杞崲鎴恓ava8 鏃堕棿
+ *
+ * @param milliseconds 姣鏁�
+ * @return LocalDateTime
+ */
+ public static LocalDateTime fromMilliseconds(final long milliseconds) {
+ return LocalDateTime.ofInstant(Instant.ofEpochMilli(milliseconds), ZoneId.systemDefault());
+ }
+
+ /**
+ * 姣旇緝2涓椂闂村樊锛岃法搴︽瘮杈冨皬
+ *
+ * @param startInclusive 寮�濮嬫椂闂�
+ * @param endExclusive 缁撴潫鏃堕棿
+ * @return 鏃堕棿闂撮殧
+ */
+ public static Duration between(Temporal startInclusive, Temporal endExclusive) {
+ return Duration.between(startInclusive, endExclusive);
+ }
+
+ /**
+ * 姣旇緝2涓椂闂村樊锛岃法搴︽瘮杈冨ぇ锛屽勾鏈堟棩涓哄崟浣�
+ *
+ * @param startDate 寮�濮嬫椂闂�
+ * @param endDate 缁撴潫鏃堕棿
+ * @return 鏃堕棿闂撮殧
+ */
+ public static Period between(LocalDate startDate, LocalDate endDate) {
+ return Period.between(startDate, endDate);
+ }
+
+ /**
+ * 姣旇緝2涓� 鏃堕棿宸�
+ *
+ * @param startDate 寮�濮嬫椂闂�
+ * @param endDate 缁撴潫鏃堕棿
+ * @return 鏃堕棿闂撮殧
+ */
+ public static Duration between(Date startDate, Date endDate) {
+ return Duration.between(startDate.toInstant(), endDate.toInstant());
+ }
+
+ /**
+ * 灏嗙鏁拌浆鎹负鏃ユ椂鍒嗙
+ *
+ * @param second 绉掓暟
+ * @return 鏃堕棿
+ */
+ public static String secondToTime(Long second) {
+ // 鍒ゆ柇鏄惁涓虹┖
+ if (second == null || second == 0L) {
+ return StringPool.EMPTY;
+ }
+ //杞崲澶╂暟
+ long days = second / 86400;
+ //鍓╀綑绉掓暟
+ second = second % 86400;
+ //杞崲灏忔椂
+ long hours = second / 3600;
+ //鍓╀綑绉掓暟
+ second = second % 3600;
+ //杞崲鍒嗛挓
+ long minutes = second / 60;
+ //鍓╀綑绉掓暟
+ second = second % 60;
+ if (days > 0) {
+ return StringUtil.format("{}澶﹞}灏忔椂{}鍒唟}绉�", days, hours, minutes, second);
+ } else {
+ return StringUtil.format("{}灏忔椂{}鍒唟}绉�", hours, minutes, second);
+ }
+ }
+
+ /**
+ * 鑾峰彇浠婂ぉ鐨勬棩鏈�
+ *
+ * @return 鏃堕棿
+ */
+ public static String today() {
+ return format(new Date(), "yyyyMMdd");
+ }
+
+ /**
+ * 鑾峰彇浠婂ぉ鐨勬椂闂�
+ *
+ * @return 鏃堕棿
+ */
+ public static String time() {
+ return format(new Date(), PATTERN_DATETIME_MINI);
+ }
+
+ /**
+ * 鑾峰彇浠婂ぉ鐨勫皬鏃舵暟
+ *
+ * @return 鏃堕棿
+ */
+ public static Integer hour() {
+ return NumberUtil.toInt(format(new Date(), "HH"));
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DigestUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DigestUtil.java
new file mode 100644
index 0000000..5daa93e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/DigestUtil.java
@@ -0,0 +1,433 @@
+package com.vci.web.util;
+
+import org.springframework.lang.Nullable;
+import org.springframework.util.DigestUtils;
+
+import javax.crypto.Mac;
+import javax.crypto.SecretKey;
+import javax.crypto.spec.SecretKeySpec;
+import java.security.InvalidKeyException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * 鍔犲瘑鐩稿叧宸ュ叿绫荤洿鎺ヤ娇鐢⊿pring util灏佽锛屽噺灏慾ar渚濊禆
+ *
+ * @author L.cm
+ */
+public class DigestUtil extends org.springframework.util.DigestUtils {
+ private static final char[] HEX_CODE = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
+
+ /**
+ * Calculates the MD5 digest and returns the value as a 32 character hex string.
+ *
+ * @param data Data to digest
+ * @return MD5 digest as a hex string
+ */
+ public static String md5Hex(final String data) {
+ return DigestUtils.md5DigestAsHex(data.getBytes(Charsets.UTF_8));
+ }
+
+ /**
+ * Return a hexadecimal string representation of the MD5 digest of the given bytes.
+ *
+ * @param bytes the bytes to calculate the digest over
+ * @return a hexadecimal digest string
+ */
+ public static String md5Hex(final byte[] bytes) {
+ return DigestUtils.md5DigestAsHex(bytes);
+ }
+
+ /**
+ * sha1Hex
+ *
+ * @param data Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha1Hex(String data) {
+ return DigestUtil.sha1Hex(data.getBytes(Charsets.UTF_8));
+ }
+
+ /**
+ * sha1Hex
+ *
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha1Hex(final byte[] bytes) {
+ return DigestUtil.digestHex("SHA-1", bytes);
+ }
+
+ /**
+ * SHA224Hex
+ *
+ * @param data Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha224Hex(String data) {
+ return DigestUtil.sha224Hex(data.getBytes(Charsets.UTF_8));
+ }
+
+ /**
+ * SHA224Hex
+ *
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha224Hex(final byte[] bytes) {
+ return DigestUtil.digestHex("SHA-224", bytes);
+ }
+
+ /**
+ * sha256Hex
+ *
+ * @param data Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha256Hex(String data) {
+ return DigestUtil.sha256Hex(data.getBytes(Charsets.UTF_8));
+ }
+
+ /**
+ * sha256Hex
+ *
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha256Hex(final byte[] bytes) {
+ return DigestUtil.digestHex("SHA-256", bytes);
+ }
+
+ /**
+ * sha384Hex
+ *
+ * @param data Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha384Hex(String data) {
+ return DigestUtil.sha384Hex(data.getBytes(Charsets.UTF_8));
+ }
+
+ /**
+ * sha384Hex
+ *
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha384Hex(final byte[] bytes) {
+ return DigestUtil.digestHex("SHA-384", bytes);
+ }
+
+ /**
+ * sha512Hex
+ *
+ * @param data Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha512Hex(String data) {
+ return DigestUtil.sha512Hex(data.getBytes(Charsets.UTF_8));
+ }
+
+ /**
+ * sha512Hex
+ *
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha512Hex(final byte[] bytes) {
+ return DigestUtil.digestHex("SHA-512", bytes);
+ }
+
+ /**
+ * digest Hex
+ *
+ * @param algorithm 绠楁硶
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String digestHex(String algorithm, byte[] bytes) {
+ try {
+ MessageDigest md = MessageDigest.getInstance(algorithm);
+ return encodeHex(md.digest(bytes));
+ } catch (NoSuchAlgorithmException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * hmacMd5 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacMd5Hex(String data, String key) {
+ return DigestUtil.hmacMd5Hex(data.getBytes(Charsets.UTF_8), key);
+ }
+
+ /**
+ * hmacMd5 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacMd5Hex(final byte[] bytes, String key) {
+ return DigestUtil.digestHMacHex("HmacMD5", bytes, key);
+ }
+
+ /**
+ * hmacSha1 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha1Hex(String data, String key) {
+ return DigestUtil.hmacSha1Hex(data.getBytes(Charsets.UTF_8), key);
+ }
+
+ /**
+ * hmacSha1 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha1Hex(final byte[] bytes, String key) {
+ return DigestUtil.digestHMacHex("HmacSHA1", bytes, key);
+ }
+
+ /**
+ * hmacSha224 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha224Hex(String data, String key) {
+ return DigestUtil.hmacSha224Hex(data.getBytes(Charsets.UTF_8), key);
+ }
+
+ /**
+ * hmacSha224 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha224Hex(final byte[] bytes, String key) {
+ return DigestUtil.digestHMacHex("HmacSHA224", bytes, key);
+ }
+
+ /**
+ * hmacSha256
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static byte[] hmacSha256(String data, String key) {
+ return DigestUtil.hmacSha256(data.getBytes(Charsets.UTF_8), key);
+ }
+
+ /**
+ * hmacSha256
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a byte array
+ */
+ public static byte[] hmacSha256(final byte[] bytes, String key) {
+ return DigestUtil.digestHMac("HmacSHA256", bytes, key);
+ }
+
+ /**
+ * hmacSha256 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha256Hex(String data, String key) {
+ return DigestUtil.hmacSha256Hex(data.getBytes(Charsets.UTF_8), key);
+ }
+
+ /**
+ * hmacSha256 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha256Hex(final byte[] bytes, String key) {
+ return DigestUtil.digestHMacHex("HmacSHA256", bytes, key);
+ }
+
+ /**
+ * hmacSha384 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha384Hex(String data, String key) {
+ return DigestUtil.hmacSha384Hex(data.getBytes(Charsets.UTF_8), key);
+ }
+
+ /**
+ * hmacSha384 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha384Hex(final byte[] bytes, String key) {
+ return DigestUtil.digestHMacHex("HmacSHA384", bytes, key);
+ }
+
+ /**
+ * hmacSha512 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha512Hex(String data, String key) {
+ return DigestUtil.hmacSha512Hex(data.getBytes(Charsets.UTF_8), key);
+ }
+
+ /**
+ * hmacSha512 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha512Hex(final byte[] bytes, String key) {
+ return DigestUtil.digestHMacHex("HmacSHA512", bytes, key);
+ }
+
+ /**
+ * digest HMac Hex
+ *
+ * @param algorithm 绠楁硶
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String digestHMacHex(String algorithm, final byte[] bytes, String key) {
+ SecretKey secretKey = new SecretKeySpec(key.getBytes(Charsets.UTF_8), algorithm);
+ try {
+ Mac mac = Mac.getInstance(secretKey.getAlgorithm());
+ mac.init(secretKey);
+ return DigestUtil.encodeHex(mac.doFinal(bytes));
+ } catch (NoSuchAlgorithmException | InvalidKeyException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * digest HMac
+ *
+ * @param algorithm 绠楁硶
+ * @param bytes Data to digest
+ * @return digest as a byte array
+ */
+ public static byte[] digestHMac(String algorithm, final byte[] bytes, String key) {
+ SecretKey secretKey = new SecretKeySpec(key.getBytes(Charsets.UTF_8), algorithm);
+ try {
+ Mac mac = Mac.getInstance(secretKey.getAlgorithm());
+ mac.init(secretKey);
+ return mac.doFinal(bytes);
+ } catch (NoSuchAlgorithmException | InvalidKeyException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * encode Hex
+ *
+ * @param bytes Data to Hex
+ * @return bytes as a hex string
+ */
+ public static String encodeHex(byte[] bytes) {
+ StringBuilder r = new StringBuilder(bytes.length * 2);
+ for (byte b : bytes) {
+ r.append(HEX_CODE[(b >> 4) & 0xF]);
+ r.append(HEX_CODE[(b & 0xF)]);
+ }
+ return r.toString();
+ }
+
+ /**
+ * decode Hex
+ *
+ * @param hexStr Hex string
+ * @return decode hex to bytes
+ */
+ public static byte[] decodeHex(final String hexStr) {
+ return DatatypeConverterUtil.parseHexBinary(hexStr);
+ }
+
+ /**
+ * 姣旇緝瀛楃涓诧紝閬垮厤瀛楃涓插洜涓鸿繃闀匡紝浜х敓鑰楁椂
+ *
+ * @param a String
+ * @param b String
+ * @return 鏄惁鐩稿悓
+ */
+ public static boolean slowEquals(@Nullable String a, @Nullable String b) {
+ if (a == null || b == null) {
+ return false;
+ }
+ return DigestUtil.slowEquals(a.getBytes(Charsets.UTF_8), b.getBytes(Charsets.UTF_8));
+ }
+
+ /**
+ * 姣旇緝 byte 鏁扮粍锛岄伩鍏嶅瓧绗︿覆鍥犱负杩囬暱锛屼骇鐢熻�楁椂
+ *
+ * @param a byte array
+ * @param b byte array
+ * @return 鏄惁鐩稿悓
+ */
+ public static boolean slowEquals(@Nullable byte[] a, @Nullable byte[] b) {
+ if (a == null || b == null) {
+ return false;
+ }
+ if (a.length != b.length) {
+ return false;
+ }
+ int diff = a.length ^ b.length;
+ for (int i = 0; i < a.length; i++) {
+ diff |= a[i] ^ b[i];
+ }
+ return diff == 0;
+ }
+
+ /**
+ * 鑷畾涔夊姞瀵� 灏嗗墠绔紶閫掔殑瀵嗙爜鍐嶆鍔犲瘑
+ *
+ * @param data 鏁版嵁
+ * @return {String}
+ */
+ public static String hex(String data) {
+ if (StringUtil.isBlank(data)) {
+ return StringPool.EMPTY;
+ }
+ return sha1Hex(data);
+ }
+
+ /**
+ * 鐢ㄦ埛瀵嗙爜鍔犲瘑瑙勫垯 鍏圡D5鍐峉HA1
+ *
+ * @param data 鏁版嵁
+ * @return {String}
+ */
+ public static String encrypt(String data) {
+ if (StringUtil.isBlank(data)) {
+ return StringPool.EMPTY;
+ }
+ return sha1Hex(md5Hex(data));
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Exceptions.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Exceptions.java
new file mode 100644
index 0000000..b43a584
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Exceptions.java
@@ -0,0 +1,99 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util;
+
+import cn.hutool.core.io.FastStringWriter;
+
+import java.io.PrintWriter;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.UndeclaredThrowableException;
+
+/**
+ * 寮傚父澶勭悊宸ュ叿绫�
+ *
+ * @author L.cm
+ */
+public class Exceptions {
+
+ /**
+ * 灏咰heckedException杞崲涓篣ncheckedException.
+ *
+ * @param e Throwable
+ * @return {RuntimeException}
+ */
+ public static RuntimeException unchecked(Throwable e) {
+ if (e instanceof Error) {
+ throw (Error) e;
+ } else if (e instanceof IllegalAccessException ||
+ e instanceof IllegalArgumentException ||
+ e instanceof NoSuchMethodException) {
+ return new IllegalArgumentException(e);
+ } else if (e instanceof InvocationTargetException) {
+ return new RuntimeException(((InvocationTargetException) e).getTargetException());
+ } else if (e instanceof RuntimeException) {
+ return (RuntimeException) e;
+ } else if (e instanceof InterruptedException) {
+ Thread.currentThread().interrupt();
+ }
+ return Exceptions.runtime(e);
+ }
+
+ /**
+ * 涓嶉噰鐢� RuntimeException 鍖呰锛岀洿鎺ユ姏鍑猴紝浣垮紓甯告洿鍔犵簿鍑�
+ *
+ * @param throwable Throwable
+ * @param <T> 娉涘瀷鏍囪
+ * @return Throwable
+ * @throws T 娉涘瀷
+ */
+ @SuppressWarnings("unchecked")
+ private static <T extends Throwable> T runtime(Throwable throwable) throws T {
+ throw (T) throwable;
+ }
+
+ /**
+ * 浠g悊寮傚父瑙e寘
+ *
+ * @param wrapped 鍖呰杩囧緱寮傚父
+ * @return 瑙e寘鍚庣殑寮傚父
+ */
+ public static Throwable unwrap(Throwable wrapped) {
+ Throwable unwrapped = wrapped;
+ while (true) {
+ if (unwrapped instanceof InvocationTargetException) {
+ unwrapped = ((InvocationTargetException) unwrapped).getTargetException();
+ } else if (unwrapped instanceof UndeclaredThrowableException) {
+ unwrapped = ((UndeclaredThrowableException) unwrapped).getUndeclaredThrowable();
+ } else {
+ return unwrapped;
+ }
+ }
+ }
+
+ /**
+ * 灏咵rrorStack杞寲涓篠tring.
+ *
+ * @param ex Throwable
+ * @return {String}
+ */
+ public static String getStackTraceAsString(Throwable ex) {
+ FastStringWriter stringWriter = new FastStringWriter();
+ ex.printStackTrace(new PrintWriter(stringWriter));
+ return stringWriter.toString();
+ }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/FileUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/FileUtil.java
new file mode 100644
index 0000000..be66a55
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/FileUtil.java
@@ -0,0 +1,383 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util;
+
+import org.springframework.lang.Nullable;
+import org.springframework.util.Assert;
+import org.springframework.util.FileSystemUtils;
+import org.springframework.util.PatternMatchUtils;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.*;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鏂囦欢宸ュ叿绫�
+ *
+ * @author L.cm
+ */
+public class FileUtil extends org.springframework.util.FileCopyUtils {
+
+ /**
+ * 榛樿涓簍rue
+ *
+ * @author L.cm
+ */
+ public static class TrueFilter implements FileFilter, Serializable {
+ private static final long serialVersionUID = -6420452043795072619L;
+
+ public final static TrueFilter TRUE = new TrueFilter();
+
+ @Override
+ public boolean accept(File pathname) {
+ return true;
+ }
+ }
+
+ /**
+ * 鎵弿鐩綍涓嬬殑鏂囦欢
+ *
+ * @param path 璺緞
+ * @return 鏂囦欢闆嗗悎
+ */
+ public static List<File> list(String path) {
+ File file = new File(path);
+ return list(file, TrueFilter.TRUE);
+ }
+
+ /**
+ * 鎵弿鐩綍涓嬬殑鏂囦欢
+ *
+ * @param path 璺緞
+ * @param fileNamePattern 鏂囦欢鍚� * 鍙�
+ * @return 鏂囦欢闆嗗悎
+ */
+ public static List<File> list(String path, final String fileNamePattern) {
+ File file = new File(path);
+ return list(file, pathname -> {
+ String fileName = pathname.getName();
+ return PatternMatchUtils.simpleMatch(fileNamePattern, fileName);
+ });
+ }
+
+ /**
+ * 鎵弿鐩綍涓嬬殑鏂囦欢
+ *
+ * @param path 璺緞
+ * @param filter 鏂囦欢杩囨护
+ * @return 鏂囦欢闆嗗悎
+ */
+ public static List<File> list(String path, FileFilter filter) {
+ File file = new File(path);
+ return list(file, filter);
+ }
+
+ /**
+ * 鎵弿鐩綍涓嬬殑鏂囦欢
+ *
+ * @param file 鏂囦欢
+ * @return 鏂囦欢闆嗗悎
+ */
+ public static List<File> list(File file) {
+ List<File> fileList = new ArrayList<>();
+ return list(file, fileList, TrueFilter.TRUE);
+ }
+
+ /**
+ * 鎵弿鐩綍涓嬬殑鏂囦欢
+ *
+ * @param file 鏂囦欢
+ * @param fileNamePattern Spring AntPathMatcher 瑙勫垯
+ * @return 鏂囦欢闆嗗悎
+ */
+ public static List<File> list(File file, final String fileNamePattern) {
+ List<File> fileList = new ArrayList<>();
+ return list(file, fileList, pathname -> {
+ String fileName = pathname.getName();
+ return PatternMatchUtils.simpleMatch(fileNamePattern, fileName);
+ });
+ }
+
+ /**
+ * 鎵弿鐩綍涓嬬殑鏂囦欢
+ *
+ * @param file 鏂囦欢
+ * @param filter 鏂囦欢杩囨护
+ * @return 鏂囦欢闆嗗悎
+ */
+ public static List<File> list(File file, FileFilter filter) {
+ List<File> fileList = new ArrayList<>();
+ return list(file, fileList, filter);
+ }
+
+ /**
+ * 鎵弿鐩綍涓嬬殑鏂囦欢
+ *
+ * @param file 鏂囦欢
+ * @param filter 鏂囦欢杩囨护
+ * @return 鏂囦欢闆嗗悎
+ */
+ private static List<File> list(File file, List<File> fileList, FileFilter filter) {
+ if (file.isDirectory()) {
+ File[] files = file.listFiles();
+ if (files != null) {
+ for (File f : files) {
+ list(f, fileList, filter);
+ }
+ }
+ } else {
+ // 杩囨护鏂囦欢
+ boolean accept = filter.accept(file);
+ if (file.exists() && accept) {
+ fileList.add(file);
+ }
+ }
+ return fileList;
+ }
+
+ /**
+ * 鑾峰彇鏂囦欢鍚庣紑鍚�
+ * @param fullName 鏂囦欢鍏ㄥ悕
+ * @return {String}
+ */
+ public static String getFileExtension(String fullName) {
+ if (StringUtil.isBlank(fullName)) return StringPool.EMPTY;
+ String fileName = new File(fullName).getName();
+ int dotIndex = fileName.lastIndexOf(CharPool.DOT);
+ return (dotIndex == -1) ? "" : fileName.substring(dotIndex + 1);
+ }
+
+ /**
+ * 鑾峰彇鏂囦欢鍚嶏紝鍘婚櫎鍚庣紑鍚�
+ * @param fullName 鏂囦欢鍏ㄥ悕
+ * @return {String}
+ */
+ public static String getNameWithoutExtension(String fullName) {
+ if (StringUtil.isBlank(fullName)) return StringPool.EMPTY;
+ String fileName = new File(fullName).getName();
+ int dotIndex = fileName.lastIndexOf(CharPool.DOT);
+ return (dotIndex == -1) ? fileName : fileName.substring(0, dotIndex);
+ }
+
+ /**
+ * Returns the path to the system temporary directory.
+ *
+ * @return the path to the system temporary directory.
+ */
+ public static String getTempDirPath() {
+ return System.getProperty("java.io.tmpdir");
+ }
+
+ /**
+ * Returns a {@link File} representing the system temporary directory.
+ *
+ * @return the system temporary directory.
+ */
+ public static File getTempDir() {
+ return new File(getTempDirPath());
+ }
+
+ /**
+ * Reads the contents of a file into a String.
+ * The file is always closed.
+ *
+ * @param file the file to read, must not be {@code null}
+ * @return the file contents, never {@code null}
+ */
+ public static String readToString(final File file) {
+ return readToString(file, Charsets.UTF_8);
+ }
+
+ /**
+ * Reads the contents of a file into a String.
+ * The file is always closed.
+ *
+ * @param file the file to read, must not be {@code null}
+ * @param encoding the encoding to use, {@code null} means platform default
+ * @return the file contents, never {@code null}
+ */
+ public static String readToString(final File file, final Charset encoding) {
+ try (InputStream in = Files.newInputStream(file.toPath())) {
+ return IoUtil.readToString(in, encoding);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * Reads the contents of a file into a String.
+ * The file is always closed.
+ *
+ * @param file the file to read, must not be {@code null}
+ * @return the file contents, never {@code null}
+ */
+ public static byte[] readToByteArray(final File file) {
+ try (InputStream in = Files.newInputStream(file.toPath())) {
+ return IoUtil.readToByteArray(in);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * Writes a String to a file creating the file if it does not exist.
+ *
+ * @param file the file to write
+ * @param data the content to write to the file
+ */
+ public static void writeToFile(final File file, final String data) {
+ writeToFile(file, data, Charsets.UTF_8, false);
+ }
+
+ /**
+ * Writes a String to a file creating the file if it does not exist.
+ *
+ * @param file the file to write
+ * @param data the content to write to the file
+ * @param append if {@code true}, then the String will be added to the
+ * end of the file rather than overwriting
+ */
+ public static void writeToFile(final File file, final String data, final boolean append){
+ writeToFile(file, data, Charsets.UTF_8, append);
+ }
+
+ /**
+ * Writes a String to a file creating the file if it does not exist.
+ *
+ * @param file the file to write
+ * @param data the content to write to the file
+ * @param encoding the encoding to use, {@code null} means platform default
+ */
+ public static void writeToFile(final File file, final String data, final Charset encoding) {
+ writeToFile(file, data, encoding, false);
+ }
+
+ /**
+ * Writes a String to a file creating the file if it does not exist.
+ *
+ * @param file the file to write
+ * @param data the content to write to the file
+ * @param encoding the encoding to use, {@code null} means platform default
+ * @param append if {@code true}, then the String will be added to the
+ * end of the file rather than overwriting
+ */
+ public static void writeToFile(final File file, final String data, final Charset encoding, final boolean append) {
+ try (OutputStream out = new FileOutputStream(file, append)) {
+ IoUtil.write(data, out, encoding);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 杞垚file
+ * @param multipartFile MultipartFile
+ * @param file File
+ */
+ public static void toFile(MultipartFile multipartFile, final File file) {
+ try {
+ FileUtil.toFile(multipartFile.getInputStream(), file);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 杞垚file
+ * @param in InputStream
+ * @param file File
+ */
+ public static void toFile(InputStream in, final File file) {
+ try (OutputStream out = new FileOutputStream(file)) {
+ FileUtil.copy(in, out);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * Moves a file.
+ * <p>
+ * When the destination file is on another file system, do a "copy and delete".
+ *
+ * @param srcFile the file to be moved
+ * @param destFile the destination file
+ * @throws NullPointerException if source or destination is {@code null}
+ * @throws IOException if source or destination is invalid
+ * @throws IOException if an IO error occurs moving the file
+ */
+ public static void moveFile(final File srcFile, final File destFile) throws IOException {
+ Assert.notNull(srcFile, "Source must not be null");
+ Assert.notNull(destFile, "Destination must not be null");
+ if (!srcFile.exists()) {
+ throw new FileNotFoundException("Source '" + srcFile + "' does not exist");
+ }
+ if (srcFile.isDirectory()) {
+ throw new IOException("Source '" + srcFile + "' is a directory");
+ }
+ if (destFile.exists()) {
+ throw new IOException("Destination '" + destFile + "' already exists");
+ }
+ if (destFile.isDirectory()) {
+ throw new IOException("Destination '" + destFile + "' is a directory");
+ }
+ final boolean rename = srcFile.renameTo(destFile);
+ if (!rename) {
+ FileUtil.copy(srcFile, destFile);
+ if (!srcFile.delete()) {
+ FileUtil.deleteQuietly(destFile);
+ throw new IOException("Failed to delete original file '" + srcFile + "' after copy to '" + destFile + "'");
+ }
+ }
+ }
+
+ /**
+ * Deletes a file, never throwing an exception. If file is a directory, delete it and all sub-directories.
+ * <p>
+ * The difference between File.delete() and this method are:
+ * <ul>
+ * <li>A directory to be deleted does not have to be empty.</li>
+ * <li>No exceptions are thrown when a file or directory cannot be deleted.</li>
+ * </ul>
+ *
+ * @param file file or directory to delete, can be {@code null}
+ * @return {@code true} if the file or directory was deleted, otherwise
+ * {@code false}
+ */
+ public static boolean deleteQuietly(@Nullable final File file) {
+ if (file == null) {
+ return false;
+ }
+ try {
+ if (file.isDirectory()) {
+ FileSystemUtils.deleteRecursively(file);
+ }
+ } catch (final Exception ignored) {
+ }
+
+ try {
+ return file.delete();
+ } catch (final Exception ignored) {
+ return false;
+ }
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Func.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Func.java
new file mode 100644
index 0000000..ffb3a4e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Func.java
@@ -0,0 +1,2140 @@
+package com.vci.web.util;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.JsonNode;
+import com.vci.web.util.jackson.JsonUtil;
+import org.springframework.util.StringUtils;
+import org.springframework.beans.BeansException;
+import org.springframework.core.MethodParameter;
+import org.springframework.core.annotation.AnnotatedElementUtils;
+import org.springframework.core.convert.TypeDescriptor;
+import org.springframework.lang.Nullable;
+import org.springframework.util.PatternMatchUtils;
+import org.springframework.web.method.HandlerMethod;
+
+import java.io.Closeable;
+import java.io.File;
+import java.io.InputStream;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Method;
+import java.nio.charset.Charset;
+import java.text.DecimalFormat;
+import java.time.Duration;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.Temporal;
+import java.time.temporal.TemporalAccessor;
+import java.util.*;
+import java.util.function.Supplier;
+
+/**
+ * 宸ュ叿鍖呴泦鍚堬紝宸ュ叿绫诲揩鎹锋柟寮�
+ *
+ * @author L.cm
+ */
+public class Func {
+
+ /**
+ * 鏂█锛屽繀椤讳笉鑳戒负 null
+ * <blockquote><pre>
+ * public Foo(Bar bar) {
+ * this.bar = $.requireNotNull(bar);
+ * }
+ * </pre></blockquote>
+ *
+ * @param obj the object reference to check for nullity
+ * @param <T> the type of the reference
+ * @return {@code obj} if not {@code null}
+ * @throws NullPointerException if {@code obj} is {@code null}
+ */
+ public static <T> T requireNotNull(T obj) {
+ return Objects.requireNonNull(obj);
+ }
+
+ /**
+ * 鏂█锛屽繀椤讳笉鑳戒负 null
+ * <blockquote><pre>
+ * public Foo(Bar bar, Baz baz) {
+ * this.bar = $.requireNotNull(bar, "bar must not be null");
+ * this.baz = $.requireNotNull(baz, "baz must not be null");
+ * }
+ * </pre></blockquote>
+ *
+ * @param obj the object reference to check for nullity
+ * @param message detail message to be used in the event that a {@code
+ * NullPointerException} is thrown
+ * @param <T> the type of the reference
+ * @return {@code obj} if not {@code null}
+ * @throws NullPointerException if {@code obj} is {@code null}
+ */
+ public static <T> T requireNotNull(T obj, String message) {
+ return Objects.requireNonNull(obj, message);
+ }
+
+ /**
+ * 鏂█锛屽繀椤讳笉鑳戒负 null
+ * <blockquote><pre>
+ * public Foo(Bar bar, Baz baz) {
+ * this.bar = $.requireNotNull(bar, () -> "bar must not be null");
+ * }
+ * </pre></blockquote>
+ *
+ * @param obj the object reference to check for nullity
+ * @param messageSupplier supplier of the detail message to be
+ * used in the event that a {@code NullPointerException} is thrown
+ * @param <T> the type of the reference
+ * @return {@code obj} if not {@code null}
+ * @throws NullPointerException if {@code obj} is {@code null}
+ */
+ public static <T> T requireNotNull(T obj, Supplier<String> messageSupplier) {
+ return Objects.requireNonNull(obj, messageSupplier);
+ }
+
+ /**
+ * 鍒ゆ柇瀵硅薄鏄惁涓簄ull
+ * <p>
+ * This method exists to be used as a
+ * {@link java.util.function.Predicate}, {@code filter($::isNull)}
+ * </p>
+ *
+ * @param obj a reference to be checked against {@code null}
+ * @return {@code true} if the provided reference is {@code null} otherwise
+ * {@code false}
+ * @see java.util.function.Predicate
+ */
+ public static boolean isNull(@Nullable Object obj) {
+ return Objects.isNull(obj);
+ }
+
+ /**
+ * 鍒ゆ柇瀵硅薄鏄惁 not null
+ * <p>
+ * This method exists to be used as a
+ * {@link java.util.function.Predicate}, {@code filter($::notNull)}
+ * </p>
+ *
+ * @param obj a reference to be checked against {@code null}
+ * @return {@code true} if the provided reference is non-{@code null}
+ * otherwise {@code false}
+ * @see java.util.function.Predicate
+ */
+ public static boolean notNull(@Nullable Object obj) {
+ return Objects.nonNull(obj);
+ }
+
+ /**
+ * 棣栧瓧姣嶅彉灏忓啓
+ *
+ * @param str 瀛楃涓�
+ * @return {String}
+ */
+ public static String firstCharToLower(String str) {
+ return StringUtil.firstCharToLower(str);
+ }
+
+ /**
+ * 棣栧瓧姣嶅彉澶у啓
+ *
+ * @param str 瀛楃涓�
+ * @return {String}
+ */
+ public static String firstCharToUpper(String str) {
+ return StringUtil.firstCharToUpper(str);
+ }
+
+ /**
+ * 鍒ゆ柇鏄惁涓虹┖瀛楃涓�
+ * <pre class="code">
+ * $.isBlank(null) = true
+ * $.isBlank("") = true
+ * $.isBlank(" ") = true
+ * $.isBlank("12345") = false
+ * $.isBlank(" 12345 ") = false
+ * </pre>
+ *
+ * @param cs the {@code CharSequence} to check (may be {@code null})
+ * @return {@code true} if the {@code CharSequence} is not {@code null},
+ * its length is greater than 0, and it does not contain whitespace only
+ * @see Character#isWhitespace
+ */
+ public static boolean isBlank(@Nullable final CharSequence cs) {
+ return StringUtil.isBlank(cs);
+ }
+
+ /**
+ * 鍒ゆ柇涓嶄负绌哄瓧绗︿覆
+ * <pre>
+ * $.isNotBlank(null) = false
+ * $.isNotBlank("") = false
+ * $.isNotBlank(" ") = false
+ * $.isNotBlank("bob") = true
+ * $.isNotBlank(" bob ") = true
+ * </pre>
+ *
+ * @param cs the CharSequence to check, may be null
+ * @return {@code true} if the CharSequence is
+ * not empty and not null and not whitespace
+ * @see Character#isWhitespace
+ */
+ public static boolean isNotBlank(@Nullable final CharSequence cs) {
+ return StringUtil.isNotBlank(cs);
+ }
+
+ /**
+ * 鍒ゆ柇鏄惁鏈変换鎰忎竴涓� 绌哄瓧绗︿覆
+ *
+ * @param css CharSequence
+ * @return boolean
+ */
+ public static boolean isAnyBlank(final CharSequence... css) {
+ return StringUtil.isAnyBlank(css);
+ }
+
+ /**
+ * 鍒ゆ柇鏄惁鍏ㄤ负闈炵┖瀛楃涓�
+ *
+ * @param css CharSequence
+ * @return boolean
+ */
+ public static boolean isNoneBlank(final CharSequence... css) {
+ return StringUtil.isNoneBlank(css);
+ }
+
+ /**
+ * 鍒ゆ柇瀵硅薄鏄暟缁�
+ *
+ * @param obj the object to check
+ * @return 鏄惁鏁扮粍
+ */
+ public static boolean isArray(@Nullable Object obj) {
+ return ObjectUtil.isArray(obj);
+ }
+
+ /**
+ * 鍒ゆ柇绌哄璞� object銆乵ap銆乴ist銆乻et銆佸瓧绗︿覆銆佹暟缁�
+ *
+ * @param obj the object to check
+ * @return 鏁扮粍鏄惁涓虹┖
+ */
+ public static boolean isEmpty(@Nullable Object obj) {
+ return ObjectUtil.isEmpty(obj);
+ }
+
+ /**
+ * 瀵硅薄涓嶄负绌� object銆乵ap銆乴ist銆乻et銆佸瓧绗︿覆銆佹暟缁�
+ *
+ * @param obj the object to check
+ * @return 鏄惁涓嶄负绌�
+ */
+ public static boolean isNotEmpty(@Nullable Object obj) {
+ return !ObjectUtil.isEmpty(obj);
+ }
+
+ /**
+ * 鍒ゆ柇鏁扮粍涓虹┖
+ *
+ * @param array the array to check
+ * @return 鏁扮粍鏄惁涓虹┖
+ */
+ public static boolean isEmpty(@Nullable Object[] array) {
+ return ObjectUtil.isEmpty(array);
+ }
+
+ /**
+ * 鍒ゆ柇鏁扮粍涓嶄负绌�
+ *
+ * @param array 鏁扮粍
+ * @return 鏁扮粍鏄惁涓嶄负绌�
+ */
+ public static boolean isNotEmpty(@Nullable Object[] array) {
+ return ObjectUtil.isNotEmpty(array);
+ }
+
+ /**
+ * 瀵硅薄缁勪腑鏄惁瀛樺湪 Empty Object
+ *
+ * @param os 瀵硅薄缁�
+ * @return boolean
+ */
+ public static boolean hasEmpty(Object... os) {
+ for (Object o : os) {
+ if (isEmpty(o)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 瀵硅薄缁勪腑鏄惁鍏ㄩ儴涓� Empty Object
+ *
+ * @param os 瀵硅薄缁�
+ * @return boolean
+ */
+ public static boolean isAllEmpty(Object... os) {
+ for (Object o : os) {
+ if (isNotEmpty(o)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆涓壒瀹氭ā寮忕殑瀛楃杞崲鎴恗ap涓搴旂殑鍊�
+ * <p>
+ * use: format("my name is ${name}, and i like ${like}!", {"name":"L.cm", "like": "Java"})
+ *
+ * @param message 闇�瑕佽浆鎹㈢殑瀛楃涓�
+ * @param params 杞崲鎵�闇�鐨勯敭鍊煎闆嗗悎
+ * @return 杞崲鍚庣殑瀛楃涓�
+ */
+ public static String format(@Nullable String message, @Nullable Map<String, ?> params) {
+ return StringUtil.format(message, params);
+ }
+
+ /**
+ * 鍚� log 鏍煎紡鐨� format 瑙勫垯
+ * <p>
+ * use: format("my name is {}, and i like {}!", "L.cm", "Java")
+ *
+ * @param message 闇�瑕佽浆鎹㈢殑瀛楃涓�
+ * @param arguments 闇�瑕佹浛鎹㈢殑鍙橀噺
+ * @return 杞崲鍚庣殑瀛楃涓�
+ */
+ public static String format(@Nullable String message, @Nullable Object... arguments) {
+ return StringUtil.format(message, arguments);
+ }
+
+ /**
+ * 鏍煎紡鍖栨墽琛屾椂闂达紝鍗曚綅涓� ms 鍜� s锛屼繚鐣欎笁浣嶅皬鏁�
+ *
+ * @param nanos 绾崇
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String format(long nanos) {
+ return StringUtil.format(nanos);
+ }
+
+ /**
+ * 姣旇緝涓や釜瀵硅薄鏄惁鐩哥瓑銆�<br>
+ * 鐩稿悓鐨勬潯浠舵湁涓や釜锛屾弧瓒冲叾涓�鍗冲彲锛�<br>
+ *
+ * @param obj1 瀵硅薄1
+ * @param obj2 瀵硅薄2
+ * @return 鏄惁鐩哥瓑
+ */
+ public static boolean equals(Object obj1, Object obj2) {
+ return Objects.equals(obj1, obj2);
+ }
+
+ /**
+ * 瀹夊叏鐨� equals
+ *
+ * @param o1 first Object to compare
+ * @param o2 second Object to compare
+ * @return whether the given objects are equal
+ * @see Object#equals(Object)
+ * @see java.util.Arrays#equals
+ */
+ public static boolean equalsSafe(@Nullable Object o1, @Nullable Object o2) {
+ return ObjectUtil.nullSafeEquals(o1, o2);
+ }
+
+ /**
+ * 鍒ゆ柇鏁扮粍涓槸鍚﹀寘鍚厓绱�
+ *
+ * @param array the Array to check
+ * @param element the element to look for
+ * @param <T> The generic tag
+ * @return {@code true} if found, {@code false} else
+ */
+ public static <T> boolean contains(@Nullable T[] array, final T element) {
+ return CollectionUtil.contains(array, element);
+ }
+
+ /**
+ * 鍒ゆ柇杩唬鍣ㄤ腑鏄惁鍖呭惈鍏冪礌
+ *
+ * @param iterator the Iterator to check
+ * @param element the element to look for
+ * @return {@code true} if found, {@code false} otherwise
+ */
+ public static boolean contains(@Nullable Iterator<?> iterator, Object element) {
+ return CollectionUtil.contains(iterator, element);
+ }
+
+ /**
+ * 鍒ゆ柇鏋氫妇鏄惁鍖呭惈璇ュ厓绱�
+ *
+ * @param enumeration the Enumeration to check
+ * @param element the element to look for
+ * @return {@code true} if found, {@code false} otherwise
+ */
+ public static boolean contains(@Nullable Enumeration<?> enumeration, Object element) {
+ return CollectionUtil.contains(enumeration, element);
+ }
+
+ /**
+ * 涓嶅彲鍙� Set
+ *
+ * @param es 瀵硅薄
+ * @param <E> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ @SafeVarargs
+ public static <E> Set<E> ofImmutableSet(E... es) {
+ return CollectionUtil.ofImmutableSet(es);
+ }
+
+ /**
+ * 涓嶅彲鍙� List
+ *
+ * @param es 瀵硅薄
+ * @param <E> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ @SafeVarargs
+ public static <E> List<E> ofImmutableList(E... es) {
+ return CollectionUtil.ofImmutableList(es);
+ }
+
+ /**
+ * 寮鸿浆string,骞跺幓鎺夊浣欑┖鏍�
+ *
+ * @param str 瀛楃涓�
+ * @return {String}
+ */
+ public static String toStr(Object str) {
+ return toStr(str, "");
+ }
+
+ /**
+ * 寮鸿浆string,骞跺幓鎺夊浣欑┖鏍�
+ *
+ * @param str 瀛楃涓�
+ * @param defaultValue 榛樿鍊�
+ * @return {String}
+ */
+ public static String toStr(Object str, String defaultValue) {
+ if (null == str || str.equals(StringPool.NULL)) {
+ return defaultValue;
+ }
+ return String.valueOf(str);
+ }
+
+ /**
+ * 寮鸿浆string(鍖呭惈绌哄瓧绗︿覆),骞跺幓鎺夊浣欑┖鏍�
+ *
+ * @param str 瀛楃涓�
+ * @param defaultValue 榛樿鍊�
+ * @return {String}
+ */
+ public static String toStrWithEmpty(Object str, String defaultValue) {
+ if (null == str || str.equals(StringPool.NULL) || str.equals(StringPool.EMPTY)) {
+ return defaultValue;
+ }
+ return String.valueOf(str);
+ }
+
+
+ /**
+ * 鍒ゆ柇涓�涓瓧绗︿覆鏄惁鏄暟瀛�
+ *
+ * @param cs the CharSequence to check, may be null
+ * @return {boolean}
+ */
+ public static boolean isNumeric(final CharSequence cs) {
+ return StringUtil.isNumeric(cs);
+ }
+
+ /**
+ * 瀛楃涓茶浆 int锛屼负绌哄垯杩斿洖0
+ *
+ * <pre>
+ * $.toInt(null) = 0
+ * $.toInt("") = 0
+ * $.toInt("1") = 1
+ * </pre>
+ *
+ * @param str the string to convert, may be null
+ * @return the int represented by the string, or <code>zero</code> if
+ * conversion fails
+ */
+ public static int toInt(final Object str) {
+ return NumberUtil.toInt(String.valueOf(str));
+ }
+
+ /**
+ * 瀛楃涓茶浆 int锛屼负绌哄垯杩斿洖榛樿鍊�
+ *
+ * <pre>
+ * $.toInt(null, 1) = 1
+ * $.toInt("", 1) = 1
+ * $.toInt("1", 0) = 1
+ * </pre>
+ *
+ * @param str the string to convert, may be null
+ * @param defaultValue the default value
+ * @return the int represented by the string, or the default if conversion fails
+ */
+ public static int toInt(@Nullable final Object str, final int defaultValue) {
+ return NumberUtil.toInt(String.valueOf(str), defaultValue);
+ }
+
+ /**
+ * 瀛楃涓茶浆 long锛屼负绌哄垯杩斿洖0
+ *
+ * <pre>
+ * $.toLong(null) = 0L
+ * $.toLong("") = 0L
+ * $.toLong("1") = 1L
+ * </pre>
+ *
+ * @param str the string to convert, may be null
+ * @return the long represented by the string, or <code>0</code> if
+ * conversion fails
+ */
+ public static long toLong(final Object str) {
+ return NumberUtil.toLong(String.valueOf(str));
+ }
+
+ /**
+ * 瀛楃涓茶浆 long锛屼负绌哄垯杩斿洖榛樿鍊�
+ *
+ * <pre>
+ * $.toLong(null, 1L) = 1L
+ * $.toLong("", 1L) = 1L
+ * $.toLong("1", 0L) = 1L
+ * </pre>
+ *
+ * @param str the string to convert, may be null
+ * @param defaultValue the default value
+ * @return the long represented by the string, or the default if conversion fails
+ */
+ public static long toLong(@Nullable final Object str, final long defaultValue) {
+ return NumberUtil.toLong(String.valueOf(str), defaultValue);
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to an <code>Double</code>, returning a
+ * default value if the conversion fails.</p>
+ *
+ * <p>If the string is <code>null</code>, the default value is returned.</p>
+ *
+ * <pre>
+ * $.toDouble(null, 1) = 1.0
+ * $.toDouble("", 1) = 1.0
+ * $.toDouble("1", 0) = 1.0
+ * </pre>
+ *
+ * @param value the string to convert, may be null
+ * @return the int represented by the string, or the default if conversion fails
+ */
+ public static Double toDouble(Object value) {
+ return toDouble(String.valueOf(value), -1.00);
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to an <code>Double</code>, returning a
+ * default value if the conversion fails.</p>
+ *
+ * <p>If the string is <code>null</code>, the default value is returned.</p>
+ *
+ * <pre>
+ * $.toDouble(null, 1) = 1.0
+ * $.toDouble("", 1) = 1.0
+ * $.toDouble("1", 0) = 1.0
+ * </pre>
+ *
+ * @param value the string to convert, may be null
+ * @param defaultValue the default value
+ * @return the int represented by the string, or the default if conversion fails
+ */
+ public static Double toDouble(Object value, Double defaultValue) {
+ return NumberUtil.toDouble(String.valueOf(value), defaultValue);
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to an <code>Float</code>, returning a
+ * default value if the conversion fails.</p>
+ *
+ * <p>If the string is <code>null</code>, the default value is returned.</p>
+ *
+ * <pre>
+ * $.toFloat(null, 1) = 1.00f
+ * $.toFloat("", 1) = 1.00f
+ * $.toFloat("1", 0) = 1.00f
+ * </pre>
+ *
+ * @param value the string to convert, may be null
+ * @return the int represented by the string, or the default if conversion fails
+ */
+ public static Float toFloat(Object value) {
+ return toFloat(String.valueOf(value), -1.0f);
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to an <code>Float</code>, returning a
+ * default value if the conversion fails.</p>
+ *
+ * <p>If the string is <code>null</code>, the default value is returned.</p>
+ *
+ * <pre>
+ * $.toFloat(null, 1) = 1.00f
+ * $.toFloat("", 1) = 1.00f
+ * $.toFloat("1", 0) = 1.00f
+ * </pre>
+ *
+ * @param value the string to convert, may be null
+ * @param defaultValue the default value
+ * @return the int represented by the string, or the default if conversion fails
+ */
+ public static Float toFloat(Object value, Float defaultValue) {
+ return NumberUtil.toFloat(String.valueOf(value), defaultValue);
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to an <code>Boolean</code>, returning a
+ * default value if the conversion fails.</p>
+ *
+ * <p>If the string is <code>null</code>, the default value is returned.</p>
+ *
+ * <pre>
+ * $.toBoolean("true", true) = true
+ * $.toBoolean("false") = false
+ * $.toBoolean("", false) = false
+ * </pre>
+ *
+ * @param value the string to convert, may be null
+ * @return the int represented by the string, or the default if conversion fails
+ */
+ public static Boolean toBoolean(Object value) {
+ return toBoolean(value, null);
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to an <code>Boolean</code>, returning a
+ * default value if the conversion fails.</p>
+ *
+ * <p>If the string is <code>null</code>, the default value is returned.</p>
+ *
+ * <pre>
+ * $.toBoolean("true", true) = true
+ * $.toBoolean("false") = false
+ * $.toBoolean("", false) = false
+ * </pre>
+ *
+ * @param value the string to convert, may be null
+ * @param defaultValue the default value
+ * @return the int represented by the string, or the default if conversion fails
+ */
+ public static Boolean toBoolean(Object value, Boolean defaultValue) {
+ if (value != null) {
+ String val = String.valueOf(value);
+ val = val.toLowerCase().trim();
+ return Boolean.parseBoolean(val);
+ }
+ return defaultValue;
+ }
+
+ /**
+ * 杞崲涓篒nteger鏁扮粍<br>
+ *
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static Integer[] toIntArray(String str) {
+ return toIntArray(",", str);
+ }
+
+ /**
+ * 杞崲涓篒nteger鏁扮粍<br>
+ *
+ * @param split 鍒嗛殧绗�
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static Integer[] toIntArray(String split, String str) {
+ if (StringUtil.isEmpty(str)) {
+ return new Integer[]{};
+ }
+ String[] arr = str.split(split);
+ final Integer[] ints = new Integer[arr.length];
+ for (int i = 0; i < arr.length; i++) {
+ final Integer v = toInt(arr[i], 0);
+ ints[i] = v;
+ }
+ return ints;
+ }
+
+ /**
+ * 杞崲涓篒nteger闆嗗悎<br>
+ *
+ * @param str 缁撴灉琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static List<Integer> toIntList(String str) {
+ return Arrays.asList(toIntArray(str));
+ }
+
+ /**
+ * 杞崲涓篒nteger闆嗗悎<br>
+ *
+ * @param split 鍒嗛殧绗�
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static List<Integer> toIntList(String split, String str) {
+ return Arrays.asList(toIntArray(split, str));
+ }
+
+ /**
+ * 鑾峰彇绗竴浣岻nteger鏁板��
+ *
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static Integer firstInt(String str) {
+ return firstInt(",", str);
+ }
+
+ /**
+ * 鑾峰彇绗竴浣岻nteger鏁板��
+ *
+ * @param split 鍒嗛殧绗�
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static Integer firstInt(String split, String str) {
+ List<Integer> ints = toIntList(split, str);
+ if (isEmpty(ints)) {
+ return null;
+ } else {
+ return ints.get(0);
+ }
+ }
+
+ /**
+ * 杞崲涓篖ong鏁扮粍<br>
+ *
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static Long[] toLongArray(String str) {
+ return toLongArray(",", str);
+ }
+
+ /**
+ * 杞崲涓篖ong鏁扮粍<br>
+ *
+ * @param split 鍒嗛殧绗�
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static Long[] toLongArray(String split, String str) {
+ if (StringUtil.isEmpty(str)) {
+ return new Long[]{};
+ }
+ String[] arr = str.split(split);
+ final Long[] longs = new Long[arr.length];
+ for (int i = 0; i < arr.length; i++) {
+ final Long v = toLong(arr[i], 0);
+ longs[i] = v;
+ }
+ return longs;
+ }
+
+ /**
+ * 杞崲涓篖ong闆嗗悎<br>
+ *
+ * @param str 缁撴灉琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static List<Long> toLongList(String str) {
+ return Arrays.asList(toLongArray(str));
+ }
+
+ /**
+ * 杞崲涓篖ong闆嗗悎<br>
+ *
+ * @param split 鍒嗛殧绗�
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static List<Long> toLongList(String split, String str) {
+ return Arrays.asList(toLongArray(split, str));
+ }
+
+ /**
+ * 鑾峰彇绗竴浣峀ong鏁板��
+ *
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static Long firstLong(String str) {
+ return firstLong(",", str);
+ }
+
+ /**
+ * 鑾峰彇绗竴浣峀ong鏁板��
+ *
+ * @param split 鍒嗛殧绗�
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static Long firstLong(String split, String str) {
+ List<Long> longs = toLongList(split, str);
+ if (isEmpty(longs)) {
+ return null;
+ } else {
+ return longs.get(0);
+ }
+ }
+
+ /**
+ * 杞崲涓篠tring鏁扮粍<br>
+ *
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static String[] toStrArray(String str) {
+ return toStrArray(",", str);
+ }
+
+ /**
+ * 杞崲涓篠tring鏁扮粍<br>
+ *
+ * @param split 鍒嗛殧绗�
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static String[] toStrArray(String split, String str) {
+ if (isBlank(str)) {
+ return new String[]{};
+ }
+ return str.split(split);
+ }
+
+ /**
+ * 杞崲涓篠tring闆嗗悎<br>
+ *
+ * @param str 缁撴灉琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static List<String> toStrList(String str) {
+ return Arrays.asList(toStrArray(str));
+ }
+
+ /**
+ * 杞崲涓篠tring闆嗗悎<br>
+ *
+ * @param split 鍒嗛殧绗�
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static List<String> toStrList(String split, String str) {
+ return Arrays.asList(toStrArray(split, str));
+ }
+
+ /**
+ * 鑾峰彇绗竴浣峉tring鏁板��
+ *
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static String firstStr(String str) {
+ return firstStr(",", str);
+ }
+
+ /**
+ * 鑾峰彇绗竴浣峉tring鏁板��
+ *
+ * @param split 鍒嗛殧绗�
+ * @param str 琚浆鎹㈢殑鍊�
+ * @return 缁撴灉
+ */
+ public static String firstStr(String split, String str) {
+ List<String> strs = toStrList(split, str);
+ if (isEmpty(strs)) {
+ return null;
+ } else {
+ return strs.get(0);
+ }
+ }
+
+ /**
+ * 灏� long 杞煭瀛楃涓� 涓� 62 杩涘埗
+ *
+ * @param num 鏁板瓧
+ * @return 鐭瓧绗︿覆
+ */
+ public static String to62String(long num) {
+ return NumberUtil.to62String(num);
+ }
+
+ /**
+ * 灏嗛泦鍚堟嫾鎺ユ垚瀛楃涓诧紝榛樿浣跨敤`,`鎷兼帴
+ *
+ * @param coll the {@code Collection} to convert
+ * @return the delimited {@code String}
+ */
+ public static String join(Collection<?> coll) {
+ return StringUtil.join(coll);
+ }
+
+ /**
+ * 灏嗛泦鍚堟嫾鎺ユ垚瀛楃涓诧紝榛樿鎸囧畾鍒嗛殧绗�
+ *
+ * @param coll the {@code Collection} to convert
+ * @param delim the delimiter to use (typically a ",")
+ * @return the delimited {@code String}
+ */
+ public static String join(Collection<?> coll, String delim) {
+ return StringUtil.join(coll, delim);
+ }
+
+ /**
+ * 灏嗘暟缁勬嫾鎺ユ垚瀛楃涓诧紝榛樿浣跨敤`,`鎷兼帴
+ *
+ * @param arr the array to display
+ * @return the delimited {@code String}
+ */
+ public static String join(Object[] arr) {
+ return StringUtil.join(arr);
+ }
+
+ /**
+ * 灏嗘暟缁勬嫾鎺ユ垚瀛楃涓诧紝榛樿鎸囧畾鍒嗛殧绗�
+ *
+ * @param arr the array to display
+ * @param delim the delimiter to use (typically a ",")
+ * @return the delimited {@code String}
+ */
+ public static String join(Object[] arr, String delim) {
+ return StringUtil.join(arr, delim);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝涓嶅幓闄ゅ垏鍒嗗悗姣忎釜鍏冪礌涓よ竟鐨勭┖鐧界锛屼笉鍘婚櫎绌虹櫧椤�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ */
+ public static List<String> split(CharSequence str, char separator) {
+ return StringUtil.split(str, separator, -1);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝鍘婚櫎鍒囧垎鍚庢瘡涓厓绱犱袱杈圭殑绌虹櫧绗︼紝鍘婚櫎绌虹櫧椤�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ */
+ public static List<String> splitTrim(CharSequence str, char separator) {
+ return StringUtil.splitTrim(str, separator);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝鍘婚櫎鍒囧垎鍚庢瘡涓厓绱犱袱杈圭殑绌虹櫧绗︼紝鍘婚櫎绌虹櫧椤�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ */
+ public static List<String> splitTrim(CharSequence str, CharSequence separator) {
+ return StringUtil.splitTrim(str, separator);
+ }
+
+ /**
+ * 鍒嗗壊 瀛楃涓�
+ *
+ * @param str 瀛楃涓�
+ * @param delimiter 鍒嗗壊绗�
+ * @return 瀛楃涓叉暟缁�
+ */
+ public static String[] split(@Nullable String str, @Nullable String delimiter) {
+ return StringUtil.delimitedListToStringArray(str, delimiter);
+ }
+
+ /**
+ * 鍒嗗壊 瀛楃涓� 鍒犻櫎甯歌 绌虹櫧绗�
+ *
+ * @param str 瀛楃涓�
+ * @param delimiter 鍒嗗壊绗�
+ * @return 瀛楃涓叉暟缁�
+ */
+ public static String[] splitTrim(@Nullable String str, @Nullable String delimiter) {
+ return StringUtil.delimitedListToStringArray(str, delimiter, " \t\n\n\f");
+ }
+
+ /**
+ * 瀛楃涓叉槸鍚︾鍚堟寚瀹氱殑 琛ㄨ揪寮�
+ *
+ * <p>
+ * pattern styles: "xxx*", "*xxx", "*xxx*" and "xxx*yyy"
+ * </p>
+ *
+ * @param pattern 琛ㄨ揪寮�
+ * @param str 瀛楃涓�
+ * @return 鏄惁鍖归厤
+ */
+ public static boolean simpleMatch(@Nullable String pattern, @Nullable String str) {
+ return PatternMatchUtils.simpleMatch(pattern, str);
+ }
+
+ /**
+ * 瀛楃涓叉槸鍚︾鍚堟寚瀹氱殑 琛ㄨ揪寮�
+ *
+ * <p>
+ * pattern styles: "xxx*", "*xxx", "*xxx*" and "xxx*yyy"
+ * </p>
+ *
+ * @param patterns 琛ㄨ揪寮� 鏁扮粍
+ * @param str 瀛楃涓�
+ * @return 鏄惁鍖归厤
+ */
+ public static boolean simpleMatch(@Nullable String[] patterns, String str) {
+ return PatternMatchUtils.simpleMatch(patterns, str);
+ }
+
+ /**
+ * 鐢熸垚uuid
+ *
+ * @return UUID
+ */
+ public static String randomUUID() {
+ return StringUtil.randomUUID();
+ }
+
+ /**
+ * 杞箟HTML鐢ㄤ簬瀹夊叏杩囨护
+ *
+ * @param html html
+ * @return {String}
+ */
+ public static String escapeHtml(String html) {
+ return StringUtil.escapeHtml(html);
+ }
+
+ /**
+ * 闅忔満鏁扮敓鎴�
+ *
+ * @param count 瀛楃闀垮害
+ * @return 闅忔満鏁�
+ */
+ public static String random(int count) {
+ return StringUtil.random(count);
+ }
+
+ /**
+ * 闅忔満鏁扮敓鎴�
+ *
+ * @param count 瀛楃闀垮害
+ * @param randomType 闅忔満鏁扮被鍒�
+ * @return 闅忔満鏁�
+ */
+ public static String random(int count, RandomType randomType) {
+ return StringUtil.random(count, randomType);
+ }
+
+ /**
+ * 瀛楃涓插簭鍒楀寲鎴� md5
+ *
+ * @param data Data to digest
+ * @return MD5 digest as a hex string
+ */
+ public static String md5Hex(final String data) {
+ return DigestUtil.md5Hex(data);
+ }
+
+ /**
+ * 鏁扮粍搴忓垪鍖栨垚 md5
+ *
+ * @param bytes the bytes to calculate the digest over
+ * @return md5 digest string
+ */
+ public static String md5Hex(final byte[] bytes) {
+ return DigestUtil.md5Hex(bytes);
+ }
+
+
+ /**
+ * sha1Hex
+ *
+ * @param data Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha1Hex(String data) {
+ return DigestUtil.sha1Hex(data);
+ }
+
+ /**
+ * sha1Hex
+ *
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha1Hex(final byte[] bytes) {
+ return DigestUtil.sha1Hex(bytes);
+ }
+
+ /**
+ * SHA224Hex
+ *
+ * @param data Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha224Hex(String data) {
+ return DigestUtil.sha224Hex(data);
+ }
+
+ /**
+ * SHA224Hex
+ *
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha224Hex(final byte[] bytes) {
+ return DigestUtil.sha224Hex(bytes);
+ }
+
+ /**
+ * sha256Hex
+ *
+ * @param data Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha256Hex(String data) {
+ return DigestUtil.sha256Hex(data);
+ }
+
+ /**
+ * sha256Hex
+ *
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha256Hex(final byte[] bytes) {
+ return DigestUtil.sha256Hex(bytes);
+ }
+
+ /**
+ * sha384Hex
+ *
+ * @param data Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha384Hex(String data) {
+ return DigestUtil.sha384Hex(data);
+ }
+
+ /**
+ * sha384Hex
+ *
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha384Hex(final byte[] bytes) {
+ return DigestUtil.sha384Hex(bytes);
+ }
+
+ /**
+ * sha512Hex
+ *
+ * @param data Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha512Hex(String data) {
+ return DigestUtil.sha512Hex(data);
+ }
+
+ /**
+ * sha512Hex
+ *
+ * @param bytes Data to digest
+ * @return digest as a hex string
+ */
+ public static String sha512Hex(final byte[] bytes) {
+ return DigestUtil.sha512Hex(bytes);
+ }
+
+ /**
+ * hmacMd5 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacMd5Hex(String data, String key) {
+ return DigestUtil.hmacMd5Hex(data, key);
+ }
+
+ /**
+ * hmacMd5 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacMd5Hex(final byte[] bytes, String key) {
+ return DigestUtil.hmacMd5Hex(bytes, key);
+ }
+
+ /**
+ * hmacSha1 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha1Hex(String data, String key) {
+ return DigestUtil.hmacSha1Hex(data, key);
+ }
+
+ /**
+ * hmacSha1 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha1Hex(final byte[] bytes, String key) {
+ return DigestUtil.hmacSha1Hex(bytes, key);
+ }
+
+ /**
+ * hmacSha224 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha224Hex(String data, String key) {
+ return DigestUtil.hmacSha224Hex(data, key);
+ }
+
+ /**
+ * hmacSha224 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha224Hex(final byte[] bytes, String key) {
+ return DigestUtil.hmacSha224Hex(bytes, key);
+ }
+
+ /**
+ * hmacSha256 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha256Hex(String data, String key) {
+ return DigestUtil.hmacSha256Hex(data, key);
+ }
+
+ /**
+ * hmacSha256 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha256Hex(final byte[] bytes, String key) {
+ return DigestUtil.hmacSha256Hex(bytes, key);
+ }
+
+ /**
+ * hmacSha384 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha384Hex(String data, String key) {
+ return DigestUtil.hmacSha384Hex(data, key);
+ }
+
+ /**
+ * hmacSha384 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha384Hex(final byte[] bytes, String key) {
+ return DigestUtil.hmacSha384Hex(bytes, key);
+ }
+
+ /**
+ * hmacSha512 Hex
+ *
+ * @param data Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha512Hex(String data, String key) {
+ return DigestUtil.hmacSha512Hex(data, key);
+ }
+
+ /**
+ * hmacSha512 Hex
+ *
+ * @param bytes Data to digest
+ * @param key key
+ * @return digest as a hex string
+ */
+ public static String hmacSha512Hex(final byte[] bytes, String key) {
+ return DigestUtil.hmacSha512Hex(bytes, key);
+ }
+
+ /**
+ * byte 鏁扮粍搴忓垪鍖栨垚 hex
+ *
+ * @param bytes bytes to encode
+ * @return MD5 digest as a hex string
+ */
+ public static String encodeHex(byte[] bytes) {
+ return DigestUtil.encodeHex(bytes);
+ }
+
+ /**
+ * 瀛楃涓插弽搴忓垪鍖栨垚 hex
+ *
+ * @param hexString String to decode
+ * @return MD5 digest as a hex string
+ */
+ public static byte[] decodeHex(final String hexString) {
+ return DigestUtil.decodeHex(hexString);
+ }
+
+ /**
+ * Base64缂栫爜
+ *
+ * @param value 瀛楃涓�
+ * @return {String}
+ */
+ public static String encodeBase64(String value) {
+ return Base64Util.encode(value);
+ }
+
+ /**
+ * Base64缂栫爜
+ *
+ * @param value 瀛楃涓�
+ * @param charset 瀛楃闆�
+ * @return {String}
+ */
+ public static String encodeBase64(String value, Charset charset) {
+ return Base64Util.encode(value, charset);
+ }
+
+ /**
+ * Base64缂栫爜涓篣RL瀹夊叏
+ *
+ * @param value 瀛楃涓�
+ * @return {String}
+ */
+ public static String encodeBase64UrlSafe(String value) {
+ return Base64Util.encodeUrlSafe(value);
+ }
+
+ /**
+ * Base64缂栫爜涓篣RL瀹夊叏
+ *
+ * @param value 瀛楃涓�
+ * @param charset 瀛楃闆�
+ * @return {String}
+ */
+ public static String encodeBase64UrlSafe(String value, Charset charset) {
+ return Base64Util.encodeUrlSafe(value, charset);
+ }
+
+ /**
+ * Base64瑙g爜
+ *
+ * @param value 瀛楃涓�
+ * @return {String}
+ */
+ public static String decodeBase64(String value) {
+ return Base64Util.decode(value);
+ }
+
+ /**
+ * Base64瑙g爜
+ *
+ * @param value 瀛楃涓�
+ * @param charset 瀛楃闆�
+ * @return {String}
+ */
+ public static String decodeBase64(String value, Charset charset) {
+ return Base64Util.decode(value, charset);
+ }
+
+ /**
+ * Base64URL瀹夊叏瑙g爜
+ *
+ * @param value 瀛楃涓�
+ * @return {String}
+ */
+ public static String decodeBase64UrlSafe(String value) {
+ return Base64Util.decodeUrlSafe(value);
+ }
+
+ /**
+ * Base64URL瀹夊叏瑙g爜
+ *
+ * @param value 瀛楃涓�
+ * @param charset 瀛楃闆�
+ * @return {String}
+ */
+ public static String decodeBase64UrlSafe(String value, Charset charset) {
+ return Base64Util.decodeUrlSafe(value, charset);
+ }
+
+ /**
+ * 鍏抽棴 Closeable
+ *
+ * @param closeable 鑷姩鍏抽棴
+ */
+ public static void closeQuietly(@Nullable Closeable closeable) {
+ IoUtil.closeQuietly(closeable);
+ }
+
+ /**
+ * InputStream to String utf-8
+ *
+ * @param input the <code>InputStream</code> to read from
+ * @return the requested String
+ * @throws NullPointerException if the input is null
+ */
+ public static String readToString(InputStream input) {
+ return IoUtil.readToString(input);
+ }
+
+ /**
+ * InputStream to String
+ *
+ * @param input the <code>InputStream</code> to read from
+ * @param charset the <code>Charset</code>
+ * @return the requested String
+ * @throws NullPointerException if the input is null
+ */
+ public static String readToString(@Nullable InputStream input, Charset charset) {
+ return IoUtil.readToString(input, charset);
+ }
+
+ /**
+ * InputStream to bytes 鏁扮粍
+ *
+ * @param input InputStream
+ * @return the requested byte array
+ */
+ public static byte[] readToByteArray(@Nullable InputStream input) {
+ return IoUtil.readToByteArray(input);
+ }
+
+ /**
+ * 璇诲彇鏂囦欢涓哄瓧绗︿覆
+ *
+ * @param file the file to read, must not be {@code null}
+ * @return the file contents, never {@code null}
+ */
+ public static String readToString(final File file) {
+ return FileUtil.readToString(file);
+ }
+
+ /**
+ * 璇诲彇鏂囦欢涓哄瓧绗︿覆
+ *
+ * @param file the file to read, must not be {@code null}
+ * @param encoding the encoding to use, {@code null} means platform default
+ * @return the file contents, never {@code null}
+ */
+ public static String readToString(File file, Charset encoding) {
+ return FileUtil.readToString(file, encoding);
+ }
+
+ /**
+ * 璇诲彇鏂囦欢涓� byte 鏁扮粍
+ *
+ * @param file the file to read, must not be {@code null}
+ * @return the file contents, never {@code null}
+ */
+ public static byte[] readToByteArray(File file) {
+ return FileUtil.readToByteArray(file);
+ }
+
+ /**
+ * 灏嗗璞″簭鍒楀寲鎴恓son瀛楃涓�
+ *
+ * @param object javaBean
+ * @return jsonString json瀛楃涓�
+ */
+ public static String toJson(Object object) {
+ return JsonUtil.toJson(object);
+ }
+
+ /**
+ * 灏嗗璞″簭鍒楀寲鎴� json byte 鏁扮粍
+ *
+ * @param object javaBean
+ * @return jsonString json瀛楃涓�
+ */
+ public static byte[] toJsonAsBytes(Object object) {
+ return JsonUtil.toJsonAsBytes(object);
+ }
+
+ /**
+ * 灏唈son瀛楃涓茶浆鎴� JsonNode
+ *
+ * @param jsonString jsonString
+ * @return jsonString json瀛楃涓�
+ */
+ public static JsonNode readTree(String jsonString) {
+ return JsonUtil.readTree(jsonString);
+ }
+
+ /**
+ * 灏唈son瀛楃涓茶浆鎴� JsonNode
+ *
+ * @param in InputStream
+ * @return jsonString json瀛楃涓�
+ */
+ public static JsonNode readTree(InputStream in) {
+ return JsonUtil.readTree(in);
+ }
+
+ /**
+ * 灏唈son瀛楃涓茶浆鎴� JsonNode
+ *
+ * @param content content
+ * @return jsonString json瀛楃涓�
+ */
+ public static JsonNode readTree(byte[] content) {
+ return JsonUtil.readTree(content);
+ }
+
+ /**
+ * 灏唈son瀛楃涓茶浆鎴� JsonNode
+ *
+ * @param jsonParser JsonParser
+ * @return jsonString json瀛楃涓�
+ */
+ public static JsonNode readTree(JsonParser jsonParser) {
+ return JsonUtil.readTree(jsonParser);
+ }
+
+ /**
+ * 灏唈son byte 鏁扮粍鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param bytes json bytes
+ * @param valueType class
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T readJson(byte[] bytes, Class<T> valueType) {
+ return JsonUtil.parse(bytes, valueType);
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param jsonString jsonString
+ * @param valueType class
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T readJson(String jsonString, Class<T> valueType) {
+ return JsonUtil.parse(jsonString, valueType);
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param in InputStream
+ * @param valueType class
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T readJson(InputStream in, Class<T> valueType) {
+ return JsonUtil.parse(in, valueType);
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param bytes bytes
+ * @param typeReference 娉涘瀷绫诲瀷
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T readJson(byte[] bytes, TypeReference<T> typeReference) {
+ return JsonUtil.parse(bytes, typeReference);
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param jsonString jsonString
+ * @param typeReference 娉涘瀷绫诲瀷
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T readJson(String jsonString, TypeReference<T> typeReference) {
+ return JsonUtil.parse(jsonString, typeReference);
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param in InputStream
+ * @param typeReference 娉涘瀷绫诲瀷
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T readJson(InputStream in, TypeReference<T> typeReference) {
+ return JsonUtil.parse(in, typeReference);
+ }
+
+ /**
+ * url 缂栫爜
+ *
+ * @param source the String to be encoded
+ * @return the encoded String
+ */
+ public static String urlEncode(String source) {
+ return UrlUtil.encode(source, Charsets.UTF_8);
+ }
+
+ /**
+ * url 缂栫爜
+ *
+ * @param source the String to be encoded
+ * @param charset the character encoding to encode to
+ * @return the encoded String
+ */
+ public static String urlEncode(String source, Charset charset) {
+ return UrlUtil.encode(source, charset);
+ }
+
+ /**
+ * url 瑙g爜
+ *
+ * @param source the encoded String
+ * @return the decoded value
+ * @throws IllegalArgumentException when the given source contains invalid encoded sequences
+ * @see StringUtils#uriDecode(String, Charset)
+ * @see java.net.URLDecoder#decode(String, String)
+ */
+ public static String urlDecode(String source) {
+ return StringUtils.uriDecode(source, Charsets.UTF_8);
+ }
+
+ /**
+ * url 瑙g爜
+ *
+ * @param source the encoded String
+ * @param charset the character encoding to use
+ * @return the decoded value
+ * @throws IllegalArgumentException when the given source contains invalid encoded sequences
+ * @see StringUtils#uriDecode(String, Charset)
+ * @see java.net.URLDecoder#decode(String, String)
+ */
+ public static String urlDecode(String source, Charset charset) {
+ return StringUtils.uriDecode(source, charset);
+ }
+
+ /**
+ * 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ *
+ * @param date 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDateTime(Date date) {
+ return DateUtil.formatDateTime(date);
+ }
+
+ /**
+ * 鏃ユ湡鏍煎紡鍖�
+ *
+ * @param date 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDate(Date date) {
+ return DateUtil.formatDate(date);
+ }
+
+ /**
+ * 鏃堕棿鏍煎紡鍖�
+ *
+ * @param date 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatTime(Date date) {
+ return DateUtil.formatTime(date);
+ }
+
+ /**
+ * 瀵硅薄鏍煎紡鍖� 鏀寔鏁板瓧锛宒ate锛宩ava8鏃堕棿
+ *
+ * @param object 鏍煎紡鍖栧璞�
+ * @param pattern 琛ㄨ揪寮�
+ * @return 鏍煎紡鍖栧悗鐨勫瓧绗︿覆
+ */
+ public static String format(Object object, String pattern) {
+ if (object instanceof Number) {
+ DecimalFormat decimalFormat = new DecimalFormat(pattern);
+ return decimalFormat.format(object);
+ } else if (object instanceof Date) {
+ return DateUtil.format((Date) object, pattern);
+ } else if (object instanceof TemporalAccessor) {
+ return DateTimeUtil.format((TemporalAccessor) object, pattern);
+ }
+ throw new IllegalArgumentException("鏈敮鎸佺殑瀵硅薄:" + object + ",鏍煎紡:" + object);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param pattern 琛ㄨ揪寮�
+ * @return 鏃堕棿
+ */
+ public static Date parseDate(String dateStr, String pattern) {
+ return DateUtil.parse(dateStr, pattern);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param format ConcurrentDateFormat
+ * @return 鏃堕棿
+ */
+ public static Date parse(String dateStr, ConcurrentDateFormat format) {
+ return DateUtil.parse(dateStr, format);
+ }
+
+ /**
+ * 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDateTime(TemporalAccessor temporal) {
+ return DateTimeUtil.formatDateTime(temporal);
+ }
+
+ /**
+ * 鏃ユ湡鏃堕棿鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatDate(TemporalAccessor temporal) {
+ return DateTimeUtil.formatDate(temporal);
+ }
+
+ /**
+ * 鏃堕棿鏍煎紡鍖�
+ *
+ * @param temporal 鏃堕棿
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String formatTime(TemporalAccessor temporal) {
+ return DateTimeUtil.formatTime(temporal);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param formatter DateTimeFormatter
+ * @return 鏃堕棿
+ */
+ public static LocalDateTime parseDateTime(String dateStr, DateTimeFormatter formatter) {
+ return DateTimeUtil.parseDateTime(dateStr, formatter);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @return 鏃堕棿
+ */
+ public static LocalDateTime parseDateTime(String dateStr) {
+ return DateTimeUtil.parseDateTime(dateStr);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param formatter DateTimeFormatter
+ * @return 鏃堕棿
+ */
+ public static LocalDate parseDate(String dateStr, DateTimeFormatter formatter) {
+ return DateTimeUtil.parseDate(dateStr, formatter);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘棩鏈�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @return 鏃堕棿
+ */
+ public static LocalDate parseDate(String dateStr) {
+ return DateTimeUtil.parseDate(dateStr, DateTimeUtil.DATE_FORMAT);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @param formatter DateTimeFormatter
+ * @return 鏃堕棿
+ */
+ public static LocalTime parseTime(String dateStr, DateTimeFormatter formatter) {
+ return DateTimeUtil.parseTime(dateStr, formatter);
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆杞崲涓烘椂闂�
+ *
+ * @param dateStr 鏃堕棿瀛楃涓�
+ * @return 鏃堕棿
+ */
+ public static LocalTime parseTime(String dateStr) {
+ return DateTimeUtil.parseTime(dateStr);
+ }
+
+ /**
+ * 鏃堕棿姣旇緝
+ *
+ * @param startInclusive the start instant, inclusive, not null
+ * @param endExclusive the end instant, exclusive, not null
+ * @return a {@code Duration}, not null
+ */
+ public static Duration between(Temporal startInclusive, Temporal endExclusive) {
+ return Duration.between(startInclusive, endExclusive);
+ }
+
+ /**
+ * 姣旇緝2涓� 鏃堕棿宸�
+ *
+ * @param startDate 寮�濮嬫椂闂�
+ * @param endDate 缁撴潫鏃堕棿
+ * @return 鏃堕棿闂撮殧
+ */
+ public static Duration between(Date startDate, Date endDate) {
+ return DateUtil.between(startDate, endDate);
+ }
+
+ /**
+ * 瀵硅薄绫诲瀷杞崲
+ *
+ * @param source the source object
+ * @param targetType the target type
+ * @param <T> 娉涘瀷鏍囪
+ * @return the converted value
+ * @throws IllegalArgumentException if targetType is {@code null},
+ * or sourceType is {@code null} but source is not {@code null}
+ */
+ @Nullable
+ public static <T> T convert(@Nullable Object source, Class<T> targetType) {
+ return ConvertUtil.convert(source, targetType);
+ }
+
+ /**
+ * 瀵硅薄绫诲瀷杞崲
+ *
+ * @param source the source object
+ * @param sourceType the source type
+ * @param targetType the target type
+ * @param <T> 娉涘瀷鏍囪
+ * @return the converted value
+ * @throws IllegalArgumentException if targetType is {@code null},
+ * or sourceType is {@code null} but source is not {@code null}
+ */
+ @Nullable
+ public static <T> T convert(@Nullable Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
+ return ConvertUtil.convert(source, sourceType, targetType);
+ }
+
+ /**
+ * 瀵硅薄绫诲瀷杞崲
+ *
+ * @param source the source object
+ * @param targetType the target type
+ * @param <T> 娉涘瀷鏍囪
+ * @return the converted value
+ * @throws IllegalArgumentException if targetType is {@code null},
+ * or sourceType is {@code null} but source is not {@code null}
+ */
+ @Nullable
+ public static <T> T convert(@Nullable Object source, TypeDescriptor targetType) {
+ return ConvertUtil.convert(source, targetType);
+ }
+
+ /**
+ * 鑾峰彇鏂规硶鍙傛暟淇℃伅
+ *
+ * @param constructor 鏋勯�犲櫒
+ * @param parameterIndex 鍙傛暟搴忓彿
+ * @return {MethodParameter}
+ */
+ public static MethodParameter getMethodParameter(Constructor<?> constructor, int parameterIndex) {
+ return ClassUtil.getMethodParameter(constructor, parameterIndex);
+ }
+
+ /**
+ * 鑾峰彇鏂规硶鍙傛暟淇℃伅
+ *
+ * @param method 鏂规硶
+ * @param parameterIndex 鍙傛暟搴忓彿
+ * @return {MethodParameter}
+ */
+ public static MethodParameter getMethodParameter(Method method, int parameterIndex) {
+ return ClassUtil.getMethodParameter(method, parameterIndex);
+ }
+
+ /**
+ * 鑾峰彇Annotation娉ㄨВ
+ *
+ * @param annotatedElement AnnotatedElement
+ * @param annotationType 娉ㄨВ绫�
+ * @param <A> 娉涘瀷鏍囪
+ * @return {Annotation}
+ */
+ @Nullable
+ public static <A extends Annotation> A getAnnotation(AnnotatedElement annotatedElement, Class<A> annotationType) {
+ return AnnotatedElementUtils.findMergedAnnotation(annotatedElement, annotationType);
+ }
+
+ /**
+ * 鑾峰彇Annotation锛屽厛鎵炬柟娉曪紝娌℃湁鍒欏啀鎵炬柟娉曚笂鐨勭被
+ *
+ * @param method Method
+ * @param annotationType 娉ㄨВ绫�
+ * @param <A> 娉涘瀷鏍囪
+ * @return {Annotation}
+ */
+ @Nullable
+ public static <A extends Annotation> A getAnnotation(Method method, Class<A> annotationType) {
+ return ClassUtil.getAnnotation(method, annotationType);
+ }
+
+ /**
+ * 鑾峰彇Annotation锛屽厛鎵綡andlerMethod锛屾病鏈夊垯鍐嶆壘瀵瑰簲鐨勭被
+ *
+ * @param handlerMethod HandlerMethod
+ * @param annotationType 娉ㄨВ绫�
+ * @param <A> 娉涘瀷鏍囪
+ * @return {Annotation}
+ */
+ @Nullable
+ public static <A extends Annotation> A getAnnotation(HandlerMethod handlerMethod, Class<A> annotationType) {
+ return ClassUtil.getAnnotation(handlerMethod, annotationType);
+ }
+
+ /**
+ * 瀹炰緥鍖栧璞�
+ *
+ * @param clazz 绫�
+ * @param <T> 娉涘瀷鏍囪
+ * @return 瀵硅薄
+ */
+ @SuppressWarnings("unchecked")
+ public static <T> T newInstance(Class<?> clazz) {
+ return (T) BeanUtil.instantiateClass(clazz);
+ }
+
+ /**
+ * 瀹炰緥鍖栧璞�
+ *
+ * @param clazzStr 绫诲悕
+ * @param <T> 娉涘瀷鏍囪
+ * @return 瀵硅薄
+ */
+ public static <T> T newInstance(String clazzStr) {
+ return BeanUtil.newInstance(clazzStr);
+ }
+
+ /**
+ * 鑾峰彇Bean鐨勫睘鎬�
+ *
+ * @param bean bean
+ * @param propertyName 灞炴�у悕
+ * @return 灞炴�у��
+ */
+ @Nullable
+ public static Object getProperty(@Nullable Object bean, String propertyName) {
+ return BeanUtil.getProperty(bean, propertyName);
+ }
+
+ /**
+ * 璁剧疆Bean灞炴��
+ *
+ * @param bean bean
+ * @param propertyName 灞炴�у悕
+ * @param value 灞炴�у��
+ */
+ public static void setProperty(Object bean, String propertyName, Object value) {
+ BeanUtil.setProperty(bean, propertyName, value);
+ }
+
+ /**
+ * 娴呭鍒�
+ *
+ * @param source 婧愬璞�
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ */
+ @Nullable
+ public static <T> T clone(@Nullable T source) {
+ return BeanUtil.clone(source);
+ }
+
+ /**
+ * 鎷疯礉瀵硅薄锛屾敮鎸� Map 鍜� Bean
+ *
+ * @param source 婧愬璞�
+ * @param clazz 绫诲悕
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ */
+ @Nullable
+ public static <T> T copy(@Nullable Object source, Class<T> clazz) {
+ return BeanUtil.copy(source, clazz);
+ }
+
+ /**
+ * 鎷疯礉瀵硅薄锛屾敮鎸� Map 鍜� Bean
+ *
+ * @param source 婧愬璞�
+ * @param targetBean 闇�瑕佽祴鍊肩殑瀵硅薄
+ */
+ public static void copy(@Nullable Object source, @Nullable Object targetBean) {
+ BeanUtil.copy(source, targetBean);
+ }
+
+ /**
+ * 鎷疯礉瀵硅薄锛宻ource 瀵硅薄灞炴�у仛闈� null 鍒ゆ柇
+ *
+ * <p>
+ * 鏀寔 map bean copy
+ * </p>
+ *
+ * @param source 婧愬璞�
+ * @param targetBean 闇�瑕佽祴鍊肩殑瀵硅薄
+ */
+ public static void copyNonNull(@Nullable Object source, @Nullable Object targetBean) {
+ BeanUtil.copyNonNull(source, targetBean);
+ }
+
+ /**
+ * 鎷疯礉瀵硅薄锛屽苟瀵逛笉鍚岀被鍨嬪睘鎬ц繘琛岃浆鎹�
+ *
+ * @param source 婧愬璞�
+ * @param clazz 绫诲悕
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ */
+ @Nullable
+ public static <T> T copyWithConvert(@Nullable Object source, Class<T> clazz) {
+ return BeanUtil.copyWithConvert(source, clazz);
+ }
+
+ /**
+ * 鎷疯礉鍒楄〃瀵硅薄
+ *
+ * <p>
+ * 鏀寔 map bean copy
+ * </p>
+ *
+ * @param sourceList 婧愬垪琛�
+ * @param targetClazz 杞崲鎴愮殑绫诲瀷
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ */
+ public static <T> List<T> copy(@Nullable Collection<?> sourceList, Class<T> targetClazz) {
+ return BeanUtil.copy(sourceList, targetClazz);
+ }
+
+ /**
+ * 鎷疯礉鍒楄〃瀵硅薄锛屽苟瀵逛笉鍚岀被鍨嬪睘鎬ц繘琛岃浆鎹�
+ *
+ * <p>
+ * 鏀寔 map bean copy
+ * </p>
+ *
+ * @param sourceList 婧愬璞″垪琛�
+ * @param targetClazz 杞崲鎴愮殑绫�
+ * @param <T> 娉涘瀷鏍囪
+ * @return List
+ */
+ public static <T> List<T> copyWithConvert(@Nullable Collection<?> sourceList, Class<T> targetClazz) {
+ return BeanUtil.copyWithConvert(sourceList, targetClazz);
+ }
+
+ /**
+ * 鎷疯礉瀵硅薄锛屾墿灞� Spring 鐨勬嫹璐濇柟娉�
+ *
+ * @param source the source bean
+ * @param clazz the target bean class
+ * @param <T> 娉涘瀷鏍囪
+ * @return T
+ * @throws BeansException if the copying failed
+ */
+ @Nullable
+ public static <T> T copyProperties(@Nullable Object source, Class<T> clazz) throws BeansException {
+ return BeanUtil.copyProperties(source, clazz);
+ }
+
+ /**
+ * 鎷疯礉鍒楄〃瀵硅薄锛屾墿灞� Spring 鐨勬嫹璐濇柟娉�
+ *
+ * @param sourceList the source list bean
+ * @param targetClazz the target bean class
+ * @param <T> 娉涘瀷鏍囪
+ * @return List
+ * @throws BeansException if the copying failed
+ */
+ public static <T> List<T> copyProperties(@Nullable Collection<?> sourceList, Class<T> targetClazz) throws BeansException {
+ return BeanUtil.copyProperties(sourceList, targetClazz);
+ }
+
+ /**
+ * 灏嗗璞¤鎴恗ap褰㈠紡
+ *
+ * @param bean 婧愬璞�
+ * @return {Map}
+ */
+ public static Map<String, Object> toMap(@Nullable Object bean) {
+ return BeanUtil.toMap(bean);
+ }
+
+ /**
+ * 灏唌ap 杞负 bean
+ *
+ * @param beanMap map
+ * @param valueType 瀵硅薄绫诲瀷
+ * @param <T> 娉涘瀷鏍囪
+ * @return {T}
+ */
+ public static <T> T toBean(Map<String, Object> beanMap, Class<T> valueType) {
+ return BeanUtil.toBean(beanMap, valueType);
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Holder.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Holder.java
new file mode 100644
index 0000000..ec11d04
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Holder.java
@@ -0,0 +1,22 @@
+package com.vci.web.util;
+
+import java.security.SecureRandom;
+import java.util.Random;
+
+/**
+ * 涓�浜涘父鐢ㄧ殑鍗曚緥瀵硅薄
+ *
+ * @author L.cm
+ */
+public class Holder {
+
+ /**
+ * RANDOM
+ */
+ public final static Random RANDOM = new Random();
+
+ /**
+ * SECURE_RANDOM
+ */
+ public final static SecureRandom SECURE_RANDOM = new SecureRandom();
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/IoUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/IoUtil.java
new file mode 100644
index 0000000..836380e
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/IoUtil.java
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util;
+
+import org.springframework.lang.Nullable;
+
+import java.io.*;
+import java.nio.charset.Charset;
+
+/**
+ * 娴佸伐鍏风被
+ *
+ * @author L.cm
+ */
+public class IoUtil extends org.springframework.util.StreamUtils {
+
+ /**
+ * closeQuietly
+ *
+ * @param closeable 鑷姩鍏抽棴
+ */
+ public static void closeQuietly(@Nullable Closeable closeable) {
+ if (closeable == null) {
+ return;
+ }
+ if (closeable instanceof Flushable) {
+ try {
+ ((Flushable) closeable).flush();
+ } catch (IOException ignored) {
+ // ignore
+ }
+ }
+ try {
+ closeable.close();
+ } catch (IOException ignored) {
+ // ignore
+ }
+ }
+
+ /**
+ * InputStream to String utf-8
+ *
+ * @param input the <code>InputStream</code> to read from
+ * @return the requested String
+ */
+ public static String readToString(InputStream input) {
+ return readToString(input, Charsets.UTF_8);
+ }
+
+ /**
+ * InputStream to String
+ *
+ * @param input the <code>InputStream</code> to read from
+ * @param charset the <code>Charset</code>
+ * @return the requested String
+ */
+ public static String readToString(@Nullable InputStream input, Charset charset) {
+ try {
+ return IoUtil.copyToString(input, charset);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ } finally {
+ IoUtil.closeQuietly(input);
+ }
+ }
+
+ public static byte[] readToByteArray(@Nullable InputStream input) {
+ try {
+ return IoUtil.copyToByteArray(input);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ } finally {
+ IoUtil.closeQuietly(input);
+ }
+ }
+
+ /**
+ * Writes chars from a <code>String</code> to bytes on an
+ * <code>OutputStream</code> using the specified character encoding.
+ * <p>
+ * This method uses {@link String#getBytes(String)}.
+ * </p>
+ * @param data the <code>String</code> to write, null ignored
+ * @param output the <code>OutputStream</code> to write to
+ * @param encoding the encoding to use, null means platform default
+ * @throws NullPointerException if output is null
+ * @throws IOException if an I/O error occurs
+ */
+ public static void write(@Nullable final String data, final OutputStream output, final Charset encoding) throws IOException {
+ if (data != null) {
+ output.write(data.getBytes(encoding));
+ }
+ }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/NumberUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/NumberUtil.java
new file mode 100644
index 0000000..c493791
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/NumberUtil.java
@@ -0,0 +1,195 @@
+package com.vci.web.util;
+
+
+import org.springframework.lang.Nullable;
+
+/**
+ * 鏁板瓧绫诲瀷宸ュ叿绫�
+ *
+ * @author L.cm
+ */
+public class NumberUtil extends org.springframework.util.NumberUtils {
+
+ //-----------------------------------------------------------------------
+
+ /**
+ * <p>Convert a <code>String</code> to an <code>int</code>, returning
+ * <code>zero</code> if the conversion fails.</p>
+ *
+ * <p>If the string is <code>null</code>, <code>zero</code> is returned.</p>
+ *
+ * <pre>
+ * NumberUtil.toInt(null) = 0
+ * NumberUtil.toInt("") = 0
+ * NumberUtil.toInt("1") = 1
+ * </pre>
+ *
+ * @param str the string to convert, may be null
+ * @return the int represented by the string, or <code>zero</code> if
+ * conversion fails
+ */
+ public static int toInt(final String str) {
+ return toInt(str, -1);
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to an <code>int</code>, returning a
+ * default value if the conversion fails.</p>
+ *
+ * <p>If the string is <code>null</code>, the default value is returned.</p>
+ *
+ * <pre>
+ * NumberUtil.toInt(null, 1) = 1
+ * NumberUtil.toInt("", 1) = 1
+ * NumberUtil.toInt("1", 0) = 1
+ * </pre>
+ *
+ * @param str the string to convert, may be null
+ * @param defaultValue the default value
+ * @return the int represented by the string, or the default if conversion fails
+ */
+ public static int toInt(@Nullable final String str, final int defaultValue) {
+ if (str == null) {
+ return defaultValue;
+ }
+ try {
+ return Integer.valueOf(str);
+ } catch (final NumberFormatException nfe) {
+ return defaultValue;
+ }
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to a <code>long</code>, returning
+ * <code>zero</code> if the conversion fails.</p>
+ *
+ * <p>If the string is <code>null</code>, <code>zero</code> is returned.</p>
+ *
+ * <pre>
+ * NumberUtil.toLong(null) = 0L
+ * NumberUtil.toLong("") = 0L
+ * NumberUtil.toLong("1") = 1L
+ * </pre>
+ *
+ * @param str the string to convert, may be null
+ * @return the long represented by the string, or <code>0</code> if
+ * conversion fails
+ */
+ public static long toLong(final String str) {
+ return toLong(str, 0L);
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to a <code>long</code>, returning a
+ * default value if the conversion fails.</p>
+ *
+ * <p>If the string is <code>null</code>, the default value is returned.</p>
+ *
+ * <pre>
+ * NumberUtil.toLong(null, 1L) = 1L
+ * NumberUtil.toLong("", 1L) = 1L
+ * NumberUtil.toLong("1", 0L) = 1L
+ * </pre>
+ *
+ * @param str the string to convert, may be null
+ * @param defaultValue the default value
+ * @return the long represented by the string, or the default if conversion fails
+ */
+ public static long toLong(@Nullable final String str, final long defaultValue) {
+ if (str == null) {
+ return defaultValue;
+ }
+ try {
+ return Long.valueOf(str);
+ } catch (final NumberFormatException nfe) {
+ return defaultValue;
+ }
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to a <code>Double</code>
+ *
+ * @param value value
+ * @return double value
+ */
+ public static Double toDouble(String value) {
+ return toDouble(value, null);
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to a <code>Double</code>
+ *
+ * @param value value
+ * @param defaultValue 榛樿鍊�
+ * @return double value
+ */
+ public static Double toDouble(@Nullable String value, Double defaultValue) {
+ if (value != null) {
+ return Double.valueOf(value.trim());
+ }
+ return defaultValue;
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to a <code>Double</code>
+ *
+ * @param value value
+ * @return double value
+ */
+ public static Float toFloat(String value) {
+ return toFloat(value, null);
+ }
+
+ /**
+ * <p>Convert a <code>String</code> to a <code>Double</code>
+ *
+ * @param value value
+ * @param defaultValue 榛樿鍊�
+ * @return double value
+ */
+ public static Float toFloat(@Nullable String value, Float defaultValue) {
+ if (value != null) {
+ return Float.valueOf(value.trim());
+ }
+ return defaultValue;
+ }
+
+ /**
+ * All possible chars for representing a number as a String
+ */
+ private final static char[] DIGITS = {
+ '0', '1', '2', '3', '4', '5',
+ '6', '7', '8', '9', 'a', 'b',
+ 'c', 'd', 'e', 'f', 'g', 'h',
+ 'i', 'j', 'k', 'l', 'm', 'n',
+ 'o', 'p', 'q', 'r', 's', 't',
+ 'u', 'v', 'w', 'x', 'y', 'z',
+ 'A', 'B', 'C', 'D', 'E', 'F',
+ 'G', 'H', 'I', 'J', 'K', 'L',
+ 'M', 'N', 'O', 'P', 'Q', 'R',
+ 'S', 'T', 'U', 'V', 'W', 'X',
+ 'Y', 'Z'
+ };
+
+ /**
+ * 灏� long 杞煭瀛楃涓� 涓� 62 杩涘埗
+ *
+ * @param i 鏁板瓧
+ * @return 鐭瓧绗︿覆
+ */
+ public static String to62String(long i) {
+ int radix = DIGITS.length;
+ char[] buf = new char[65];
+ int charPos = 64;
+ i = -i;
+ while (i <= -radix) {
+ buf[charPos--] = DIGITS[(int) (-(i % radix))];
+ i = i / radix;
+ }
+ buf[charPos] = DIGITS[(int) (-i)];
+
+ return new String(buf, charPos, (65 - charPos));
+ }
+
+}
+
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ObjectUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ObjectUtil.java
new file mode 100644
index 0000000..da05460
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ObjectUtil.java
@@ -0,0 +1,21 @@
+package com.vci.web.util;
+
+import org.springframework.lang.Nullable;
+
+/**
+ * 瀵硅薄宸ュ叿绫�
+ *
+ * @author L.cm
+ */
+public class ObjectUtil extends org.springframework.util.ObjectUtils {
+
+ /**
+ * 鍒ゆ柇鍏冪礌涓嶄负绌�
+ * @param obj object
+ * @return boolean
+ */
+ public static boolean isNotEmpty(@Nullable Object obj) {
+ return !ObjectUtil.isEmpty(obj);
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/PlatformClientUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/PlatformClientUtil.java
index 3abe20b..fff6644 100644
--- a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/PlatformClientUtil.java
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/PlatformClientUtil.java
@@ -105,7 +105,6 @@
return BOFactoryServiceHelper.narrow(jacorbClientConnector.getCorbaServiceObjectByServiceName(BO_FACTORY_SERVICE_NAME));
}
-
/**
* 鑾峰彇鐧诲綍涓绘湇鍔�
* @return 鏈嶅姟鐨勫璞�
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/RandomType.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/RandomType.java
new file mode 100644
index 0000000..98da4bc
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/RandomType.java
@@ -0,0 +1,30 @@
+package com.vci.web.util;
+
+
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+
+/**
+ * 鐢熸垚鐨勯殢鏈烘暟绫诲瀷
+ *
+ * @author L.cm
+ */
+@Getter
+@RequiredArgsConstructor
+public enum RandomType {
+ /**
+ * INT STRING ALL
+ */
+ INT(RandomType.INT_STR),
+ STRING(RandomType.STR_STR),
+ ALL(RandomType.ALL_STR);
+
+ private final String factor;
+
+ /**
+ * 闅忔満瀛楃涓插洜瀛�
+ */
+ private static final String INT_STR = "0123456789";
+ private static final String STR_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
+ private static final String ALL_STR = INT_STR + STR_STR;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ReflectUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ReflectUtil.java
new file mode 100644
index 0000000..996fe45
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/ReflectUtil.java
@@ -0,0 +1,180 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+package com.vci.web.util;
+
+import org.springframework.beans.BeansException;
+import org.springframework.cglib.core.CodeGenerationException;
+import org.springframework.core.convert.Property;
+import org.springframework.core.convert.TypeDescriptor;
+import org.springframework.lang.Nullable;
+import org.springframework.util.ReflectionUtils;
+
+import java.beans.PropertyDescriptor;
+import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 鍙嶅皠宸ュ叿绫�
+ *
+ * @author L.cm
+ */
+public class ReflectUtil extends ReflectionUtils {
+
+ /**
+ * 鑾峰彇 Bean 鐨勬墍鏈� get鏂规硶
+ *
+ * @param type 绫�
+ * @return PropertyDescriptor鏁扮粍
+ */
+ public static PropertyDescriptor[] getBeanGetters(Class type) {
+ return getPropertiesHelper(type, true, false);
+ }
+
+ /**
+ * 鑾峰彇 Bean 鐨勬墍鏈� set鏂规硶
+ *
+ * @param type 绫�
+ * @return PropertyDescriptor鏁扮粍
+ */
+ public static PropertyDescriptor[] getBeanSetters(Class type) {
+ return getPropertiesHelper(type, false, true);
+ }
+
+ /**
+ * 鑾峰彇 Bean 鐨勬墍鏈� PropertyDescriptor
+ *
+ * @param type 绫�
+ * @param read 璇诲彇鏂规硶
+ * @param write 鍐欐柟娉�
+ * @return PropertyDescriptor鏁扮粍
+ */
+ public static PropertyDescriptor[] getPropertiesHelper(Class type, boolean read, boolean write) {
+ try {
+ PropertyDescriptor[] all = BeanUtil.getPropertyDescriptors(type);
+ if (read && write) {
+ return all;
+ } else {
+ List<PropertyDescriptor> properties = new ArrayList<>(all.length);
+ for (PropertyDescriptor pd : all) {
+ if (read && pd.getReadMethod() != null) {
+ properties.add(pd);
+ } else if (write && pd.getWriteMethod() != null) {
+ properties.add(pd);
+ }
+ }
+ return properties.toArray(new PropertyDescriptor[0]);
+ }
+ } catch (BeansException ex) {
+ throw new CodeGenerationException(ex);
+ }
+ }
+
+ /**
+ * 鑾峰彇 bean 鐨勫睘鎬т俊鎭�
+ * @param propertyType 绫诲瀷
+ * @param propertyName 灞炴�у悕
+ * @return {Property}
+ */
+ @Nullable
+ public static Property getProperty(Class<?> propertyType, String propertyName) {
+ PropertyDescriptor propertyDescriptor = BeanUtil.getPropertyDescriptor(propertyType, propertyName);
+ if (propertyDescriptor == null) {
+ return null;
+ }
+ return ReflectUtil.getProperty(propertyType, propertyDescriptor, propertyName);
+ }
+
+ /**
+ * 鑾峰彇 bean 鐨勫睘鎬т俊鎭�
+ * @param propertyType 绫诲瀷
+ * @param propertyDescriptor PropertyDescriptor
+ * @param propertyName 灞炴�у悕
+ * @return {Property}
+ */
+ public static Property getProperty(Class<?> propertyType, PropertyDescriptor propertyDescriptor, String propertyName) {
+ Method readMethod = propertyDescriptor.getReadMethod();
+ Method writeMethod = propertyDescriptor.getWriteMethod();
+ return new Property(propertyType, readMethod, writeMethod, propertyName);
+ }
+
+ /**
+ * 鑾峰彇 bean 鐨勫睘鎬т俊鎭�
+ * @param propertyType 绫诲瀷
+ * @param propertyName 灞炴�у悕
+ * @return {Property}
+ */
+ @Nullable
+ public static TypeDescriptor getTypeDescriptor(Class<?> propertyType, String propertyName) {
+ Property property = ReflectUtil.getProperty(propertyType, propertyName);
+ if (property == null) {
+ return null;
+ }
+ return new TypeDescriptor(property);
+ }
+
+ /**
+ * 鑾峰彇 绫诲睘鎬т俊鎭�
+ * @param propertyType 绫诲瀷
+ * @param propertyDescriptor PropertyDescriptor
+ * @param propertyName 灞炴�у悕
+ * @return {Property}
+ */
+ public static TypeDescriptor getTypeDescriptor(Class<?> propertyType, PropertyDescriptor propertyDescriptor, String propertyName) {
+ Method readMethod = propertyDescriptor.getReadMethod();
+ Method writeMethod = propertyDescriptor.getWriteMethod();
+ Property property = new Property(propertyType, readMethod, writeMethod, propertyName);
+ return new TypeDescriptor(property);
+ }
+
+ /**
+ * 鑾峰彇 绫诲睘鎬�
+ * @param clazz 绫讳俊鎭�
+ * @param fieldName 灞炴�у悕
+ * @return Field
+ */
+ @Nullable
+ public static Field getField(Class<?> clazz, String fieldName) {
+ while (clazz != Object.class) {
+ try {
+ return clazz.getDeclaredField(fieldName);
+ } catch (NoSuchFieldException e) {
+ clazz = clazz.getSuperclass();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 鑾峰彇 鎵�鏈� field 灞炴�т笂鐨勬敞瑙�
+ * @param clazz 绫�
+ * @param fieldName 灞炴�у悕
+ * @param annotationClass 娉ㄨВ
+ * @param <T> 娉ㄨВ娉涘瀷
+ * @return 娉ㄨВ
+ */
+ @Nullable
+ public static <T extends Annotation> T getAnnotation(Class<?> clazz, String fieldName, Class<T> annotationClass) {
+ Field field = ReflectUtil.getField(clazz, fieldName);
+ if (field == null) {
+ return null;
+ }
+ return field.getAnnotation(annotationClass);
+ }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/StringPool.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/StringPool.java
new file mode 100644
index 0000000..5dd92d7
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/StringPool.java
@@ -0,0 +1,71 @@
+package com.vci.web.util;
+
+/**
+ * 闈欐�� String 姹�
+ *
+ * @author L.cm
+ */
+public interface StringPool {
+
+ String AMPERSAND = "&";
+ String AND = "and";
+ String AT = "@";
+ String ASTERISK = "*";
+ String STAR = ASTERISK;
+ String SLASH = "/";
+ String BACK_SLASH = "\\";
+ String DOUBLE_SLASH = "#//";
+ String COLON = ":";
+ String COMMA = ",";
+ String DASH = "-";
+ String DOLLAR = "$";
+ String DOT = ".";
+ String EMPTY = "";
+ String EMPTY_JSON = "{}";
+ String EQUALS = "=";
+ String FALSE = "false";
+ String HASH = "#";
+ String HAT = "^";
+ String LEFT_BRACE = "{";
+ String LEFT_BRACKET = "(";
+ String LEFT_CHEV = "<";
+ String NEWLINE = "\n";
+ String N = "n";
+ String NO = "no";
+ String NULL = "null";
+ String OFF = "off";
+ String ON = "on";
+ String PERCENT = "%";
+ String PIPE = "|";
+ String PLUS = "+";
+ String QUESTION_MARK = "?";
+ String EXCLAMATION_MARK = "!";
+ String QUOTE = "\"";
+ String RETURN = "\r";
+ String TAB = "\t";
+ String RIGHT_BRACE = "}";
+ String RIGHT_BRACKET = ")";
+ String RIGHT_CHEV = ">";
+ String SEMICOLON = ";";
+ String SINGLE_QUOTE = "'";
+ String BACKTICK = "`";
+ String SPACE = " ";
+ String TILDA = "~";
+ String LEFT_SQ_BRACKET = "[";
+ String RIGHT_SQ_BRACKET = "]";
+ String TRUE = "true";
+ String UNDERSCORE = "_";
+ String UTF_8 = "UTF-8";
+ String GBK = "GBK";
+ String ISO_8859_1 = "ISO-8859-1";
+ String Y = "y";
+ String YES = "yes";
+ String ONE = "1";
+ String ZERO = "0";
+ String MINUS_ONE = "-1";
+ String DOLLAR_LEFT_BRACE= "${";
+ String UNKNOWN = "unknown";
+ String GET = "GET";
+ String POST = "POST";
+
+}
\ No newline at end of file
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/StringUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/StringUtil.java
new file mode 100644
index 0000000..c062a75
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/StringUtil.java
@@ -0,0 +1,1560 @@
+package com.vci.web.util;
+
+import cn.hutool.core.util.ObjectUtil;
+import org.springframework.lang.Nullable;
+import org.springframework.util.Assert;
+import org.springframework.util.PatternMatchUtils;
+import org.springframework.web.util.HtmlUtils;
+import com.vci.web.support.StrSpliter;
+import java.io.StringReader;
+import java.io.StringWriter;
+import java.text.MessageFormat;
+import java.util.*;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+/**
+ * 缁ф壙鑷猄pring util鐨勫伐鍏风被锛屽噺灏慾ar渚濊禆
+ *
+ * @author L.cm
+ */
+public class StringUtil extends org.springframework.util.StringUtils {
+
+ public static final int INDEX_NOT_FOUND = -1;
+ // public static final int INDEX_NOT_FOUND = 0;
+
+ /**
+ * Check whether the given {@code CharSequence} contains actual <em>text</em>.
+ * <p>More specifically, this method returns {@code true} if the
+ * {@code CharSequence} is not {@code null}, its length is greater than
+ * 0, and it contains at least one non-whitespace character.
+ * <pre class="code">
+ * StringUtil.isBlank(null) = true
+ * StringUtil.isBlank("") = true
+ * StringUtil.isBlank(" ") = true
+ * StringUtil.isBlank("12345") = false
+ * StringUtil.isBlank(" 12345 ") = false
+ * </pre>
+ *
+ * @param cs the {@code CharSequence} to check (may be {@code null})
+ * @return {@code true} if the {@code CharSequence} is not {@code null},
+ * its length is greater than 0, and it does not contain whitespace only
+ * @see Character#isWhitespace
+ */
+ public static boolean isBlank(final CharSequence cs) {
+ return !StringUtil.hasText(cs);
+ }
+
+ /**
+ * <p>Checks if a CharSequence is not empty (""), not null and not whitespace only.</p>
+ * <pre>
+ * StringUtil.isNotBlank(null) = false
+ * StringUtil.isNotBlank("") = false
+ * StringUtil.isNotBlank(" ") = false
+ * StringUtil.isNotBlank("bob") = true
+ * StringUtil.isNotBlank(" bob ") = true
+ * </pre>
+ *
+ * @param cs the CharSequence to check, may be null
+ * @return {@code true} if the CharSequence is
+ * not empty and not null and not whitespace
+ * @see Character#isWhitespace
+ */
+ public static boolean isNotBlank(final CharSequence cs) {
+ return StringUtil.hasText(cs);
+ }
+
+ /**
+ * 鏈� 浠绘剰 涓�涓� Blank
+ *
+ * @param css CharSequence
+ * @return boolean
+ */
+ public static boolean isAnyBlank(final CharSequence... css) {
+ if (ObjectUtil.isEmpty(css)) {
+ return true;
+ }
+ return Stream.of(css).anyMatch(StringUtil::isBlank);
+ }
+
+ /**
+ * 鏄惁鍏ㄩ潪 Blank
+ *
+ * @param css CharSequence
+ * @return boolean
+ */
+ public static boolean isNoneBlank(final CharSequence... css) {
+ if (ObjectUtil.isEmpty(css)) {
+ return false;
+ }
+ return Stream.of(css).allMatch(StringUtil::isNotBlank);
+ }
+
+ /**
+ * 鏄惁鍏ㄤ负 Blank
+ *
+ * @param css CharSequence
+ * @return boolean
+ */
+ public static boolean isAllBlank(final CharSequence... css) {
+ return Stream.of(css).allMatch(StringUtil::isBlank);
+ }
+
+ /**
+ * 鍒ゆ柇涓�涓瓧绗︿覆鏄惁鏄暟瀛�
+ *
+ * @param cs the CharSequence to check, may be null
+ * @return {boolean}
+ */
+ public static boolean isNumeric(final CharSequence cs) {
+ if (isBlank(cs)) {
+ return false;
+ }
+ for (int i = cs.length(); --i >= 0; ) {
+ int chr = cs.charAt(i);
+ if (chr < 48 || chr > 57) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ /**
+ * 灏嗗瓧绗︿覆涓壒瀹氭ā寮忕殑瀛楃杞崲鎴恗ap涓搴旂殑鍊�
+ * <p>
+ * use: format("my name is ${name}, and i like ${like}!", {"name":"L.cm", "like": "Java"})
+ *
+ * @param message 闇�瑕佽浆鎹㈢殑瀛楃涓�
+ * @param params 杞崲鎵�闇�鐨勯敭鍊煎闆嗗悎
+ * @return 杞崲鍚庣殑瀛楃涓�
+ */
+ public static String format(@Nullable String message, @Nullable Map<String, ?> params) {
+ // message 涓� null 杩斿洖绌哄瓧绗︿覆
+ if (message == null) {
+ return StringPool.EMPTY;
+ }
+ // 鍙傛暟涓� null 鎴栬�呬负绌�
+ if (params == null || params.isEmpty()) {
+ return message;
+ }
+ // 鏇挎崲鍙橀噺
+ StringBuilder sb = new StringBuilder((int) (message.length() * 1.5));
+ int cursor = 0;
+ for (int start, end; (start = message.indexOf(StringPool.DOLLAR_LEFT_BRACE, cursor)) != -1 && (end = message.indexOf(StringPool.RIGHT_BRACE, start)) != -1; ) {
+ sb.append(message, cursor, start);
+ String key = message.substring(start + 2, end);
+ Object value = params.get(StringUtil.trimWhitespace(key));
+ sb.append(value == null ? StringPool.EMPTY : value);
+ cursor = end + 1;
+ }
+ sb.append(message.substring(cursor));
+ return sb.toString();
+ }
+
+ /**
+ * 鍚� log 鏍煎紡鐨� format 瑙勫垯
+ * <p>
+ * use: format("my name is {}, and i like {}!", "L.cm", "Java")
+ *
+ * @param message 闇�瑕佽浆鎹㈢殑瀛楃涓�
+ * @param arguments 闇�瑕佹浛鎹㈢殑鍙橀噺
+ * @return 杞崲鍚庣殑瀛楃涓�
+ */
+ public static String format(@Nullable String message, @Nullable Object... arguments) {
+ // message 涓� null 杩斿洖绌哄瓧绗︿覆
+ if (message == null) {
+ return StringPool.EMPTY;
+ }
+ // 鍙傛暟涓� null 鎴栬�呬负绌�
+ if (arguments == null || arguments.length == 0) {
+ return message;
+ }
+ StringBuilder sb = new StringBuilder((int) (message.length() * 1.5));
+ int cursor = 0;
+ int index = 0;
+ int argsLength = arguments.length;
+ for (int start, end; (start = message.indexOf('{', cursor)) != -1 && (end = message.indexOf('}', start)) != -1 && index < argsLength; ) {
+ sb.append(message, cursor, start);
+ sb.append(arguments[index]);
+ cursor = end + 1;
+ index++;
+ }
+ sb.append(message.substring(cursor));
+ return sb.toString();
+ }
+
+ /**
+ * 鏍煎紡鍖栨墽琛屾椂闂达紝鍗曚綅涓� ms 鍜� s锛屼繚鐣欎笁浣嶅皬鏁�
+ *
+ * @param nanos 绾崇
+ * @return 鏍煎紡鍖栧悗鐨勬椂闂�
+ */
+ public static String format(long nanos) {
+ if (nanos < 1) {
+ return "0ms";
+ }
+ double millis = (double) nanos / (1000 * 1000);
+ // 涓嶅 1 ms锛屾渶灏忓崟浣嶄负 ms
+ if (millis > 1000) {
+ return String.format("%.3fs", millis / 1000);
+ } else {
+ return String.format("%.3fms", millis);
+ }
+ }
+
+ /**
+ * Convert a {@code Collection} into a delimited {@code String} (e.g., CSV).
+ * <p>Useful for {@code toString()} implementations.
+ *
+ * @param coll the {@code Collection} to convert
+ * @return the delimited {@code String}
+ */
+ public static String join(Collection<?> coll) {
+ return StringUtil.collectionToCommaDelimitedString(coll);
+ }
+
+ /**
+ * Convert a {@code Collection} into a delimited {@code String} (e.g. CSV).
+ * <p>Useful for {@code toString()} implementations.
+ *
+ * @param coll the {@code Collection} to convert
+ * @param delim the delimiter to use (typically a ",")
+ * @return the delimited {@code String}
+ */
+ public static String join(Collection<?> coll, String delim) {
+ return StringUtil.collectionToDelimitedString(coll, delim);
+ }
+
+ /**
+ * Convert a {@code String} array into a comma delimited {@code String}
+ * (i.e., CSV).
+ * <p>Useful for {@code toString()} implementations.
+ *
+ * @param arr the array to display
+ * @return the delimited {@code String}
+ */
+ public static String join(Object[] arr) {
+ return StringUtil.arrayToCommaDelimitedString(arr);
+ }
+
+ /**
+ * Convert a {@code String} array into a delimited {@code String} (e.g. CSV).
+ * <p>Useful for {@code toString()} implementations.
+ *
+ * @param arr the array to display
+ * @param delim the delimiter to use (typically a ",")
+ * @return the delimited {@code String}
+ */
+ public static String join(Object[] arr, String delim) {
+ return StringUtil.arrayToDelimitedString(arr, delim);
+ }
+
+ /**
+ * 瀛楃涓叉槸鍚︾鍚堟寚瀹氱殑 琛ㄨ揪寮�
+ *
+ * <p>
+ * pattern styles: "xxx*", "*xxx", "*xxx*" and "xxx*yyy"
+ * </p>
+ *
+ * @param pattern 琛ㄨ揪寮�
+ * @param str 瀛楃涓�
+ * @return 鏄惁鍖归厤
+ */
+ public static boolean simpleMatch(@Nullable String pattern, @Nullable String str) {
+ return PatternMatchUtils.simpleMatch(pattern, str);
+ }
+
+ /**
+ * 瀛楃涓叉槸鍚︾鍚堟寚瀹氱殑 琛ㄨ揪寮�
+ *
+ * <p>
+ * pattern styles: "xxx*", "*xxx", "*xxx*" and "xxx*yyy"
+ * </p>
+ *
+ * @param patterns 琛ㄨ揪寮� 鏁扮粍
+ * @param str 瀛楃涓�
+ * @return 鏄惁鍖归厤
+ */
+ public static boolean simpleMatch(@Nullable String[] patterns, String str) {
+ return PatternMatchUtils.simpleMatch(patterns, str);
+ }
+
+ /**
+ * 鐢熸垚uuid
+ *
+ * @return UUID
+ */
+ public static String randomUUID() {
+ ThreadLocalRandom random = ThreadLocalRandom.current();
+ return new UUID(random.nextLong(), random.nextLong()).toString().replace(StringPool.DASH, StringPool.EMPTY);
+ }
+
+ /**
+ * 杞箟HTML鐢ㄤ簬瀹夊叏杩囨护
+ *
+ * @param html html
+ * @return {String}
+ */
+ public static String escapeHtml(String html) {
+ return StringUtil.isBlank(html) ? StringPool.EMPTY : HtmlUtils.htmlEscape(html);
+ }
+
+ /**
+ * 娓呯悊瀛楃涓诧紝娓呯悊鍑烘煇浜涗笉鍙瀛楃
+ *
+ * @param txt 瀛楃涓�
+ * @return {String}
+ */
+ public static String cleanChars(String txt) {
+ return txt.replaceAll("[ 銆�`路鈥拷\\f\\t\\v\\s]", "");
+ }
+
+ /**
+ * 鐗规畩瀛楃姝e垯锛宻ql鐗规畩瀛楃鍜岀┖鐧界
+ */
+ private final static Pattern SPECIAL_CHARS_REGEX = Pattern.compile("[`'\"|/,;()-+*%#路鈥拷銆�\\s]");
+
+ /**
+ * 娓呯悊瀛楃涓诧紝娓呯悊鍑烘煇浜涗笉鍙瀛楃鍜屼竴浜泂ql鐗规畩瀛楃
+ *
+ * @param txt 鏂囨湰
+ * @return {String}
+ */
+ @Nullable
+ public static String cleanText(@Nullable String txt) {
+ if (txt == null) {
+ return null;
+ }
+ return SPECIAL_CHARS_REGEX.matcher(txt).replaceAll(StringPool.EMPTY);
+ }
+
+ /**
+ * 鑾峰彇鏍囪瘑绗︼紝鐢ㄤ簬鍙傛暟娓呯悊
+ *
+ * @param param 鍙傛暟
+ * @return 娓呯悊鍚庣殑鏍囪瘑绗�
+ */
+ @Nullable
+ public static String cleanIdentifier(@Nullable String param) {
+ if (param == null) {
+ return null;
+ }
+ StringBuilder paramBuilder = new StringBuilder();
+ for (int i = 0; i < param.length(); i++) {
+ char c = param.charAt(i);
+ if (Character.isJavaIdentifierPart(c)) {
+ paramBuilder.append(c);
+ }
+ }
+ return paramBuilder.toString();
+ }
+
+ /**
+ * 闅忔満鏁扮敓鎴�
+ *
+ * @param count 瀛楃闀垮害
+ * @return 闅忔満鏁�
+ */
+ public static String random(int count) {
+ return StringUtil.random(count, RandomType.ALL);
+ }
+
+ /**
+ * 闅忔満鏁扮敓鎴�
+ *
+ * @param count 瀛楃闀垮害
+ * @param randomType 闅忔満鏁扮被鍒�
+ * @return 闅忔満鏁�
+ */
+ public static String random(int count, RandomType randomType) {
+ if (count == 0) {
+ return StringPool.EMPTY;
+ }
+ Assert.isTrue(count > 0, "Requested random string length " + count + " is less than 0.");
+ final Random random = Holder.SECURE_RANDOM;
+ char[] buffer = new char[count];
+ for (int i = 0; i < count; i++) {
+ String factor = randomType.getFactor();
+ buffer[i] = factor.charAt(random.nextInt(factor.length()));
+ }
+ return new String(buffer);
+ }
+
+ /**
+ * 鏈夊簭鐨勬牸寮忓寲鏂囨湰锛屼娇鐢▄number}鍋氫负鍗犱綅绗�<br>
+ * 渚嬶細<br>
+ * 閫氬父浣跨敤锛歠ormat("this is {0} for {1}", "a", "b") =銆� this is a for b<br>
+ *
+ * @param pattern 鏂囨湰鏍煎紡
+ * @param arguments 鍙傛暟
+ * @return 鏍煎紡鍖栧悗鐨勬枃鏈�
+ */
+ public static String indexedFormat(CharSequence pattern, Object... arguments) {
+ return MessageFormat.format(pattern.toString(), arguments);
+ }
+
+ /**
+ * 鏍煎紡鍖栨枃鏈紝浣跨敤 {varName} 鍗犱綅<br>
+ * map = {a: "aValue", b: "bValue"} format("{a} and {b}", map) ---=銆� aValue and bValue
+ *
+ * @param template 鏂囨湰妯℃澘锛岃鏇挎崲鐨勯儴鍒嗙敤 {key} 琛ㄧず
+ * @param map 鍙傛暟鍊煎
+ * @return 鏍煎紡鍖栧悗鐨勬枃鏈�
+ */
+ public static String format(CharSequence template, Map<?, ?> map) {
+ if (null == template) {
+ return null;
+ }
+ if (null == map || map.isEmpty()) {
+ return template.toString();
+ }
+
+ String template2 = template.toString();
+ for (Map.Entry<?, ?> entry : map.entrySet()) {
+ template2 = template2.replace("{" + entry.getKey() + "}", Func.toStr(entry.getValue()));
+ }
+ return template2;
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝涓嶅幓闄ゅ垏鍒嗗悗姣忎釜鍏冪礌涓よ竟鐨勭┖鐧界锛屼笉鍘婚櫎绌虹櫧椤�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁帮紝-1涓嶉檺鍒�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ */
+ public static List<String> split(CharSequence str, char separator, int limit) {
+ return split(str, separator, limit, false, false);
+ }
+
+ /**
+ * 鍒嗗壊 瀛楃涓� 鍒犻櫎甯歌 绌虹櫧绗�
+ *
+ * @param str 瀛楃涓�
+ * @param delimiter 鍒嗗壊绗�
+ * @return 瀛楃涓叉暟缁�
+ */
+ public static String[] splitTrim(@Nullable String str, @Nullable String delimiter) {
+ return StringUtil.delimitedListToStringArray(str, delimiter, " \t\n\n\f");
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝鍘婚櫎鍒囧垎鍚庢瘡涓厓绱犱袱杈圭殑绌虹櫧绗︼紝鍘婚櫎绌虹櫧椤�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.1.2
+ */
+ public static List<String> splitTrim(CharSequence str, char separator) {
+ return splitTrim(str, separator, -1);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝鍘婚櫎鍒囧垎鍚庢瘡涓厓绱犱袱杈圭殑绌虹櫧绗︼紝鍘婚櫎绌虹櫧椤�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.0
+ */
+ public static List<String> splitTrim(CharSequence str, CharSequence separator) {
+ return splitTrim(str, separator, -1);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝鍘婚櫎鍒囧垎鍚庢瘡涓厓绱犱袱杈圭殑绌虹櫧绗︼紝鍘婚櫎绌虹櫧椤�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁帮紝-1涓嶉檺鍒�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.1.0
+ */
+ public static List<String> splitTrim(CharSequence str, char separator, int limit) {
+ return split(str, separator, limit, true, true);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝鍘婚櫎鍒囧垎鍚庢瘡涓厓绱犱袱杈圭殑绌虹櫧绗︼紝鍘婚櫎绌虹櫧椤�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁帮紝-1涓嶉檺鍒�
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.0
+ */
+ public static List<String> splitTrim(CharSequence str, CharSequence separator, int limit) {
+ return split(str, separator, limit, true, true);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓诧紝涓嶉檺鍒跺垎鐗囨暟閲�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> split(CharSequence str, char separator, boolean isTrim, boolean ignoreEmpty) {
+ return split(str, separator, 0, isTrim, ignoreEmpty);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁帮紝-1涓嶉檺鍒�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.0.8
+ */
+ public static List<String> split(CharSequence str, char separator, int limit, boolean isTrim, boolean ignoreEmpty) {
+ if (null == str) {
+ return new ArrayList<>(0);
+ }
+ return StrSpliter.split(str.toString(), separator, limit, isTrim, ignoreEmpty);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗﹀瓧绗�
+ * @param limit 闄愬埗鍒嗙墖鏁帮紝-1涓嶉檺鍒�
+ * @param isTrim 鏄惁鍘婚櫎鍒囧垎瀛楃涓插悗姣忎釜鍏冪礌涓よ竟鐨勭┖鏍�
+ * @param ignoreEmpty 鏄惁蹇界暐绌轰覆
+ * @return 鍒囧垎鍚庣殑闆嗗悎
+ * @since 3.2.0
+ */
+ public static List<String> split(CharSequence str, CharSequence separator, int limit, boolean isTrim, boolean ignoreEmpty) {
+ if (null == str) {
+ return new ArrayList<>(0);
+ }
+ final String separatorStr = (null == separator) ? null : separator.toString();
+ return StrSpliter.split(str.toString(), separatorStr, limit, isTrim, ignoreEmpty);
+ }
+
+ /**
+ * 鍒囧垎瀛楃涓�
+ *
+ * @param str 琚垏鍒嗙殑瀛楃涓�
+ * @param separator 鍒嗛殧绗�
+ * @return 瀛楃涓�
+ */
+ public static String[] split(CharSequence str, CharSequence separator) {
+ if (str == null) {
+ return new String[]{};
+ }
+
+ final String separatorStr = (null == separator) ? null : separator.toString();
+ return StrSpliter.splitToArray(str.toString(), separatorStr, 0, false, false);
+ }
+
+ /**
+ * 鏍规嵁缁欏畾闀垮害锛屽皢缁欏畾瀛楃涓叉埅鍙栦负澶氫釜閮ㄥ垎
+ *
+ * @param str 瀛楃涓�
+ * @param len 姣忎竴涓皬鑺傜殑闀垮害
+ * @return 鎴彇鍚庣殑瀛楃涓叉暟缁�
+ * @see StrSpliter#splitByLength(String, int)
+ */
+ public static String[] split(CharSequence str, int len) {
+ if (null == str) {
+ return new String[]{};
+ }
+ return StrSpliter.splitByLength(str.toString(), len);
+ }
+
+ /**
+ * 鎸囧畾瀛楃鏄惁鍦ㄥ瓧绗︿覆涓嚭鐜拌繃
+ *
+ * @param str 瀛楃涓�
+ * @param searchChar 琚煡鎵剧殑瀛楃
+ * @return 鏄惁鍖呭惈
+ * @since 3.1.2
+ */
+ public static boolean contains(CharSequence str, char searchChar) {
+ return indexOf(str, searchChar) > -1;
+ }
+
+ /**
+ * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀寘鍚寚瀹氬瓧绗︿覆鍒楄〃涓殑浠绘剰涓�涓瓧绗︿覆
+ *
+ * @param str 鎸囧畾瀛楃涓�
+ * @param testStrs 闇�瑕佹鏌ョ殑瀛楃涓叉暟缁�
+ * @return 鏄惁鍖呭惈浠绘剰涓�涓瓧绗︿覆
+ * @since 3.2.0
+ */
+ public static boolean containsAny(CharSequence str, CharSequence... testStrs) {
+ return null != getContainsStr(str, testStrs);
+ }
+
+ /**
+ * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀寘鍚寚瀹氬瓧绗︿覆鍒楄〃涓殑浠绘剰涓�涓瓧绗︿覆锛屽鏋滃寘鍚繑鍥炴壘鍒扮殑绗竴涓瓧绗︿覆
+ *
+ * @param str 鎸囧畾瀛楃涓�
+ * @param testStrs 闇�瑕佹鏌ョ殑瀛楃涓叉暟缁�
+ * @return 琚寘鍚殑绗竴涓瓧绗︿覆
+ * @since 3.2.0
+ */
+ public static String getContainsStr(CharSequence str, CharSequence... testStrs) {
+ if (isEmpty(str) || Func.isEmpty(testStrs)) {
+ return null;
+ }
+ for (CharSequence checkStr : testStrs) {
+ if (str.toString().contains(checkStr)) {
+ return checkStr.toString();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 鏄惁鍖呭惈鐗瑰畾瀛楃锛屽拷鐣ュぇ灏忓啓锛屽鏋滅粰瀹氫袱涓弬鏁伴兘涓�<code>null</code>锛岃繑鍥瀟rue
+ *
+ * @param str 琚娴嬪瓧绗︿覆
+ * @param testStr 琚祴璇曟槸鍚﹀寘鍚殑瀛楃涓�
+ * @return 鏄惁鍖呭惈
+ */
+ public static boolean containsIgnoreCase(CharSequence str, CharSequence testStr) {
+ if (null == str) {
+ // 濡傛灉琚洃娴嬪瓧绗︿覆鍜�
+ return null == testStr;
+ }
+ return str.toString().toLowerCase().contains(testStr.toString().toLowerCase());
+ }
+
+ /**
+ * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀寘鍚寚瀹氬瓧绗︿覆鍒楄〃涓殑浠绘剰涓�涓瓧绗︿覆<br>
+ * 蹇界暐澶у皬鍐�
+ *
+ * @param str 鎸囧畾瀛楃涓�
+ * @param testStrs 闇�瑕佹鏌ョ殑瀛楃涓叉暟缁�
+ * @return 鏄惁鍖呭惈浠绘剰涓�涓瓧绗︿覆
+ * @since 3.2.0
+ */
+ public static boolean containsAnyIgnoreCase(CharSequence str, CharSequence... testStrs) {
+ return null != getContainsStrIgnoreCase(str, testStrs);
+ }
+
+ /**
+ * 鏌ユ壘鎸囧畾瀛楃涓叉槸鍚﹀寘鍚寚瀹氬瓧绗︿覆鍒楄〃涓殑浠绘剰涓�涓瓧绗︿覆锛屽鏋滃寘鍚繑鍥炴壘鍒扮殑绗竴涓瓧绗︿覆<br>
+ * 蹇界暐澶у皬鍐�
+ *
+ * @param str 鎸囧畾瀛楃涓�
+ * @param testStrs 闇�瑕佹鏌ョ殑瀛楃涓叉暟缁�
+ * @return 琚寘鍚殑绗竴涓瓧绗︿覆
+ * @since 3.2.0
+ */
+ public static String getContainsStrIgnoreCase(CharSequence str, CharSequence... testStrs) {
+ if (isEmpty(str) || Func.isEmpty(testStrs)) {
+ return null;
+ }
+ for (CharSequence testStr : testStrs) {
+ if (containsIgnoreCase(str, testStr)) {
+ return testStr.toString();
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 鏀硅繘JDK subString<br>
+ * index浠�0寮�濮嬭绠楋紝鏈�鍚庝竴涓瓧绗︿负-1<br>
+ * 濡傛灉from鍜宼o浣嶇疆涓�鏍凤紝杩斿洖 "" <br>
+ * 濡傛灉from鎴杢o涓鸿礋鏁帮紝鍒欐寜鐓ength浠庡悗鍚戝墠鏁颁綅缃紝濡傛灉缁濆鍊煎ぇ浜庡瓧绗︿覆闀垮害锛屽垯from褰掑埌0锛宼o褰掑埌length<br>
+ * 濡傛灉缁忚繃淇鐨刬ndex涓璮rom澶т簬to锛屽垯浜掓崲from鍜宼o example: <br>
+ * abcdefgh 2 3 =銆� c <br>
+ * abcdefgh 2 -3 =銆� cde <br>
+ *
+ * @param str String
+ * @param fromIndex 寮�濮嬬殑index锛堝寘鎷級
+ * @param toIndex 缁撴潫鐨刬ndex锛堜笉鍖呮嫭锛�
+ * @return 瀛椾覆
+ */
+ public static String sub(CharSequence str, int fromIndex, int toIndex) {
+ if (isEmpty(str)) {
+ return StringPool.EMPTY;
+ }
+ int len = str.length();
+
+ if (fromIndex < 0) {
+ fromIndex = len + fromIndex;
+ if (fromIndex < 0) {
+ fromIndex = 0;
+ }
+ } else if (fromIndex > len) {
+ fromIndex = len;
+ }
+
+ if (toIndex < 0) {
+ toIndex = len + toIndex;
+ if (toIndex < 0) {
+ toIndex = len;
+ }
+ } else if (toIndex > len) {
+ toIndex = len;
+ }
+
+ if (toIndex < fromIndex) {
+ int tmp = fromIndex;
+ fromIndex = toIndex;
+ toIndex = tmp;
+ }
+
+ if (fromIndex == toIndex) {
+ return StringPool.EMPTY;
+ }
+
+ return str.toString().substring(fromIndex, toIndex);
+ }
+
+
+ /**
+ * 鎴彇鍒嗛殧瀛楃涓蹭箣鍓嶇殑瀛楃涓诧紝涓嶅寘鎷垎闅斿瓧绗︿覆<br>
+ * 濡傛灉缁欏畾鐨勫瓧绗︿覆涓虹┖涓诧紙null鎴�""锛夋垨鑰呭垎闅斿瓧绗︿覆涓簄ull锛岃繑鍥炲師瀛楃涓�<br>
+ * 濡傛灉鍒嗛殧瀛楃涓蹭负绌轰覆""锛屽垯杩斿洖绌轰覆锛屽鏋滃垎闅斿瓧绗︿覆鏈壘鍒帮紝杩斿洖鍘熷瓧绗︿覆
+ * <p>
+ * 鏍楀瓙锛�
+ *
+ * <pre>
+ * StringUtil.subBefore(null, *) = null
+ * StringUtil.subBefore("", *) = ""
+ * StringUtil.subBefore("abc", "a") = ""
+ * StringUtil.subBefore("abcba", "b") = "a"
+ * StringUtil.subBefore("abc", "c") = "ab"
+ * StringUtil.subBefore("abc", "d") = "abc"
+ * StringUtil.subBefore("abc", "") = ""
+ * StringUtil.subBefore("abc", null) = "abc"
+ * </pre>
+ *
+ * @param string 琚煡鎵剧殑瀛楃涓�
+ * @param separator 鍒嗛殧瀛楃涓诧紙涓嶅寘鎷級
+ * @param isLastSeparator 鏄惁鏌ユ壘鏈�鍚庝竴涓垎闅斿瓧绗︿覆锛堝娆″嚭鐜板垎闅斿瓧绗︿覆鏃堕�夊彇鏈�鍚庝竴涓級锛宼rue涓洪�夊彇鏈�鍚庝竴涓�
+ * @return 鍒囧壊鍚庣殑瀛楃涓�
+ * @since 3.1.1
+ */
+ public static String subBefore(CharSequence string, CharSequence separator, boolean isLastSeparator) {
+ if (isEmpty(string) || separator == null) {
+ return null == string ? null : string.toString();
+ }
+
+ final String str = string.toString();
+ final String sep = separator.toString();
+ if (sep.isEmpty()) {
+ return StringPool.EMPTY;
+ }
+ final int pos = isLastSeparator ? str.lastIndexOf(sep) : str.indexOf(sep);
+ if (pos == INDEX_NOT_FOUND) {
+ return str;
+ }
+ return str.substring(0, pos);
+ }
+
+ /**
+ * 鎴彇鍒嗛殧瀛楃涓蹭箣鍚庣殑瀛楃涓诧紝涓嶅寘鎷垎闅斿瓧绗︿覆<br>
+ * 濡傛灉缁欏畾鐨勫瓧绗︿覆涓虹┖涓诧紙null鎴�""锛夛紝杩斿洖鍘熷瓧绗︿覆<br>
+ * 濡傛灉鍒嗛殧瀛楃涓蹭负绌轰覆锛坣ull鎴�""锛夛紝鍒欒繑鍥炵┖涓诧紝濡傛灉鍒嗛殧瀛楃涓叉湭鎵惧埌锛岃繑鍥炵┖涓�
+ * <p>
+ * 鏍楀瓙锛�
+ *
+ * <pre>
+ * StringUtil.subAfter(null, *) = null
+ * StringUtil.subAfter("", *) = ""
+ * StringUtil.subAfter(*, null) = ""
+ * StringUtil.subAfter("abc", "a") = "bc"
+ * StringUtil.subAfter("abcba", "b") = "cba"
+ * StringUtil.subAfter("abc", "c") = ""
+ * StringUtil.subAfter("abc", "d") = ""
+ * StringUtil.subAfter("abc", "") = "abc"
+ * </pre>
+ *
+ * @param string 琚煡鎵剧殑瀛楃涓�
+ * @param separator 鍒嗛殧瀛楃涓诧紙涓嶅寘鎷級
+ * @param isLastSeparator 鏄惁鏌ユ壘鏈�鍚庝竴涓垎闅斿瓧绗︿覆锛堝娆″嚭鐜板垎闅斿瓧绗︿覆鏃堕�夊彇鏈�鍚庝竴涓級锛宼rue涓洪�夊彇鏈�鍚庝竴涓�
+ * @return 鍒囧壊鍚庣殑瀛楃涓�
+ * @since 3.1.1
+ */
+ public static String subAfter(CharSequence string, CharSequence separator, boolean isLastSeparator) {
+ if (isEmpty(string)) {
+ return null == string ? null : string.toString();
+ }
+ if (separator == null) {
+ return StringPool.EMPTY;
+ }
+ final String str = string.toString();
+ final String sep = separator.toString();
+ final int pos = isLastSeparator ? str.lastIndexOf(sep) : str.indexOf(sep);
+ if (pos == INDEX_NOT_FOUND) {
+ return StringPool.EMPTY;
+ }
+ return str.substring(pos + separator.length());
+ }
+
+ /**
+ * 鎴彇鎸囧畾瀛楃涓蹭腑闂撮儴鍒嗭紝涓嶅寘鎷爣璇嗗瓧绗︿覆<br>
+ * <p>
+ * 鏍楀瓙锛�
+ *
+ * <pre>
+ * StringUtil.subBetween("wx[b]yz", "[", "]") = "b"
+ * StringUtil.subBetween(null, *, *) = null
+ * StringUtil.subBetween(*, null, *) = null
+ * StringUtil.subBetween(*, *, null) = null
+ * StringUtil.subBetween("", "", "") = ""
+ * StringUtil.subBetween("", "", "]") = null
+ * StringUtil.subBetween("", "[", "]") = null
+ * StringUtil.subBetween("yabcz", "", "") = ""
+ * StringUtil.subBetween("yabcz", "y", "z") = "abc"
+ * StringUtil.subBetween("yabczyabcz", "y", "z") = "abc"
+ * </pre>
+ *
+ * @param str 琚垏鍓茬殑瀛楃涓�
+ * @param before 鎴彇寮�濮嬬殑瀛楃涓叉爣璇�
+ * @param after 鎴彇鍒扮殑瀛楃涓叉爣璇�
+ * @return 鎴彇鍚庣殑瀛楃涓�
+ * @since 3.1.1
+ */
+ public static String subBetween(CharSequence str, CharSequence before, CharSequence after) {
+ if (str == null || before == null || after == null) {
+ return null;
+ }
+
+ final String str2 = str.toString();
+ final String before2 = before.toString();
+ final String after2 = after.toString();
+
+ final int start = str2.indexOf(before2);
+ if (start != INDEX_NOT_FOUND) {
+ final int end = str2.indexOf(after2, start + before2.length());
+ if (end != INDEX_NOT_FOUND) {
+ return str2.substring(start + before2.length(), end);
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 鎴彇鎸囧畾瀛楃涓蹭腑闂撮儴鍒嗭紝涓嶅寘鎷爣璇嗗瓧绗︿覆<br>
+ * <p>
+ * 鏍楀瓙锛�
+ *
+ * <pre>
+ * StringUtil.subBetween(null, *) = null
+ * StringUtil.subBetween("", "") = ""
+ * StringUtil.subBetween("", "tag") = null
+ * StringUtil.subBetween("tagabctag", null) = null
+ * StringUtil.subBetween("tagabctag", "") = ""
+ * StringUtil.subBetween("tagabctag", "tag") = "abc"
+ * </pre>
+ *
+ * @param str 琚垏鍓茬殑瀛楃涓�
+ * @param beforeAndAfter 鎴彇寮�濮嬪拰缁撴潫鐨勫瓧绗︿覆鏍囪瘑
+ * @return 鎴彇鍚庣殑瀛楃涓�
+ * @since 3.1.1
+ */
+ public static String subBetween(CharSequence str, CharSequence beforeAndAfter) {
+ return subBetween(str, beforeAndAfter, beforeAndAfter);
+ }
+
+ /**
+ * 鍘绘帀鎸囧畾鍓嶇紑
+ *
+ * @param str 瀛楃涓�
+ * @param prefix 鍓嶇紑
+ * @return 鍒囨帀鍚庣殑瀛楃涓诧紝鑻ュ墠缂�涓嶆槸 preffix锛� 杩斿洖鍘熷瓧绗︿覆
+ */
+ public static String removePrefix(CharSequence str, CharSequence prefix) {
+ if (isEmpty(str) || isEmpty(prefix)) {
+ return StringPool.EMPTY;
+ }
+
+ final String str2 = str.toString();
+ if (str2.startsWith(prefix.toString())) {
+ return subSuf(str2, prefix.length());
+ }
+ return str2;
+ }
+
+ /**
+ * 蹇界暐澶у皬鍐欏幓鎺夋寚瀹氬墠缂�
+ *
+ * @param str 瀛楃涓�
+ * @param prefix 鍓嶇紑
+ * @return 鍒囨帀鍚庣殑瀛楃涓诧紝鑻ュ墠缂�涓嶆槸 prefix锛� 杩斿洖鍘熷瓧绗︿覆
+ */
+ public static String removePrefixIgnoreCase(CharSequence str, CharSequence prefix) {
+ if (isEmpty(str) || isEmpty(prefix)) {
+ return StringPool.EMPTY;
+ }
+
+ final String str2 = str.toString();
+ if (str2.toLowerCase().startsWith(prefix.toString().toLowerCase())) {
+ return subSuf(str2, prefix.length());
+ }
+ return str2;
+ }
+
+ /**
+ * 鍘绘帀鎸囧畾鍚庣紑
+ *
+ * @param str 瀛楃涓�
+ * @param suffix 鍚庣紑
+ * @return 鍒囨帀鍚庣殑瀛楃涓诧紝鑻ュ悗缂�涓嶆槸 suffix锛� 杩斿洖鍘熷瓧绗︿覆
+ */
+ public static String removeSuffix(CharSequence str, CharSequence suffix) {
+ if (isEmpty(str) || isEmpty(suffix)) {
+ return StringPool.EMPTY;
+ }
+
+ final String str2 = str.toString();
+ if (str2.endsWith(suffix.toString())) {
+ return subPre(str2, str2.length() - suffix.length());
+ }
+ return str2;
+ }
+
+ /**
+ * 鍘绘帀鎸囧畾鍚庣紑锛屽苟灏忓啓棣栧瓧姣�
+ *
+ * @param str 瀛楃涓�
+ * @param suffix 鍚庣紑
+ * @return 鍒囨帀鍚庣殑瀛楃涓诧紝鑻ュ悗缂�涓嶆槸 suffix锛� 杩斿洖鍘熷瓧绗︿覆
+ */
+ public static String removeSufAndLowerFirst(CharSequence str, CharSequence suffix) {
+ return firstCharToLower(removeSuffix(str, suffix));
+ }
+
+ /**
+ * 蹇界暐澶у皬鍐欏幓鎺夋寚瀹氬悗缂�
+ *
+ * @param str 瀛楃涓�
+ * @param suffix 鍚庣紑
+ * @return 鍒囨帀鍚庣殑瀛楃涓诧紝鑻ュ悗缂�涓嶆槸 suffix锛� 杩斿洖鍘熷瓧绗︿覆
+ */
+ public static String removeSuffixIgnoreCase(CharSequence str, CharSequence suffix) {
+ if (isEmpty(str) || isEmpty(suffix)) {
+ return StringPool.EMPTY;
+ }
+
+ final String str2 = str.toString();
+ if (str2.toLowerCase().endsWith(suffix.toString().toLowerCase())) {
+ return subPre(str2, str2.length() - suffix.length());
+ }
+ return str2;
+ }
+
+ /**
+ * 棣栧瓧姣嶅彉灏忓啓
+ *
+ * @param str 瀛楃涓�
+ * @return {String}
+ */
+ public static String firstCharToLower(String str) {
+ char firstChar = str.charAt(0);
+ if (firstChar >= CharPool.UPPER_A && firstChar <= CharPool.UPPER_Z) {
+ char[] arr = str.toCharArray();
+ arr[0] += (CharPool.LOWER_A - CharPool.UPPER_A);
+ return new String(arr);
+ }
+ return str;
+ }
+
+ /**
+ * 棣栧瓧姣嶅彉澶у啓
+ *
+ * @param str 瀛楃涓�
+ * @return {String}
+ */
+ public static String firstCharToUpper(String str) {
+ char firstChar = str.charAt(0);
+ if (firstChar >= CharPool.LOWER_A && firstChar <= CharPool.LOWER_Z) {
+ char[] arr = str.toCharArray();
+ arr[0] -= (CharPool.LOWER_A - CharPool.UPPER_A);
+ return new String(arr);
+ }
+ return str;
+ }
+
+ /**
+ * 鍒囧壊鎸囧畾浣嶇疆涔嬪墠閮ㄥ垎鐨勫瓧绗︿覆
+ *
+ * @param string 瀛楃涓�
+ * @param toIndex 鍒囧壊鍒扮殑浣嶇疆锛堜笉鍖呮嫭锛�
+ * @return 鍒囧壊鍚庣殑鍓╀綑鐨勫墠鍗婇儴鍒嗗瓧绗︿覆
+ */
+ public static String subPre(CharSequence string, int toIndex) {
+ return sub(string, 0, toIndex);
+ }
+
+ /**
+ * 鍒囧壊鎸囧畾浣嶇疆涔嬪悗閮ㄥ垎鐨勫瓧绗︿覆
+ *
+ * @param string 瀛楃涓�
+ * @param fromIndex 鍒囧壊寮�濮嬬殑浣嶇疆锛堝寘鎷級
+ * @return 鍒囧壊鍚庡悗鍓╀綑鐨勫悗鍗婇儴鍒嗗瓧绗︿覆
+ */
+ public static String subSuf(CharSequence string, int fromIndex) {
+ if (isEmpty(string)) {
+ return null;
+ }
+ return sub(string, fromIndex, string.length());
+ }
+
+ /**
+ * 鎸囧畾鑼冨洿鍐呮煡鎵炬寚瀹氬瓧绗�
+ *
+ * @param str 瀛楃涓�
+ * @param searchChar 琚煡鎵剧殑瀛楃
+ * @return 浣嶇疆
+ */
+ public static int indexOf(final CharSequence str, char searchChar) {
+ return indexOf(str, searchChar, 0);
+ }
+
+ /**
+ * 鎸囧畾鑼冨洿鍐呮煡鎵炬寚瀹氬瓧绗�
+ *
+ * @param str 瀛楃涓�
+ * @param searchChar 琚煡鎵剧殑瀛楃
+ * @param start 璧峰浣嶇疆锛屽鏋滃皬浜�0锛屼粠0寮�濮嬫煡鎵�
+ * @return 浣嶇疆
+ */
+ public static int indexOf(final CharSequence str, char searchChar, int start) {
+ if (str instanceof String) {
+ return ((String) str).indexOf(searchChar, start);
+ } else {
+ return indexOf(str, searchChar, start, -1);
+ }
+ }
+
+ /**
+ * 鎸囧畾鑼冨洿鍐呮煡鎵炬寚瀹氬瓧绗�
+ *
+ * @param str 瀛楃涓�
+ * @param searchChar 琚煡鎵剧殑瀛楃
+ * @param start 璧峰浣嶇疆锛屽鏋滃皬浜�0锛屼粠0寮�濮嬫煡鎵�
+ * @param end 缁堟浣嶇疆锛屽鏋滆秴杩噑tr.length()鍒欓粯璁ゆ煡鎵惧埌瀛楃涓叉湯灏�
+ * @return 浣嶇疆
+ */
+ public static int indexOf(final CharSequence str, char searchChar, int start, int end) {
+ final int len = str.length();
+ if (start < 0 || start > len) {
+ start = 0;
+ }
+ if (end > len || end < 0) {
+ end = len;
+ }
+ for (int i = start; i < end; i++) {
+ if (str.charAt(i) == searchChar) {
+ return i;
+ }
+ }
+ return -1;
+ }
+
+ /**
+ * 鎸囧畾鑼冨洿鍐呮煡鎵惧瓧绗︿覆锛屽拷鐣ュぇ灏忓啓<br>
+ *
+ * <pre>
+ * StringUtil.indexOfIgnoreCase(null, *, *) = -1
+ * StringUtil.indexOfIgnoreCase(*, null, *) = -1
+ * StringUtil.indexOfIgnoreCase("", "", 0) = 0
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "A", 0) = 0
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "B", 0) = 2
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "AB", 0) = 1
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "B", 3) = 5
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "B", 9) = -1
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "B", -1) = 2
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "", 2) = 2
+ * StringUtil.indexOfIgnoreCase("abc", "", 9) = -1
+ * </pre>
+ *
+ * @param str 瀛楃涓�
+ * @param searchStr 闇�瑕佹煡鎵句綅缃殑瀛楃涓�
+ * @return 浣嶇疆
+ * @since 3.2.1
+ */
+ public static int indexOfIgnoreCase(final CharSequence str, final CharSequence searchStr) {
+ return indexOfIgnoreCase(str, searchStr, 0);
+ }
+
+ /**
+ * 鎸囧畾鑼冨洿鍐呮煡鎵惧瓧绗︿覆
+ *
+ * <pre>
+ * StringUtil.indexOfIgnoreCase(null, *, *) = -1
+ * StringUtil.indexOfIgnoreCase(*, null, *) = -1
+ * StringUtil.indexOfIgnoreCase("", "", 0) = 0
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "A", 0) = 0
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "B", 0) = 2
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "AB", 0) = 1
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "B", 3) = 5
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "B", 9) = -1
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "B", -1) = 2
+ * StringUtil.indexOfIgnoreCase("aabaabaa", "", 2) = 2
+ * StringUtil.indexOfIgnoreCase("abc", "", 9) = -1
+ * </pre>
+ *
+ * @param str 瀛楃涓�
+ * @param searchStr 闇�瑕佹煡鎵句綅缃殑瀛楃涓�
+ * @param fromIndex 璧峰浣嶇疆
+ * @return 浣嶇疆
+ * @since 3.2.1
+ */
+ public static int indexOfIgnoreCase(final CharSequence str, final CharSequence searchStr, int fromIndex) {
+ return indexOf(str, searchStr, fromIndex, true);
+ }
+
+ /**
+ * 鎸囧畾鑼冨洿鍐呭弽鍚戞煡鎵惧瓧绗︿覆
+ *
+ * @param str 瀛楃涓�
+ * @param searchStr 闇�瑕佹煡鎵句綅缃殑瀛楃涓�
+ * @param fromIndex 璧峰浣嶇疆
+ * @param ignoreCase 鏄惁蹇界暐澶у皬鍐�
+ * @return 浣嶇疆
+ * @since 3.2.1
+ */
+ public static int indexOf(final CharSequence str, CharSequence searchStr, int fromIndex, boolean ignoreCase) {
+ if (str == null || searchStr == null) {
+ return INDEX_NOT_FOUND;
+ }
+ if (fromIndex < 0) {
+ fromIndex = 0;
+ }
+
+ final int endLimit = str.length() - searchStr.length() + 1;
+ if (fromIndex > endLimit) {
+ return INDEX_NOT_FOUND;
+ }
+ if (searchStr.length() == 0) {
+ return fromIndex;
+ }
+
+ if (false == ignoreCase) {
+ // 涓嶅拷鐣ュぇ灏忓啓璋冪敤JDK鏂规硶
+ return str.toString().indexOf(searchStr.toString(), fromIndex);
+ }
+
+ for (int i = fromIndex; i < endLimit; i++) {
+ if (isSubEquals(str, i, searchStr, 0, searchStr.length(), true)) {
+ return i;
+ }
+ }
+ return INDEX_NOT_FOUND;
+ }
+
+ /**
+ * 鎸囧畾鑼冨洿鍐呮煡鎵惧瓧绗︿覆锛屽拷鐣ュぇ灏忓啓<br>
+ *
+ * @param str 瀛楃涓�
+ * @param searchStr 闇�瑕佹煡鎵句綅缃殑瀛楃涓�
+ * @return 浣嶇疆
+ * @since 3.2.1
+ */
+ public static int lastIndexOfIgnoreCase(final CharSequence str, final CharSequence searchStr) {
+ return lastIndexOfIgnoreCase(str, searchStr, str.length());
+ }
+
+ /**
+ * 鎸囧畾鑼冨洿鍐呮煡鎵惧瓧绗︿覆锛屽拷鐣ュぇ灏忓啓<br>
+ *
+ * @param str 瀛楃涓�
+ * @param searchStr 闇�瑕佹煡鎵句綅缃殑瀛楃涓�
+ * @param fromIndex 璧峰浣嶇疆锛屼粠鍚庡線鍓嶈鏁�
+ * @return 浣嶇疆
+ * @since 3.2.1
+ */
+ public static int lastIndexOfIgnoreCase(final CharSequence str, final CharSequence searchStr, int fromIndex) {
+ return lastIndexOf(str, searchStr, fromIndex, true);
+ }
+
+ /**
+ * 鎸囧畾鑼冨洿鍐呮煡鎵惧瓧绗︿覆<br>
+ *
+ * @param str 瀛楃涓�
+ * @param searchStr 闇�瑕佹煡鎵句綅缃殑瀛楃涓�
+ * @param fromIndex 璧峰浣嶇疆锛屼粠鍚庡線鍓嶈鏁�
+ * @param ignoreCase 鏄惁蹇界暐澶у皬鍐�
+ * @return 浣嶇疆
+ * @since 3.2.1
+ */
+ public static int lastIndexOf(final CharSequence str, final CharSequence searchStr, int fromIndex, boolean ignoreCase) {
+ if (str == null || searchStr == null) {
+ return INDEX_NOT_FOUND;
+ }
+ if (fromIndex < 0) {
+ fromIndex = 0;
+ }
+ fromIndex = Math.min(fromIndex, str.length());
+
+ if (searchStr.length() == 0) {
+ return fromIndex;
+ }
+
+ if (false == ignoreCase) {
+ // 涓嶅拷鐣ュぇ灏忓啓璋冪敤JDK鏂规硶
+ return str.toString().lastIndexOf(searchStr.toString(), fromIndex);
+ }
+
+ for (int i = fromIndex; i > 0; i--) {
+ if (isSubEquals(str, i, searchStr, 0, searchStr.length(), true)) {
+ return i;
+ }
+ }
+ return INDEX_NOT_FOUND;
+ }
+
+ /**
+ * 杩斿洖瀛楃涓� searchStr 鍦ㄥ瓧绗︿覆 str 涓 ordinal 娆″嚭鐜扮殑浣嶇疆銆�<br>
+ * 姝ゆ柟娉曟潵鑷細Apache-Commons-Lang
+ * <p>
+ * 鏍楀瓙锛�*浠h〃浠绘剰瀛楃锛夛細
+ *
+ * <pre>
+ * StringUtil.ordinalIndexOf(null, *, *) = -1
+ * StringUtil.ordinalIndexOf(*, null, *) = -1
+ * StringUtil.ordinalIndexOf("", "", *) = 0
+ * StringUtil.ordinalIndexOf("aabaabaa", "a", 1) = 0
+ * StringUtil.ordinalIndexOf("aabaabaa", "a", 2) = 1
+ * StringUtil.ordinalIndexOf("aabaabaa", "b", 1) = 2
+ * StringUtil.ordinalIndexOf("aabaabaa", "b", 2) = 5
+ * StringUtil.ordinalIndexOf("aabaabaa", "ab", 1) = 1
+ * StringUtil.ordinalIndexOf("aabaabaa", "ab", 2) = 4
+ * StringUtil.ordinalIndexOf("aabaabaa", "", 1) = 0
+ * StringUtil.ordinalIndexOf("aabaabaa", "", 2) = 0
+ * </pre>
+ *
+ * @param str 琚鏌ョ殑瀛楃涓诧紝鍙互涓簄ull
+ * @param searchStr 琚煡鎵剧殑瀛楃涓诧紝鍙互涓簄ull
+ * @param ordinal 绗嚑娆″嚭鐜扮殑浣嶇疆
+ * @return 鏌ユ壘鍒扮殑浣嶇疆
+ * @since 3.2.3
+ */
+ public static int ordinalIndexOf(String str, String searchStr, int ordinal) {
+ if (str == null || searchStr == null || ordinal <= 0) {
+ return INDEX_NOT_FOUND;
+ }
+ if (searchStr.length() == 0) {
+ return 0;
+ }
+ int found = 0;
+ int index = INDEX_NOT_FOUND;
+ do {
+ index = str.indexOf(searchStr, index + 1);
+ if (index < 0) {
+ return index;
+ }
+ found++;
+ } while (found < ordinal);
+ return index;
+ }
+
+ /**
+ * 鎴彇涓や釜瀛楃涓茬殑涓嶅悓閮ㄥ垎锛堥暱搴︿竴鑷达級锛屽垽鏂埅鍙栫殑瀛愪覆鏄惁鐩稿悓<br>
+ * 浠绘剰涓�涓瓧绗︿覆涓簄ull杩斿洖false
+ *
+ * @param str1 绗竴涓瓧绗︿覆
+ * @param start1 绗竴涓瓧绗︿覆寮�濮嬬殑浣嶇疆
+ * @param str2 绗簩涓瓧绗︿覆
+ * @param start2 绗簩涓瓧绗︿覆寮�濮嬬殑浣嶇疆
+ * @param length 鎴彇闀垮害
+ * @param ignoreCase 鏄惁蹇界暐澶у皬鍐�
+ * @return 瀛愪覆鏄惁鐩稿悓
+ * @since 3.2.1
+ */
+ public static boolean isSubEquals(CharSequence str1, int start1, CharSequence str2, int start2, int length, boolean ignoreCase) {
+ if (null == str1 || null == str2) {
+ return false;
+ }
+
+ return str1.toString().regionMatches(ignoreCase, start1, str2.toString(), start2, length);
+ }
+
+ /**
+ * 姣旇緝涓や釜瀛楃涓诧紙澶у皬鍐欐晱鎰燂級銆�
+ *
+ * <pre>
+ * equalsIgnoreCase(null, null) = true
+ * equalsIgnoreCase(null, "abc") = false
+ * equalsIgnoreCase("abc", null) = false
+ * equalsIgnoreCase("abc", "abc") = true
+ * equalsIgnoreCase("abc", "ABC") = true
+ * </pre>
+ *
+ * @param str1 瑕佹瘮杈冪殑瀛楃涓�1
+ * @param str2 瑕佹瘮杈冪殑瀛楃涓�2
+ * @return 濡傛灉涓や釜瀛楃涓茬浉鍚岋紝鎴栬�呴兘鏄�<code>null</code>锛屽垯杩斿洖<code>true</code>
+ */
+ public static boolean equals(CharSequence str1, CharSequence str2) {
+ return equals(str1, str2, false);
+ }
+
+ /**
+ * 姣旇緝涓や釜瀛楃涓诧紙澶у皬鍐欎笉鏁忔劅锛夈��
+ *
+ * <pre>
+ * equalsIgnoreCase(null, null) = true
+ * equalsIgnoreCase(null, "abc") = false
+ * equalsIgnoreCase("abc", null) = false
+ * equalsIgnoreCase("abc", "abc") = true
+ * equalsIgnoreCase("abc", "ABC") = true
+ * </pre>
+ *
+ * @param str1 瑕佹瘮杈冪殑瀛楃涓�1
+ * @param str2 瑕佹瘮杈冪殑瀛楃涓�2
+ * @return 濡傛灉涓や釜瀛楃涓茬浉鍚岋紝鎴栬�呴兘鏄�<code>null</code>锛屽垯杩斿洖<code>true</code>
+ */
+ public static boolean equalsIgnoreCase(CharSequence str1, CharSequence str2) {
+ return equals(str1, str2, true);
+ }
+
+ /**
+ * 姣旇緝涓や釜瀛楃涓叉槸鍚︾浉绛夈��
+ *
+ * @param str1 瑕佹瘮杈冪殑瀛楃涓�1
+ * @param str2 瑕佹瘮杈冪殑瀛楃涓�2
+ * @param ignoreCase 鏄惁蹇界暐澶у皬鍐�
+ * @return 濡傛灉涓や釜瀛楃涓茬浉鍚岋紝鎴栬�呴兘鏄�<code>null</code>锛屽垯杩斿洖<code>true</code>
+ * @since 3.2.0
+ */
+ public static boolean equals(CharSequence str1, CharSequence str2, boolean ignoreCase) {
+ if (null == str1) {
+ // 鍙湁涓や釜閮戒负null鎵嶅垽鏂浉绛�
+ return str2 == null;
+ }
+ if (null == str2) {
+ // 瀛楃涓�2绌猴紝瀛楃涓�1闈炵┖锛岀洿鎺alse
+ return false;
+ }
+
+ if (ignoreCase) {
+ return str1.toString().equalsIgnoreCase(str2.toString());
+ } else {
+ return str1.equals(str2);
+ }
+ }
+
+ /**
+ * 鍒涘缓StringBuilder瀵硅薄
+ *
+ * @return {String}Builder瀵硅薄
+ */
+ public static StringBuilder builder() {
+ return new StringBuilder();
+ }
+
+ /**
+ * 鍒涘缓StringBuilder瀵硅薄
+ *
+ * @param capacity 鍒濆澶у皬
+ * @return {String}Builder瀵硅薄
+ */
+ public static StringBuilder builder(int capacity) {
+ return new StringBuilder(capacity);
+ }
+
+ /**
+ * 鍒涘缓StringBuilder瀵硅薄
+ *
+ * @param strs 鍒濆瀛楃涓插垪琛�
+ * @return {String}Builder瀵硅薄
+ */
+ public static StringBuilder builder(CharSequence... strs) {
+ final StringBuilder sb = new StringBuilder();
+ for (CharSequence str : strs) {
+ sb.append(str);
+ }
+ return sb;
+ }
+
+ /**
+ * 鍒涘缓StringBuilder瀵硅薄
+ *
+ * @param sb 鍒濆StringBuilder
+ * @param strs 鍒濆瀛楃涓插垪琛�
+ * @return {String}Builder瀵硅薄
+ */
+ public static StringBuilder appendBuilder(StringBuilder sb, CharSequence... strs) {
+ for (CharSequence str : strs) {
+ sb.append(str);
+ }
+ return sb;
+ }
+
+ /**
+ * 鑾峰緱StringReader
+ *
+ * @param str 瀛楃涓�
+ * @return {String}Reader
+ */
+ public static StringReader getReader(CharSequence str) {
+ if (null == str) {
+ return null;
+ }
+ return new StringReader(str.toString());
+ }
+
+ /**
+ * 鑾峰緱StringWriter
+ *
+ * @return {String}Writer
+ */
+ public static StringWriter getWriter() {
+ return new StringWriter();
+ }
+
+ /**
+ * 缁熻鎸囧畾鍐呭涓寘鍚寚瀹氬瓧绗︿覆鐨勬暟閲�<br>
+ * 鍙傛暟涓� {@code null} 鎴栬�� "" 杩斿洖 {@code 0}.
+ *
+ * <pre>
+ * StringUtil.count(null, *) = 0
+ * StringUtil.count("", *) = 0
+ * StringUtil.count("abba", null) = 0
+ * StringUtil.count("abba", "") = 0
+ * StringUtil.count("abba", "a") = 2
+ * StringUtil.count("abba", "ab") = 1
+ * StringUtil.count("abba", "xxx") = 0
+ * </pre>
+ *
+ * @param content 琚煡鎵剧殑瀛楃涓�
+ * @param strForSearch 闇�瑕佹煡鎵剧殑瀛楃涓�
+ * @return 鏌ユ壘鍒扮殑涓暟
+ */
+ public static int count(CharSequence content, CharSequence strForSearch) {
+ if (Func.hasEmpty(content, strForSearch) || strForSearch.length() > content.length()) {
+ return 0;
+ }
+
+ int count = 0;
+ int idx = 0;
+ final String content2 = content.toString();
+ final String strForSearch2 = strForSearch.toString();
+ while ((idx = content2.indexOf(strForSearch2, idx)) > -1) {
+ count++;
+ idx += strForSearch.length();
+ }
+ return count;
+ }
+
+ /**
+ * 缁熻鎸囧畾鍐呭涓寘鍚寚瀹氬瓧绗︾殑鏁伴噺
+ *
+ * @param content 鍐呭
+ * @param charForSearch 琚粺璁$殑瀛楃
+ * @return 鍖呭惈鏁伴噺
+ */
+ public static int count(CharSequence content, char charForSearch) {
+ int count = 0;
+ if (isEmpty(content)) {
+ return 0;
+ }
+ int contentLength = content.length();
+ for (int i = 0; i < contentLength; i++) {
+ if (charForSearch == content.charAt(i)) {
+ count++;
+ }
+ }
+ return count;
+ }
+
+ /**
+ * 涓嬪垝绾胯浆椹煎嘲
+ *
+ * @param para 瀛楃涓�
+ * @return {String}
+ */
+ public static String underlineToHump(String para) {
+ if (isBlank(para)) {
+ return StringPool.EMPTY;
+ }
+ StringBuilder result = new StringBuilder();
+ String[] a = para.split("_");
+ for (String s : a) {
+ if (result.length() == 0) {
+ result.append(s.toLowerCase());
+ } else {
+ result.append(s.substring(0, 1).toUpperCase());
+ result.append(s.substring(1).toLowerCase());
+ }
+ }
+ return result.toString();
+ }
+
+ /**
+ * 椹煎嘲杞笅鍒掔嚎
+ *
+ * @param para 瀛楃涓�
+ * @return {String}
+ */
+ public static String humpToUnderline(String para) {
+ if (isBlank(para)) {
+ return StringPool.EMPTY;
+ }
+ para = firstCharToLower(para);
+ StringBuilder sb = new StringBuilder(para);
+ int temp = 0;
+ for (int i = 0; i < para.length(); i++) {
+ if (Character.isUpperCase(para.charAt(i))) {
+ sb.insert(i + temp, "_");
+ temp += 1;
+ }
+ }
+ return sb.toString().toLowerCase();
+ }
+
+ /**
+ * 妯嚎杞┘宄�
+ *
+ * @param para 瀛楃涓�
+ * @return {String}
+ */
+ public static String lineToHump(String para) {
+ if (isBlank(para)) {
+ return StringPool.EMPTY;
+ }
+ StringBuilder result = new StringBuilder();
+ String[] a = para.split("-");
+ for (String s : a) {
+ if (result.length() == 0) {
+ result.append(s.toLowerCase());
+ } else {
+ result.append(s.substring(0, 1).toUpperCase());
+ result.append(s.substring(1).toLowerCase());
+ }
+ }
+ return result.toString();
+ }
+
+ /**
+ * 椹煎嘲杞í绾�
+ *
+ * @param para 瀛楃涓�
+ * @return {String}
+ */
+ public static String humpToLine(String para) {
+ if (isBlank(para)) {
+ return StringPool.EMPTY;
+ }
+ para = firstCharToLower(para);
+ StringBuilder sb = new StringBuilder(para);
+ int temp = 0;
+ for (int i = 0; i < para.length(); i++) {
+ if (Character.isUpperCase(para.charAt(i))) {
+ sb.insert(i + temp, "-");
+ temp += 1;
+ }
+ }
+ return sb.toString().toLowerCase();
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Unchecked.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Unchecked.java
new file mode 100644
index 0000000..737b21f
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/Unchecked.java
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util;
+
+import com.vci.web.util.function.*;
+import java.util.Comparator;
+import java.util.Objects;
+import java.util.concurrent.Callable;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+/**
+ * Lambda 鍙楁寮傚父澶勭悊
+ *
+ * <p>
+ * https://segmentfault.com/a/1190000007832130
+ * https://github.com/jOOQ/jOOL
+ * </p>
+ *
+ * @author L.cm
+ */
+public class Unchecked {
+
+ public static <T, R> Function<T, R> function(CheckedFunction<T, R> mapper) {
+ Objects.requireNonNull(mapper);
+ return t -> {
+ try {
+ return mapper.apply(t);
+ } catch (Throwable e) {
+ throw Exceptions.unchecked(e);
+ }
+ };
+ }
+
+ public static <T> Consumer<T> consumer(CheckedConsumer<T> mapper) {
+ Objects.requireNonNull(mapper);
+ return t -> {
+ try {
+ mapper.accept(t);
+ } catch (Throwable e) {
+ throw Exceptions.unchecked(e);
+ }
+ };
+ }
+
+ public static <T> Supplier<T> supplier(CheckedSupplier<T> mapper) {
+ Objects.requireNonNull(mapper);
+ return () -> {
+ try {
+ return mapper.get();
+ } catch (Throwable e) {
+ throw Exceptions.unchecked(e);
+ }
+ };
+ }
+
+ public static Runnable runnable(CheckedRunnable runnable) {
+ Objects.requireNonNull(runnable);
+ return () -> {
+ try {
+ runnable.run();
+ } catch (Throwable e) {
+ throw Exceptions.unchecked(e);
+ }
+ };
+ }
+
+ public static <T> Callable<T> callable(CheckedCallable<T> callable) {
+ Objects.requireNonNull(callable);
+ return () -> {
+ try {
+ return callable.call();
+ } catch (Throwable e) {
+ throw Exceptions.unchecked(e);
+ }
+ };
+ }
+
+ public static <T> Comparator<T> comparator(CheckedComparator<T> comparator) {
+ Objects.requireNonNull(comparator);
+ return (T o1, T o2) -> {
+ try {
+ return comparator.compare(o1, o2);
+ } catch (Throwable e) {
+ throw Exceptions.unchecked(e);
+ }
+ };
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/UrlUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/UrlUtil.java
new file mode 100644
index 0000000..6ee51f2
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/UrlUtil.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+package com.vci.web.util;
+
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.nio.charset.Charset;
+
+/**
+ * url澶勭悊宸ュ叿绫�
+ *
+ * @author L.cm
+ */
+public class UrlUtil extends org.springframework.web.util.UriUtils {
+
+ /**
+ * url 缂栫爜
+ *
+ * @param source source
+ * @return sourced String
+ */
+ public static String encode(String source) {
+ return UrlUtil.encode(source, Charsets.UTF_8);
+ }
+
+ /**
+ * url 瑙g爜
+ *
+ * @param source source
+ * @return decoded String
+ */
+ public static String decode(String source) {
+ return UrlUtil.decode(source, Charsets.UTF_8);
+ }
+
+ /**
+ * url 缂栫爜
+ *
+ * @param source url
+ * @param charset 瀛楃闆�
+ * @return 缂栫爜鍚庣殑url
+ */
+ @Deprecated
+ public static String encodeURL(String source, Charset charset) {
+ return UrlUtil.encode(source, charset.name());
+ }
+
+ /**
+ * url 瑙g爜
+ *
+ * @param source url
+ * @param charset 瀛楃闆�
+ * @return 瑙g爜url
+ */
+ @Deprecated
+ public static String decodeURL(String source, Charset charset) {
+ return UrlUtil.decode(source, charset.name());
+ }
+
+ /**
+ * 鑾峰彇url璺緞
+ *
+ * @param uriStr 璺緞
+ * @return url璺緞
+ */
+ public static String getPath(String uriStr) {
+ URI uri;
+
+ try {
+ uri = new URI(uriStr);
+ } catch (URISyntaxException var3) {
+ throw new RuntimeException(var3);
+ }
+
+ return uri.getPath();
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BeanProperty.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BeanProperty.java
new file mode 100644
index 0000000..e19bbf5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BeanProperty.java
@@ -0,0 +1,16 @@
+package com.vci.web.util.beans;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * Bean灞炴��
+ *
+ * @author Chill
+ */
+@Getter
+@AllArgsConstructor
+public class BeanProperty {
+ private final String name;
+ private final Class<?> type;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanCopier.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanCopier.java
new file mode 100644
index 0000000..d71fbf7
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanCopier.java
@@ -0,0 +1,404 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util.beans;
+
+import com.vci.web.util.BeanUtil;
+import com.vci.web.util.ClassUtil;
+import com.vci.web.util.ReflectUtil;
+import com.vci.web.util.StringUtil;
+import org.springframework.asm.ClassVisitor;
+import org.springframework.asm.Label;
+import org.springframework.asm.Opcodes;
+import org.springframework.asm.Type;
+import org.springframework.cglib.core.*;
+import org.springframework.lang.Nullable;
+import org.springframework.util.ClassUtils;
+
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.security.ProtectionDomain;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * spring cglib 榄旀敼
+ *
+ * <p>
+ * 1. 鏀寔閾惧紡 bean锛屾敮鎸� map
+ * 2. ClassLoader 璺� target 淇濇寔涓�鑷�
+ * </p>
+ *
+ * @author L.cm
+ */
+public abstract class BladeBeanCopier {
+ private static final Type CONVERTER = TypeUtils.parseType("org.springframework.cglib.core.Converter");
+ private static final Type BEAN_COPIER = TypeUtils.parseType(BladeBeanCopier.class.getName());
+ private static final Type BEAN_MAP = TypeUtils.parseType(Map.class.getName());
+ private static final Signature COPY = new Signature("copy", Type.VOID_TYPE, new Type[]{Constants.TYPE_OBJECT, Constants.TYPE_OBJECT, CONVERTER});
+ private static final Signature CONVERT = TypeUtils.parseSignature("Object convert(Object, Class, Object)");
+ private static final Signature BEAN_MAP_GET = TypeUtils.parseSignature("Object get(Object)");
+ private static final Type CLASS_UTILS = TypeUtils.parseType(ClassUtils.class.getName());
+ private static final Signature IS_ASSIGNABLE_VALUE = TypeUtils.parseSignature("boolean isAssignableValue(Class, Object)");
+ /**
+ * The map to store {@link BladeBeanCopier} of source type and class type for copy.
+ */
+ private static final ConcurrentMap<BladeBeanCopierKey, BladeBeanCopier> BEAN_COPIER_MAP = new ConcurrentHashMap<>();
+
+ public static BladeBeanCopier create(Class source, Class target, boolean useConverter) {
+ return BladeBeanCopier.create(source, target, useConverter, false);
+ }
+
+ public static BladeBeanCopier create(Class source, Class target, boolean useConverter, boolean nonNull) {
+ BladeBeanCopierKey copierKey = new BladeBeanCopierKey(source, target, useConverter, nonNull);
+ // 鍒╃敤 ConcurrentMap 缂撳瓨 鎻愰珮鎬ц兘锛屾帴杩� 鐩存帴 get set
+ return BEAN_COPIER_MAP.computeIfAbsent(copierKey, key -> {
+ Generator gen = new Generator();
+ gen.setSource(key.getSource());
+ gen.setTarget(key.getTarget());
+ gen.setUseConverter(key.isUseConverter());
+ gen.setNonNull(key.isNonNull());
+ return gen.create(key);
+ });
+ }
+
+ /**
+ * Bean copy
+ *
+ * @param from from Bean
+ * @param to to Bean
+ * @param converter Converter
+ */
+ abstract public void copy(Object from, Object to, @Nullable Converter converter);
+
+ public static class Generator extends AbstractClassGenerator {
+ private static final Source SOURCE = new Source(BladeBeanCopier.class.getName());
+ private Class source;
+ private Class target;
+ private boolean useConverter;
+ private boolean nonNull;
+
+ Generator() {
+ super(SOURCE);
+ }
+
+ public void setSource(Class source) {
+ if (!Modifier.isPublic(source.getModifiers())) {
+ setNamePrefix(source.getName());
+ }
+ this.source = source;
+ }
+
+ public void setTarget(Class target) {
+ if (!Modifier.isPublic(target.getModifiers())) {
+ setNamePrefix(target.getName());
+ }
+ this.target = target;
+ }
+
+ public void setUseConverter(boolean useConverter) {
+ this.useConverter = useConverter;
+ }
+
+ public void setNonNull(boolean nonNull) {
+ this.nonNull = nonNull;
+ }
+
+ @Override
+ protected ClassLoader getDefaultClassLoader() {
+ // L.cm 淇濊瘉 鍜� 杩斿洖浣跨敤鍚屼竴涓� ClassLoader
+ return target.getClassLoader();
+ }
+
+ @Override
+ protected ProtectionDomain getProtectionDomain() {
+ return ReflectUtils.getProtectionDomain(source);
+ }
+
+ @Override
+ public BladeBeanCopier create(Object key) {
+ return (BladeBeanCopier) super.create(key);
+ }
+
+ @Override
+ public void generateClass(ClassVisitor v) {
+ Type sourceType = Type.getType(source);
+ Type targetType = Type.getType(target);
+ ClassEmitter ce = new ClassEmitter(v);
+ ce.begin_class(Constants.V1_2,
+ Constants.ACC_PUBLIC,
+ getClassName(),
+ BEAN_COPIER,
+ null,
+ Constants.SOURCE_FILE);
+
+ EmitUtils.null_constructor(ce);
+ CodeEmitter e = ce.begin_method(Constants.ACC_PUBLIC, COPY, null);
+
+ // map 鍗曠嫭澶勭悊
+ if (Map.class.isAssignableFrom(source)) {
+ generateClassFormMap(ce, e, sourceType, targetType);
+ return;
+ }
+
+ // 2018.12.27 by L.cm 鏀寔閾惧紡 bean
+ // 娉ㄦ剰锛氭澶勯渶鍏煎閾惧紡bean 浣跨敤浜� spring 鐨勬柟娉曪紝姣旇緝鑰楁椂
+ PropertyDescriptor[] getters = ReflectUtil.getBeanGetters(source);
+ PropertyDescriptor[] setters = ReflectUtil.getBeanSetters(target);
+ Map<String, PropertyDescriptor> names = new HashMap<>(16);
+ for (PropertyDescriptor getter : getters) {
+ names.put(getter.getName(), getter);
+ }
+
+ Local targetLocal = e.make_local();
+ Local sourceLocal = e.make_local();
+ e.load_arg(1);
+ e.checkcast(targetType);
+ e.store_local(targetLocal);
+ e.load_arg(0);
+ e.checkcast(sourceType);
+ e.store_local(sourceLocal);
+
+ for (PropertyDescriptor setter : setters) {
+ String propName = setter.getName();
+
+ CopyProperty targetIgnoreCopy = ReflectUtil.getAnnotation(target, propName, CopyProperty.class);
+ // set 涓婃湁蹇界暐鐨� 娉ㄨВ
+ if (targetIgnoreCopy != null) {
+ if (targetIgnoreCopy.ignore()) {
+ continue;
+ }
+ // 娉ㄨВ涓婄殑鍒悕锛屽鏋滃埆鍚嶄笉涓虹┖锛屼娇鐢ㄥ埆鍚�
+ String aliasTargetPropName = targetIgnoreCopy.value();
+ if (StringUtil.isNotBlank(aliasTargetPropName)) {
+ propName = aliasTargetPropName;
+ }
+ }
+ // 鎵惧埌瀵瑰簲鐨� get
+ PropertyDescriptor getter = names.get(propName);
+ // 娌℃湁 get 璺冲嚭
+ if (getter == null) {
+ continue;
+ }
+
+ MethodInfo read = ReflectUtils.getMethodInfo(getter.getReadMethod());
+ Method writeMethod = setter.getWriteMethod();
+ MethodInfo write = ReflectUtils.getMethodInfo(writeMethod);
+ Type returnType = read.getSignature().getReturnType();
+ Type setterType = write.getSignature().getArgumentTypes()[0];
+ Class<?> getterPropertyType = getter.getPropertyType();
+ Class<?> setterPropertyType = setter.getPropertyType();
+
+ // L.cm 2019.01.12 浼樺寲閫昏緫锛屽厛鍒ゆ柇绫诲瀷锛岀被鍨嬩竴鑷寸洿鎺� set锛屼笉鍚屽啀鍒ゆ柇 鏄惁 绫诲瀷杞崲
+ // nonNull Label
+ Label l0 = e.make_label();
+ // 鍒ゆ柇绫诲瀷鏄惁涓�鑷达紝鍖呮嫭 鍖呰绫诲瀷
+ if (ClassUtil.isAssignable(setterPropertyType, getterPropertyType)) {
+ // 2018.12.27 by L.cm 鏀寔閾惧紡 bean
+ e.load_local(targetLocal);
+ e.load_local(sourceLocal);
+ e.invoke(read);
+ boolean getterIsPrimitive = getterPropertyType.isPrimitive();
+ boolean setterIsPrimitive = setterPropertyType.isPrimitive();
+
+ if (nonNull) {
+ // 闇�瑕佽惤鏍堬紝寮哄埗瑁呯
+ e.box(returnType);
+ Local var = e.make_local();
+ e.store_local(var);
+ e.load_local(var);
+ // nonNull Label
+ e.ifnull(l0);
+ e.load_local(targetLocal);
+ e.load_local(var);
+ // 闇�瑕佽惤鏍堬紝寮哄埗鎷嗙
+ e.unbox_or_zero(setterType);
+ } else {
+ // 濡傛灉 get 涓哄師濮嬬被鍨嬶紝闇�瑕佽绠�
+ if (getterIsPrimitive && !setterIsPrimitive) {
+ e.box(returnType);
+ }
+ // 濡傛灉 set 涓哄師濮嬬被鍨嬶紝闇�瑕佹媶绠�
+ if (!getterIsPrimitive && setterIsPrimitive) {
+ e.unbox_or_zero(setterType);
+ }
+ }
+
+ // 鏋勯�� set 鏂规硶
+ invokeWrite(e, write, writeMethod, nonNull, l0);
+ } else if (useConverter) {
+ e.load_local(targetLocal);
+ e.load_arg(2);
+ e.load_local(sourceLocal);
+ e.invoke(read);
+ e.box(returnType);
+
+ if (nonNull) {
+ Local var = e.make_local();
+ e.store_local(var);
+ e.load_local(var);
+ e.ifnull(l0);
+ e.load_local(targetLocal);
+ e.load_arg(2);
+ e.load_local(var);
+ }
+
+ EmitUtils.load_class(e, setterType);
+ // 鏇存敼鎴愪簡灞炴�у悕锛屼箣鍓嶆槸 set 鏂规硶鍚�
+ e.push(propName);
+ e.invoke_interface(CONVERTER, CONVERT);
+ e.unbox_or_zero(setterType);
+
+ // 鏋勯�� set 鏂规硶
+ invokeWrite(e, write, writeMethod, nonNull, l0);
+ }
+ }
+ e.return_value();
+ e.end_method();
+ ce.end_class();
+ }
+
+ private static void invokeWrite(CodeEmitter e, MethodInfo write, Method writeMethod, boolean nonNull, Label l0) {
+ // 杩斿洖鍊硷紝鍒ゆ柇 閾惧紡 bean
+ Class<?> returnType = writeMethod.getReturnType();
+ e.invoke(write);
+ // 閾惧紡 bean锛屾湁杩斿洖鍊奸渶瑕� pop
+ if (!returnType.equals(Void.TYPE)) {
+ e.pop();
+ }
+ if (nonNull) {
+ e.visitLabel(l0);
+ }
+ }
+
+ @Override
+ protected Object firstInstance(Class type) {
+ return BeanUtil.newInstance(type);
+ }
+
+ @Override
+ protected Object nextInstance(Object instance) {
+ return instance;
+ }
+
+ /**
+ * 澶勭悊 map 鐨� copy
+ * @param ce ClassEmitter
+ * @param e CodeEmitter
+ * @param sourceType sourceType
+ * @param targetType targetType
+ */
+ public void generateClassFormMap(ClassEmitter ce, CodeEmitter e, Type sourceType, Type targetType) {
+ // 2018.12.27 by L.cm 鏀寔閾惧紡 bean
+ PropertyDescriptor[] setters = ReflectUtil.getBeanSetters(target);
+
+ // 鍏ュ彛鍙橀噺
+ Local targetLocal = e.make_local();
+ Local sourceLocal = e.make_local();
+ e.load_arg(1);
+ e.checkcast(targetType);
+ e.store_local(targetLocal);
+ e.load_arg(0);
+ e.checkcast(sourceType);
+ e.store_local(sourceLocal);
+ Type mapBox = Type.getType(Object.class);
+
+ for (PropertyDescriptor setter : setters) {
+ String propName = setter.getName();
+
+ // set 涓婃湁蹇界暐鐨� 娉ㄨВ
+ CopyProperty targetIgnoreCopy = ReflectUtil.getAnnotation(target, propName, CopyProperty.class);
+ if (targetIgnoreCopy != null) {
+ if (targetIgnoreCopy.ignore()) {
+ continue;
+ }
+ // 娉ㄨВ涓婄殑鍒悕
+ String aliasTargetPropName = targetIgnoreCopy.value();
+ if (StringUtil.isNotBlank(aliasTargetPropName)) {
+ propName = aliasTargetPropName;
+ }
+ }
+
+ Method writeMethod = setter.getWriteMethod();
+ MethodInfo write = ReflectUtils.getMethodInfo(writeMethod);
+ Type setterType = write.getSignature().getArgumentTypes()[0];
+
+ e.load_local(targetLocal);
+ e.load_local(sourceLocal);
+
+ e.push(propName);
+ // 鎵ц map get
+ e.invoke_interface(BEAN_MAP, BEAN_MAP_GET);
+ // box 瑁呯锛岄伩鍏� array[] 鏁扮粍闂
+ e.box(mapBox);
+
+ // 鐢熸垚鍙橀噺
+ Local var = e.make_local();
+ e.store_local(var);
+ e.load_local(var);
+
+ // 鍏堝垽鏂� 涓嶄负null锛岀劧鍚庡仛绫诲瀷鍒ゆ柇
+ Label l0 = e.make_label();
+ e.ifnull(l0);
+ EmitUtils.load_class(e, setterType);
+ e.load_local(var);
+ // ClassUtils.isAssignableValue(Integer.class, id)
+ e.invoke_static(CLASS_UTILS, IS_ASSIGNABLE_VALUE);
+ Label l1 = new Label();
+ // 杩斿洖鍊硷紝鍒ゆ柇 閾惧紡 bean
+ Class<?> returnType = writeMethod.getReturnType();
+ if (useConverter) {
+ e.if_jump(Opcodes.IFEQ, l1);
+ e.load_local(targetLocal);
+ e.load_local(var);
+ e.unbox_or_zero(setterType);
+ e.invoke(write);
+ if (!returnType.equals(Void.TYPE)) {
+ e.pop();
+ }
+ e.goTo(l0);
+ e.visitLabel(l1);
+ e.load_local(targetLocal);
+ e.load_arg(2);
+ e.load_local(var);
+ EmitUtils.load_class(e, setterType);
+ e.push(propName);
+ e.invoke_interface(CONVERTER, CONVERT);
+ e.unbox_or_zero(setterType);
+ e.invoke(write);
+ } else {
+ e.if_jump(Opcodes.IFEQ, l0);
+ e.load_local(targetLocal);
+ e.load_local(var);
+ e.unbox_or_zero(setterType);
+ e.invoke(write);
+ }
+ // 杩斿洖鍊硷紝鍒ゆ柇 閾惧紡 bean
+ if (!returnType.equals(Void.TYPE)) {
+ e.pop();
+ }
+ e.visitLabel(l0);
+ }
+ e.return_value();
+ e.end_method();
+ ce.end_class();
+ }
+ }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanCopierKey.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanCopierKey.java
new file mode 100644
index 0000000..9b96826
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanCopierKey.java
@@ -0,0 +1,20 @@
+package com.vci.web.util.beans;
+
+import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+
+/**
+ * copy key
+ *
+ * @author L.cm
+ */
+@Getter
+@EqualsAndHashCode
+@AllArgsConstructor
+public class BladeBeanCopierKey {
+ private final Class<?> source;
+ private final Class<?> target;
+ private final boolean useConverter;
+ private final boolean nonNull;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMap.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMap.java
new file mode 100644
index 0000000..aa35969
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMap.java
@@ -0,0 +1,125 @@
+package com.vci.web.util.beans;
+
+import org.springframework.asm.ClassVisitor;
+import org.springframework.cglib.beans.BeanMap;
+import org.springframework.cglib.core.AbstractClassGenerator;
+import org.springframework.cglib.core.ReflectUtils;
+
+import java.security.ProtectionDomain;
+
+/**
+ * 閲嶅啓 cglib BeanMap锛屾敮鎸侀摼寮廱ean
+ *
+ * @author L.cm
+ */
+public abstract class BladeBeanMap extends BeanMap {
+ protected BladeBeanMap() {
+ }
+
+ protected BladeBeanMap(Object bean) {
+ super(bean);
+ }
+
+ public static BladeBeanMap create(Object bean) {
+ BladeGenerator gen = new BladeGenerator();
+ gen.setBean(bean);
+ return gen.create();
+ }
+
+ /**
+ * newInstance
+ *
+ * @param o Object
+ * @return BladeBeanMap
+ */
+ @Override
+ public abstract BladeBeanMap newInstance(Object o);
+
+ public static class BladeGenerator extends AbstractClassGenerator {
+ private static final Source SOURCE = new Source(BladeBeanMap.class.getName());
+
+ private Object bean;
+ private Class beanClass;
+ private int require;
+
+ public BladeGenerator() {
+ super(SOURCE);
+ }
+
+ /**
+ * Set the bean that the generated map should reflect. The bean may be swapped
+ * out for another bean of the same type using {@link #setBean}.
+ * Calling this method overrides any value previously set using {@link #setBeanClass}.
+ * You must call either this method or {@link #setBeanClass} before {@link #create}.
+ *
+ * @param bean the initial bean
+ */
+ public void setBean(Object bean) {
+ this.bean = bean;
+ if (bean != null) {
+ beanClass = bean.getClass();
+ }
+ }
+
+ /**
+ * Set the class of the bean that the generated map should support.
+ * You must call either this method or {@link #setBeanClass} before {@link #create}.
+ *
+ * @param beanClass the class of the bean
+ */
+ public void setBeanClass(Class beanClass) {
+ this.beanClass = beanClass;
+ }
+
+ /**
+ * Limit the properties reflected by the generated map.
+ *
+ * @param require any combination of {@link #REQUIRE_GETTER} and
+ * {@link #REQUIRE_SETTER}; default is zero (any property allowed)
+ */
+ public void setRequire(int require) {
+ this.require = require;
+ }
+
+ @Override
+ protected ClassLoader getDefaultClassLoader() {
+ return beanClass.getClassLoader();
+ }
+
+ @Override
+ protected ProtectionDomain getProtectionDomain() {
+ return ReflectUtils.getProtectionDomain(beanClass);
+ }
+
+ /**
+ * Create a new instance of the <code>BeanMap</code>. An existing
+ * generated class will be reused if possible.
+ *
+ * @return {BladeBeanMap}
+ */
+ public BladeBeanMap create() {
+ if (beanClass == null) {
+ throw new IllegalArgumentException("Class of bean unknown");
+ }
+ setNamePrefix(beanClass.getName());
+ BladeBeanMapKey key = new BladeBeanMapKey(beanClass, require);
+ return (BladeBeanMap) super.create(key);
+ }
+
+ @Override
+ public void generateClass(ClassVisitor v) throws Exception {
+ new BladeBeanMapEmitter(v, getClassName(), beanClass, require);
+ }
+
+ @Override
+ protected Object firstInstance(Class type) {
+ return ((BeanMap) ReflectUtils.newInstance(type)).newInstance(bean);
+ }
+
+ @Override
+ protected Object nextInstance(Object instance) {
+ return ((BeanMap) instance).newInstance(bean);
+ }
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMapEmitter.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMapEmitter.java
new file mode 100644
index 0000000..915edb5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMapEmitter.java
@@ -0,0 +1,192 @@
+package com.vci.web.util.beans;
+
+import com.vci.web.util.ReflectUtil;
+import org.springframework.asm.ClassVisitor;
+import org.springframework.asm.Label;
+import org.springframework.asm.Type;
+import org.springframework.cglib.core.*;
+
+import java.beans.PropertyDescriptor;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+
+/**
+ * 閲嶅啓 cglib BeanMap 澶勭悊鍣�
+ *
+ * @author L.cm
+ */
+class BladeBeanMapEmitter extends ClassEmitter {
+ private static final Type BEAN_MAP = TypeUtils.parseType(BladeBeanMap.class.getName());
+ private static final Type FIXED_KEY_SET = TypeUtils.parseType("org.springframework.cglib.beans.FixedKeySet");
+ private static final Signature CSTRUCT_OBJECT = TypeUtils.parseConstructor("Object");
+ private static final Signature CSTRUCT_STRING_ARRAY = TypeUtils.parseConstructor("String[]");
+ private static final Signature BEAN_MAP_GET = TypeUtils.parseSignature("Object get(Object, Object)");
+ private static final Signature BEAN_MAP_PUT = TypeUtils.parseSignature("Object put(Object, Object, Object)");
+ private static final Signature KEY_SET = TypeUtils.parseSignature("java.util.Set keySet()");
+ private static final Signature NEW_INSTANCE = new Signature("newInstance", BEAN_MAP, new Type[]{Constants.TYPE_OBJECT});
+ private static final Signature GET_PROPERTY_TYPE = TypeUtils.parseSignature("Class getPropertyType(String)");
+
+ public BladeBeanMapEmitter(ClassVisitor v, String className, Class type, int require) {
+ super(v);
+
+ begin_class(Constants.V1_2, Constants.ACC_PUBLIC, className, BEAN_MAP, null, Constants.SOURCE_FILE);
+ EmitUtils.null_constructor(this);
+ EmitUtils.factory_method(this, NEW_INSTANCE);
+ generateConstructor();
+
+ Map<String, PropertyDescriptor> getters = makePropertyMap(ReflectUtil.getBeanGetters(type));
+ Map<String, PropertyDescriptor> setters = makePropertyMap(ReflectUtil.getBeanSetters(type));
+ Map<String, PropertyDescriptor> allProps = new HashMap<>(32);
+ allProps.putAll(getters);
+ allProps.putAll(setters);
+
+ if (require != 0) {
+ for (Iterator it = allProps.keySet().iterator(); it.hasNext(); ) {
+ String name = (String) it.next();
+ if ((((require & BladeBeanMap.REQUIRE_GETTER) != 0) && !getters.containsKey(name)) ||
+ (((require & BladeBeanMap.REQUIRE_SETTER) != 0) && !setters.containsKey(name))) {
+ it.remove();
+ getters.remove(name);
+ setters.remove(name);
+ }
+ }
+ }
+ generateGet(type, getters);
+ generatePut(type, setters);
+
+ String[] allNames = getNames(allProps);
+ generateKeySet(allNames);
+ generateGetPropertyType(allProps, allNames);
+ end_class();
+ }
+
+ private Map<String, PropertyDescriptor> makePropertyMap(PropertyDescriptor[] props) {
+ Map<String, PropertyDescriptor> names = new HashMap<>(16);
+ for (PropertyDescriptor prop : props) {
+ String propName = prop.getName();
+ // 杩囨护 getClass锛孲pring 鐨勫伐鍏风被浼氭嬁鍒拌鏂规硶
+ if (!"class".equals(propName)) {
+ names.put(propName, prop);
+ }
+ }
+ return names;
+ }
+
+ private String[] getNames(Map<String, PropertyDescriptor> propertyMap) {
+ return propertyMap.keySet().toArray(new String[0]);
+ }
+
+ private void generateConstructor() {
+ CodeEmitter e = begin_method(Constants.ACC_PUBLIC, CSTRUCT_OBJECT, null);
+ e.load_this();
+ e.load_arg(0);
+ e.super_invoke_constructor(CSTRUCT_OBJECT);
+ e.return_value();
+ e.end_method();
+ }
+
+ private void generateGet(Class type, final Map<String, PropertyDescriptor> getters) {
+ final CodeEmitter e = begin_method(Constants.ACC_PUBLIC, BEAN_MAP_GET, null);
+ e.load_arg(0);
+ e.checkcast(Type.getType(type));
+ e.load_arg(1);
+ e.checkcast(Constants.TYPE_STRING);
+ EmitUtils.string_switch(e, getNames(getters), Constants.SWITCH_STYLE_HASH, new ObjectSwitchCallback() {
+ @Override
+ public void processCase(Object key, Label end) {
+ PropertyDescriptor pd = getters.get(key);
+ MethodInfo method = ReflectUtils.getMethodInfo(pd.getReadMethod());
+ e.invoke(method);
+ e.box(method.getSignature().getReturnType());
+ e.return_value();
+ }
+
+ @Override
+ public void processDefault() {
+ e.aconst_null();
+ e.return_value();
+ }
+ });
+ e.end_method();
+ }
+
+ private void generatePut(Class type, final Map<String, PropertyDescriptor> setters) {
+ final CodeEmitter e = begin_method(Constants.ACC_PUBLIC, BEAN_MAP_PUT, null);
+ e.load_arg(0);
+ e.checkcast(Type.getType(type));
+ e.load_arg(1);
+ e.checkcast(Constants.TYPE_STRING);
+ EmitUtils.string_switch(e, getNames(setters), Constants.SWITCH_STYLE_HASH, new ObjectSwitchCallback() {
+ @Override
+ public void processCase(Object key, Label end) {
+ PropertyDescriptor pd = setters.get(key);
+ if (pd.getReadMethod() == null) {
+ e.aconst_null();
+ } else {
+ MethodInfo read = ReflectUtils.getMethodInfo(pd.getReadMethod());
+ e.dup();
+ e.invoke(read);
+ e.box(read.getSignature().getReturnType());
+ }
+ // move old value behind bean
+ e.swap();
+ // new value
+ e.load_arg(2);
+ MethodInfo write = ReflectUtils.getMethodInfo(pd.getWriteMethod());
+ e.unbox(write.getSignature().getArgumentTypes()[0]);
+ e.invoke(write);
+ e.return_value();
+ }
+
+ @Override
+ public void processDefault() {
+ // fall-through
+ }
+ });
+ e.aconst_null();
+ e.return_value();
+ e.end_method();
+ }
+
+ private void generateKeySet(String[] allNames) {
+ // static initializer
+ declare_field(Constants.ACC_STATIC | Constants.ACC_PRIVATE, "keys", FIXED_KEY_SET, null);
+
+ CodeEmitter e = begin_static();
+ e.new_instance(FIXED_KEY_SET);
+ e.dup();
+ EmitUtils.push_array(e, allNames);
+ e.invoke_constructor(FIXED_KEY_SET, CSTRUCT_STRING_ARRAY);
+ e.putfield("keys");
+ e.return_value();
+ e.end_method();
+
+ // keySet
+ e = begin_method(Constants.ACC_PUBLIC, KEY_SET, null);
+ e.load_this();
+ e.getfield("keys");
+ e.return_value();
+ e.end_method();
+ }
+
+ private void generateGetPropertyType(final Map allProps, String[] allNames) {
+ final CodeEmitter e = begin_method(Constants.ACC_PUBLIC, GET_PROPERTY_TYPE, null);
+ e.load_arg(0);
+ EmitUtils.string_switch(e, allNames, Constants.SWITCH_STYLE_HASH, new ObjectSwitchCallback() {
+ @Override
+ public void processCase(Object key, Label end) {
+ PropertyDescriptor pd = (PropertyDescriptor) allProps.get(key);
+ EmitUtils.load_class(e, Type.getType(pd.getPropertyType()));
+ e.return_value();
+ }
+
+ @Override
+ public void processDefault() {
+ e.aconst_null();
+ e.return_value();
+ }
+ });
+ e.end_method();
+ }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMapKey.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMapKey.java
new file mode 100644
index 0000000..e015ae4
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/BladeBeanMapKey.java
@@ -0,0 +1,16 @@
+package com.vci.web.util.beans;
+
+import lombok.AllArgsConstructor;
+import lombok.EqualsAndHashCode;
+
+/**
+ * bean map key锛屾彁楂樻�ц兘
+ *
+ * @author L.cm
+ */
+@EqualsAndHashCode
+@AllArgsConstructor
+public class BladeBeanMapKey {
+ private final Class type;
+ private final int require;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/CopyProperty.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/CopyProperty.java
new file mode 100644
index 0000000..d387f01
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/beans/CopyProperty.java
@@ -0,0 +1,26 @@
+package com.vci.web.util.beans;
+
+import java.lang.annotation.*;
+
+/**
+ * copy 瀛楁 閰嶇疆
+ *
+ * @author L.cm
+ */
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface CopyProperty {
+
+ /**
+ * 灞炴�у悕锛岀敤浜庢寚瀹氬埆鍚嶏紝榛樿浣跨敤锛歠ield name
+ * @return 灞炴�у悕
+ */
+ String value() default "";
+
+ /**
+ * 蹇界暐锛氶粯璁や负 false
+ * @return 鏄惁蹇界暐
+ */
+ boolean ignore() default false;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/BladeConversionService.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/BladeConversionService.java
new file mode 100644
index 0000000..3540be5
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/BladeConversionService.java
@@ -0,0 +1,51 @@
+package com.vci.web.util.convert;
+
+import com.vci.web.util.convert.EnumToStringConverter;
+import org.springframework.boot.convert.ApplicationConversionService;
+import org.springframework.core.convert.support.GenericConversionService;
+import org.springframework.lang.Nullable;
+import org.springframework.util.StringValueResolver;
+
+/**
+ * 绫诲瀷 杞崲 鏈嶅姟锛屾坊鍔犱簡 IEnum 杞崲
+ *
+ * @author L.cm
+ */
+public class BladeConversionService extends ApplicationConversionService {
+ @Nullable
+ private static volatile BladeConversionService SHARED_INSTANCE;
+
+ public BladeConversionService() {
+ this(null);
+ }
+
+ public BladeConversionService(@Nullable StringValueResolver embeddedValueResolver) {
+ super(embeddedValueResolver);
+ super.addConverter(new EnumToStringConverter());
+ super.addConverter(new StringToEnumConverter());
+ }
+
+ /**
+ * Return a shared default application {@code ConversionService} instance, lazily
+ * building it once needed.
+ * <p>
+ * Note: This method actually returns an {@link BladeConversionService}
+ * instance. However, the {@code ConversionService} signature has been preserved for
+ * binary compatibility.
+ * @return the shared {@code BladeConversionService} instance (never{@code null})
+ */
+ public static GenericConversionService getInstance() {
+ BladeConversionService sharedInstance = BladeConversionService.SHARED_INSTANCE;
+ if (sharedInstance == null) {
+ synchronized (BladeConversionService.class) {
+ sharedInstance = BladeConversionService.SHARED_INSTANCE;
+ if (sharedInstance == null) {
+ sharedInstance = new BladeConversionService();
+ BladeConversionService.SHARED_INSTANCE = sharedInstance;
+ }
+ }
+ }
+ return sharedInstance;
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/BladeConverter.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/BladeConverter.java
new file mode 100644
index 0000000..978214a
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/BladeConverter.java
@@ -0,0 +1,77 @@
+package com.vci.web.util.convert;
+
+import com.vci.web.util.ClassUtil;
+import com.vci.web.util.ConvertUtil;
+import com.vci.web.util.ReflectUtil;
+import com.vci.web.util.Unchecked;
+import com.vci.web.util.function.CheckedFunction;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cglib.core.Converter;
+import org.springframework.core.convert.TypeDescriptor;
+import org.springframework.lang.Nullable;
+
+import java.lang.reflect.Field;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * 缁勫悎 spring cglib Converter 鍜� spring ConversionService
+ *
+ * @author L.cm
+ */
+@Slf4j
+@AllArgsConstructor
+public class BladeConverter implements Converter {
+ private static final ConcurrentMap<String, TypeDescriptor> TYPE_CACHE = new ConcurrentHashMap<>();
+ private final Class<?> sourceClazz;
+ private final Class<?> targetClazz;
+
+ /**
+ * cglib convert
+ *
+ * @param value 婧愬璞″睘鎬�
+ * @param target 鐩爣瀵硅薄灞炴�х被
+ * @param fieldName 鐩爣鐨刦ield鍚嶏紝鍘熶负 set 鏂规硶鍚嶏紝BladeBeanCopier 閲屽仛浜嗘洿鏀�
+ * @return {Object}
+ */
+ @Override
+ @Nullable
+ public Object convert(Object value, Class target, final Object fieldName) {
+ if (value == null) {
+ return null;
+ }
+ // 绫诲瀷涓�鏍凤紝涓嶉渶瑕佽浆鎹�
+ if (ClassUtil.isAssignableValue(target, value)) {
+ return value;
+ }
+ try {
+ TypeDescriptor targetDescriptor = BladeConverter.getTypeDescriptor(targetClazz, (String) fieldName);
+ // 1. 鍒ゆ柇 sourceClazz 涓� Map
+ if (Map.class.isAssignableFrom(sourceClazz)) {
+ return ConvertUtil.convert(value, targetDescriptor);
+ } else {
+ TypeDescriptor sourceDescriptor = BladeConverter.getTypeDescriptor(sourceClazz, (String) fieldName);
+ return ConvertUtil.convert(value, sourceDescriptor, targetDescriptor);
+ }
+ } catch (Throwable e) {
+ log.warn("BladeConverter error", e);
+ return null;
+ }
+ }
+
+ private static TypeDescriptor getTypeDescriptor(final Class<?> clazz, final String fieldName) {
+ String srcCacheKey = clazz.getName() + fieldName;
+ // 蹇界暐鎶涘嚭寮傚父鐨勫嚱鏁帮紝瀹氫箟瀹屾暣娉涘瀷锛岄伩鍏嶇紪璇戦棶棰�
+ CheckedFunction<String, TypeDescriptor> uncheckedFunction = (key) -> {
+ // 杩欓噷 property 鐞嗚涓婁笉浼氫负 null
+ Field field = ReflectUtil.getField(clazz, fieldName);
+ if (field == null) {
+ throw new NoSuchFieldException(fieldName);
+ }
+ return new TypeDescriptor(field);
+ };
+ return TYPE_CACHE.computeIfAbsent(srcCacheKey, Unchecked.function(uncheckedFunction));
+ }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/EnumToStringConverter.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/EnumToStringConverter.java
new file mode 100644
index 0000000..fe10cdf
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/EnumToStringConverter.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util.convert;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.vci.web.util.ConvertUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.convert.TypeDescriptor;
+import org.springframework.core.convert.converter.ConditionalGenericConverter;
+import org.springframework.lang.Nullable;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * 鎺ユ敹鍙傛暟 鍚� jackson Enum -銆� String 杞崲
+ *
+ * @author L.cm
+ */
+@Slf4j
+public class EnumToStringConverter implements ConditionalGenericConverter {
+ /**
+ * 缂撳瓨 Enum 绫讳俊鎭紝鎻愪緵鎬ц兘
+ */
+ private static final ConcurrentMap<Class<?>, AccessibleObject> ENUM_CACHE_MAP = new ConcurrentHashMap<>(8);
+
+ @Nullable
+ private static AccessibleObject getAnnotation(Class<?> clazz) {
+ Set<AccessibleObject> accessibleObjects = new HashSet<>();
+ // JsonValue METHOD, FIELD
+ Field[] fields = clazz.getDeclaredFields();
+ Collections.addAll(accessibleObjects, fields);
+ // methods
+ Method[] methods = clazz.getDeclaredMethods();
+ Collections.addAll(accessibleObjects, methods);
+ for (AccessibleObject accessibleObject : accessibleObjects) {
+ // 澶嶇敤 jackson 鐨� JsonValue 娉ㄨВ
+ JsonValue jsonValue = accessibleObject.getAnnotation(JsonValue.class);
+ if (jsonValue != null && jsonValue.value()) {
+ accessibleObject.setAccessible(true);
+ return accessibleObject;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
+ return true;
+ }
+
+ @Override
+ public Set<ConvertiblePair> getConvertibleTypes() {
+ Set<ConvertiblePair> pairSet = new HashSet<>(3);
+ pairSet.add(new ConvertiblePair(Enum.class, String.class));
+ pairSet.add(new ConvertiblePair(Enum.class, Integer.class));
+ pairSet.add(new ConvertiblePair(Enum.class, Long.class));
+ return Collections.unmodifiableSet(pairSet);
+ }
+
+ @Override
+ public Object convert(@Nullable Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
+ if (source == null) {
+ return null;
+ }
+ Class<?> sourceClazz = sourceType.getType();
+ AccessibleObject accessibleObject = ENUM_CACHE_MAP.computeIfAbsent(sourceClazz, EnumToStringConverter::getAnnotation);
+ Class<?> targetClazz = targetType.getType();
+ // 濡傛灉涓簄ull锛岃蛋榛樿鐨勮浆鎹�
+ if (accessibleObject == null) {
+ if (String.class == targetClazz) {
+ return ((Enum) source).name();
+ }
+ int ordinal = ((Enum) source).ordinal();
+ return ConvertUtil.convert(ordinal, targetClazz);
+ }
+ try {
+ return EnumToStringConverter.invoke(sourceClazz, accessibleObject, source, targetClazz);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+ @Nullable
+ private static Object invoke(Class<?> clazz, AccessibleObject accessibleObject, Object source, Class<?> targetClazz)
+ throws IllegalAccessException, InvocationTargetException {
+ Object value = null;
+ if (accessibleObject instanceof Field) {
+ Field field = (Field) accessibleObject;
+ value = field.get(source);
+ } else if (accessibleObject instanceof Method) {
+ Method method = (Method) accessibleObject;
+ Class<?> paramType = method.getParameterTypes()[0];
+ // 绫诲瀷杞崲
+ Object object = ConvertUtil.convert(source, paramType);
+ value = method.invoke(clazz, object);
+ }
+ if (value == null) {
+ return null;
+ }
+ return ConvertUtil.convert(value, targetClazz);
+ }
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/StringToEnumConverter.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/StringToEnumConverter.java
new file mode 100644
index 0000000..cb36729
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/convert/StringToEnumConverter.java
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util.convert;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.vci.web.util.ConvertUtil;
+import com.vci.web.util.StringUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.core.convert.TypeDescriptor;
+import org.springframework.core.convert.converter.ConditionalGenericConverter;
+import org.springframework.lang.Nullable;
+
+import java.lang.reflect.AccessibleObject;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+/**
+ * 鎺ユ敹鍙傛暟 鍚� jackson String -銆� Enum 杞崲
+ *
+ * @author L.cm
+ */
+@Slf4j
+public class StringToEnumConverter implements ConditionalGenericConverter {
+ /**
+ * 缂撳瓨 Enum 绫讳俊鎭紝鎻愪緵鎬ц兘
+ */
+ private static final ConcurrentMap<Class<?>, AccessibleObject> ENUM_CACHE_MAP = new ConcurrentHashMap<>(8);
+
+ @Nullable
+ private static AccessibleObject getAnnotation(Class<?> clazz) {
+ Set<AccessibleObject> accessibleObjects = new HashSet<>();
+ // JsonCreator METHOD, CONSTRUCTOR
+ Constructor<?>[] constructors = clazz.getConstructors();
+ Collections.addAll(accessibleObjects, constructors);
+ // methods
+ Method[] methods = clazz.getDeclaredMethods();
+ Collections.addAll(accessibleObjects, methods);
+ for (AccessibleObject accessibleObject : accessibleObjects) {
+ // 澶嶇敤 jackson 鐨� JsonCreator娉ㄨВ
+ JsonCreator jsonCreator = accessibleObject.getAnnotation(JsonCreator.class);
+ if (jsonCreator != null && JsonCreator.Mode.DISABLED != jsonCreator.mode()) {
+ accessibleObject.setAccessible(true);
+ return accessibleObject;
+ }
+ }
+ return null;
+ }
+
+ @Override
+ public boolean matches(TypeDescriptor sourceType, TypeDescriptor targetType) {
+ return true;
+ }
+
+ @Override
+ public Set<ConvertiblePair> getConvertibleTypes() {
+ return Collections.singleton(new ConvertiblePair(String.class, Enum.class));
+ }
+
+ @Nullable
+ @Override
+ public Object convert(@Nullable Object source, TypeDescriptor sourceType, TypeDescriptor targetType) {
+ if (StringUtil.isBlank((String) source)) {
+ return null;
+ }
+ Class<?> clazz = targetType.getType();
+ AccessibleObject accessibleObject = ENUM_CACHE_MAP.computeIfAbsent(clazz, StringToEnumConverter::getAnnotation);
+ String value = ((String) source).trim();
+ // 濡傛灉涓簄ull锛岃蛋榛樿鐨勮浆鎹�
+ if (accessibleObject == null) {
+ return valueOf(clazz, value);
+ }
+ try {
+ return StringToEnumConverter.invoke(clazz, accessibleObject, value);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+ @SuppressWarnings("unchecked")
+ private static <T extends Enum<T>> T valueOf(Class<?> clazz, String value){
+ return Enum.valueOf((Class<T>) clazz, value);
+ }
+
+ @Nullable
+ private static Object invoke(Class<?> clazz, AccessibleObject accessibleObject, String value)
+ throws IllegalAccessException, InvocationTargetException, InstantiationException {
+ if (accessibleObject instanceof Constructor) {
+ Constructor constructor = (Constructor) accessibleObject;
+ Class<?> paramType = constructor.getParameterTypes()[0];
+ // 绫诲瀷杞崲
+ Object object = ConvertUtil.convert(value, paramType);
+ return constructor.newInstance(object);
+ }
+ if (accessibleObject instanceof Method) {
+ Method method = (Method) accessibleObject;
+ Class<?> paramType = method.getParameterTypes()[0];
+ // 绫诲瀷杞崲
+ Object object = ConvertUtil.convert(value, paramType);
+ return method.invoke(clazz, object);
+ }
+ return null;
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedCallable.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedCallable.java
new file mode 100644
index 0000000..e61dd7c
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedCallable.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util.function;
+
+import org.springframework.lang.Nullable;
+
+/**
+ * 鍙楁鐨� Callable
+ *
+ * @author L.cm
+ */
+@FunctionalInterface
+public interface CheckedCallable<T> {
+
+ /**
+ * Run this callable.
+ *
+ * @return result
+ * @throws Throwable CheckedException
+ */
+ @Nullable
+ T call() throws Throwable;
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedComparator.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedComparator.java
new file mode 100644
index 0000000..7511b85
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedComparator.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util.function;
+
+/**
+ * 鍙楁鐨� Comparator
+ *
+ * @author L.cm
+ */
+@FunctionalInterface
+public interface CheckedComparator<T> {
+
+ /**
+ * Compares its two arguments for order.
+ *
+ * @param o1 o1
+ * @param o2 o2
+ * @return int
+ * @throws Throwable CheckedException
+ */
+ int compare(T o1, T o2) throws Throwable;
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedConsumer.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedConsumer.java
new file mode 100644
index 0000000..11f9694
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedConsumer.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util.function;
+
+import org.springframework.lang.Nullable;
+
+/**
+ * 鍙楁鐨� Consumer
+ *
+ * @author L.cm
+ */
+@FunctionalInterface
+public interface CheckedConsumer<T> {
+
+ /**
+ * Run the Consumer
+ *
+ * @param t T
+ * @throws Throwable UncheckedException
+ */
+ @Nullable
+ void accept(@Nullable T t) throws Throwable;
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedFunction.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedFunction.java
new file mode 100644
index 0000000..a1cb096
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedFunction.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util.function;
+
+import org.springframework.lang.Nullable;
+
+/**
+ * 鍙楁鐨� function
+ *
+ * @author L.cm
+ */
+@FunctionalInterface
+public interface CheckedFunction<T, R> {
+
+ /**
+ * Run the Function
+ *
+ * @param t T
+ * @return R R
+ * @throws Throwable CheckedException
+ */
+ @Nullable
+ R apply(@Nullable T t) throws Throwable;
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedRunnable.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedRunnable.java
new file mode 100644
index 0000000..7bd0407
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedRunnable.java
@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util.function;
+
+/**
+ * 鍙楁鐨� runnable
+ *
+ * @author L.cm
+ */
+@FunctionalInterface
+public interface CheckedRunnable {
+
+ /**
+ * Run this runnable.
+ *
+ * @throws Throwable CheckedException
+ */
+ void run() throws Throwable;
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedSupplier.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedSupplier.java
new file mode 100644
index 0000000..cd55775
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/function/CheckedSupplier.java
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2018-2028, DreamLu All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: DreamLu 鍗㈡槬姊� (596392912@qq.com)
+ */
+
+package com.vci.web.util.function;
+
+import org.springframework.lang.Nullable;
+
+/**
+ * 鍙楁鐨� Supplier
+ *
+ * @author L.cm
+ */
+@FunctionalInterface
+public interface CheckedSupplier<T> {
+
+ /**
+ * Run the Supplier
+ *
+ * @return T
+ * @throws Throwable CheckedException
+ */
+ @Nullable
+ T get() throws Throwable;
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/jackson/BladeJavaTimeModule.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/jackson/BladeJavaTimeModule.java
new file mode 100644
index 0000000..e3ee236
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/jackson/BladeJavaTimeModule.java
@@ -0,0 +1,35 @@
+package com.vci.web.util.jackson;
+
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.datatype.jsr310.PackageVersion;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
+import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
+import com.vci.web.util.DateTimeUtil;
+
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+/**
+ * java 8 鏃堕棿榛樿搴忓垪鍖�
+ *
+ * @author L.cm
+ */
+public class BladeJavaTimeModule extends SimpleModule {
+ public static final BladeJavaTimeModule INSTANCE = new BladeJavaTimeModule();
+
+ public BladeJavaTimeModule() {
+ super(PackageVersion.VERSION);
+ this.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeUtil.DATETIME_FORMAT));
+ this.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeUtil.DATE_FORMAT));
+ this.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeUtil.TIME_FORMAT));
+ this.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeUtil.DATETIME_FORMAT));
+ this.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeUtil.DATE_FORMAT));
+ this.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeUtil.TIME_FORMAT));
+ }
+
+}
diff --git a/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/jackson/JsonUtil.java b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/jackson/JsonUtil.java
new file mode 100644
index 0000000..dd459c3
--- /dev/null
+++ b/Source/platformProject/vci-platform-web/src/main/java/com/vci/web/util/jackson/JsonUtil.java
@@ -0,0 +1,705 @@
+/*
+ * Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the dreamlu.net developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: Chill 搴勯獮 (smallchill@163.com)
+ */
+package com.vci.web.util.jackson;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.TreeNode;
+import com.fasterxml.jackson.core.json.JsonReadFeature;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.type.CollectionLikeType;
+import com.fasterxml.jackson.databind.type.MapType;
+import com.vci.web.util.*;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.lang.Nullable;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.text.SimpleDateFormat;
+import java.time.ZoneId;
+import java.util.*;
+
+/**
+ * Jackson宸ュ叿绫�
+ *
+ * @author Chill
+ */
+@Slf4j
+public class JsonUtil {
+
+ /**
+ * 灏嗗璞″簭鍒楀寲鎴恓son瀛楃涓�
+ *
+ * @param value javaBean
+ * @return jsonString json瀛楃涓�
+ */
+ public static <T> String toJson(T value) {
+ try {
+ return getInstance().writeValueAsString(value);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+ /**
+ * 灏嗗璞″簭鍒楀寲鎴� json byte 鏁扮粍
+ *
+ * @param object javaBean
+ * @return jsonString json瀛楃涓�
+ */
+ public static byte[] toJsonAsBytes(Object object) {
+ try {
+ return getInstance().writeValueAsBytes(object);
+ } catch (JsonProcessingException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param content content
+ * @param valueType class
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T parse(String content, Class<T> valueType) {
+ try {
+ return getInstance().readValue(content, valueType);
+ } catch (Exception e) {
+ log.error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param content content
+ * @param typeReference 娉涘瀷绫诲瀷
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T parse(String content, TypeReference<T> typeReference) {
+ try {
+ return getInstance().readValue(content, typeReference);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son byte 鏁扮粍鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param bytes json bytes
+ * @param valueType class
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T parse(byte[] bytes, Class<T> valueType) {
+ try {
+ return getInstance().readValue(bytes, valueType);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param bytes bytes
+ * @param typeReference 娉涘瀷绫诲瀷
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T parse(byte[] bytes, TypeReference<T> typeReference) {
+ try {
+ return getInstance().readValue(bytes, typeReference);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param in InputStream
+ * @param valueType class
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T parse(InputStream in, Class<T> valueType) {
+ try {
+ return getInstance().readValue(in, valueType);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param in InputStream
+ * @param typeReference 娉涘瀷绫诲瀷
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ public static <T> T parse(InputStream in, TypeReference<T> typeReference) {
+ try {
+ return getInstance().readValue(in, typeReference);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴怢ist瀵硅薄
+ *
+ * @param content content
+ * @param valueTypeRef class
+ * @param <T> T 娉涘瀷鏍囪
+ * @return List<T>
+ */
+ public static <T> List<T> parseArray(String content, Class<T> valueTypeRef) {
+ try {
+
+ if (!StringUtil.startsWithIgnoreCase(content, StringPool.LEFT_SQ_BRACKET)) {
+ content = StringPool.LEFT_SQ_BRACKET + content + StringPool.RIGHT_SQ_BRACKET;
+ }
+
+ List<Map<String, Object>> list = getInstance().readValue(content, new TypeReference<List<Map<String, Object>>>() {
+ });
+
+ List<T> result = new ArrayList<>();
+ for (Map<String, Object> map : list) {
+ result.add(toPojo(map, valueTypeRef));
+ }
+ return result;
+ } catch (IOException e) {
+ log.error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+ /**
+ * 灏唈son瀛楃涓茶浆鎴� JsonNode
+ *
+ * @param jsonString jsonString
+ * @return jsonString json瀛楃涓�
+ */
+ public static JsonNode readTree(String jsonString) {
+ Objects.requireNonNull(jsonString, "jsonString is null");
+ try {
+ return getInstance().readTree(jsonString);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son瀛楃涓茶浆鎴� JsonNode
+ *
+ * @param in InputStream
+ * @return jsonString json瀛楃涓�
+ */
+ public static JsonNode readTree(InputStream in) {
+ Objects.requireNonNull(in, "InputStream in is null");
+ try {
+ return getInstance().readTree(in);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son瀛楃涓茶浆鎴� JsonNode
+ *
+ * @param content content
+ * @return jsonString json瀛楃涓�
+ */
+ public static JsonNode readTree(byte[] content) {
+ Objects.requireNonNull(content, "byte[] content is null");
+ try {
+ return getInstance().readTree(content);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son瀛楃涓茶浆鎴� JsonNode
+ *
+ * @param jsonParser JsonParser
+ * @return jsonString json瀛楃涓�
+ */
+ public static JsonNode readTree(JsonParser jsonParser) {
+ Objects.requireNonNull(jsonParser, "jsonParser is null");
+ try {
+ return getInstance().readTree(jsonParser);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+
+ /**
+ * 灏唈son byte 鏁扮粍鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param content json bytes
+ * @param valueType class
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ @Nullable
+ public static <T> T readValue(@Nullable byte[] content, Class<T> valueType) {
+ if (ObjectUtil.isEmpty(content)) {
+ return null;
+ }
+ try {
+ return getInstance().readValue(content, valueType);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param jsonString jsonString
+ * @param valueType class
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ @Nullable
+ public static <T> T readValue(@Nullable String jsonString, Class<T> valueType) {
+ if (StringUtil.isBlank(jsonString)) {
+ return null;
+ }
+ try {
+ return getInstance().readValue(jsonString, valueType);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param in InputStream
+ * @param valueType class
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ @Nullable
+ public static <T> T readValue(@Nullable InputStream in, Class<T> valueType) {
+ if (in == null) {
+ return null;
+ }
+ try {
+ return getInstance().readValue(in, valueType);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param content bytes
+ * @param typeReference 娉涘瀷绫诲瀷
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ @Nullable
+ public static <T> T readValue(@Nullable byte[] content, TypeReference<T> typeReference) {
+ if (ObjectUtil.isEmpty(content)) {
+ return null;
+ }
+ try {
+ return getInstance().readValue(content, typeReference);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param jsonString jsonString
+ * @param typeReference 娉涘瀷绫诲瀷
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ @Nullable
+ public static <T> T readValue(@Nullable String jsonString, TypeReference<T> typeReference) {
+ if (StringUtil.isBlank(jsonString)) {
+ return null;
+ }
+ try {
+ return getInstance().readValue(jsonString, typeReference);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏唈son鍙嶅簭鍒楀寲鎴愬璞�
+ *
+ * @param in InputStream
+ * @param typeReference 娉涘瀷绫诲瀷
+ * @param <T> T 娉涘瀷鏍囪
+ * @return Bean
+ */
+ @Nullable
+ public static <T> T readValue(@Nullable InputStream in, TypeReference<T> typeReference) {
+ if (in == null) {
+ return null;
+ }
+ try {
+ return getInstance().readValue(in, typeReference);
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 灏佽 map type
+ *
+ * @param keyClass key 绫诲瀷
+ * @param valueClass value 绫诲瀷
+ * @return MapType
+ */
+ public static MapType getMapType(Class<?> keyClass, Class<?> valueClass) {
+ return getInstance().getTypeFactory().constructMapType(Map.class, keyClass, valueClass);
+ }
+
+ /**
+ * 灏佽 map type
+ *
+ * @param elementClass 闆嗗悎鍊肩被鍨�
+ * @return CollectionLikeType
+ */
+ public static CollectionLikeType getListType(Class<?> elementClass) {
+ return getInstance().getTypeFactory().constructCollectionLikeType(List.class, elementClass);
+ }
+
+ /**
+ * 璇诲彇闆嗗悎
+ *
+ * @param content bytes
+ * @param elementClass elementClass
+ * @param <T> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ public static <T> List<T> readList(@Nullable byte[] content, Class<T> elementClass) {
+ if (ObjectUtil.isEmpty(content)) {
+ return Collections.emptyList();
+ }
+ try {
+ return getInstance().readValue(content, getListType(elementClass));
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 璇诲彇闆嗗悎
+ *
+ * @param content InputStream
+ * @param elementClass elementClass
+ * @param <T> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ public static <T> List<T> readList(@Nullable InputStream content, Class<T> elementClass) {
+ if (content == null) {
+ return Collections.emptyList();
+ }
+ try {
+ return getInstance().readValue(content, getListType(elementClass));
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 璇诲彇闆嗗悎
+ *
+ * @param content bytes
+ * @param elementClass elementClass
+ * @param <T> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ public static <T> List<T> readList(@Nullable String content, Class<T> elementClass) {
+ if (ObjectUtil.isEmpty(content)) {
+ return Collections.emptyList();
+ }
+ try {
+ return getInstance().readValue(content, getListType(elementClass));
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 璇诲彇闆嗗悎
+ *
+ * @param content bytes
+ * @param keyClass key绫诲瀷
+ * @param valueClass 鍊肩被鍨�
+ * @param <K> 娉涘瀷
+ * @param <V> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ public static <K, V> Map<K, V> readMap(@Nullable byte[] content, Class<?> keyClass, Class<?> valueClass) {
+ if (ObjectUtil.isEmpty(content)) {
+ return Collections.emptyMap();
+ }
+ try {
+ return getInstance().readValue(content, getMapType(keyClass, valueClass));
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 璇诲彇闆嗗悎
+ *
+ * @param content InputStream
+ * @param keyClass key绫诲瀷
+ * @param valueClass 鍊肩被鍨�
+ * @param <K> 娉涘瀷
+ * @param <V> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ public static <K, V> Map<K, V> readMap(@Nullable InputStream content, Class<?> keyClass, Class<?> valueClass) {
+ if (ObjectUtil.isEmpty(content)) {
+ return Collections.emptyMap();
+ }
+ try {
+ return getInstance().readValue(content, getMapType(keyClass, valueClass));
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 璇诲彇闆嗗悎
+ *
+ * @param content bytes
+ * @param keyClass key绫诲瀷
+ * @param valueClass 鍊肩被鍨�
+ * @param <K> 娉涘瀷
+ * @param <V> 娉涘瀷
+ * @return 闆嗗悎
+ */
+ public static <K, V> Map<K, V> readMap(@Nullable String content, Class<?> keyClass, Class<?> valueClass) {
+ if (ObjectUtil.isEmpty(content)) {
+ return Collections.emptyMap();
+ }
+ try {
+ return getInstance().readValue(content, getMapType(keyClass, valueClass));
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 璇诲彇闆嗗悎
+ *
+ * @param content bytes
+ * @return 闆嗗悎
+ */
+ public static Map<String, Object> readMap(@Nullable String content) {
+ return readMap(content, String.class, Object.class);
+ }
+
+ /**
+ * 璇诲彇闆嗗悎
+ *
+ * @param content bytes
+ * @return 闆嗗悎
+ */
+ public static List<Map<String, Object>> readListMap(@Nullable String content) {
+ if (ObjectUtil.isEmpty(content)) {
+ return Collections.emptyList();
+ }
+ try {
+ return getInstance().readValue(content, new TypeReference<List<Map<String, Object>>>() {
+ });
+ } catch (IOException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * jackson 鐨勭被鍨嬭浆鎹�
+ *
+ * @param fromValue 鏉ユ簮瀵硅薄
+ * @param toValueType 杞崲鐨勭被鍨�
+ * @param <T> 娉涘瀷鏍囪
+ * @return 杞崲缁撴灉
+ */
+ public static <T> T convertValue(Object fromValue, Class<T> toValueType) {
+ return getInstance().convertValue(fromValue, toValueType);
+ }
+
+ /**
+ * jackson 鐨勭被鍨嬭浆鎹�
+ *
+ * @param fromValue 鏉ユ簮瀵硅薄
+ * @param toValueType 杞崲鐨勭被鍨�
+ * @param <T> 娉涘瀷鏍囪
+ * @return 杞崲缁撴灉
+ */
+ public static <T> T convertValue(Object fromValue, JavaType toValueType) {
+ return getInstance().convertValue(fromValue, toValueType);
+ }
+
+ /**
+ * jackson 鐨勭被鍨嬭浆鎹�
+ *
+ * @param fromValue 鏉ユ簮瀵硅薄
+ * @param toValueTypeRef 娉涘瀷绫诲瀷
+ * @param <T> 娉涘瀷鏍囪
+ * @return 杞崲缁撴灉
+ */
+ public static <T> T convertValue(Object fromValue, TypeReference<T> toValueTypeRef) {
+ return getInstance().convertValue(fromValue, toValueTypeRef);
+ }
+
+ /**
+ * tree 杞璞�
+ *
+ * @param treeNode TreeNode
+ * @param valueType valueType
+ * @param <T> 娉涘瀷鏍囪
+ * @return 杞崲缁撴灉
+ */
+ public static <T> T treeToValue(TreeNode treeNode, Class<T> valueType) {
+ try {
+ return getInstance().treeToValue(treeNode, valueType);
+ } catch (JsonProcessingException e) {
+ throw Exceptions.unchecked(e);
+ }
+ }
+
+ /**
+ * 瀵硅薄杞负 json node
+ *
+ * @param value 瀵硅薄
+ * @return JsonNode
+ */
+ public static JsonNode valueToTree(@Nullable Object value) {
+ return getInstance().valueToTree(value);
+ }
+
+ /**
+ * 鍒ゆ柇鏄惁鍙互搴忓垪鍖�
+ *
+ * @param value 瀵硅薄
+ * @return 鏄惁鍙互搴忓垪鍖�
+ */
+ public static boolean canSerialize(@Nullable Object value) {
+ if (value == null) {
+ return true;
+ }
+ return getInstance().canSerialize(value.getClass());
+ }
+
+ public static Map<String, Object> toMap(String content) {
+ try {
+ return getInstance().readValue(content, Map.class);
+ } catch (IOException e) {
+ log.error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+ public static <T> Map<String, T> toMap(String content, Class<T> valueTypeRef) {
+ try {
+ Map<String, Map<String, Object>> map = getInstance().readValue(content, new TypeReference<Map<String, Map<String, Object>>>() {
+ });
+ Map<String, T> result = new HashMap<>(16);
+ for (Map.Entry<String, Map<String, Object>> entry : map.entrySet()) {
+ result.put(entry.getKey(), toPojo(entry.getValue(), valueTypeRef));
+ }
+ return result;
+ } catch (IOException e) {
+ log.error(e.getMessage(), e);
+ }
+ return null;
+ }
+
+ public static <T> T toPojo(Map fromValue, Class<T> toValueType) {
+ return getInstance().convertValue(fromValue, toValueType);
+ }
+
+ public static ObjectMapper getInstance() {
+ return JacksonHolder.INSTANCE;
+ }
+
+ private static class JacksonHolder {
+ private static final ObjectMapper INSTANCE = new JacksonObjectMapper();
+ }
+
+ private static class JacksonObjectMapper extends ObjectMapper {
+ private static final long serialVersionUID = 4288193147502386170L;
+
+ private static final Locale CHINA = Locale.CHINA;
+
+ public JacksonObjectMapper(ObjectMapper src) {
+ super(src);
+ }
+
+ public JacksonObjectMapper() {
+ super();
+ //璁剧疆鍦扮偣涓轰腑鍥�
+ super.setLocale(CHINA);
+ //鍘绘帀榛樿鐨勬椂闂存埑鏍煎紡
+ super.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
+ //璁剧疆涓轰腑鍥戒笂娴锋椂鍖�
+ super.setTimeZone(TimeZone.getTimeZone(ZoneId.systemDefault()));
+ //搴忓垪鍖栨椂锛屾棩鏈熺殑缁熶竴鏍煎紡
+ super.setDateFormat(new SimpleDateFormat(DateUtil.PATTERN_DATETIME, Locale.CHINA));
+ // 鍗曞紩鍙�
+ super.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);
+ // 鍏佽JSON瀛楃涓插寘鍚潪寮曞彿鎺у埗瀛楃锛堝�煎皬浜�32鐨凙SCII瀛楃锛屽寘鍚埗琛ㄧ鍜屾崲琛岀锛�
+ super.configure(JsonReadFeature.ALLOW_UNESCAPED_CONTROL_CHARS.mappedFeature(), true);
+ super.configure(JsonReadFeature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER.mappedFeature(), true);
+ super.findAndRegisterModules();
+ //澶辫触澶勭悊
+ super.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
+ super.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+ //鍗曞紩鍙峰鐞�
+ super.configure(JsonReadFeature.ALLOW_SINGLE_QUOTES.mappedFeature(), true);
+ //鍙嶅簭鍒楀寲鏃讹紝灞炴�т笉瀛樺湪鐨勫吋瀹瑰鐞唖
+ super.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
+ //鏃ユ湡鏍煎紡鍖�
+ super.registerModule(new BladeJavaTimeModule());
+ super.findAndRegisterModules();
+ }
+
+ @Override
+ public ObjectMapper copy() {
+ return new JacksonObjectMapper(this);
+ }
+ }
+
+}
--
Gitblit v1.9.3