首次提交

main
gaoshuguang 2 months ago
commit 60ee109c9b

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<module version="4">
<component name="SonarLintModuleSettings">
<option name="uniqueId" value="d931ae4c-9246-4c76-8069-40536858e278" />
</component>
</module>

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

@ -0,0 +1,8 @@
# 默认忽略的文件
/shelf/
/workspace.xml
# 基于编辑器的 HTTP 客户端请求
/httpRequests/
# Datasource local storage ignored files
/dataSources/
/dataSources.local.xml

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

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

@ -0,0 +1,42 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0">
<option name="myName" value="Project Default" />
<inspection_tool class="AlibabaVarargsParameter" enabled="true" level="WARNING" enabled_by_default="true" />
<inspection_tool class="DuplicatedCode" enabled="true" level="WEAK WARNING" enabled_by_default="true">
<Languages>
<language minSize="96" name="Java" />
</Languages>
</inspection_tool>
<inspection_tool class="JavaDoc" enabled="true" level="WARNING" enabled_by_default="true">
<option name="TOP_LEVEL_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="INNER_CLASS_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="METHOD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="@return@param@throws or @exception" />
</value>
</option>
<option name="FIELD_OPTIONS">
<value>
<option name="ACCESS_JAVADOC_REQUIRED_FOR" value="none" />
<option name="REQUIRED_TAGS" value="" />
</value>
</option>
<option name="IGNORE_DEPRECATED" value="false" />
<option name="IGNORE_JAVADOC_PERIOD" value="true" />
<option name="IGNORE_DUPLICATED_THROWS" value="false" />
<option name="IGNORE_POINT_TO_ITSELF" value="false" />
<option name="myAdditionalJavadocTags" value="Author,Date,Description,Author:,Date:,Description:,,Param:,return:,date,author:,date:,description:" />
</inspection_tool>
</profile>
</component>

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

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

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

@ -0,0 +1,316 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.nmggs</groupId>
<artifactId>FortressGetDataInterface</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>FortressGetDataInterface</name>
<description>FortressGetDataInterface</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.3.7.RELEASE</spring-boot.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<!-- 内置tomcat-->
<!-- <dependency>-->
<!-- <groupId>org.springframework.boot</groupId>-->
<!-- <artifactId>spring-boot-starter-web</artifactId>-->
<!-- </dependency>-->
<!-- 外置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.1</version>
</dependency>
<!-- 外置依赖-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<!--验证码 -->
<dependency>
<groupId>com.github.penggle</groupId>
<artifactId>kaptcha</artifactId>
<version>2.3.2</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
<!--JWT鉴权-->
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.vaadin.external.google</groupId>
<artifactId>android-json</artifactId>
<version>0.0.20131108.vaadin1</version>
</dependency>
<!-- session 配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<!--spring-session-->
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-jdbc</artifactId>
</dependency>
<!-- 数据库链接包-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>druid</artifactId>-->
<!-- <version>1.2.11</version>-->
<!-- </dependency>-->
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc8</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.oracle.database.nls</groupId>
<artifactId>orai18n</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.microsoft</groupId>
<artifactId>sqljdbc4</artifactId>
<version>3.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<!-- 密码加密-->
<dependency>
<groupId>com.enc</groupId>
<artifactId>EndPassJava</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<!-- 解析HTML-->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>2.10.13</version>
</dependency>
<!-- goldendb驱动 -->
<!-- <dependency>-->
<!-- <groupId>com.zte.goldendb</groupId> &lt;!&ndash; 假设的groupId &ndash;&gt;-->
<!-- <artifactId>gdb_mysql-connector-java</artifactId> &lt;!&ndash; 假设的artifactId &ndash;&gt;-->
<!-- <version>5.1.46.67</version> &lt;!&ndash; 版本号 &ndash;&gt;-->
<!-- </dependency>-->
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>33.3.1-jre</version>
</dependency>
<!-- 通过HttpClient实现请求发送、接收文件 -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpmime</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.0</version>
</dependency>
<!-- SM4加密依赖包 -->
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.78.1</version>
</dependency>
<!-- MyBatis的多数据源 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
<!--Spring AOP-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>FortressGetDataInterface</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<!-- <configuration>-->
<!-- <packagingExcludes>-->
<!-- WEB-INF/classes/application.yml-->
<!-- WEB-INF\classes\application.yml-->
<!-- </packagingExcludes>-->
<!-- </configuration>-->
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.nmggs.query.FortressGetDataInterfaceApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
<!--打包时去除配置文件-->
<resource>
<directory>src/main/resources</directory>
<excludes>
<exclude>*.properties</exclude>
</excludes>
<!-- <includes>-->
<!-- <include>static/*.properties</include>-->
<!-- </includes>-->
</resource>
</resources>
</build>
</project>

@ -0,0 +1,18 @@
package com.nmggs.query;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
@SpringBootApplication
public class FortressGetDataInterfaceApplication extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(FortressGetDataInterfaceApplication.class);
}
public static void main(String[] args) {
SpringApplication.run(FortressGetDataInterfaceApplication.class, args);
}
}

@ -0,0 +1,28 @@
package com.nmggs.query.common.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.FormHttpMessageConverter;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.List;
/**
* @author: shuguang
* @date: 20250909 17:32
* @description:
*/
@Configuration
public class AppConfig {
@Bean
public RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> messageConverters = new ArrayList<>(restTemplate.getMessageConverters());
messageConverters.add(new FormHttpMessageConverter());
restTemplate.setMessageConverters(messageConverters);
return restTemplate;
}
}

@ -0,0 +1,102 @@
package com.nmggs.query.common.config;
import com.google.code.kaptcha.impl.DefaultKaptcha;
import com.google.code.kaptcha.util.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Properties;
import static com.google.code.kaptcha.Constants.KAPTCHA_BORDER;
import static com.google.code.kaptcha.Constants.KAPTCHA_BORDER_COLOR;
import static com.google.code.kaptcha.Constants.KAPTCHA_IMAGE_HEIGHT;
import static com.google.code.kaptcha.Constants.KAPTCHA_IMAGE_WIDTH;
import static com.google.code.kaptcha.Constants.KAPTCHA_NOISE_COLOR;
import static com.google.code.kaptcha.Constants.KAPTCHA_NOISE_IMPL;
import static com.google.code.kaptcha.Constants.KAPTCHA_OBSCURIFICATOR_IMPL;
import static com.google.code.kaptcha.Constants.KAPTCHA_SESSION_CONFIG_KEY;
import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH;
import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_CHAR_SPACE;
import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR;
import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES;
import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE;
import static com.google.code.kaptcha.Constants.KAPTCHA_TEXTPRODUCER_IMPL;
/**
*
*
* @author ruoyi
*/
@Configuration
public class CaptchaConfig
{
@Bean(name = "captchaProducer")
public DefaultKaptcha getKaptchaBean()
{
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
// 是否有边框 默认为true 我们可以自己设置yesno
properties.setProperty(KAPTCHA_BORDER, "yes");
// 验证码文本字符颜色 默认为Color.BLACK
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "black");
// 验证码图片宽度 默认为200
properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
// 验证码图片高度 默认为50
properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
// 验证码文本字符大小 默认为40
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "38");
// KAPTCHA_SESSION_KEY
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCode");
// 验证码文本字符长度 默认为5
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4");
// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
// properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
// // 设置无干扰线
// properties.setProperty("kaptcha.noise.impl","com.google.code.kaptcha.impl.NoNoise");
// 干扰实现类
properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
@Bean(name = "captchaProducerMath")
public DefaultKaptcha getKaptchaBeanMath()
{
DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
Properties properties = new Properties();
// 是否有边框 默认为true 我们可以自己设置yesno
properties.setProperty(KAPTCHA_BORDER, "yes");
// 边框颜色 默认为Color.BLACK
properties.setProperty(KAPTCHA_BORDER_COLOR, "105,179,90");
// 验证码文本字符颜色 默认为Color.BLACK
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue");
// 验证码图片宽度 默认为200
properties.setProperty(KAPTCHA_IMAGE_WIDTH, "160");
// 验证码图片高度 默认为50
properties.setProperty(KAPTCHA_IMAGE_HEIGHT, "60");
// 验证码文本字符大小 默认为40
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_SIZE, "35");
// KAPTCHA_SESSION_KEY
properties.setProperty(KAPTCHA_SESSION_CONFIG_KEY, "kaptchaCodeMath");
// 验证码文本生成器
properties.setProperty(KAPTCHA_TEXTPRODUCER_IMPL, "com.ruoyi.framework.config.KaptchaTextCreator");
// 验证码文本字符间距 默认为2
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_SPACE, "3");
// 验证码文本字符长度 默认为5
properties.setProperty(KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "6");
// 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize)
properties.setProperty(KAPTCHA_TEXTPRODUCER_FONT_NAMES, "Arial,Courier");
// 验证码噪点颜色 默认为Color.BLACK
properties.setProperty(KAPTCHA_NOISE_COLOR, "white");
// 干扰实现类
properties.setProperty(KAPTCHA_NOISE_IMPL, "com.google.code.kaptcha.impl.NoNoise");
// 图片样式 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy 阴影com.google.code.kaptcha.impl.ShadowGimpy
properties.setProperty(KAPTCHA_OBSCURIFICATOR_IMPL, "com.google.code.kaptcha.impl.ShadowGimpy");
Config config = new Config(properties);
defaultKaptcha.setConfig(config);
return defaultKaptcha;
}
}

