.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_alibaba_druid_1_2_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_alibaba_fastjson_1_2_70.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_baomidou_mybatis_plus_3_5_7.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_5_7.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_5_7.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_5_7.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_5_7.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_baomidou_mybatis_plus_spring_boot_autoconfigure_3_5_7.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_fasterxml_classmate_1_5_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_10_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_10_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_10_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_10_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_10_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_10_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_10_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_fasterxml_woodstox_woodstox_core_5_2_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_jsqlparser_jsqlparser_4_9.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_oshi_oshi_core_5_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_pagehelper_pagehelper_6_1_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_pagehelper_pagehelper_spring_boot_autoconfigure_2_1_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_pagehelper_pagehelper_spring_boot_starter_2_1_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_penggle_kaptcha_2_3_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_virtuald_curvesapi_1_06.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_xiaoymin_knife4j_annotations_3_0_3.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_xiaoymin_knife4j_core_3_0_3.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_3_0_3.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_boot_autoconfigure_3_0_3.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_boot_starter_3_0_3.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_xiaoymin_knife4j_spring_ui_3_0_3.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_1_4_2_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_annotation_1_4_2_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_boot_starter_1_4_2_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_github_yulichang_mybatis_plus_join_core_1_4_2_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_2_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_google_guava_guava_27_0_1_android.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_jhlabs_filters_2_0_235_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_mchange_mchange_commons_java_0_2_15.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_sun_activation_jakarta_activation_1_2_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_sun_mail_jakarta_mail_1_6_4.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_zaxxer_HikariCP_3_4_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__com_zaxxer_SparseBitSet_1_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_4.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__commons_codec_commons_codec_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__commons_fileupload_commons_fileupload_1_4.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__commons_io_commons_io_2_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__commons_net_commons_net_3_8_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__de_rototor_pdfbox_graphics2d_0_30.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_github_classgraph_classgraph_4_8_83.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_jsonwebtoken_jjwt_0_9_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_lettuce_lettuce_core_5_2_2_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_netty_netty_buffer_4_1_45_Final.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_netty_netty_codec_4_1_45_Final.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_netty_netty_common_4_1_45_Final.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_netty_netty_handler_4_1_45_Final.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_netty_netty_resolver_4_1_45_Final.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_netty_netty_transport_4_1_45_Final.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_projectreactor_reactor_core_3_3_3_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_bean_validators_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_boot_starter_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_core_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_data_rest_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_oas_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_schema_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_spi_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_spring_web_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_spring_webflux_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_spring_webmvc_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_swagger2_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_swagger_common_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_springfox_springfox_swagger_ui_3_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_swagger_core_v3_swagger_annotations_2_1_5.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_swagger_core_v3_swagger_models_2_1_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_swagger_swagger_annotations_1_5_20.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_swagger_swagger_core_1_5_22.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__io_swagger_swagger_models_1_5_20.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__javax_servlet_javax_servlet_api_4_0_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__javax_validation_validation_api_2_0_1_Final.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__mysql_mysql_connector_java_8_0_19.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_8.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__net_java_dev_jna_jna_5_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__net_java_dev_jna_jna_platform_5_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_commons_commons_collections4_4_4.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_commons_commons_compress_1_20.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_commons_commons_lang3_3_9.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_12_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_12_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_pdfbox_fontbox_2_0_22.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_pdfbox_pdfbox_2_0_22.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_poi_poi_5_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_poi_poi_ooxml_5_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_poi_poi_ooxml_lite_5_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_santuario_xmlsec_2_2_1.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_cache_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_config_core_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_config_ogdl_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_core_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_crypto_cipher_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_crypto_core_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_crypto_hash_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_event_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_lang_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_spring_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_shiro_shiro_web_1_7_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_31.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_el_9_0_31.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_31.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlbeans_xmlbeans_4_0_0.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_all_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_anim_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_awt_util_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_bridge_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_codec_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_constants_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_css_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_dom_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_ext_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_extension_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_gui_util_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_gvt_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_i18n_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_parser_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_rasterizer_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_rasterizer_ext_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_script_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_shared_resources_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_slideshow_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_squiggle_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_squiggle_ext_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_svg_dom_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_svgbrowser_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_svggen_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_svgpp_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_svgrasterizer_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_swing_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_transcoder_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_ttf2svg_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_util_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_batik_xml_1_13.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_apache_xmlgraphics_xmlgraphics_commons_2_4.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_bouncycastle_bcpkix_jdk15on_1_68.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_bouncycastle_bcprov_jdk15on_1_68.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_checkerframework_checker_compat_qual_2_5_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_codehaus_mojo_animal_sniffer_annotations_1_17.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_codehaus_woodstox_stax2_api_4_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_0_18_Final.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_javassist_javassist_3_25_0_GA.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_jboss_logging_jboss_logging_3_4_1_Final.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_mapstruct_mapstruct_1_3_1_Final.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_mybatis_mybatis_3_5_16.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_mybatis_mybatis_spring_2_1_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_2_3_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_2_3_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_owasp_encoder_encoder_1_2_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_projectlombok_lombok_1_18_12.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_quartz_scheduler_quartz_2_3_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_reactivestreams_reactive_streams_1_0_3.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_slf4j_jcl_over_slf4j_1_7_30.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_30.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_30.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_data_redis_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_mail_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_quartz_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_data_spring_data_commons_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_data_spring_data_keyvalue_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_data_spring_data_redis_2_2_5_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_2_0_0_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_2_0_0_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_aop_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_beans_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_context_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_context_support_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_core_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_expression_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_jcl_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_jdbc_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_oxm_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_tx_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_web_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_springframework_spring_webmvc_5_2_4_RELEASE.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__org_yaml_snakeyaml_1_25.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__xalan_serializer_2_7_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__xalan_xalan_2_7_2.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__xml_apis_xml_apis_1_4_01.xml
ÎļþÒÑɾ³ý .idea/libraries/Maven__xml_apis_xml_apis_ext_1_3_04.xml
ÎļþÒÑɾ³ý admin/lianhelihua_admin/index.html
@@ -1 +1 @@ <!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/lianhelihua_admin/icon.png"><title>èåå©åäºä»¶ä¸æ¥ç³»ç»</title><link href="/lianhelihua_admin/static/css/app.1a42a0af.css" rel="preload" as="style"><link href="/lianhelihua_admin/static/css/chunk-vendors.d9e68312.css" rel="preload" as="style"><link href="/lianhelihua_admin/static/js/app.09df0529.js" rel="preload" as="script"><link href="/lianhelihua_admin/static/js/chunk-vendors.f4ff0439.js" rel="preload" as="script"><link href="/lianhelihua_admin/static/css/chunk-vendors.d9e68312.css" rel="stylesheet"><link href="/lianhelihua_admin/static/css/app.1a42a0af.css" rel="stylesheet"></head><body><div id="app"></div><script src="/lianhelihua_admin/static/js/chunk-vendors.f4ff0439.js"></script><script src="/lianhelihua_admin/static/js/app.09df0529.js"></script></body></html> <!DOCTYPE html><html lang=""><head><meta charset="utf-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width,initial-scale=1"><link rel="icon" href="/lianhelihua_admin/icon.png"><title>èåå©åäºä»¶ä¸æ¥ç³»ç»</title><link href="/lianhelihua_admin/static/css/app.f066ef6d.css" rel="preload" as="style"><link href="/lianhelihua_admin/static/css/chunk-vendors.d9e68312.css" rel="preload" as="style"><link href="/lianhelihua_admin/static/js/app.71473e31.js" rel="preload" as="script"><link href="/lianhelihua_admin/static/js/chunk-vendors.262019c4.js" rel="preload" as="script"><link href="/lianhelihua_admin/static/css/chunk-vendors.d9e68312.css" rel="stylesheet"><link href="/lianhelihua_admin/static/css/app.f066ef6d.css" rel="stylesheet"></head><body><div id="app"></div><script src="/lianhelihua_admin/static/js/chunk-vendors.262019c4.js"></script><script src="/lianhelihua_admin/static/js/app.71473e31.js"></script></body></html> admin/lianhelihua_admin/static/img/home_func1.2273dcea.pngBinary files differ
admin/lianhelihua_admin/static/img/home_func2.9c9be0b6.pngBinary files differ
admin/lianhelihua_admin/static/img/home_func3.507ca9bd.pngBinary files differ
admin/lianhelihua_admin/static/img/home_func4.e6510cdc.pngBinary files differ
admin/lianhelihua_admin/static/js/chunk-vendors.f4ff0439.js
ÎļþÒÑɾ³ý admin/lianhelihua_admin/static/js/chunk-vendors.f4ff0439.js.map
ÎļþÒÑɾ³ý admin/package-lock.json
@@ -7975,6 +7975,12 @@ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", "dev": true }, "jsencrypt": { "version": "3.3.2", "resolved": "https://registry.npmmirror.com/jsencrypt/-/jsencrypt-3.3.2.tgz", "integrity": "sha512-arQR1R1ESGdAxY7ZheWr12wCaF2yF47v5qpB76TtV64H1pyGudk9Hvw8Y9tb/FiTIaaTRUyaSnm5T/Y53Ghm/A==", "dev": true }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npm.taobao.org/jsesc/download/jsesc-2.5.2.tgz?cache=0&sync_timestamp=1603891232110&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fjsesc%2Fdownload%2Fjsesc-2.5.2.tgz", admin/package.json
@@ -47,7 +47,9 @@ "node-sass": "^4.12.0", "sass-loader": "^8.0.2", "vue-cli-plugin-element-ui": "~1.1.4", "vue-template-compiler": "^2.6.11" "vue-template-compiler": "^2.6.11", "crypto-js": "^4.2.0", "jsencrypt": "^3.3.2" }, "eslintConfig": { "root": true, admin/src/api/system/common.js
@@ -1,4 +1,5 @@ import request from '@/utils/request' import { encryptData } from '@/utils/request/decryption.js' // è·åå¾çéªè¯ç export function getCaptcha () { @@ -14,8 +15,14 @@ } // æ ¹æ®å¯ç ç»å½ export function loginByPassword (data) { return request.post('/system/login', data) export function loginByPassword (data, iv) { if(iv){ var actData = encryptData(data) return request.post('/system/login', actData) } else{ return request.post('/system/login', data) } } // ç»åº @@ -24,8 +31,8 @@ } // ä¿®æ¹å¯ç export function updatePwd (data) { return request.post('/system/updatePwd', data) export function updatePwd (data,iv) { return request.post('/system/updatePwd', iv?encryptData(data):data) } // è·åå·²ç»å½çç¨æ·ä¿¡æ¯ admin/src/components/common/Header.vue
@@ -131,7 +131,7 @@ updatePwd({ oldPwd: this.changePwdData.form.oldPwd, newPwd: this.changePwdData.form.newPwd }) },true) .then(() => { this.visible.changePwd = false setTimeout(() => { admin/src/utils/request/decryption.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,52 @@ // AES import CryptoJS from 'crypto-js' import JSEncrypt from 'jsencrypt' import { generateRandomObj, rsaPassWord } from './encrypt.js' // ç§é¥ // const privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJkOgs/FrhpXs3QzdhiQ9eFdK7HECPNPadhecJA5SU2kEx+FlRnbA7Z9/Tqg9RYV4zuuxp3cYp9fa8AywRzVIHYLCokt39bUYIsEVJQdh4KRr1usl/x8Wv24GjcnuDlsLnwAgSsqNcVM/4XhtaeqyrmNMEbT7YqxJjBGJNamwSfXAgMBAAECgYADkiQZJtqGAM/OATlbH16tMFhJoHI5AvxMMP/dTYjZR9+uV5Z/8O0oP849pO2y4zXW+Z/mpPKkFzzTUhvRSWOldBFOmjktPdCBA8NuyFT3+dlew202pEbjDxdnTjb+GTNnli0cHoILsJGoqEeCCddNbtlidv0kFQWubbgfuSNf2QJBAOHmb9v36hnmcH3eLEo2wy7bEE30q+UoUGzAlLw2Tv/APh82NV6VVB11duYDeifAE0wJFtImp9zEDrVcmiN5PNMCQQCtc1kwdP15Dfj+miTkmjKbsona3+m06XQ0VbeUelQ07VtAG9zpkaza7c8JEA15cOcxHECFG5f2E4f3KBl543ZtAkBBtj6jxiIbFqVyd8Z6cCOm5aKAisPWDTwX5o1dko64ZruraKFtuhKV3y2PC0PlfEIgxCQXTZdW6NE+gIl1+DZxAkAsC3iAh5S+IsAx1u67ZjSnuOSsweNU31t01rdxasbrUcK0Ot8UKLveNDk4sezaA8ORgv0XT/R8tmT2bCZb/1jZAkBUqgcdO5b9YM9wumvKIDHhKuIobrRYlIhSfh36Iaor0VO9a+Xl0c5lwmZmZDyZHE/mfhuVkjdifOwEeORnWPs7"; // const privateKey = uni.getStorageSync('aes_private_key') export function decryptedData (msg, data) { console.log(msg) console.log(data) // 忢key:å°å½æä½æ°å符串å»é¤ï¼ç¶åååº const monthIndex = new Date().getMonth() + 1 const msgStr = msg.slice(0, monthIndex) + msg.slice(monthIndex + 1) const reverseMsgStr = msgStr.split('').reverse().join('') const str1 = data.replace(/\s/g, '') console.log(reverseMsgStr) console.log(str1) // è§£å¯å¹¶è¿åç»æ return ( JSON.parse( CryptoJS.AES.decrypt({ ciphertext: CryptoJS.enc.Base64.parse(str1) }, CryptoJS.enc.Utf8.parse(reverseMsgStr), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, iv: CryptoJS.enc.Utf8.parse('AES/CBC/PKCS5Padding') } ).toString(CryptoJS.enc.Utf8) ) || {} ) } // å¯¹æ°æ®å å¯ export function encryptData (data) { const str = CryptoJS.AES.encrypt( JSON.stringify(data), CryptoJS.enc.Utf8.parse(generateRandomObj), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7, iv: CryptoJS.enc.Utf8.parse('AES/CBC/PKCS5Padding') } ).toString() return { data: str, ivKey: rsaPassWord } } admin/src/utils/request/encrypt.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ // RSA import JSEncrypt from 'jsencrypt' /******************************************************************************/ // å ¬é¥ // const publicKey = uni.getStorageSync('aes_public_key') const publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDOgrUW4jM5Y" + "2irUCpvpyBn41aTRfGHNQuBHIByK9fbc" + "lNXXt7/QuQj3NQCfwknBBCHcM7A38eC249UxjFkLHAm+I9o15INjF/TrHtlzkzzS9jiek" + "godhUuM4eVxXQUcDNdAgSkKFt9T5WRXg2cjEZQyoi5DlIWLmOqixmx8OKFRQIDAQAB"; function generateRandomString () { const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' let result = '' const charactersLength = characters.length for (let i = 0; i < 16; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)) } return result } export const generateRandomObj = generateRandomString() // è°ç¨å½æ°çæéæºå符串 const encryptor = new JSEncrypt() // å建å å¯å¯¹è±¡å®ä¾ // console.log(publicKey) encryptor.setPublicKey(publicKey) // è®¾ç½®å ¬é¥ export const rsaPassWord = encryptor.encrypt(generateRandomObj) admin/src/utils/request/index.js
@@ -3,13 +3,14 @@ import pkg from '../../../package' import { trim } from '@/utils/util' import extendsMethods from './extends.methods' import { decryptedData } from './decryption.js' // é»è®¤é ç½® axios.defaults.headers.common['Content-Type'] = 'application/json;charset=UTF-8' const axiosInstance = axios.create({ baseURL: process.env.VUE_APP_API_PREFIX, // 请æ±è¶ æ¶æ¶é´ timeout: 60000 timeout: 600000 }) // æ°å»ºè¯·æ±æ¦æªå¨ @@ -23,6 +24,10 @@ config.params = trim(config.params) } } if (config.ivKey) { config.headers.secretKey = config.ivKey } // config.headers['Content-Type'] = config.contentType || 'application/json;charset=UTF-8' // 导åºå¤ç if (config.download === true) { config.responseType = 'blob' @@ -52,7 +57,7 @@ // æªç»å½ if (response.data.code === 401) { if (response.config.autoLogin !== false) { window.location.href = process.env.VUE_APP_ROUTER_MODE === 'history' ? '/#/login' : '/login' window.location.href = process.env.VUE_APP_ROUTER_MODE === 'history' ? (process.env.VUE_APP_CONTEXT_PATH + '/#/login') : (process.env.VUE_APP_CONTEXT_PATH + '/login') } return Promise.reject(response.data) } @@ -60,6 +65,16 @@ if (!response.data.success) { return Promise.reject(response.data) } if (response.data.message) { const tm = response.data.message const list = tm.split(' ') let msg = list[0] if (list.length > 1 && response.data.data) { msg = decryptedData(list[1], list[0]) response.data.data = decryptedData(list[1], response.data.data) response.data.message = msg } } return response.data.data }, function (error) { console.log('error', error) admin/src/views/login.vue
@@ -58,7 +58,7 @@ password: this.password, code: this.captcha.value.trim(), uuid: this.captcha.uuid }) },true) .then(() => { window.location.href = process.env.VUE_APP_CONTEXT_PATH }) server/pom.xml
@@ -189,6 +189,11 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-mail</artifactId> </dependency> <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.60</version> </dependency> </dependencies> <build> @@ -206,7 +211,51 @@ <mainClass>com.doumee.LianhelihuaApplication</mainClass> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <delimiters> <delimiter>@</delimiter> </delimiters> <useDefaultDelimiters>false</useDefaultDelimiters> </configuration> </plugin> </plugins> </build> <profiles> <profile> <id>dev</id> <properties> <spring.active>dev</spring.active> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> <profile> <id>test</id> <properties> <spring.active>test</spring.active> </properties> </profile> <profile> <id>pro</id> <properties> <spring.active>pro</spring.active> </properties> </profile> </profiles> </project> server/src/main/java/com/doumee/api/system/SystemController.java
@@ -2,6 +2,8 @@ import com.doumee.api.BaseController; import com.doumee.biz.system.SystemUserBiz; import com.doumee.config.annotation.EncryptionReq; import com.doumee.config.annotation.EncryptionResp; import com.doumee.core.annotation.pr.PreventRepeat; import com.doumee.core.annotation.trace.Trace; import com.doumee.core.model.ApiResponse; @@ -39,6 +41,8 @@ @PreventRepeat(limit = 10, lockTime = 10000) @ApiOperation("ç»å½") @EncryptionReq @EncryptionResp @PostMapping("/login") public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, HttpServletRequest request) { return ApiResponse.success(systemLoginService.loginByPassword(dto, request)); @@ -54,6 +58,8 @@ @Trace(withRequestParameters = false) @ApiOperation("ä¿®æ¹å½åç¨æ·å¯ç ") @EncryptionReq @EncryptionResp @PostMapping("/updatePwd") public ApiResponse updatePwd (@Validated @RequestBody UpdatePwdDto dto) { dto.setUserId(this.getLoginUser().getId()); @@ -63,6 +69,7 @@ @ApiOperation("è·åå½åç»å½çç¨æ·ä¿¡æ¯") @GetMapping("/getUserInfo") @EncryptionResp public ApiResponse<LoginUserInfo> getUserInfo () { return ApiResponse.success(this.getLoginUser()); } server/src/main/java/com/doumee/config/annotation/EncryptionReq.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.doumee.config.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Date: 2024/3/29 18:30 */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface EncryptionReq { } server/src/main/java/com/doumee/config/annotation/EncryptionResp.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,14 @@ package com.doumee.config.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * @Date: 2024/3/29 18:30 */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) public @interface EncryptionResp { } server/src/main/java/com/doumee/config/interfaceencryption/DecryptRequestBodyAdvice.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,101 @@ package com.doumee.config.interfaceencryption; import com.alibaba.fastjson.JSONObject; import com.doumee.config.annotation.EncryptionReq; import com.doumee.config.annotation.EncryptionResp; import com.doumee.config.interfaceencryption.tool.RSAEncrypt; import com.doumee.core.utils.AESUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpInputMessage; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.util.StreamUtils; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.RequestBodyAdvice; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Type; import java.util.Base64; /** * ãé®é¢ã群ç»è¡¨ * githubå°å http://www.github.com/wanyushu * giteeå°å http://www.gitee.com/wanyushu * @author yushu * @email 921784721@qq.com * 对请æ±çåæ°è¿è¡è§£å¯ **/ @ControllerAdvice public class DecryptRequestBodyAdvice implements RequestBodyAdvice { private Logger log = LoggerFactory.getLogger(this.getClass()); private boolean encrypt; @Override public boolean supports(MethodParameter methodParameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { if (methodParameter.getMethod().isAnnotationPresent(EncryptionReq.class) || methodParameter.getClass().isAnnotationPresent(EncryptionReq.class) ) { encrypt = true; }else{ encrypt=false; } return encrypt; } @Override public Object handleEmptyBody(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { return body; } @Override public HttpInputMessage beforeBodyRead(HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType){ if (encrypt) { try { byte[] payload = StreamUtils.copyToByteArray(inputMessage.getBody()); String content =new String(payload); JSONObject jsonObject = JSONObject.parseObject(content); if(jsonObject.get("data")!=null){ content = jsonObject.getString("data"); } // 读å宿´ç客æ·ç«¯è¯·æ±ä½ï¼ä¹å°±æ¯å å¯/ç¼ç åçæ°æ® String key = jsonObject.getString("ivKey"); log.info("å å¯ keyï¼{}", key); String decrypt = RSAEncrypt.decrypt(key, RSAEncrypt.privateKey); log.info("å å¯ Payloadï¼{}",content); String decrypt1 = AESUtils.decrypt(content, decrypt); // è§£ç 为åå§æ°æ® byte[] rawPayload = decrypt1.getBytes(); log.info("åå§ Payloadï¼{}", decrypt); // è¿å HttpInputMessage å¿å对象 return new HttpInputMessage() { @Override public HttpHeaders getHeaders() { // inputMessage.getHeaders().set("Content-Type","application/json;charset=UTF-8"); return inputMessage.getHeaders(); } @Override public InputStream getBody() throws IOException { // 使ç¨åå§æ°æ®æå»ºä¸º ByteArrayInputStream return new ByteArrayInputStream(rawPayload); } }; } catch (Exception e) { log.error("Decryption failed", e); } } return inputMessage; } @Override public Object afterBodyRead(Object body, HttpInputMessage inputMessage, MethodParameter parameter, Type targetType, Class<? extends HttpMessageConverter<?>> converterType) { return body; } } server/src/main/java/com/doumee/config/interfaceencryption/EncryptResponseBodyAdvice.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,106 @@ package com.doumee.config.interfaceencryption; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.doumee.config.annotation.EncryptionResp; import com.doumee.core.model.ApiResponse; import com.doumee.core.utils.AESUtils; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.MethodParameter; import org.springframework.http.MediaType; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.server.ServerHttpRequest; import org.springframework.http.server.ServerHttpResponse; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice; import java.time.LocalDate; import java.util.Random; /** * githubå°å http://www.github.com/wanyushu * giteeå°å http://www.gitee.com/wanyushu * @author yushu * @email 921784721@qq.com * 对请æ±çåæ°è¿è¡å å¯ **/ @ControllerAdvice public class EncryptResponseBodyAdvice implements ResponseBodyAdvice<Object> { private Logger log = LoggerFactory.getLogger(this.getClass()); private boolean encrypt; @Override public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) { encrypt = false; if (returnType.getMethod().isAnnotationPresent(EncryptionResp.class) || returnType.getClass().isAnnotationPresent(EncryptionResp.class) ) { encrypt = true; } return encrypt; } @Override public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) { if (encrypt) { try { String str = generateRandomLetters(16); String afterDealStr = newEncrypt(str); ApiResponse apiResponse = (ApiResponse) body; //对ååºå 容è¿è¡å å¯ ObjectMapper objectMapper = new ObjectMapper(); String aesEncryptData = AESUtils.encrypt(objectMapper.writeValueAsString(apiResponse.getData()), str); apiResponse.setData(aesEncryptData); String aesEncryptMessage = AESUtils.encrypt(objectMapper.writeValueAsString(apiResponse.getMessage()), str); apiResponse.setMessage(aesEncryptMessage + " " + afterDealStr); return body; } catch (Exception e) { log.error("Encrypted data exception", e); } } return body; } private static String newEncrypt(String s) { //ååºæå StringBuilder reverse = new StringBuilder(s).reverse(); System.out.println("ååºæååçå¼ " + reverse); //æ ¹æ®å½åæä»½åæ¥æï¼æ¥å¤æå¨å符串ä¸çåªä¸ªä½ç½®å åç¬¦ä¸²ï¼æ¯å¦ åç¬¦ä¸²æ¯ abcdefghijklmnä»å¤©æ¯2æ14å·ï¼å°±å¨ç¬¬äºä¸ªå符串åé¢å 26个å符串ä¸å¤äº14ä½çå符ï¼å¦ææ¥æè¶ è¿26ï¼å°±ä»aéæ°å¼å§ LocalDate today = LocalDate.now(); // è·åå½åæ¥æ int monthValue = today.getMonthValue(); int dayOfMonth = today.getDayOfMonth(); // è·åæ¥æä¸çæ¥ int position = dayOfMonth % 26; // 计ç®å¨åæ¯è¡¨ä¸çä½ç½®ï¼1-26ï¼ // 计ç®è¦æå ¥çå符 char charToInsert = (char) ('a' + (position - 1)); // è®¡ç®æå ¥ä½ç½®ï¼0-based indexï¼ int insertPosition = monthValue % (reverse.length() + 1); // ä¿è¯ä¸è¶ åºèå´ // æå ¥å符 String result = insertCharacter(reverse.toString(), charToInsert, insertPosition); return result; } public static String insertCharacter(String original, char ch, int position) { StringBuilder sb = new StringBuilder(original); sb.insert(position, ch); return sb.toString(); } public String generateRandomLetters(int length) { Random random = new Random(); StringBuilder sb = new StringBuilder(); for (int i = 0; i < length; i++) { char randomChar = (char) (random.nextInt(26) + 'a'); sb.append(randomChar); } return sb.toString(); } } server/src/main/java/com/doumee/config/interfaceencryption/InterfaceEncryptionMvcConfig.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,89 @@ package com.doumee.config.interfaceencryption; import com.doumee.config.annotation.EncryptionReq; import com.doumee.config.annotation.EncryptionResp; import com.doumee.config.interfaceencryption.tool.RSAEncrypt; import com.doumee.core.utils.AESUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.stream.Collectors; /** * appèªå®ä¹tokenè®¤è¯ */ @Slf4j //@Component public class InterfaceEncryptionMvcConfig implements WebMvcConfigurer { /** * æ¯å¦å¼åè */ @Value("${debug_model}") private Boolean isDebug; /** * æ·»å æ¦æªå¨ */ @Override public void addInterceptors(InterceptorRegistry registry) { //APIæ¥å£JwtTokenæ¦æªå¨ HandlerInterceptor encrypterceptor = new HandlerInterceptor() { @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { if (!(handler instanceof HandlerMethod)) { return ; } /* HandlerMethod handlerMethod = (HandlerMethod) handler; if(!( handlerMethod.hasMethodAnnotation(EncryptionResp.class) || handlerMethod.hasMethodAnnotation(EncryptionResp.class)) ){ //妿æ¯å å¯è¿ååæ° String str = generateRandomLetters(16); String afterDealStr = newEncrypt(str); ResponseData response = (ResponseData) object; //对ååºå 容è¿è¡å å¯ ObjectMapper objectMapper = new ObjectMapper(); String aesEncryptData = AESUtils.encrypt(objectMapper.writeValueAsString(response.getData()), str); response.setData(aesEncryptData); String aesEncryptMessage = AESUtils.encrypt(objectMapper.writeValueAsString(response.getMessage()), str); response.setMessage(aesEncryptMessage + " " + afterDealStr); return object; }*/ } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 妿䏿¯æ å°å°æ¹æ³ç´æ¥éè¿ if (!(handler instanceof HandlerMethod)) { return true; } HandlerMethod handlerMethod = (HandlerMethod) handler; if(( handlerMethod.hasMethodAnnotation(EncryptionResp.class) || handlerMethod.hasMethodAnnotation(EncryptionResp.class)) ){ //妿æ¯å å¯åæ° String secretKey = request.getHeader("secretKey"); //对keyè¿è¡è§£å¯ // String decrypt = RSAEncrypt.decrypt(secretKey, RSAEncrypt.privateKey); //è·å请æ±åæ° String requestBody = request.getReader().lines().collect(Collectors.joining(System.lineSeparator())); String param = requestBody.toString(); //坹忰è¿è¡è§£å¯ String decrypt1 = AESUtils.decrypt(param, requestBody); //æ¾å ¥è¯·æ± request.setAttribute("param", decrypt1); } return true; } }; registry.addInterceptor(encrypterceptor).addPathPatterns("/**"); } } server/src/main/java/com/doumee/config/interfaceencryption/tool/RSAEncrypt.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,104 @@ package com.doumee.config.interfaceencryption.tool; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; @Slf4j public class RSAEncrypt { private static Map<Integer, String> keyMap = new HashMap<Integer, String>(); //ç¨äºå°è£ éæºäº§ççå ¬é¥ä¸ç§é¥ public static String privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAM6CtRbiMzljaKtQKm+nIGfjVpNF8Yc1C4EcgHIr19tyU1de3v9C5CPc1AJ/CScEEIdwzsDfx4Lbj1TGMWQscCb4j2jXkg2MX9Ose2XOTPNL2OJ6SCh2FS4zh5XFdBRwM10CBKQoW31PlZFeDZyMRlDKiLkOUhYuY6qLGbHw4oVFAgMBAAECgYAt6S0tWzicJ5ebjoUAsZ0ou4gB0ejycD6Qg6+islCY/v+8SuE0ysBBoNSZgXidbe/mzJOKmbWXSAzDghR0+tQrz3v2jEmm/MoBXoHS+YXuZvG6OX7n7rN4GPKm8wYNWGv3IU6NeggOZqMf+kT3JUvqQx5JxjeK/lEBlifmU0wmQQJBAPCGEmGtjbKJnMT4GurzsCJniy2rGAHvu+S51j60eusUuTnEIu78tMJGd8zkjNPlShKqyk+AUdhNoaigIZLclfkCQQDbzF444oJWkZ32iDipWcFxMqEkvn49elUZPHFzDVMN+D0mJ0uN0lGErDZAovCLu095+XecCsduXkki95HtdYytAkA3ph18ogYFx9cQr4Ky15zp6OEHuO0+DXSAkAqkyWcjGtFcLygR+T/tLxaqvjpjEEraFM/oIv1MuXFsrVf3PbgpAkB8OZVHMT3ZD5PnsjXUARaDk8nfqopO1MUj7jVwgSdfzd1BoxPgo+3OvkYrYevyDXttxMEFQFJW3pMXYDTpsHZBAkAX9R4KsvqC3FJkOk6zmGw2tsJBEFL5cqAnXQByoY3XriNgUeHJa/vCXJR7Q+vIYstnLzLzMJl7EMVOrxH4bBwF"; public static String publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCZDoLPxa4aV7N0M3YYkPXhXSuxxAjzT2nYXnCQOUlNpBMfhZUZ2wO2ff06oPUWFeM7rsad3GKfX2vAMsEc1SB2CwqJLd/W1GCLBFSUHYeCka9brJf8fFr9uBo3J7g5bC58AIErKjXFTP+F4bWnqsq5jTBG0+2KsSYwRiTWpsEn1wIDAQAB"; // public static void main(String[] args) throws Exception { // String phone = "18256057064"; // String encrypt = encrypt(phone, publicKey); // System.out.println("å å¯å"+encrypt); // System.out.println("è§£å¯å"+decrypt(encrypt, privateKey)); // } /** * éæºçæå¯é¥å¯¹ * * @throws NoSuchAlgorithmException */ public static void genKeyPair() throws NoSuchAlgorithmException { // KeyPairGeneratorç±»ç¨äºçæå ¬é¥åç§é¥å¯¹ï¼åºäºRSAç®æ³çæå¯¹è±¡ KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); // åå§åå¯é¥å¯¹çæå¨ï¼å¯é¥å¤§å°ä¸º96-1024ä½ keyPairGen.initialize(1024, new SecureRandom()); // çæä¸ä¸ªå¯é¥å¯¹ï¼ä¿åå¨keyPairä¸ KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // å¾å°ç§é¥ RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // å¾å°å ¬é¥ String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded())); // å¾å°ç§é¥å符串 String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded()))); // å°å ¬é¥åç§é¥ä¿åå°Map keyMap.put(0, publicKeyString); //0è¡¨ç¤ºå ¬é¥ keyMap.put(1, privateKeyString); //1表示ç§é¥ System.out.println("å ¬é¥:" + publicKeyString); System.out.println("ç§é¥:" + privateKeyString); } /** * RSAå ¬é¥å å¯ * * @param str å å¯å符串 * @param publicKey å ¬é¥ * @return 坿 * @throws Exception å å¯è¿ç¨ä¸çå¼å¸¸ä¿¡æ¯ */ public static String encrypt(String str, String publicKey) throws Exception { //base64ç¼ç çå ¬é¥ byte[] decoded = Base64.decodeBase64(publicKey); RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); //RSAå å¯ Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8"))); return outStr; } /** * RSAç§é¥è§£å¯ * * @param str å å¯å符串 * @param privateKey ç§é¥ * @return éæ * @throws Exception è§£å¯è¿ç¨ä¸çå¼å¸¸ä¿¡æ¯ */ public static String decrypt(String str, String privateKey) throws Exception { try { log.info("RSAç§é¥è§£å¯ str = " + str); log.info("RSAç§é¥è§£å¯ privateKey = " + privateKey); //64ä½è§£ç å å¯åçå符串 byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8")); //base64ç¼ç çç§é¥ byte[] decoded = Base64.decodeBase64(privateKey); RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); //RSAè§£å¯ Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, priKey); String outStr = new String(cipher.doFinal(inputByte)); return outStr; }catch (Exception e){ return "{}"; } } } server/src/main/java/com/doumee/config/interfaceencryption/tool/RSAEncryptTest.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,87 @@ package com.doumee.config.interfaceencryption.tool; import org.apache.commons.codec.binary.Base64; import javax.crypto.Cipher; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.HashMap; import java.util.Map; public class RSAEncryptTest { private static Map<Integer, String> keyMap = new HashMap<Integer, String>(); //ç¨äºå°è£ éæºäº§ççå ¬é¥ä¸ç§é¥ /** * éæºçæå¯é¥å¯¹ * * @throws NoSuchAlgorithmException */ public static void genKeyPair() throws NoSuchAlgorithmException { // KeyPairGeneratorç±»ç¨äºçæå ¬é¥åç§é¥å¯¹ï¼åºäºRSAç®æ³çæå¯¹è±¡ KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA"); // åå§åå¯é¥å¯¹çæå¨ï¼å¯é¥å¤§å°ä¸º96-1024ä½ keyPairGen.initialize(1024, new SecureRandom()); // çæä¸ä¸ªå¯é¥å¯¹ï¼ä¿åå¨keyPairä¸ KeyPair keyPair = keyPairGen.generateKeyPair(); RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); // å¾å°ç§é¥ RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // å¾å°å ¬é¥ String publicKeyString = new String(Base64.encodeBase64(publicKey.getEncoded())); // å¾å°ç§é¥å符串 String privateKeyString = new String(Base64.encodeBase64((privateKey.getEncoded()))); // å°å ¬é¥åç§é¥ä¿åå°Map keyMap.put(0, publicKeyString); //0è¡¨ç¤ºå ¬é¥ keyMap.put(1, privateKeyString); //1表示ç§é¥ System.out.println("å ¬é¥:" + publicKeyString); System.out.println("ç§é¥:" + privateKeyString); } /** * RSAå ¬é¥å å¯ * * @param str å å¯å符串 * @param publicKey å ¬é¥ * @return 坿 * @throws Exception å å¯è¿ç¨ä¸çå¼å¸¸ä¿¡æ¯ */ public static String encrypt(String str, String publicKey) throws Exception { //base64ç¼ç çå ¬é¥ byte[] decoded = Base64.decodeBase64(publicKey); RSAPublicKey pubKey = (RSAPublicKey) KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(decoded)); //RSAå å¯ Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, pubKey); String outStr = Base64.encodeBase64String(cipher.doFinal(str.getBytes("UTF-8"))); return outStr; } /** * RSAç§é¥è§£å¯ * * @param str å å¯å符串 * @param privateKey ç§é¥ * @return éæ * @throws Exception è§£å¯è¿ç¨ä¸çå¼å¸¸ä¿¡æ¯ */ public static String decrypt(String str, String privateKey) throws Exception { //64ä½è§£ç å å¯åçå符串 byte[] inputByte = Base64.decodeBase64(str.getBytes("UTF-8")); //base64ç¼ç çç§é¥ byte[] decoded = Base64.decodeBase64(privateKey); RSAPrivateKey priKey = (RSAPrivateKey) KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(decoded)); //RSAè§£å¯ Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.DECRYPT_MODE, priKey); String outStr = new String(cipher.doFinal(inputByte)); return outStr; } } server/src/main/java/com/doumee/core/utils/AESUtils.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,35 @@ package com.doumee.core.utils; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.nio.charset.StandardCharsets; import java.util.Base64; public class AESUtils { private static final String ALGORITHM = "AES"; private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding"; // ä½¿ç¨ ECB 模å¼å¹¶ä½¿ç¨ PKCS5Padding å¡«å public static String encrypt(String data, String key) throws Exception { SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), ALGORITHM); Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); byte[] encryptedBytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(encryptedBytes); } public static String decrypt(String encryptedData, String key) throws Exception { SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), ALGORITHM); Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedData)); return new String(decryptedBytes, StandardCharsets.UTF_8); } public static void main(String[] args) throws Exception { String key = "qtixtsujiokdgrqq"; // 16 åèçå¯é¥ String decryptedData = decrypt("/V65QRvmgommnLLJQV+JwE7L2FShGboL3TojZL4Up2JzeR/NK7rxwFqVHU4f9BTT2PYgDX5ULBGjbWnrwNpfhB1j1aUWSuItXvAAutz5L7f+bnZGmNNsUzG0KRyDu77e1fkweqfuSqZ7C4dmt6vy+DdYAMSC/RVBx/dOCU4gNcf0SupvH57WHPTt3KpB3OmbXBg74DiAi2JG7+giWDLnDrDBahhTgMSu0u1f3K5SMcE9tVVZCHGkzNAV5owwo/7yyvFMdBELqO/pgtfI1syaHgPdskMXUwa1j6HdLUcAqvaF7PzJOv++VGNqnCm2n2UBoIPEvKkn9TuI3LHHT26v2H0KoRmJdPIhme0eGqyXqAkTYFbAd/6OGUiwJO1vZYZDW/fmtKNThP0UOFLvJ6jVW5XrvIdmjzoF8iOxyyj+N3/3Mp4SinH9gSBuz/TbabH4zXL0Np1UvRmJjtkIEa+q8DEch0HcyH2ABULnu/xyxbIXhLQ1lgBZ2GJ8lO3ynvSSwkbzbd1vP5zWxKIYRDTf5qRk3eDwzXNbmcY6DFPYepS3ceh0kl4iScqG+AO/bvxTqnmm6/nrYVI8qHq7GCWthiTYX0AzulhT7ceyEfMMD4zuz8gbWTfqQtIcDGHeN7gZuFUcwRfHG9sEN7Vkle6QSDZumjODSbrYiTTruQXCSSiDVoXFDK24GvKaNMKB2lh8qcV1sldpyAlgeOKCbYWyBiEG/5ZNZH0iHtrIXn/ebrs6kzMSFREw+CVvgrkpZZ04MP5QGMFEMr3+Zg4KtwYraSoWGg8Pn1MgN/dBCHOKnpCOMW2I8n+sKKZMJh5YkhrEtknf7Zvi8lpZX5Sjz5DOA3vaxy8E0YPbrjRxqlgW8psy5R6ZwDP9jfGIOG0gS0gPewm8xJRYYLEk7vbhwBW2hQ==", key); System.out.println("" + decryptedData); } } server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxConstant.java
@@ -11,20 +11,20 @@ public final static String CORPSECRET = "8gl5ndGr824OHZ90CkZdcIewUKHoyk13XN4hfxBS_io"; public final static String ACCESS_TOKEN = "aOpknXCW7KBBwgGAPuacwfhJRcT1PeIg-IroZicxWamj0JayKJ0rKw2sNXGzpQzK8AMDeDrEJC_kTvPPWTgtefDNLtfsdHS7IpXqBV1P8znLG1EmsYPNgvn78dsQd5bBomLl_qPpOob9hUUsSJJKcEmxXldCNEYVBhKmYnQ4yY8WE8i4xp7aLmm-hRql0AzhzaNhUA7nAzNN5BsgSgbXMA"; //è·åaccesstoken,corpid=ä¼ä¸ID,corpsecret=åºç¨çåè¯å¯é¥ public final static String[] GET_ACCESS_TOKEN = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${secret}","è·åä¼ä¸å¾®ä¿¡accesstoken"}; public final static String[] GET_ACCESS_TOKEN = new String[]{"/cgi-bin/gettoken?corpid=${corpid}&corpsecret=${secret}","è·åä¼ä¸å¾®ä¿¡accesstoken"}; //è·åé¨é¨ä¿¡æ¯,é¨é¨idãè·åæå®é¨é¨åå ¶ä¸çåé¨é¨ï¼ä»¥åååé¨é¨çåé¨é¨ççï¼éå½ï¼ã 妿ä¸å¡«ï¼é»è®¤è·åå ¨éç»ç»æ¶æ public final static String[] GET_DEPARTMENT_LIST = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=${accesstoken}&id=${id}","è·åé¨é¨ä¿¡æ¯"}; public final static String[] GET_DEPARTMENT_SIMPLELIST = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/department/simplelist?access_token=${accesstoken}&id=${id}","è·åé¨é¨ä¿¡æ¯"}; public final static String[] GET_DEPARTMENT_INFO = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/department/get?access_token=${accesstoken}&id=${id}","è·åå个é¨é¨è¯¦æ "}; public final static String[] GET_DEPARTMENT_LIST = new String[]{"/cgi-bin/department/list?access_token=${accesstoken}&id=${id}","è·åé¨é¨ä¿¡æ¯"}; public final static String[] GET_DEPARTMENT_SIMPLELIST = new String[]{"/cgi-bin/department/simplelist?access_token=${accesstoken}&id=${id}","è·åé¨é¨ä¿¡æ¯"}; public final static String[] GET_DEPARTMENT_INFO = new String[]{"/cgi-bin/department/get?access_token=${accesstoken}&id=${id}","è·åå个é¨é¨è¯¦æ "}; //è·åé¨é¨æå,access_token=è°ç¨æ¥å£åè¯,department_id=è·åçé¨é¨id,fetch_child= æ¯å¦éå½è·ååé¨é¨ä¸é¢çæåï¼1-éå½è·åï¼0-åªè·åæ¬é¨é¨ public final static String[] GET_DEPARTMENT_SIMPLE_LIST = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=${accesstoken}&department_id=${departmentId}","è·åé¨é¨æå"}; public final static String[] GET_DEPARTMENT_USER_LIST = new String[]{"https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=${accesstoken}&department_id=${departmentId}","è·åé¨é¨æå"}; public final static String[] GET_DEPARTMENT_SIMPLE_LIST = new String[]{"/cgi-bin/user/simplelist?access_token=${accesstoken}&department_id=${departmentId}","è·åé¨é¨æå"}; public final static String[] GET_DEPARTMENT_USER_LIST = new String[]{"/cgi-bin/user/list?access_token=${accesstoken}&department_id=${departmentId}","è·åé¨é¨æå"}; //è·åæå详æ ,access_token=è°ç¨æ¥å£åè¯,userid=æåUserID public final static String[] GET_USER_DETAIL =new String[]{ "https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=${accesstoken}&userid=${id}","è·åæå详æ "}; public final static String[] GET_USER_DETAIL =new String[]{ "/cgi-bin/user/get?access_token=${accesstoken}&userid=${id}","è·åæå详æ "}; //åéåºç¨æ¶æ¯,access_token=è°ç¨æ¥å£åè¯ POST请æ±ï¼ public final static String[] SEND_MSG =new String[]{ "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=${accesstoken}","åçæ¨éæ¶æ¯"}; public final static String[] GET_USER_BY_AUTH_CODE =new String[]{ "https://qyapi.weixin.qq.com/cgi-bin/auth/getuserinfo?access_token=${accesstoken}&code=${code}","è·åç¨æ·ç»å½èº«ä»½"}; public final static String[] GET_JSAPI_TICKET =new String[]{ "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token=${accesstoken}","è·åä¼ä¸ jsapi_ticket"}; public final static String[] SEND_MSG =new String[]{ "/cgi-bin/message/send?access_token=${accesstoken}","åçæ¨éæ¶æ¯"}; public final static String[] GET_USER_BY_AUTH_CODE =new String[]{ "/cgi-bin/auth/getuserinfo?access_token=${accesstoken}&code=${code}","è·åç¨æ·ç»å½èº«ä»½"}; public final static String[] GET_JSAPI_TICKET =new String[]{ "/cgi-bin/get_jsapi_ticket?access_token=${accesstoken}","è·åä¼ä¸ jsapi_ticket"}; } server/src/main/java/com/doumee/core/utils/qiyeweixin/QywxUtil.java
@@ -9,6 +9,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; @@ -28,6 +29,8 @@ private SystemDictDataBiz systemDictDataBiz; private static QywxUtil qyUtil; @Value("${qiwei.serviceurl}") private static String qiweiUrl; @PostConstruct private void init() { @@ -158,7 +161,7 @@ String res = null; try { Map<String,String> headers = new HashMap<>(); res = HttpsUtil.postJson(url,param); res = HttpsUtil.postJson(qiweiUrl+url,param); QywxBaseResponse result = JSONObject.parseObject(res, typeReference.getType()); logResult(result,name); return result; @@ -175,7 +178,7 @@ String res = null; try { Map<String,String> headers = new HashMap<>(); res = HttpsUtil.postJson(url,param); res = HttpsUtil.postJson(qiweiUrl+url,param); T result = JSONObject.parseObject(res, typeReference.getType()); // logResult(result,name); return result; server/src/main/resources/application-dev.yml
@@ -71,3 +71,15 @@ enable: true username: admin password: 111111 qiwei: serviceurl: https://qyapi.weixin.qq.com aes: encrypt: open: true # æ¯å¦å¼å¯å å¯ true or false showLog: true # æ¯å¦æå°å è§£å¯log true or false publicKey: mN4Yn8Or8r7SH1w3 # AESå¯é¥ privateKey: # RSAç§é¥ time: 600000 server/src/main/resources/application-pro.yml
@@ -51,4 +51,8 @@ basic: enable: true username: admin password: 111111 password: qiwei: serviceurl: https://wecom-qyapi.unilever-china.com/ server/src/main/resources/application-test.yml
@@ -72,3 +72,6 @@ enable: true username: admin password: 111111 qiwei: serviceurl: https://qyapi.weixin.qq.com server/src/main/resources/application.yml
@@ -9,7 +9,7 @@ spring: profiles: active: test active: dev # JSONè¿åé ç½® jackson: # é»è®¤æ¶åº