@ -0,0 +1,64 @@
package com.nmggs.query.common.config;
/**
*
* SpringMVCConfig使FilterConfig
*
* @author Administrator
*/
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import javax.annotation.Resource;
@SuppressWarnings("deprecation")
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Resource
private FilterConfig filterconfig;
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 设置拦截类
registry.addInterceptor(filterconfig)
.addPathPatterns("/**")
// 是否允许证书
.excludePathPatterns(
"/ZDYH/**",
"/DCPC/**",
"/ReceptionMobileWeighInfo",
"/ReceptionProBlackList**"
);
}
/**
*
*/
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
// 设置容许跨域请求的域名
//config.addAllowedOriginPattern("*");
config.addAllowedOrigin("*");
// 设置容许的方法
config.addAllowedMethod("*");
// 容许任何头
config.addAllowedHeader("*");
config.addExposedHeader("token");
//是否支持cookie跨域
config.setAllowCredentials(true);
UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
configSource.registerCorsConfiguration("/**", config);
return new CorsFilter(configSource);
}
}

@ -0,0 +1,17 @@
package com.nmggs.query.common.config;
import org.springframework.boot.web.server.ErrorPage;
import org.springframework.boot.web.server.ErrorPageRegistrar;
import org.springframework.boot.web.server.ErrorPageRegistry;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
@Component
public class ErrorConfig implements ErrorPageRegistrar {
@Override
public void registerErrorPages(ErrorPageRegistry registry) {
ErrorPage error404Page = new ErrorPage(HttpStatus.NOT_FOUND, "/index.html");
registry.addErrorPages(error404Page);
}
}

@ -0,0 +1,16 @@
package com.nmggs.query.common.config;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @author: shuguang
* @date: 20250806 11:34
* @description: --
*/
@Target(ElementType.METHOD) // 注解仅适用于方法
@Retention(RetentionPolicy.RUNTIME) // 注解在运行时保留
public @interface ExecutionTimeLogger {
}

@ -0,0 +1,56 @@
package com.nmggs.query.common.config;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
/**
* @author: shuguang
* @date: 20250806 11:36
* @description:
*/
@Aspect
@Component
@Slf4j
public class ExecutionTimeLoggerAspect {
/**
* ExecutionTimeLogger
*
* @return java.lang.Object
* @author shuguang
* @date 2025-08-06 11:37
*/
@Around("@annotation(ExecutionTimeLogger)")
public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
long startTime = System.currentTimeMillis();
Object[] args = joinPoint.getArgs();
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String[] parameterNames = signature.getParameterNames();
String uuid = null;
for (int i = 0; i < parameterNames.length; i++) {
if ("uuid".equals(parameterNames[i]) && args[i] instanceof String) {
uuid = (String) args[i];
break;
}
}
Object result = joinPoint.proceed();
long executionTime = System.currentTimeMillis() - startTime;
if (uuid != null) {
log.info("[uuid:{}]-{}方法在{}毫秒内执行完毕", uuid, joinPoint.getSignature().getName(), executionTime);
} else {
log.info("{}方法在{}毫秒内执行完毕", joinPoint.getSignature().getName(), executionTime);
}
return result;
}
}

@ -0,0 +1,71 @@
package com.nmggs.query.common.config;
/**
*
*
* @author Administrator
*/
import com.alibaba.fastjson2.JSONObject;
import com.nmggs.query.common.utils.TokenUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
@Component
@Slf4j
public class FilterConfig implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));//支持跨域请求
response.setHeader("Access-Control-Allow-Credentials", "true");//是否支持cookie跨域
response.setHeader("Access-Control-Allow-Methods", "*");//X-forwared-port,X-forwarded-host,
response.setHeader("Access-Control-Allow-Headers", "Authorization,Origin, X-Requested-With, Content-Type, Accept,Access-Token");//Origin, X-Requested-With, Content-Type, Accept,Access-Token
String token = request.getHeader("token");
if (token == null) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
JSONObject res = new JSONObject();
res.put("status", "-2");
res.put("msg", "登录超时请重新登陆");
PrintWriter out;
out = response.getWriter();
out.write(res.toString());
out.flush();
out.close();
return false;
}
if(token.equals("test")){
return true;
}
try {
boolean result = TokenUtil.verify(token);
//判断绑定
if (result) {
//log.info("通过拦截器");
response.setHeader("token", TokenUtil.reToken(token, request));
return true;
}
} catch (Exception ignored) {
}
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
response.setCharacterEncoding("UTF-8");
response.setContentType("application/json; charset=utf-8");
JSONObject res = new JSONObject();
res.put("status", "-1");
res.put("msg", "鉴权失败");
PrintWriter out;
out = response.getWriter();
out.write(res.toString());
out.flush();
out.close();
return false;
}
}

@ -0,0 +1,84 @@
package com.nmggs.query.common.config;
import com.nmggs.query.common.emnu.Constant;
import com.nmggs.query.common.utils.PathUtil;
import com.nmggs.query.common.utils.PropertiesUtil;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.PropertiesPropertySource;
import java.io.File;
import java.io.FileInputStream;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
@Configuration
public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {
@Override
public void postProcessEnvironment(ConfigurableEnvironment configurableEnvironment, SpringApplication application) {
System.out.println("FortressGetDataInterface读取公用配置文件");
//公用配置文件路径
String path = PathUtil.applicationPath;
//本项目配置文件路径
String NewPath = PathUtil.projectApplicationPath;
System.out.println("Loading local settings from : " + path);
System.out.println("Loading local settings from : " + NewPath);
Properties properties = new Properties();
Properties Newproperties = new Properties();
try {
File fileproperties = new File(path);
File fileNewproperties = new File(NewPath);
// 判断文件夹是否存在
if (!fileproperties.exists()) {
fileproperties.createNewFile();
}
if (!fileNewproperties.exists()) {
fileNewproperties.createNewFile();
}
properties.load(new FileInputStream(path));
Newproperties.load(new FileInputStream(NewPath));
properties.setProperty("spring.logback.logPath", PathUtil.TomcatPath + "/logs");
String appName=Newproperties.getProperty("spring.logback.appName");
String versionPath =PathUtil.versionPath;
File resourceDir = new File(versionPath);
String version = getVersionFileName(resourceDir);
new PropertiesUtil(PathUtil.applicationTextPath).set(appName+"Version",version);
System.out.println(" version : "+appName+"--->"+version);
//环境名称随意取,但尽量不能和其他环境名称相同,避免不生效
PropertiesPropertySource propertySource = new PropertiesPropertySource("environmentPostProcessor", properties);
PropertiesPropertySource newPropertySource = new PropertiesPropertySource("newEnvironmentPostProcessor", Newproperties);
//外部的文件是最先导入的
configurableEnvironment.getPropertySources().addFirst(propertySource);
//如果公用配置文件没有配置的则使用本项目的配置文件
configurableEnvironment.getPropertySources().addLast(newPropertySource);
} catch (Exception e) {
e.printStackTrace();
}
}
private static String getVersionFileName(File dir) {
String version="";
List<String> fileNames = new ArrayList<>();
if (dir == null || !dir.exists() || !dir.isDirectory()) {
return version;
}
File[] files = dir.listFiles();
if (files != null) {
for (File file : files) {
if (file.isFile() && file.getName().endsWith(".txt")) {
fileNames.add(file.getName());
}
}
}
if (!fileNames.isEmpty()) {
version = fileNames.get(0).replace(".txt", "");
}
return version;
}
}

@ -0,0 +1,46 @@
package com.nmggs.query.common.emnu;
import java.util.Arrays;
import java.util.List;
/**
* @author: shuguang
* @date: 20221010 17:13
* @description:
*/
public class Constant {
/**
* 1-sqlserver 2-oracle3-4-mysql
*/
public static final String STR_ONE = "1";
public static final String STR_TWO = "2";
public static final String STR_THREE = "3";
public static final String STR_FOUR = "4";
public static final String STR_ZERO = "0";
public static final String STR_TEN = "10";
public static final Integer INT_10000 = 10000;
public static final String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
public static final String YYYYMMDD = "yyyyMMdd";
public static final String YYYYMMDDHH = "yyyyMMddHH";
public static final String YYMMDD = "yyMMdd";
public static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
public static final String YYYY_MM_DD = "yyyy-MM-dd";
public static final String APP_KEY = "2Z6hOpl5kNYWAzr8PeA5";
public static final String APP_SECRET = "sM}[(1H|EW!x&,GE8_]:[TaN8GOl10vQ}iN1s~hW";
public static final String UTF_8 = "UTF-8";
public static final String DCPC_PAY_ = "DCPC_PAY_";
public static final String HTTP = "http://";
public static final String STR_COLON = ":";
public static final String STR_SLASH = "/";
/**
*
*/
public static final String INTRANET_MOBILE_WEIGH = "GetDataInterface/ReceptionMobileWeighInfo";
public static final String INTRANET_DCPC_GET_DATA = "GetDataInterface/getData";
public static final String INTRANET_DCPC_BASE_INFO_QUERY_EX_STATION = "GetDataInterface/baseinfo/QueryExStationTrans";
public static final String INTRANET_DCPC_BASE_INFO_MIN_PATH = "GetDataInterface/baseinfo/minPath";
public static final String INTRANET_DCPC_BASE_INFO_GANTRY_INFO = "GetDataInterface/baseinfo/gantryinfo";
public static final String INTRANET_DCPC_BASE_INFO_GANTRY_FEE = "GetDataInterface/baseinfo/gantryfee";
public static final String INTRANET_ZDYH_GET_EQUIPMENT_INFO = "GetDataInterface/ZDYH/getEquipmentInfo";
}

@ -0,0 +1,73 @@
package com.nmggs.query.common.emnu;
/**
* @author: shuguang
* @date: 20221016 17:24
* @description:
*/
public enum MessageEnum {
/**
*
*/
("0", "成功"),
/**
*
*/
("701", "鉴权码不存在"),
md5("702", "md5校验失败"),
POST("703", "POST参数校验失败"),
("704", "请求文件名参数校验失败"),
("705", "请求数据不存在"),
("706", "当前数据已为最新"),
("707", "最小费额文件不存在"),
("10001", "检测数据序号不能为空"),
("10002", "请求类型错误"),
/**
*
*/
("20001", "复制文件失败"),
("20002", "文件移动重命名失败"),
("20003", "返回数据格式错误"),
("20004", "查询数据失败"),
("20005", "插入数据失败"),
("20006", "登录鉴权失败"),
("20007", "数据库连接异常"),
sql("20008", "数据库执行sql失败"),
("20009", "推送省内黑名单数据失败"),
("20010", "获取逃费记录数据失败"),
("20011", "生成密钥失败"),
("20012", "加密失败"),
("20013", "解密失败"),
("20014", "请求接口失败"),
("20015", "文件加密失败"),
("20016", "接收移动称重数据异常"),
json("20017", "转换json数据异常"),
("99999","操作失败"),
;
private String code;
private String message;
MessageEnum(String code, String message) {
this.code = code;
this.message = message;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}

@ -0,0 +1,49 @@
package com.nmggs.query.common.exception;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
*
*/
/**
* @author: shuguang
* @date: 20221015 16:27
* @description:
*/
@EqualsAndHashCode(callSuper = true)
@Data
public class PPException extends RuntimeException{
/**
*
*/
private String msg_code;
/**
*
*/
private String msg_info;
public PPException(String msg_code, String msg_info) {
super(msg_code);
this.msg_code = msg_code;
this.msg_info = msg_info;
}
public PPException(String message, String msg_code, String msg_info) {
super(message);
this.msg_code = msg_code;
this.msg_info = msg_info;
}
public PPException(String message, Throwable cause, String msg_code, String msg_info) {
super(message, cause);
this.msg_code = msg_code;
this.msg_info = msg_info;
}
public PPException(Throwable cause, String msg_code, String msg_info) {
super(cause);
this.msg_code = msg_code;
this.msg_info = msg_info;
}
}

@ -0,0 +1,40 @@
package com.nmggs.query.common.exception;
import com.alibaba.fastjson2.JSON;
import com.nmggs.query.common.emnu.MessageEnum;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
/**
* @author: shuguang
* @date: 20221011 16:27
* @description:
*/
@RestControllerAdvice
@Slf4j
public class PPExceptionHandler {
/**
*
*/
@ExceptionHandler(PPException.class)
public <T> T handlePPException(PPException e) {
Result res = Result.error(e.getMsg_code(), e.getMsg_info());
log.error("异常处理模块出参:{}", JSON.toJSONString(res));
return (T) JSON.toJSONString(res);
}
/**
*
*/
@ExceptionHandler(Exception.class)
public <T> T handleException(Exception e) {
log.info(e.getMessage(),e);
Result res = Result.error(MessageEnum..getCode(), MessageEnum..getMessage());
log.error("异常处理模块出参:{}", JSON.toJSONString(res));
return (T) JSON.toJSONString(res);
}
}

@ -0,0 +1,43 @@
package com.nmggs.query.common.exception;
import com.nmggs.query.common.emnu.MessageEnum;
import lombok.Data;
/**
* @author: shuguang
* @date: 20221016 16:01
* @description:
*/
@Data
public class Result<T> {
private String msg_code;
private String msg_info;
private T data;
public Result() {
}
public Result(T data) {
this.data = data;
}
public static Result success() {
Result result = new Result<>();
result.setMsg_code(MessageEnum..getCode());
result.setMsg_info(MessageEnum..getMessage());
return result;
}
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>(data);
result.setMsg_code(MessageEnum..getCode());
result.setMsg_info(MessageEnum..getMessage());
return result;
}
public static Result error(String code, String msg) {
Result result = new Result();
result.setMsg_code(code);
result.setMsg_info(msg);
return result;
}
}

@ -0,0 +1,84 @@
package com.nmggs.query.common.utils;
import org.springframework.util.ClassUtils;
import java.io.UnsupportedEncodingException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.net.SocketException;
import java.net.URLDecoder;
import java.net.UnknownHostException;
import java.util.Enumeration;
import java.util.Objects;
import java.util.Properties;
public class PathUtil {
public static String TomcatPath = System.getProperty("catalina.home");
public static String webappsPath;
public static String applicationPath;
public static String applicationTextPath;
public static String projectApplicationPath = Objects.requireNonNull(Objects.requireNonNull(ClassUtils.getDefaultClassLoader()).getResource("")).getPath() + "static/application.properties";
public static String uploadPath;
public static String hostAddress;
public static String tomcatUserXMLPath;
public static String versionPath;
public static String webName = "GetDataInterface";
public static String downFile;
/**
*
*/
public static String encryptedFile;
/**
*
*/
public static String decryptedFile;
public static String downZipInsertBackup;
/**
* zipjson
*/
public static String unZip;
static {
Properties props = System.getProperties();
String os = props.getProperty("os.name").toLowerCase();
try {
if (os.startsWith("win")) {
webappsPath = java.net.URLDecoder.decode(TomcatPath + "\\webapps\\", "utf-8");
uploadPath = java.net.URLDecoder.decode("\\uploadfiles\\" + webName, "utf-8");
downFile = java.net.URLDecoder.decode(uploadPath + "\\downFile\\", "utf-8");
encryptedFile = java.net.URLDecoder.decode(uploadPath + "\\encryptedFile\\", "utf-8");
decryptedFile = java.net.URLDecoder.decode(uploadPath + "\\decryptedFile\\", "utf-8");
unZip = java.net.URLDecoder.decode(uploadPath + "\\unZip\\", "utf-8");
downZipInsertBackup = java.net.URLDecoder.decode(uploadPath + "\\downZipInsertBackup\\", "utf-8");
if (projectApplicationPath.charAt(0) == '/' || projectApplicationPath.charAt(0) == '\\') {
projectApplicationPath = java.net.URLDecoder.decode(projectApplicationPath.substring(1), "utf-8");
}
versionPath = URLDecoder.decode(Objects.requireNonNull(ClassUtils.getDefaultClassLoader().getResource("")).getPath(), "UTF-8") + "version/";
} else {
webappsPath = java.net.URLDecoder.decode(TomcatPath + "/webapps/", "utf-8");
uploadPath = java.net.URLDecoder.decode("/uploadfiles/" + webName, "utf-8");
downFile = java.net.URLDecoder.decode(uploadPath + "/downFile/", "utf-8");
encryptedFile = java.net.URLDecoder.decode(uploadPath + "/encryptedFile/", "utf-8");
decryptedFile = java.net.URLDecoder.decode(uploadPath + "/decryptedFile/", "utf-8");
unZip = java.net.URLDecoder.decode(uploadPath + "/unZip/", "utf-8");
downZipInsertBackup = java.net.URLDecoder.decode(uploadPath + "/downZipInsertBackup/", "utf-8");
versionPath = Objects.requireNonNull(ClassUtils.getDefaultClassLoader().getResource("")).getPath() + "version/";
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
applicationPath = webappsPath + "application.properties";
applicationTextPath = webappsPath + "/applicationText.properties";
tomcatUserXMLPath = TomcatPath + "/conf/tomcat-users.xml";
try {
hostAddress = Inet4Address.getLocalHost().getHostAddress();
} catch (UnknownHostException e) {
throw new RuntimeException(e);
}
}
}

@ -0,0 +1,353 @@
package com.nmggs.query.common.utils;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Properties;
public class PropertiesUtil {
public static String getValue(String key) {
String path = PathUtil.applicationPath;
FileInputStream fIn = null;
InputStreamReader in = null;
try {
// File updateFile = new File(path);
Properties properties = new Properties();
// BufferedReader bf = new BufferedReader(new InputStreamReader(new FileInputStream(path), "gb2312"));
fIn = new FileInputStream(path);
in = new InputStreamReader(fIn, "UTF-8");
BufferedReader bf = new BufferedReader(in);
properties.load(bf);
return properties.getProperty(key);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (fIn != null) {
fIn.close();
}
if (in != null) {
in.close();
}
} catch (Exception e) {
}
}
return "";
}
//目标文件
public File file;
//目标路径
public String path;
//默认字符编码
public String charset = "UTF-8";
//文件的每一行
public String[] lines;
//注释符
public static final String ANNOTATION_CHAR = "#";
public PropertiesUtil(File file) throws IOException {
this.file = file;
this.lines = getFileLines(file);
}
public PropertiesUtil(String path) throws IOException {
this.path = path;
this.lines = getFileLines(path);
}
/*
*
*
* @param key
* @return: java.lang.String
*/
public String get(String key) {
for (String line : lines) {
if (hasKey(line, key)) {
return getLineValue(line);
}
}
return null;
}
/**
*
*
* @param key
* @param value
* @param descriptions
* @return: boolean
*/
public boolean add(String key, String value, String... descriptions) {
List<String> lineList = new ArrayList<>(Arrays.asList(lines));
for (String description : descriptions) {
lineList.add(ANNOTATION_CHAR + description);
}
lineList.add(key.trim() + "=" + value.trim());
return commit(lineList.toArray(new String[0]));
}
/**
*
*
* @param key
* @param value
* @return: boolean
*/
public boolean set(String key, String value) {
boolean isHave = false;
for (int i = 0; i < lines.length; i++) {
if (hasKey(lines[i], key)) {
isHave = true;
lines[i] = key + "=" + value;
}
}
if (!isHave) {
add(key, value);
}
return commit(lines);
}
/**
*
*
* @param key
* @param value
* @return: boolean
*/
public boolean set(String key, String value, String... descriptions) {
boolean isHave = false;
for (int i = 0; i < lines.length; i++) {
if (hasKey(lines[i], key)) {
isHave = true;
lines[i] = key + "=" + value;
List<String> lineList = new ArrayList<>(Arrays.asList(lines));
for (String description : descriptions) {
while (1 == 1) {
if (i - 1 >= 0 && lineList.get(i - 1).toString().contains("#")) {
lineList.remove(i - 1);
i = i - 1;
} else {
break;
}
}
lineList.add(i, ANNOTATION_CHAR + description);
}
lines = lineList.toArray(new String[0]);
break;
}
}
if (!isHave) {
add(key, value, descriptions);
}
return commit(lines);
}
/*
*
*
* @param key
* @return: boolean
*/
public boolean delete(String key) {
List<String> lineList = new ArrayList<>(Arrays.asList(lines));
lineList.removeIf(line -> hasKey(line, key));
return commit(lineList.toArray(new String[0]));
}
/*
*
*
* @param lines
* @return: boolean
*/
public boolean commit(String[] lines) {
synchronized (this) {
this.lines = lines;
try (BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), charset))) {
StringBuilder data = new StringBuilder();
for (String line : lines) {
data.append(line).append('\n');
}
bufferedWriter.write(data.toString());
return true;
} catch (IOException e) {
e.printStackTrace();
}
}
return false;
}
/*
* key
*
* @param line
* @return: java.lang.String
*/
public String getLineKey(String line) {
return line.substring(0, line.indexOf('=')).trim();
}
/**
* value
*
* @param line
* @return: java.lang.String
*/
public String getLineValue(String line) {
return line.substring(line.indexOf('=') + 1).trim();
}
/**
* ( # = ) true false
*
* @return: boolean
*/
public boolean isValidLine(String line) {
return !line.trim().startsWith("#") && line.contains("=");
}
/**
* key
*
* @param line
* @param key
* @return: boolean
*/
public boolean hasKey(String line, String key) {
return isValidLine(line) && key.equals(getLineKey(line));
}
public boolean hasKey(String key) {
List<String> lineList = new ArrayList<>(Arrays.asList(lines));
for (int i = 0; i < lineList.size(); i++) {
String line = lineList.get(i);
if (hasKey(line, key)) {
return true;
}
if (i == lineList.size() - 1) {
return false;
}
}
return false;
}
/**
*
*
* @param file
* @return: java.lang.String[]
*/
public String[] getFileLines(File file) {
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file), charset));) {
String line;
List<String> lines = new ArrayList<>();
while ((line = bufferedReader.readLine()) != null) {
lines.add(line);
}
return lines.toArray(new String[0]);
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
/**
* resource resourceIOException
*
* @param path
* @return: java.lang.String[]
*/
public String[] getFileLines(String path) throws IOException {
File file = new File(path);
if (file.isFile()) {
this.file = file;
return getFileLines(file);
} else {
URL url = getClass().getClassLoader().getResource(path);
if (url == null) {
throw new FileNotFoundException("resource path is not found");
}
file = new File(url.getPath());
if (file.isFile()) {
this.file = file;
return getFileLines(file);
} else {
throw new FileNotFoundException("properties file is not found");
}
}
}
// Type conversion
public boolean getBoolean(String key) {
return Boolean.parseBoolean(get(key));
}
public int getInt(String key) {
return Integer.parseInt(get(key));
}
public float getFloat(String key) {
return Float.parseFloat(get(key));
}
public double getDouble(String key) {
return Double.parseDouble(get(key));
}
public short getShort(String key) {
return Short.parseShort(get(key));
}
public long getLong(String key) {
return Long.parseLong(get(key));
}
//getter and setter
public File getFile() {
return file;
}
public void setFile(File file) {
this.file = file;
}
public String getCharset() {
return charset;
}
public void setCharset(String charset) {
this.charset = charset;
}
public String[] getLines() {
return lines;
}
public void setLines(String[] lines) {
this.lines = lines;
}
}

@ -0,0 +1,95 @@
package com.nmggs.query.common.utils;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class TokenUtil {
/**
* token
*/
private static String TOKEN_SECRET;
/**
*
*/
private static long EXPIRE_DATE;
static {
String SystemType = PropertiesUtil.getValue("SystemType");
if (StringUtils.isEmpty(SystemType) || SystemType.equals("0") || SystemType.equals("2")) {
TOKEN_SECRET = "apiManager";
} else if (SystemType.equals("1")) {
TOKEN_SECRET = "5267915";
}
String tokenOutTime = PropertiesUtil.getValue("tokenOutTime");
if (StringUtils.isEmpty(tokenOutTime)) {
tokenOutTime = "30";
}
EXPIRE_DATE = Long.parseLong(tokenOutTime) * 60 * 1000;
}
public static boolean verify(String token) {
/**
* @desc tokentrue
* @params [token]
**/
try {
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
JWTVerifier verifier = JWT.require(algorithm).build();
verifier.verify(token);
return true;
} catch (Exception e) {
log.error("验证token异常", e);
return false;
}
}
public static String reToken(String token, HttpServletRequest request) {
/**
* @desc tokentrue
* @params [token]
**/
try {
Algorithm algorithm = Algorithm.HMAC256(TOKEN_SECRET);
JWTVerifier verifier = JWT.require(algorithm).build();
DecodedJWT jwt = verifier.verify(token);
String Man = jwt.getClaim("Man").toString().replaceAll("\\\"", "");
String Manid = jwt.getClaim("Manid").toString().replaceAll("\\\"", "");
String Manno = jwt.getClaim("Manno").toString().replaceAll("\\\"", "");
//过期时间
Date date = new Date(System.currentTimeMillis() + EXPIRE_DATE);
//秘钥及加密算法
//设置头部信息
Map<String, Object> header = new HashMap<>();
header.put("typ", "JWT");
header.put("alg", "HS256");
token = JWT.create()
.withHeader(header)
.withClaim("Man", Man)
.withClaim("Manid", Manid)
.withClaim("Manno", Manno)
.withExpiresAt(date)
.sign(algorithm);
HttpSession session = request.getSession();
session.setAttribute("token", token);
session.setAttribute("Man", Man);
session.setAttribute("Manid", Manid);
session.setAttribute("Manno", Manno);
return token;
} catch (Exception e) {
log.error("获取token异常", e);
return "";
}
}
}

@ -0,0 +1,14 @@
package com.nmggs.query.common.utils;
import java.util.UUID;
/**
* @author: shuguang
* @date: 20221025 18:01
* @description: uuid
*/
public class UuidUtil {
public static String getUuid() {
return UUID.randomUUID().toString().replace("-","");
}
}

@ -0,0 +1,279 @@
package com.nmggs.query.controller;
import com.nmggs.query.common.config.ExecutionTimeLogger;
import com.nmggs.query.common.utils.PropertiesUtil;
import com.nmggs.query.common.utils.UuidUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponentsBuilder;
import javax.annotation.Resource;
import java.util.Map;
/**
* @author: shuguang
* @date: 20250909 11:33
* @description:
*/
@RestController
@Slf4j
public class InForwardOutController {
@Resource
private RestTemplate restTemplate;
/**
*DCPC
*/
@GetMapping("/DCPC/getDCPCData")
@ExecutionTimeLogger
public ResponseEntity<String> getDCPCData(@RequestHeader Map<String, String> headers,
@RequestParam Map<String, String> params) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求参数:{}", uuid, headers, params);
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造查询参数
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
params.forEach(queryParams::add);
// 构造请求体
HttpEntity<Void> requestEntity = new HttpEntity<>(requestHeaders);
// 构造完整 URL
String url = PropertiesUtil.getValue("reconciliationInterfaceUrl");
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(url);
queryParams.forEach((key, value) -> builder.queryParam(key, value.toArray(new String[0])));
// 调用接口
ResponseEntity<String> response = restTemplate.exchange(
builder.build().toUri(),
HttpMethod.GET,
requestEntity,
String.class
);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, url, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
/**
*DCPC
*/
@GetMapping("/DCPC/verify")
@ExecutionTimeLogger
public ResponseEntity<String> verify(@RequestHeader Map<String, String> headers,
@RequestParam Map<String, String> params) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求参数:{}", uuid, headers, params);
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造查询参数
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
params.forEach(queryParams::add);
// 构造请求体
HttpEntity<Void> requestEntity = new HttpEntity<>(requestHeaders);
// 构造完整 URL
String verifyInterfaceUrl = PropertiesUtil.getValue("verifyInterfaceUrl");
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(verifyInterfaceUrl);
queryParams.forEach((key, value) -> builder.queryParam(key, value.toArray(new String[0])));
// 调用接口
ResponseEntity<String> response = restTemplate.exchange(
builder.build().toUri(),
HttpMethod.GET,
requestEntity,
String.class
);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, verifyInterfaceUrl, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
/**
*token
*/
@PostMapping("/ZDYH/verifyToken")
@ExecutionTimeLogger
public ResponseEntity<String> verifyToken(@RequestHeader Map<String, String> headers,
@RequestParam Map<String, String> params) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}", uuid, headers, params);
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
requestHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
// 构造请求体
MultiValueMap<String, String> formBody = new LinkedMultiValueMap<>();
params.forEach(formBody::add);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(formBody, requestHeaders);
// 调用接口
String loginAuthenticationUrl = PropertiesUtil.getValue("loginAuthenticationUrl");
ResponseEntity<String> response = restTemplate.postForEntity(loginAuthenticationUrl, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, loginAuthenticationUrl, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
/**
*
*/
@PostMapping("/ZDYH/sendProBlackListToInterface")
@ExecutionTimeLogger
public ResponseEntity<String> sendProBlackListToInterface(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{}",uuid, headers);
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String sendProBlackListUrl = PropertiesUtil.getValue("sendProBlackListUrl");
ResponseEntity<String> response = restTemplate.postForEntity(sendProBlackListUrl, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, sendProBlackListUrl, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
/**
*
*/
@GetMapping("/ZDYH/getFeeEvasionInfo")
@ExecutionTimeLogger
public ResponseEntity<String> getFeeEvasionInfo(@RequestHeader Map<String, String> headers,
@RequestParam Map<String, String> params) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求参数:{}", uuid, headers, params);
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造查询参数
MultiValueMap<String, String> queryParams = new LinkedMultiValueMap<>();
params.forEach(queryParams::add);
// 构造请求体
HttpEntity<Void> requestEntity = new HttpEntity<>(requestHeaders);
// 构造完整 URL
String sendProBlackListUrl = PropertiesUtil.getValue("sendProBlackListUrl");
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(sendProBlackListUrl);
queryParams.forEach((key, value) -> builder.queryParam(key, value.toArray(new String[0])));
// 调用接口
ResponseEntity<String> response = restTemplate.exchange(
builder.build().toUri(),
HttpMethod.GET,
requestEntity,
String.class
);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, sendProBlackListUrl, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
@PostMapping("/DCPC/getLanePass")
@ExecutionTimeLogger
public ResponseEntity<String> getLanePass(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String dCPCLanePassInterfaceUrl = PropertiesUtil.getValue("DCPCLanePassInterfaceUrl");
ResponseEntity<String> response = restTemplate.postForEntity(dCPCLanePassInterfaceUrl, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, dCPCLanePassInterfaceUrl, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
@PostMapping("/DCPC/getFeepay")
@ExecutionTimeLogger
public ResponseEntity<String> getFeepay(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String dCPCFeePayInterfaceUrl = PropertiesUtil.getValue("DCPCFeePayInterfaceUrl");
ResponseEntity<String> response = restTemplate.postForEntity(dCPCFeePayInterfaceUrl, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, dCPCFeePayInterfaceUrl, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
@PostMapping("/DCPC/getRunawayfeepay")
@ExecutionTimeLogger
public ResponseEntity<String> getRunawayfeepay(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String dCPCRunAwayInterfaceUrl = PropertiesUtil.getValue("DCPCRunAwayInterfaceUrl");
ResponseEntity<String> response = restTemplate.postForEntity(dCPCRunAwayInterfaceUrl, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, dCPCRunAwayInterfaceUrl, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
@PostMapping("/DCPC/getReversalfeepay")
@ExecutionTimeLogger
public ResponseEntity<String> getReversalfeepay(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String dCPCRefundInterfaceUrl = PropertiesUtil.getValue("DCPCRefundInterfaceUrl");
ResponseEntity<String> response = restTemplate.postForEntity(dCPCRefundInterfaceUrl, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, dCPCRefundInterfaceUrl, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
}

@ -0,0 +1,193 @@
package com.nmggs.query.controller;
import com.nmggs.query.common.config.ExecutionTimeLogger;
import com.nmggs.query.common.emnu.Constant;
import com.nmggs.query.common.utils.PropertiesUtil;
import com.nmggs.query.common.utils.UuidUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.Map;
/**
* @author: shuguang
* @date: 20250909 11:43
* @description:
*/
@RestController
@Slf4j
public class OutForwardInController {
@Resource
private RestTemplate restTemplate;
@PostMapping("/ZDYH/getEquipmentInfo")
@ExecutionTimeLogger
public ResponseEntity<String> getEquipmentInfo(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
String intranetIp = PropertiesUtil.getValue("IntranetIp");
String intranetPort = PropertiesUtil.getValue("IntranetPort");
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String url = urlSplicing(intranetIp, intranetPort,Constant.INTRANET_ZDYH_GET_EQUIPMENT_INFO);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, url, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
@PostMapping("/DCPC/baseinfo/gantryfee")
@ExecutionTimeLogger
public ResponseEntity<String> gantryFee(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
String intranetIp = PropertiesUtil.getValue("IntranetIp");
String intranetPort = PropertiesUtil.getValue("IntranetPort");
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String url = urlSplicing(intranetIp, intranetPort,Constant.INTRANET_DCPC_BASE_INFO_GANTRY_FEE);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{}", uuid, url, response.getStatusCode());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
@PostMapping("/DCPC/baseinfo/gantryinfo")
@ExecutionTimeLogger
public ResponseEntity<String> gantryinfo(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
String intranetIp = PropertiesUtil.getValue("IntranetIp");
String intranetPort = PropertiesUtil.getValue("IntranetPort");
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String url = urlSplicing(intranetIp, intranetPort,Constant.INTRANET_DCPC_BASE_INFO_GANTRY_INFO);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{}", uuid, url, response.getStatusCode());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
@PostMapping("/DCPC/baseinfo/minPath")
@ExecutionTimeLogger
public ResponseEntity<String> minPath(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
String intranetIp = PropertiesUtil.getValue("IntranetIp");
String intranetPort = PropertiesUtil.getValue("IntranetPort");
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String url = urlSplicing(intranetIp, intranetPort,Constant.INTRANET_DCPC_BASE_INFO_MIN_PATH);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{}", uuid, url, response.getStatusCode());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
@PostMapping("/DCPC/baseinfo/QueryExStationTrans")
@ExecutionTimeLogger
public ResponseEntity<String> queryExStationTrans(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
String intranetIp = PropertiesUtil.getValue("IntranetIp");
String intranetPort = PropertiesUtil.getValue("IntranetPort");
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String url = urlSplicing(intranetIp, intranetPort,Constant.INTRANET_DCPC_BASE_INFO_QUERY_EX_STATION);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{}", uuid, url, response.getStatusCode());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
@PostMapping("/DCPC/getData")
@ExecutionTimeLogger
public ResponseEntity<String> getData(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
String intranetIp = PropertiesUtil.getValue("IntranetIp");
String intranetPort = PropertiesUtil.getValue("IntranetPort");
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String url = urlSplicing(intranetIp, intranetPort,Constant.INTRANET_DCPC_GET_DATA);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{}", uuid, url, response.getStatusCode());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
@PostMapping("/ReceptionMobileWeighInfo")
@ExecutionTimeLogger
public ResponseEntity<String> receptionMobileWeighInfo(@RequestHeader Map<String, String> headers, @RequestBody Map<String, Object> body) {
String uuid = UuidUtil.getUuid();
log.info("[uuid:{}]-接收到请求,请求头:{},请求体:{}",uuid, headers, body);
String intranetIp = PropertiesUtil.getValue("IntranetIp");
String intranetPort = PropertiesUtil.getValue("IntranetPort");
// 构造请求头
HttpHeaders requestHeaders = new HttpHeaders();
headers.forEach(requestHeaders::add);
// 构造请求体
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(body, requestHeaders);
// 调用接口
String url = urlSplicing(intranetIp, intranetPort,Constant.INTRANET_MOBILE_WEIGH);
ResponseEntity<String> response = restTemplate.postForEntity(url, requestEntity, String.class);
// 返回接口的响应
log.info("[uuid:{}]-请求接口{}成功,响应状态码:{},响应体:{}", uuid, url, response.getStatusCode(), response.getBody());
return new ResponseEntity<>(response.getBody(), response.getStatusCode());
}
private String urlSplicing(String fortressIp, String fortressPort, String interfaceAddress) {
return Constant.HTTP + fortressIp + Constant.STR_COLON + fortressPort + Constant.STR_SLASH+ interfaceAddress;
}
}

@ -0,0 +1,38 @@
package com.nmggs.query.entity;
import com.nmggs.query.common.emnu.MessageEnum;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* @author: shuguang
* @date: 20221114 14:54
* @description:
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Res implements Serializable {
private static final long serialVersionUID = 1L;
private Integer code;
private Object data = "";
private String message = "";
public static Res success() {
Res result = new Res();
result.setCode(Integer.valueOf(MessageEnum..getCode()));
result.setMessage(MessageEnum..getMessage());
return result;
}
public static Res success(Object data) {
Res result = new Res();
result.setCode(Integer.valueOf(MessageEnum..getCode()));
result.setMessage(MessageEnum..getMessage());
result.setData(data);
return result;
}
}

@ -0,0 +1,21 @@
package com.nmggs.query.entity;
import lombok.Data;
/**
* @author: shuguang
* @date: 20250820 9:22
* @description:
*/
@Data
public class ResData {
/**
*
*/
private String key;
/**
*
*/
private String data;
}

@ -0,0 +1,102 @@
package com.nmggs.query.test;
/**
* @author: shuguang
* @date: 20250523 14:56
* @description:
*/
public class GreenQRInfo {
public static final int CARD_TYPE_PASS = 2;
public static final int CARD_TYPE_TICKET = 5;
public static final int CARD_TYPE_STORE = 22;
public static final int CARD_TYPE_TOLLY = 23;
public static final int MEDIA_TYPE_OBU = 1;
public static final int MEDIA_TYPE_CPC = 2;
public static final int MEDIA_TYPE_TICKET = 3;
public static final int MEDIA_TYPE_UNKNOWN = 9;
public static final int PAY_TYPE_STORE = 1;
public static final int PAY_TYPE_TOLLY = 2;
public static String getVehPlateAll(String vehPlate, int vehPlateColor) {
if (vehPlate.isEmpty()) {
return "";
}
return vehPlate + "_" + vehPlateColor;
}
public static String getGreenQRInfo(String vehPlate, int vehPlateColor, String enStationId, String exStationId,
int enWeight, int exWeight, int cardTP, String id, String passId,
long exTime, int payType, int cash, int inCash, int vehSign, String appointId, int provCount) {
int mediaType = cardTP2MediaType(cardTP);
int transPayType = 0;
if (payType == PAY_TYPE_STORE || payType == PAY_TYPE_TOLLY) {
transPayType = 2;
if (cardTP == CARD_TYPE_TOLLY || cardTP == CARD_TYPE_STORE) {
transPayType = 1;
}
}
String sVehSign = "0xFF";
if (!(appointId.isEmpty() || "0".equals(appointId))) {
sVehSign = String.format("0x%02X", vehSign);
}
String sExWeight = "";
if (exWeight > 1000) {
sExWeight = Integer.toString(exWeight);
}
if (transPayType != 0) {
return String.format("%s|%s|%s|%d|%s|%d|%s|%s|%s|%d|%d|%d|%s|%d",
getVehPlateAll(vehPlate, vehPlateColor), enStationId, exStationId, enWeight, sExWeight, mediaType,
id, passId, DateTime2Str(exTime), transPayType, inCash, cash, sVehSign, provCount);
} else {
return String.format("%s|%s|%s|%d|%s|%d|%s|%s|%s|%s|%d|%d|%s|%d",
getVehPlateAll(vehPlate, vehPlateColor), enStationId, exStationId, enWeight, sExWeight, mediaType,
id, passId, DateTime2Str(exTime), "", cash, cash, sVehSign, provCount);
}
}
public static int cardTP2MediaType(int cardTP) {
switch (cardTP) {
case CARD_TYPE_STORE:
case CARD_TYPE_TOLLY:
return MEDIA_TYPE_OBU;
case CARD_TYPE_PASS:
return MEDIA_TYPE_CPC;
case CARD_TYPE_TICKET:
return MEDIA_TYPE_TICKET;
default:
return MEDIA_TYPE_UNKNOWN;
}
}
public static String DateTime2Str(long exTime) {
return String.format("%tF %<tT", exTime);
}
public static void main(String[] args) {
String vehPlate = "蒙A12345";
int vehPlateColor = 1;
String enStationId = "Station1";
String exStationId = "Station2";
int enWeight = 1000;
int exWeight = 1500;
int cardTP = CARD_TYPE_STORE;
String id = "ID123";
String passId = "Pass123";
long exTime = System.currentTimeMillis();
int payType = PAY_TYPE_STORE;
int cash = 100;
int inCash = 50;
int vehSign = 1;
String appointId = "0";
int provCount = 1;
String result = getGreenQRInfo(vehPlate, vehPlateColor, enStationId, exStationId, enWeight, exWeight, cardTP, id, passId, exTime, payType, cash, inCash, vehSign, appointId, provCount);
System.out.println(result);
}
}

@ -0,0 +1,2 @@
org.springframework.boot.env.EnvironmentPostProcessor=\
com.nmggs.query.common.config.MyEnvironmentPostProcessor

@ -0,0 +1,255 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL如果设置为WARN则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时配置文件如果发生改变将会被重新加载默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔如果没有给出时间单位默认单位是毫秒。当scan为true时此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时将打印出logback内部日志信息实时查看logback运行状态。默认值为false。 -->
<configuration scan="false" scanPeriod="10 seconds" debug="true">
<springProperty scope="context" name="logLevel" source="spring.logback.level"/>
<springProperty scope="context" name="APP_NAME" source="spring.logback.appName"/>
<springProperty scope="context" name="myMaxHistory" source="spring.logback.myMaxHistory"/>
<springProperty scope="context" name="myFileSize" source="spring.logback.myFileSize"/>
<springProperty scope="context" name="myTotalSizeCap" source="spring.logback.myTotalSizeCap"/>
<springProperty scope="context" name="logPath" source="spring.logback.logPath"/>
<contextName>${APP_NAME}</contextName>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!--彩色日志输出格式-->
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!--非彩色日志输出格式-->
<property name="PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level 服务名称:${APP_NAME} %logger{36} - %msg%n"/>
<!--dev文件路径src同级目录logs,如果上级目录不存在会自动创建-->
<property name="DEV_FILE_PATH" value="${logPath}/${APP_NAME}/"/>
<!-- pro文件路径 -->
<property name="PRO_FILE_PATH" value="${logPath}/${APP_NAME}/"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%class:%line] %logger{50} - %m %n</pattern>-->
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>${PATTERN}</pattern>
<!-- <charset>UTF-8</charset>-->
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 按照每天生成输出日志文件 -->
<appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!--格式化输出:%d表示日期%thread表示线程%-5level级别从左显示五个字符宽度%logger{36}logger是class的全名,后面的数字代表限制最长的字符,%msg日志消息%n换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<!--滚动策略按照时间滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily 文件名称 -->
<fileNamePattern>${DEV_FILE_PATH}/output-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${myMaxHistory}</maxHistory>
<maxFileSize>${myFileSize}</maxFileSize>
<totalSizeCap>${myTotalSizeCap}</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${DEV_FILE_PATH}/log_info_%d{yyyy-MM-dd_HH}.%i.txt</fileNamePattern>
<!-- 当文件总大小超过2GB先删除30天内最早的文件。不会删除30天外的文件。 -->
<maxHistory>${myMaxHistory}</maxHistory>
<maxFileSize>${myFileSize}</maxFileSize>
<totalSizeCap>${myTotalSizeCap}</totalSizeCap>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${DEV_FILE_PATH}/log_error_%d{yyyy-MM-dd_HH}.%i.txt</fileNamePattern>
<!-- 当文件总大小超过1GB先删除10天内最早的文件。不会删除10天外的文件。 -->
<maxHistory>${myMaxHistory}</maxHistory>
<maxFileSize>${myFileSize}</maxFileSize>
<totalSizeCap>${myTotalSizeCap}</totalSizeCap>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${DEV_FILE_PATH}/log_warn_%d{yyyy-MM-dd_H}.%i.txt</fileNamePattern>-->
<!-- &lt;!&ndash; 每产生一个日志文件该日志文件的保存期限为10天 &ndash;&gt;-->
<!-- <maxHistory>10</maxHistory>-->
<!-- <maxFileSize>20MB</maxFileSize>-->
<!-- <totalSizeCap>500MB</totalSizeCap>-->
<!-- </rollingPolicy>-->
<!-- <append>true</append>-->
<!-- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
<!-- <pattern>${PATTERN}</pattern>-->
<!-- <charset>utf-8</charset>-->
<!-- </encoder>-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>WARN</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
<!-- </appender>-->
<!-- <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${DEV_FILE_PATH}/log_debug_%d{yyyy-MM-dd_H}.%i.txt</fileNamePattern>-->
<!-- &lt;!&ndash; 当文件总大小超过1GB先删除10天内最早的文件。不会删除10天外的文件。 &ndash;&gt;-->
<!-- <maxHistory>${myMaxHistory}</maxHistory>-->
<!-- <maxFileSize>${myFileSize}</maxFileSize>-->
<!-- <totalSizeCap>${myTotalSizeCap}</totalSizeCap>-->
<!-- </rollingPolicy>-->
<!-- <append>true</append>-->
<!-- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
<!-- <pattern>${PATTERN}</pattern>-->
<!-- <charset>utf-8</charset>-->
<!-- </encoder>-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>DEBUG</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
<!-- </appender>-->
<!-- <appender name="SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${DEV_FILE_PATH}/log-sql-%d{yyyy-MM-dd_H}.%i.txt</fileNamePattern>-->
<!-- &lt;!&ndash; 每产生一个日志文件该日志文件的保存期限为3天 &ndash;&gt;-->
<!-- <maxHistory>${myMaxHistory}</maxHistory>-->
<!-- <maxFileSize>${myFileSize}</maxFileSize>-->
<!-- <totalSizeCap>${myTotalSizeCap}</totalSizeCap>-->
<!-- </rollingPolicy>-->
<!-- <append>true</append>-->
<!-- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
<!-- <pattern>${PATTERN}</pattern>-->
<!-- <charset>utf-8</charset>-->
<!-- </encoder>-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>DEBUG</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
<!-- </appender>-->
<!--异步输出-->
<!-- <appender name="DEBUG_ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">-->
<!-- &lt;!&ndash; 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 &ndash;&gt;-->
<!-- <discardingThreshold>0</discardingThreshold>-->
<!-- &lt;!&ndash; 更改默认的队列的深度,该值会影响性能.默认值为256 &ndash;&gt;-->
<!-- <queueSize>2048</queueSize>-->
<!-- <includeCallerData>true</includeCallerData>-->
<!-- &lt;!&ndash; 添加附加的appender,最多只能添加一个 &ndash;&gt;-->
<!-- <appender-ref ref="DEBUG"/>-->
<!-- </appender>-->
<!--异步输出-->
<appender name="ERROR_ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>1024</queueSize>
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="ERROR"/>
</appender>
<!--异步输出-->
<!-- <appender name="WARN_ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">-->
<!-- &lt;!&ndash; 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 &ndash;&gt;-->
<!-- <discardingThreshold>0</discardingThreshold>-->
<!-- &lt;!&ndash; 更改默认的队列的深度,该值会影响性能.默认值为256 &ndash;&gt;-->
<!-- <queueSize>1024</queueSize>-->
<!-- <includeCallerData>true</includeCallerData>-->
<!-- &lt;!&ndash; 添加附加的appender,最多只能添加一个 &ndash;&gt;-->
<!-- <appender-ref ref="WARN"/>-->
<!-- </appender>-->
<!--异步输出-->
<appender name="INFO_ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>2048</queueSize>
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="INFO"/>
</appender>
<!--异步输出-->
<!-- <appender name="SQL_ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">-->
<!-- &lt;!&ndash; 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 &ndash;&gt;-->
<!-- <discardingThreshold>0</discardingThreshold>-->
<!-- &lt;!&ndash; 更改默认的队列的深度,该值会影响性能.默认值为256 &ndash;&gt;-->
<!-- <queueSize>2048</queueSize>-->
<!-- <includeCallerData>true</includeCallerData>-->
<!-- &lt;!&ndash; 添加附加的appender,最多只能添加一个 &ndash;&gt;-->
<!-- <appender-ref ref="SQL"/>-->
<!-- </appender>-->
<!--
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、
以及指定<appender><logger>仅有一个name属性
一个可选的level和一个可选的addtivity属性。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别大小写无关TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
还有一个特俗值INHERITED或者同义词NULL代表强制执行上级的级别。
如果未设置此属性那么当前logger将会继承上级的级别。
addtivity:是否向上级logger传递打印信息。默认是true。
-->
<!-- <logger name="dao" level="ERROR">-->
<!-- <appender-ref ref="SQL"/>-->
<!-- <appender-ref ref="STDOUT"/>-->
<!-- </logger>-->
<root level="${logLevel}">
<appender-ref ref="STDOUT"/>
<appender-ref ref="fileAppender"/>
<appender-ref ref="INFO_ASYNC_LOG"/>
<!-- <appender-ref ref="WARN_ASYNC_LOG"/>-->
<appender-ref ref="ERROR_ASYNC_LOG"/>
<!-- <appender-ref ref="DEBUG_ASYNC_LOG"/>-->
<!-- <appender-ref ref="SQL_ASYNC_LOG"/>-->
</root>
</configuration>

@ -0,0 +1,81 @@
#\u65E5\u5FD7\u9ED8\u8BA4\u914D\u7F6E
spring.logback.appName=FortressGetDataInterface
spring.logback.level=INFO
spring.logback.myMaxHistory=30
spring.logback.myFileSize=10MB
spring.logback.myTotalSizeCap=2GB
#\u7F16\u7801\u8BBE\u7F6E
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8
spring.profiles.active=dev
server.resources.static-locations=classpath:/resources/,classpath:/static/
# \u8FDE\u63A5\u6C60\u914D\u7F6E
spring.datasource.name=com.zaxxer.hikari.HikariConfig
spring.datasource.type=com.zaxxer.hikari.HikariConfig
spring.datasource.hikari.maximum-pool-size=25
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=0
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=300000
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.minimum-idle=1
spring.datasource.hikari.allow-pool-suspension: true
spring.datasource.hikari.register-mbeans: true
spring.datasource.hikari.leak-detection-threshold: 60000
# xml\u5730\u5740
spring.mybatis-plus.mapper-locations=com.nmggs.query.mapper/*Mapper.xml
# \u5B9E\u4F53\u626B\u63CF\uFF0C\u591A\u4E2Apackage\u7528\u9017\u53F7\u6216\u8005\u5206\u53F7\u5206\u9694
#\u81EA\u5DF1\u7684\u5B9E\u4F53\u7C7B\u5730\u5740
spring.mybatis-plus.type-aliases-package=com.nmggs.query.entity
# \u670D\u52A1\u6A21\u5757
# \u70ED\u90E8\u7F72\u5F00\u5173
spring.devtools.restart.enabled=true
#\u91CD\u542F\u76EE\u5F55
spring.devtools.restart.additional-paths=src/main
#redis
spring.session.store-type=none
#spring-session
spring.session.timeout: PT30M
spring.datasource.initialization-mode=always
#\u53BB\u9664\u9644\u4EF6\u5927\u5C0F\u9650\u5236
#\u8BF7\u6C42\u53C2\u6570\u957F\u5EA6
server.tomcat.max-http-form-post-size=10MB
server.max-http-header-size=10MB
#\u6700\u5927\u4E0A\u4F20\u6587\u4EF6\u5927\u5C0F(10MB)
spring.servlet.multipart.max-file-size = -1
spring.servlet.multipart.max-request-size = -1
server.tomcat.max-swallow-size = -1
server.tomcat.max-threads=1000
#\u4E0D\u53EF\u914D\u7F6E\u7684\u914D\u7F6E\u9879
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
logging.level.com.nmgs.ssmpback.mapper=debug
sqlClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
sqlvalidationQuery=SELECT 1
OracleClassName=oracle.jdbc.driver.OracleDriver
OraclevalidationQuery=SELECT 1 from dual
DMClassName=dm.jdbc.driver.DmDriver
DMvalidationQuery=SELECT 1
MySQLClassName=com.mysql.cj.jdbc.Driver
MySQLvalidationQuery=SELECT 1
GoldenDBClassName=com.goldendb.jdbc.Driver
GoldenvalidationQuery=SELECT 1 FROM DUAL
mybatis-plus.configuration.map-underscore-to-camel-case=false
spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
#前端vue
spring.web.resources.static-locations= classpath:/static/

@ -0,0 +1,3 @@
序号 日期 版本号 说明
1 2025年09月09日 1.0.0 堡垒机中间转发内外网请求

@ -0,0 +1,9 @@
Manifest-Version: 1.0
Created-By: IntelliJ IDEA
Built-By: shuguang
Build-Jdk: Oracle OpenJDK version 1.8.0_181
Implementation-Title: FortressGetDataInterface
Implementation-Version: 0.0.1-SNAPSHOT
Implementation-Vendor-Id: com.nmggs
Main-Class: ${start-class}

@ -0,0 +1,2 @@
org.springframework.boot.env.EnvironmentPostProcessor=\
com.nmggs.query.common.config.MyEnvironmentPostProcessor

@ -0,0 +1,255 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL如果设置为WARN则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时配置文件如果发生改变将会被重新加载默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔如果没有给出时间单位默认单位是毫秒。当scan为true时此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时将打印出logback内部日志信息实时查看logback运行状态。默认值为false。 -->
<configuration scan="false" scanPeriod="10 seconds" debug="true">
<springProperty scope="context" name="logLevel" source="spring.logback.level"/>
<springProperty scope="context" name="APP_NAME" source="spring.logback.appName"/>
<springProperty scope="context" name="myMaxHistory" source="spring.logback.myMaxHistory"/>
<springProperty scope="context" name="myFileSize" source="spring.logback.myFileSize"/>
<springProperty scope="context" name="myTotalSizeCap" source="spring.logback.myTotalSizeCap"/>
<springProperty scope="context" name="logPath" source="spring.logback.logPath"/>
<contextName>${APP_NAME}</contextName>
<!-- 彩色日志 -->
<!-- 彩色日志依赖的渲染类 -->
<conversionRule conversionWord="clr" converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
<conversionRule conversionWord="wex"
converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
<conversionRule conversionWord="wEx"
converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
<!--彩色日志输出格式-->
<property name="CONSOLE_LOG_PATTERN"
value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%level){blue} %clr(${PID}){magenta} %clr([%thread]){orange} %clr(%logger){cyan} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!--非彩色日志输出格式-->
<property name="PATTERN"
value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level 服务名称:${APP_NAME} %logger{36} - %msg%n"/>
<!--dev文件路径src同级目录logs,如果上级目录不存在会自动创建-->
<property name="DEV_FILE_PATH" value="${logPath}/${APP_NAME}/"/>
<!-- pro文件路径 -->
<property name="PRO_FILE_PATH" value="${logPath}/${APP_NAME}/"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<!--<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] [%thread] [%class:%line] %logger{50} - %m %n</pattern>-->
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%msg日志消息%n是换行符-->
<pattern>${PATTERN}</pattern>
<!-- <charset>UTF-8</charset>-->
</encoder>
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
</appender>
<!-- 按照每天生成输出日志文件 -->
<appender name="fileAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<!--格式化输出:%d表示日期%thread表示线程%-5level级别从左显示五个字符宽度%logger{36}logger是class的全名,后面的数字代表限制最长的字符,%msg日志消息%n换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
<!--滚动策略按照时间滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- rollover daily 文件名称 -->
<fileNamePattern>${DEV_FILE_PATH}/output-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<maxHistory>${myMaxHistory}</maxHistory>
<maxFileSize>${myFileSize}</maxFileSize>
<totalSizeCap>${myTotalSizeCap}</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${DEV_FILE_PATH}/log_info_%d{yyyy-MM-dd_HH}.%i.txt</fileNamePattern>
<!-- 当文件总大小超过2GB先删除30天内最早的文件。不会删除30天外的文件。 -->
<maxHistory>${myMaxHistory}</maxHistory>
<maxFileSize>${myFileSize}</maxFileSize>
<totalSizeCap>${myTotalSizeCap}</totalSizeCap>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>${DEV_FILE_PATH}/log_error_%d{yyyy-MM-dd_HH}.%i.txt</fileNamePattern>
<!-- 当文件总大小超过1GB先删除10天内最早的文件。不会删除10天外的文件。 -->
<maxHistory>${myMaxHistory}</maxHistory>
<maxFileSize>${myFileSize}</maxFileSize>
<totalSizeCap>${myTotalSizeCap}</totalSizeCap>
</rollingPolicy>
<append>true</append>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>${PATTERN}</pattern>
<charset>utf-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- <appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${DEV_FILE_PATH}/log_warn_%d{yyyy-MM-dd_H}.%i.txt</fileNamePattern>-->
<!-- &lt;!&ndash; 每产生一个日志文件该日志文件的保存期限为10天 &ndash;&gt;-->
<!-- <maxHistory>10</maxHistory>-->
<!-- <maxFileSize>20MB</maxFileSize>-->
<!-- <totalSizeCap>500MB</totalSizeCap>-->
<!-- </rollingPolicy>-->
<!-- <append>true</append>-->
<!-- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
<!-- <pattern>${PATTERN}</pattern>-->
<!-- <charset>utf-8</charset>-->
<!-- </encoder>-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>WARN</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
<!-- </appender>-->
<!-- <appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${DEV_FILE_PATH}/log_debug_%d{yyyy-MM-dd_H}.%i.txt</fileNamePattern>-->
<!-- &lt;!&ndash; 当文件总大小超过1GB先删除10天内最早的文件。不会删除10天外的文件。 &ndash;&gt;-->
<!-- <maxHistory>${myMaxHistory}</maxHistory>-->
<!-- <maxFileSize>${myFileSize}</maxFileSize>-->
<!-- <totalSizeCap>${myTotalSizeCap}</totalSizeCap>-->
<!-- </rollingPolicy>-->
<!-- <append>true</append>-->
<!-- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
<!-- <pattern>${PATTERN}</pattern>-->
<!-- <charset>utf-8</charset>-->
<!-- </encoder>-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>DEBUG</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
<!-- </appender>-->
<!-- <appender name="SQL" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">-->
<!-- <fileNamePattern>${DEV_FILE_PATH}/log-sql-%d{yyyy-MM-dd_H}.%i.txt</fileNamePattern>-->
<!-- &lt;!&ndash; 每产生一个日志文件该日志文件的保存期限为3天 &ndash;&gt;-->
<!-- <maxHistory>${myMaxHistory}</maxHistory>-->
<!-- <maxFileSize>${myFileSize}</maxFileSize>-->
<!-- <totalSizeCap>${myTotalSizeCap}</totalSizeCap>-->
<!-- </rollingPolicy>-->
<!-- <append>true</append>-->
<!-- <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">-->
<!-- <pattern>${PATTERN}</pattern>-->
<!-- <charset>utf-8</charset>-->
<!-- </encoder>-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <level>DEBUG</level>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
<!-- </appender>-->
<!--异步输出-->
<!-- <appender name="DEBUG_ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">-->
<!-- &lt;!&ndash; 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 &ndash;&gt;-->
<!-- <discardingThreshold>0</discardingThreshold>-->
<!-- &lt;!&ndash; 更改默认的队列的深度,该值会影响性能.默认值为256 &ndash;&gt;-->
<!-- <queueSize>2048</queueSize>-->
<!-- <includeCallerData>true</includeCallerData>-->
<!-- &lt;!&ndash; 添加附加的appender,最多只能添加一个 &ndash;&gt;-->
<!-- <appender-ref ref="DEBUG"/>-->
<!-- </appender>-->
<!--异步输出-->
<appender name="ERROR_ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>1024</queueSize>
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="ERROR"/>
</appender>
<!--异步输出-->
<!-- <appender name="WARN_ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">-->
<!-- &lt;!&ndash; 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 &ndash;&gt;-->
<!-- <discardingThreshold>0</discardingThreshold>-->
<!-- &lt;!&ndash; 更改默认的队列的深度,该值会影响性能.默认值为256 &ndash;&gt;-->
<!-- <queueSize>1024</queueSize>-->
<!-- <includeCallerData>true</includeCallerData>-->
<!-- &lt;!&ndash; 添加附加的appender,最多只能添加一个 &ndash;&gt;-->
<!-- <appender-ref ref="WARN"/>-->
<!-- </appender>-->
<!--异步输出-->
<appender name="INFO_ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能.默认值为256 -->
<queueSize>2048</queueSize>
<includeCallerData>true</includeCallerData>
<!-- 添加附加的appender,最多只能添加一个 -->
<appender-ref ref="INFO"/>
</appender>
<!--异步输出-->
<!-- <appender name="SQL_ASYNC_LOG" class="ch.qos.logback.classic.AsyncAppender">-->
<!-- &lt;!&ndash; 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 &ndash;&gt;-->
<!-- <discardingThreshold>0</discardingThreshold>-->
<!-- &lt;!&ndash; 更改默认的队列的深度,该值会影响性能.默认值为256 &ndash;&gt;-->
<!-- <queueSize>2048</queueSize>-->
<!-- <includeCallerData>true</includeCallerData>-->
<!-- &lt;!&ndash; 添加附加的appender,最多只能添加一个 &ndash;&gt;-->
<!-- <appender-ref ref="SQL"/>-->
<!-- </appender>-->
<!--
<logger>用来设置某一个包或者具体的某一个类的日志打印级别、
以及指定<appender><logger>仅有一个name属性
一个可选的level和一个可选的addtivity属性。
name:用来指定受此logger约束的某一个包或者具体的某一个类。
level:用来设置打印级别大小写无关TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
还有一个特俗值INHERITED或者同义词NULL代表强制执行上级的级别。
如果未设置此属性那么当前logger将会继承上级的级别。
addtivity:是否向上级logger传递打印信息。默认是true。
-->
<!-- <logger name="dao" level="ERROR">-->
<!-- <appender-ref ref="SQL"/>-->
<!-- <appender-ref ref="STDOUT"/>-->
<!-- </logger>-->
<root level="${logLevel}">
<appender-ref ref="STDOUT"/>
<appender-ref ref="fileAppender"/>
<appender-ref ref="INFO_ASYNC_LOG"/>
<!-- <appender-ref ref="WARN_ASYNC_LOG"/>-->
<appender-ref ref="ERROR_ASYNC_LOG"/>
<!-- <appender-ref ref="DEBUG_ASYNC_LOG"/>-->
<!-- <appender-ref ref="SQL_ASYNC_LOG"/>-->
</root>
</configuration>

@ -0,0 +1,81 @@
#\u65E5\u5FD7\u9ED8\u8BA4\u914D\u7F6E
spring.logback.appName=FortressGetDataInterface
spring.logback.level=INFO
spring.logback.myMaxHistory=30
spring.logback.myFileSize=10MB
spring.logback.myTotalSizeCap=2GB
#\u7F16\u7801\u8BBE\u7F6E
spring.http.encoding.charset=UTF-8
spring.http.encoding.enabled=true
spring.http.encoding.force=true
spring.messages.encoding=UTF-8
spring.profiles.active=dev
server.resources.static-locations=classpath:/resources/,classpath:/static/
# \u8FDE\u63A5\u6C60\u914D\u7F6E
spring.datasource.name=com.zaxxer.hikari.HikariConfig
spring.datasource.type=com.zaxxer.hikari.HikariConfig
spring.datasource.hikari.maximum-pool-size=25
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=0
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=300000
spring.datasource.hikari.connection-timeout=60000
spring.datasource.hikari.minimum-idle=1
spring.datasource.hikari.allow-pool-suspension: true
spring.datasource.hikari.register-mbeans: true
spring.datasource.hikari.leak-detection-threshold: 60000
# xml\u5730\u5740
spring.mybatis-plus.mapper-locations=com.nmggs.query.mapper/*Mapper.xml
# \u5B9E\u4F53\u626B\u63CF\uFF0C\u591A\u4E2Apackage\u7528\u9017\u53F7\u6216\u8005\u5206\u53F7\u5206\u9694
#\u81EA\u5DF1\u7684\u5B9E\u4F53\u7C7B\u5730\u5740
spring.mybatis-plus.type-aliases-package=com.nmggs.query.entity
# \u670D\u52A1\u6A21\u5757
# \u70ED\u90E8\u7F72\u5F00\u5173
spring.devtools.restart.enabled=true
#\u91CD\u542F\u76EE\u5F55
spring.devtools.restart.additional-paths=src/main
#redis
spring.session.store-type=none
#spring-session
spring.session.timeout: PT30M
spring.datasource.initialization-mode=always
#\u53BB\u9664\u9644\u4EF6\u5927\u5C0F\u9650\u5236
#\u8BF7\u6C42\u53C2\u6570\u957F\u5EA6
server.tomcat.max-http-form-post-size=10MB
server.max-http-header-size=10MB
#\u6700\u5927\u4E0A\u4F20\u6587\u4EF6\u5927\u5C0F(10MB)
spring.servlet.multipart.max-file-size = -1
spring.servlet.multipart.max-request-size = -1
server.tomcat.max-swallow-size = -1
server.tomcat.max-threads=1000
#\u4E0D\u53EF\u914D\u7F6E\u7684\u914D\u7F6E\u9879
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
logging.level.com.nmgs.ssmpback.mapper=debug
sqlClassName=com.microsoft.sqlserver.jdbc.SQLServerDriver
sqlvalidationQuery=SELECT 1
OracleClassName=oracle.jdbc.driver.OracleDriver
OraclevalidationQuery=SELECT 1 from dual
DMClassName=dm.jdbc.driver.DmDriver
DMvalidationQuery=SELECT 1
MySQLClassName=com.mysql.cj.jdbc.Driver
MySQLvalidationQuery=SELECT 1
GoldenDBClassName=com.goldendb.jdbc.Driver
GoldenvalidationQuery=SELECT 1 FROM DUAL
mybatis-plus.configuration.map-underscore-to-camel-case=false
spring.jackson.time-zone=GMT+8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
#前端vue
spring.web.resources.static-locations= classpath:/static/

@ -0,0 +1,3 @@
序号 日期 版本号 说明
1 2025年09月09日 1.0.0 堡垒机中间转发内外网请求

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

Loading…
Cancel
Save