From 1fa33039728a9bb9fb5c3a12e1245a2c68277d10 Mon Sep 17 00:00:00 2001 From: esacpe Date: Wed, 17 Jul 2024 21:04:17 +0800 Subject: [PATCH] 1 --- .idea/compiler.xml | 37 + ...__ch_qos_logback_logback_classic_1_2_3.xml | 13 + ...ven__ch_qos_logback_logback_core_1_2_3.xml | 13 + .../Maven__cn_hutool_hutool_all_5_7_20.xml | 13 + .../Maven__com_alibaba_druid_1_2_8.xml | 13 + ...libaba_druid_spring_boot_starter_1_2_8.xml | 13 + .../Maven__com_alibaba_fastjson_1_2_83.xml | 13 + ...baba_transmittable_thread_local_2_11_5.xml | 13 + .../Maven__com_auth0_java_jwt_3_8_1.xml | 13 + ...Maven__com_baomidou_mybatis_plus_3_4_3.xml | 13 + ...baomidou_mybatis_plus_annotation_3_4_3.xml | 13 + ...omidou_mybatis_plus_boot_starter_3_4_3.xml | 13 + ...__com_baomidou_mybatis_plus_core_3_4_3.xml | 13 + ..._baomidou_mybatis_plus_extension_3_4_3.xml | 13 + .../Maven__com_belerweb_pinyin4j_2_5_0.xml | 13 + ...earch_thirdparty_simple_xml_safe_2_7_1.xml | 13 + .../Maven__com_fasterxml_classmate_1_3_4.xml | 13 + ...ackson_core_jackson_annotations_2_11_1.xml | 13 + ...ackson_core_jackson_annotations_2_11_2.xml | 13 + ...jackson_core_jackson_annotations_2_4_3.xml | 13 + ...jackson_core_jackson_annotations_2_8_7.xml | 13 + ...jackson_core_jackson_annotations_2_9_0.xml | 13 + ...erxml_jackson_core_jackson_core_2_11_1.xml | 13 + ...erxml_jackson_core_jackson_core_2_11_2.xml | 13 + ...terxml_jackson_core_jackson_core_2_4_3.xml | 13 + ...terxml_jackson_core_jackson_core_2_9_9.xml | 13 + ...l_jackson_core_jackson_databind_2_11_1.xml | 13 + ...ml_jackson_core_jackson_databind_2_4_3.xml | 13 + ...ml_jackson_core_jackson_databind_2_9_9.xml | 13 + ...aformat_jackson_dataformat_yaml_2_11_1.xml | 13 + ..._datatype_jackson_datatype_jdk8_2_11_1.xml | 13 + ...atatype_jackson_datatype_jsr310_2_11_1.xml | 13 + ..._jackson_module_parameter_names_2_11_1.xml | 13 + ...hub_caspar_chen_swagger_ui_layer_1_1_3.xml | 13 + ...__com_github_jsqlparser_jsqlparser_4_2.xml | 13 + ...com_github_pagehelper_pagehelper_5_3_0.xml | 13 + ...aven__com_github_penggle_kaptcha_2_3_2.xml | 13 + ...en__com_github_virtuald_curvesapi_1_06.xml | 13 + ..._com_google_code_findbugs_jsr305_3_0_2.xml | 13 + ...rorprone_error_prone_annotations_2_3_4.xml | 13 + ...__com_google_guava_failureaccess_1_0_1.xml | 13 + ...Maven__com_google_guava_guava_29_0_jre.xml | 13 + ...9_0_empty_to_avoid_conflict_with_guava.xml | 13 + ...m_google_j2objc_j2objc_annotations_1_3.xml | 13 + .../Maven__com_jhlabs_filters_2_0_235_1.xml | 13 + ...m_netflix_archaius_archaius_core_0_7_6.xml | 13 + ...n__com_netflix_feign_feign_core_8_14_4.xml | 13 + ...__com_netflix_feign_feign_slf4j_8_14_4.xml | 13 + ...om_netflix_hystrix_hystrix_core_1_5_18.xml | 13 + ...ven__com_squareup_okhttp3_okhttp_4_8_1.xml | 13 + .../Maven__com_squareup_okio_okio_2_7_0.xml | 13 + .../Maven__com_vividsolutions_jts_1_13.xml | 13 + .../Maven__com_zaxxer_HikariCP_3_4_5.xml | 13 + .../Maven__com_zaxxer_HikariCP_4_0_3.xml | 13 + .../Maven__com_zaxxer_SparseBitSet_1_2.xml | 13 + ...mons_beanutils_commons_beanutils_1_9_4.xml | 13 + ...aven__commons_codec_commons_codec_1_12.xml | 13 + ...aven__commons_codec_commons_codec_1_13.xml | 13 + ..._collections_commons_collections_3_2_2.xml | 13 + ...onfiguration_commons_configuration_1_8.xml | 13 + ...mons_fileupload_commons_fileupload_1_4.xml | 13 + .../Maven__commons_io_commons_io_2_2.xml | 13 + .../Maven__commons_io_commons_io_2_7.xml | 13 + .../Maven__commons_lang_commons_lang_2_6.xml | 13 + ..._commons_logging_commons_logging_1_1_1.xml | 13 + ...n__commons_logging_commons_logging_1_2.xml | 13 + ...io_github_openfeign_feign_core_10_10_1.xml | 13 + ...github_openfeign_feign_hystrix_10_10_1.xml | 13 + ...github_openfeign_form_feign_form_3_8_0.xml | 13 + ...openfeign_form_feign_form_spring_3_8_0.xml | 13 + ..._io_lettuce_lettuce_core_5_3_0_RELEASE.xml | 13 + ...n__io_micrometer_micrometer_core_1_5_1.xml | 13 + .../libraries/Maven__io_minio_minio_8_0_3.xml | 13 + ...en__io_netty_netty_buffer_4_1_49_Final.xml | 13 + ...en__io_netty_netty_buffer_4_1_51_Final.xml | 13 + ...ven__io_netty_netty_codec_4_1_49_Final.xml | 13 + ...ven__io_netty_netty_codec_4_1_51_Final.xml | 13 + ..._io_netty_netty_codec_dns_4_1_51_Final.xml | 13 + ...en__io_netty_netty_common_4_1_49_Final.xml | 13 + ...en__io_netty_netty_common_4_1_51_Final.xml | 13 + ...n__io_netty_netty_handler_4_1_49_Final.xml | 13 + ...n__io_netty_netty_handler_4_1_51_Final.xml | 13 + ...__io_netty_netty_resolver_4_1_49_Final.xml | 13 + ...__io_netty_netty_resolver_4_1_51_Final.xml | 13 + ..._netty_netty_resolver_dns_4_1_51_Final.xml | 13 + ..._io_netty_netty_transport_4_1_49_Final.xml | 13 + ..._io_netty_netty_transport_4_1_51_Final.xml | 13 + ...jectreactor_reactor_core_3_3_4_RELEASE.xml | 13 + ...jectreactor_reactor_core_3_3_5_RELEASE.xml | 13 + ...en__io_reactivex_rxjava2_rxjava_2_2_19.xml | 13 + .../Maven__io_reactivex_rxjava_1_2_0.xml | 13 + ...ven__io_springfox_springfox_core_2_8_0.xml | 13 + ...n__io_springfox_springfox_schema_2_8_0.xml | 13 + ...aven__io_springfox_springfox_spi_2_8_0.xml | 13 + ...o_springfox_springfox_spring_web_2_8_0.xml | 13 + ..._io_springfox_springfox_swagger2_2_8_0.xml | 13 + ...ringfox_springfox_swagger_common_2_8_0.xml | 13 + ...o_springfox_springfox_swagger_ui_2_8_0.xml | 13 + ..._io_swagger_swagger_annotations_1_5_14.xml | 13 + ...aven__io_swagger_swagger_models_1_5_14.xml | 13 + ...nnotation_jakarta_annotation_api_1_3_5.xml | 13 + ...alidation_jakarta_validation_api_2_0_2.xml | 13 + ..._annotation_javax_annotation_api_1_3_2.xml | 13 + .../Maven__javax_cache_cache_api_1_0_0.xml | 13 + ..._javax_servlet_javax_servlet_api_3_1_0.xml | 13 + ...Maven__net_bytebuddy_byte_buddy_1_10_7.xml | 13 + .../Maven__net_bytebuddy_byte_buddy_1_7_9.xml | 13 + ...en__net_sf_ehcache_ehcache_core_2_6_11.xml | 13 + ...pache_commons_commons_collections4_4_4.xml | 13 + ...g_apache_commons_commons_compress_1_19.xml | 13 + ...rg_apache_commons_commons_lang3_3_12_0.xml | 13 + ...org_apache_commons_commons_math3_3_6_1.xml | 13 + ...n__org_apache_commons_commons_text_1_6.xml | 13 + ...pache_httpcomponents_httpclient_4_5_12.xml | 13 + ..._apache_httpcomponents_httpcore_4_4_13.xml | 13 + ..._apache_logging_log4j_log4j_api_2_13_2.xml | 13 + ..._apache_logging_log4j_log4j_api_2_13_3.xml | 13 + ...he_logging_log4j_log4j_to_slf4j_2_13_2.xml | 13 + ...he_logging_log4j_log4j_to_slf4j_2_13_3.xml | 13 + .../Maven__org_apache_poi_poi_4_1_2.xml | 13 + .../Maven__org_apache_poi_poi_ooxml_4_1_2.xml | 13 + ...org_apache_poi_poi_ooxml_schemas_4_1_2.xml | 13 + ...en__org_apache_shiro_shiro_cache_1_8_0.xml | 13 + ...g_apache_shiro_shiro_config_core_1_8_0.xml | 13 + ...g_apache_shiro_shiro_config_ogdl_1_8_0.xml | 13 + ...ven__org_apache_shiro_shiro_core_1_8_0.xml | 13 + ...apache_shiro_shiro_crypto_cipher_1_8_0.xml | 13 + ...g_apache_shiro_shiro_crypto_core_1_8_0.xml | 13 + ...g_apache_shiro_shiro_crypto_hash_1_8_0.xml | 13 + ...__org_apache_shiro_shiro_ehcache_1_8_0.xml | 13 + ...en__org_apache_shiro_shiro_event_1_8_0.xml | 13 + ...ven__org_apache_shiro_shiro_lang_1_8_0.xml | 13 + ..._tomcat_embed_tomcat_embed_core_9_0_37.xml | 13 + ...at_embed_tomcat_embed_websocket_9_0_37.xml | 13 + ...ache_velocity_velocity_engine_core_2_3.xml | 13 + ...en__org_apache_xmlbeans_xmlbeans_3_1_0.xml | 13 + ...Maven__org_aspectj_aspectjweaver_1_9_6.xml | 13 + ...g_checkerframework_checker_qual_2_11_1.xml | 13 + .../Maven__org_glassfish_jakarta_el_3_0_3.xml | 13 + ...__org_hdrhistogram_HdrHistogram_2_1_12.xml | 13 + ...n__org_hdrhistogram_HdrHistogram_2_1_9.xml | 13 + ...idator_hibernate_validator_6_1_5_Final.xml | 13 + ...ven__org_javassist_javassist_3_21_0_GA.xml | 13 + ...boss_logging_jboss_logging_3_3_2_Final.xml | 13 + ...shalling_jboss_marshalling_2_0_9_Final.xml | 13 + ...ng_jboss_marshalling_river_2_0_9_Final.xml | 13 + .../Maven__org_jetbrains_annotations_13_0.xml | 13 + ..._jetbrains_kotlin_kotlin_stdlib_1_3_72.xml | 13 + ...ins_kotlin_kotlin_stdlib_common_1_3_70.xml | 13 + .../Maven__org_jodd_jodd_bean_5_0_13.xml | 13 + .../Maven__org_jodd_jodd_core_5_0_13.xml | 13 + ...n__org_latencyutils_LatencyUtils_2_0_3.xml | 13 + ...n__org_mapstruct_mapstruct_1_2_0_Final.xml | 13 + .../Maven__org_mybatis_mybatis_3_5_7.xml | 13 + ...aven__org_mybatis_mybatis_spring_2_0_6.xml | 13 + ...ybatis_spring_boot_autoconfigure_2_2_0.xml | 13 + ...boot_mybatis_spring_boot_starter_2_2_0.xml | 13 + ...aven__org_projectlombok_lombok_1_16_18.xml | 13 + ...Maven__org_projectlombok_lombok_1_18_8.xml | 13 + ...reactivestreams_reactive_streams_1_0_3.xml | 13 + .../Maven__org_redisson_redisson_3_13_3.xml | 13 + ...on_redisson_spring_boot_starter_3_13_3.xml | 13 + ...edisson_redisson_spring_data_23_3_13_3.xml | 13 + ...en__org_reflections_reflections_0_9_11.xml | 13 + .../Maven__org_slf4j_jul_to_slf4j_1_7_30.xml | 13 + .../Maven__org_slf4j_slf4j_api_1_7_13.xml | 13 + .../Maven__org_slf4j_slf4j_api_1_7_25.xml | 13 + .../Maven__org_slf4j_slf4j_api_1_7_26.xml | 13 + .../Maven__org_slf4j_slf4j_api_1_7_30.xml | 13 + ...amework_boot_spring_boot_2_3_0_RELEASE.xml | 13 + ...amework_boot_spring_boot_2_3_2_RELEASE.xml | 13 + ...oot_spring_boot_actuator_2_3_0_RELEASE.xml | 13 + ...t_actuator_autoconfigure_2_3_0_RELEASE.xml | 13 + ...ring_boot_autoconfigure_1_5_12_RELEASE.xml | 13 + ...pring_boot_autoconfigure_2_3_0_RELEASE.xml | 13 + ...pring_boot_autoconfigure_2_3_2_RELEASE.xml | 13 + ...k_boot_spring_boot_autoconfigure_2_4_5.xml | 13 + ...boot_spring_boot_starter_2_3_0_RELEASE.xml | 13 + ...boot_spring_boot_starter_2_3_2_RELEASE.xml | 13 + ...ng_boot_starter_actuator_2_3_0_RELEASE.xml | 13 + ..._spring_boot_starter_aop_2_3_2_RELEASE.xml | 13 + ..._boot_starter_data_redis_2_3_0_RELEASE.xml | 13 + ...rk_boot_spring_boot_starter_jdbc_2_4_5.xml | 13 + ...rk_boot_spring_boot_starter_jdbc_2_5_0.xml | 13 + ...spring_boot_starter_json_2_3_2_RELEASE.xml | 13 + ...ing_boot_starter_logging_2_3_0_RELEASE.xml | 13 + ...ing_boot_starter_logging_2_3_2_RELEASE.xml | 13 + ...ring_boot_starter_tomcat_2_3_2_RELEASE.xml | 13 + ..._boot_starter_validation_2_3_2_RELEASE.xml | 13 + ..._spring_boot_starter_web_2_3_2_RELEASE.xml | 13 + ...ot_spring_boot_starter_websocket_2_4_5.xml | 13 + ...g_cloud_netflix_archaius_2_2_5_RELEASE.xml | 13 + ...ing_cloud_netflix_ribbon_2_2_5_RELEASE.xml | 13 + ...ing_cloud_openfeign_core_2_2_5_RELEASE.xml | 13 + ...data_spring_data_commons_2_3_0_RELEASE.xml | 13 + ...ata_spring_data_keyvalue_2_3_0_RELEASE.xml | 13 + ...k_data_spring_data_redis_2_3_0_RELEASE.xml | 13 + ...lugin_spring_plugin_core_1_2_0_RELEASE.xml | 13 + ...n_spring_plugin_metadata_1_2_0_RELEASE.xml | 13 + ...ringframework_spring_aop_5_2_6_RELEASE.xml | 13 + ...ringframework_spring_aop_5_2_8_RELEASE.xml | 13 + ...ngframework_spring_beans_4_0_9_RELEASE.xml | 13 + ...ngframework_spring_beans_5_2_8_RELEASE.xml | 13 + ...org_springframework_spring_beans_5_3_6.xml | 13 + ...org_springframework_spring_beans_5_3_7.xml | 13 + ...framework_spring_context_4_0_9_RELEASE.xml | 13 + ...framework_spring_context_5_2_8_RELEASE.xml | 13 + ...k_spring_context_support_5_2_6_RELEASE.xml | 13 + ...ingframework_spring_core_5_2_6_RELEASE.xml | 13 + ...ingframework_spring_core_5_2_8_RELEASE.xml | 13 + ..._org_springframework_spring_core_5_3_6.xml | 13 + ...mework_spring_expression_5_2_8_RELEASE.xml | 13 + ...ringframework_spring_jcl_5_2_6_RELEASE.xml | 13 + ...ringframework_spring_jcl_5_2_8_RELEASE.xml | 13 + ...__org_springframework_spring_jcl_5_3_6.xml | 13 + ..._org_springframework_spring_jdbc_5_3_6.xml | 13 + ..._org_springframework_spring_jdbc_5_3_7.xml | 13 + ...springframework_spring_messaging_5_3_6.xml | 13 + ...ringframework_spring_oxm_5_2_6_RELEASE.xml | 13 + ...pringframework_spring_tx_5_2_6_RELEASE.xml | 13 + ...n__org_springframework_spring_tx_5_3_6.xml | 13 + ...n__org_springframework_spring_tx_5_3_7.xml | 13 + ...ringframework_spring_web_5_1_5_RELEASE.xml | 13 + ...ringframework_spring_web_5_2_8_RELEASE.xml | 13 + ...gframework_spring_webmvc_5_2_8_RELEASE.xml | 13 + ...springframework_spring_websocket_5_3_6.xml | 13 + .../Maven__org_ssssssss_magic_api_2_0_1.xml | 13 + ...sssssss_magic_api_plugin_swagger_2_0_1.xml | 13 + ...ss_magic_api_spring_boot_starter_2_0_1.xml | 13 + ...Maven__org_ssssssss_magic_editor_2_0_1.xml | 13 + ...Maven__org_ssssssss_magic_script_1_8_5.xml | 13 + .../Maven__org_yaml_snakeyaml_1_26.xml | 13 + .idea/misc.xml | 11 + .idea/modules.xml | 19 + .idea/workspace.xml | 96 + common-base-starter/common-base-starter.iml | 146 + common-base-starter/pom.xml | 187 + .../base/autoconfig/Desensitization.java | 113 + .../autoconfig/JacksonCustomizerConfig.java | 88 + .../autoconfig/swagger/SwaggerConfig.java | 87 + .../mosty/common/base/constant/Constants.java | 114 + .../common/base/constant/GenConstants.java | 176 + .../common/base/constant/OnlineStatus.java | 23 + .../base/constant/PermissionConstants.java | 38 + .../base/constant/ScheduleConstants.java | 56 + .../common/base/constant/ShiroConstants.java | 78 + .../base/constant/SystemConfigConstants.java | 26 + .../common/base/constant/UserConstants.java | 148 + .../base/constant/enums/ConfigKeyEnum.java | 21 + .../base/constant/enums/DeletedEnum.java | 26 + .../base/constant/enums/DictTypeEnum.java | 27 + .../base/constant/enums/MenuTypeEnum.java | 43 + .../constant/enums/PasswordLevelEnum.java | 22 + .../constant/enums/PermissionLevelEnum.java | 38 + .../common/base/data/scope/DataScope.java | 24 + .../common/base/domain/BaseController.java | 207 + .../mosty/common/base/domain/CxSelect.java | 60 + .../common/base/domain/ResponseResult.java | 99 + .../common/base/domain/TableDataInfo.java | 82 + .../common/base/domain/page/PageDomain.java | 86 + .../common/base/domain/page/PageUtils.java | 27 + .../common/base/domain/page/ServletUtils.java | 156 + .../common/base/domain/page/SqlUtil.java | 53 + .../common/base/domain/page/TableSupport.java | 51 + .../common/base/entity/log/BaseEntity.java | 141 + .../common/base/entity/log/BusinessType.java | 38 + .../common/base/entity/log/CharsetKit.java | 87 + .../mosty/common/base/entity/log/Convert.java | 1013 + .../mosty/common/base/entity/log/Excel.java | 188 + .../base/entity/log/ExcelHandlerAdapter.java | 17 + .../mosty/common/base/entity/log/Excels.java | 18 + .../com/mosty/common/base/entity/log/Log.java | 36 + .../common/base/entity/log/LogConst.java | 15 + .../common/base/entity/log/OperatorType.java | 25 + .../common/base/entity/log/ReflectUtils.java | 410 + .../common/base/entity/log/SpringUtils.java | 114 + .../common/base/entity/log/StringUtils.java | 562 + .../common/base/entity/log/SysOperLog.java | 96 + .../common/base/entity/realm/SysUser.java | 380 + .../mosty/common/base/exception/Asserts.java | 97 + .../base/exception/BusinessException.java | 51 + .../base/exception/BusinessExceptionEnum.java | 26 + .../common/base/exception/BusinessStatus.java | 19 + .../base/exception/MostyExceptionHandler.java | 76 + .../base/exception/ServiceException.java | 50 + .../common/base/exception/UtilException.java | 26 + .../base/lock/optimistic/AopTargetUtils.java | 48 + .../lock/optimistic/EnableOptimisticLock.java | 32 + .../base/lock/optimistic/OptimisticLock.java | 300 + .../OptimisticLockConfiguration.java | 32 + .../optimistic/OptimisticLockException.java | 20 + .../common/base/lock/redisson/CallBack.java | 17 + .../redisson/RedisConcurrentException.java | 18 + .../common/base/mybatis/MybatisConfig.java | 45 + .../system/config/EnableSystemConfig.java | 21 + .../base/threadpool/SimpleThreadPool.java | 176 + .../common/base/threadpool/ThreadPool.java | 20 + .../base/threadpool/ThreadPoolEntity.java | 78 + .../base/threadpool/ThreadPoolInit.java | 188 + .../log/OperationLogThreadPool.java | 49 + .../base/timeconsume/EnableTimeConsume.java | 19 + .../common/base/timeconsume/TimeConsume.java | 40 + .../base/timeconsume/TimeConsumeAction.java | 116 + .../timeconsume/TimeConsumeActionConfig.java | 23 + .../timeconsume/TimeConsumeStopWatch.java | 33 + .../mosty/common/base/token/MostyContext.java | 19 + .../common/base/token/MostyUserInfo.java | 40 + .../mosty/common/base/util/Base64Util.java | 28 + .../common/base/util/BeanValidators.java | 24 + .../base/util/ChineseCharacterUtil.java | 127 + .../com/mosty/common/base/util/DateUtils.java | 221 + .../common/base/util/DistributedLockUtil.java | 256 + .../mosty/common/base/util/FileTypeUtils.java | 94 + .../mosty/common/base/util/ImageUtils.java | 84 + .../com/mosty/common/base/util/IpUtil.java | 195 + .../common/base/util/LocalDateTimeUtils.java | 44 + .../com/mosty/common/base/util/Md5Utils.java | 53 + .../mosty/common/base/util/MimeTypeUtils.java | 59 + .../mosty/common/base/util/PasswordUtil.java | 79 + .../mosty/common/base/util/RandomUtil.java | 126 + .../mosty/common/base/util/ServletUtils.java | 180 + .../common/base/util/SpringIocContext.java | 81 + .../mosty/common/base/util/StringUtils.java | 478 + .../main/resources/META-INF/spring.factories | 9 + .../target/classes/META-INF/spring.factories | 9 + .../autoconfig/Desensitization$BankCard.class | Bin 0 -> 1682 bytes .../autoconfig/Desensitization$FullName.class | Bin 0 -> 2009 bytes .../Desensitization$IdentityCard.class | Bin 0 -> 1694 bytes .../autoconfig/Desensitization$Phone.class | Bin 0 -> 1735 bytes .../base/autoconfig/Desensitization.class | Bin 0 -> 689 bytes .../autoconfig/swagger/SwaggerConfig.class | Bin 0 -> 4621 bytes .../common/base/constant/Constants.class | Bin 0 -> 1511 bytes .../common/base/constant/GenConstants.class | Bin 0 -> 2655 bytes .../common/base/constant/OnlineStatus.class | Bin 0 -> 1321 bytes .../base/constant/PermissionConstants.class | Bin 0 -> 651 bytes .../constant/ScheduleConstants$Status.class | Bin 0 -> 1484 bytes .../base/constant/ScheduleConstants.class | Bin 0 -> 734 bytes .../common/base/constant/ShiroConstants.class | Bin 0 -> 1041 bytes .../base/constant/SystemConfigConstants.class | Bin 0 -> 626 bytes .../common/base/constant/UserConstants.class | Bin 0 -> 2762 bytes .../base/constant/enums/ConfigKeyEnum.class | Bin 0 -> 1309 bytes .../base/constant/enums/DeletedEnum.class | Bin 0 -> 1429 bytes .../base/constant/enums/DictTypeEnum.class | Bin 0 -> 1445 bytes .../base/constant/enums/MenuTypeEnum.class | Bin 0 -> 1888 bytes .../constant/enums/PasswordLevelEnum.class | Bin 0 -> 1393 bytes .../constant/enums/PermissionLevelEnum.class | Bin 0 -> 1584 bytes .../common/base/data/scope/DataScope.class | Bin 0 -> 548 bytes .../common/base/domain/BaseController$1.class | Bin 0 -> 1162 bytes .../common/base/domain/BaseController.class | Bin 0 -> 1913 bytes .../mosty/common/base/domain/CxSelect.class | Bin 0 -> 1461 bytes .../common/base/domain/ResponseResult.class | Bin 0 -> 4946 bytes .../common/base/domain/TableDataInfo.class | Bin 0 -> 1642 bytes .../common/base/domain/page/PageDomain.class | Bin 0 -> 2143 bytes .../common/base/domain/page/PageUtils.class | Bin 0 -> 1501 bytes .../base/domain/page/ServletUtils.class | Bin 0 -> 3756 bytes .../common/base/domain/page/SqlUtil.class | Bin 0 -> 1628 bytes .../base/domain/page/TableSupport.class | Bin 0 -> 1432 bytes .../common/base/entity/log/BaseEntity.class | Bin 0 -> 2931 bytes .../common/base/entity/log/BusinessType.class | Bin 0 -> 1522 bytes .../common/base/entity/log/CharsetKit.class | Bin 0 -> 1843 bytes .../common/base/entity/log/Convert.class | Bin 0 -> 14153 bytes .../base/entity/log/Excel$ColumnType.class | Bin 0 -> 1403 bytes .../common/base/entity/log/Excel$Type.class | Bin 0 -> 1358 bytes .../mosty/common/base/entity/log/Excel.class | Bin 0 -> 2064 bytes .../base/entity/log/ExcelHandlerAdapter.class | Bin 0 -> 229 bytes .../mosty/common/base/entity/log/Excels.class | Bin 0 -> 451 bytes .../mosty/common/base/entity/log/Log.class | Bin 0 -> 895 bytes .../common/base/entity/log/LogConst.class | Bin 0 -> 405 bytes .../common/base/entity/log/OperatorType.class | Bin 0 -> 1144 bytes .../common/base/entity/log/ReflectUtils.class | Bin 0 -> 10886 bytes .../common/base/entity/log/SpringUtils.class | Bin 0 -> 2387 bytes .../common/base/entity/log/StringUtils.class | Bin 0 -> 7996 bytes .../common/base/entity/log/SysOperLog.class | Bin 0 -> 13348 bytes .../common/base/entity/realm/SysUser.class | Bin 0 -> 7190 bytes .../mosty/common/base/exception/Asserts.class | Bin 0 -> 2952 bytes .../base/exception/BusinessException.class | Bin 0 -> 2730 bytes .../exception/BusinessExceptionEnum.class | Bin 0 -> 1333 bytes .../base/exception/BusinessStatus.class | Bin 0 -> 1099 bytes .../exception/MostyExceptionHandler.class | Bin 0 -> 4681 bytes .../base/exception/ServiceException.class | Bin 0 -> 1042 bytes .../common/base/exception/UtilException.class | Bin 0 -> 826 bytes .../base/lock/optimistic/AopTargetUtils.class | Bin 0 -> 1862 bytes .../optimistic/EnableOptimisticLock.class | Bin 0 -> 578 bytes .../optimistic/OptimisticLockException.class | Bin 0 -> 469 bytes .../common/base/lock/redisson/CallBack.class | Bin 0 -> 328 bytes .../redisson/RedisConcurrentException.class | Bin 0 -> 544 bytes .../common/base/mybatis/MybatisConfig.class | Bin 0 -> 1786 bytes .../system/config/EnableSystemConfig.class | Bin 0 -> 626 bytes .../base/threadpool/SimpleThreadPool.class | Bin 0 -> 6431 bytes .../common/base/threadpool/ThreadPool.class | Bin 0 -> 350 bytes .../base/threadpool/ThreadPoolEntity.class | Bin 0 -> 1956 bytes .../ThreadPoolInit$DefaultThreadFactory.class | Bin 0 -> 2060 bytes .../threadpool/ThreadPoolInit$PoolModel.class | Bin 0 -> 1309 bytes .../base/threadpool/ThreadPoolInit.class | Bin 0 -> 8225 bytes .../log/OperationLogThreadPool.class | Bin 0 -> 2197 bytes .../base/timeconsume/EnableTimeConsume.class | Bin 0 -> 622 bytes .../common/base/timeconsume/TimeConsume.class | Bin 0 -> 548 bytes .../base/timeconsume/TimeConsumeAction.class | Bin 0 -> 4782 bytes .../timeconsume/TimeConsumeActionConfig.class | Bin 0 -> 894 bytes .../timeconsume/TimeConsumeStopWatch.class | Bin 0 -> 887 bytes .../common/base/token/MostyContext.class | Bin 0 -> 1271 bytes .../common/base/token/MostyUserInfo.class | Bin 0 -> 2920 bytes .../mosty/common/base/util/Base64Util.class | Bin 0 -> 693 bytes .../common/base/util/BeanValidators.class | Bin 0 -> 1225 bytes .../base/util/ChineseCharacterUtil.class | Bin 0 -> 3157 bytes .../mosty/common/base/util/DateUtils.class | Bin 0 -> 5896 bytes .../base/util/DistributedLockUtil$1.class | Bin 0 -> 259 bytes .../DistributedLockUtil$CacheConfig.class | Bin 0 -> 1503 bytes .../util/DistributedLockUtil$Parameter.class | Bin 0 -> 3226 bytes .../util/DistributedLockUtil$Singleton.class | Bin 0 -> 828 bytes .../base/util/DistributedLockUtil.class | Bin 0 -> 9010 bytes .../common/base/util/FileTypeUtils.class | Bin 0 -> 2021 bytes .../mosty/common/base/util/ImageUtils.class | Bin 0 -> 2257 bytes .../com/mosty/common/base/util/IpUtil.class | Bin 0 -> 4773 bytes .../common/base/util/LocalDateTimeUtils.class | Bin 0 -> 1250 bytes .../com/mosty/common/base/util/Md5Utils.class | Bin 0 -> 1975 bytes .../common/base/util/MimeTypeUtils.class | Bin 0 -> 1891 bytes .../mosty/common/base/util/PasswordUtil.class | Bin 0 -> 2438 bytes .../mosty/common/base/util/RandomUtil.class | Bin 0 -> 3114 bytes .../mosty/common/base/util/ServletUtils.class | Bin 0 -> 4519 bytes .../common/base/util/SpringIocContext.class | Bin 0 -> 2078 bytes .../mosty/common/base/util/StringUtils.class | Bin 0 -> 7860 bytes ...on-base-starter-1.0.0-SNAPSHOT-sources.jar | Bin 0 -> 95488 bytes .../common-base-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 133139 bytes .../target/maven-archiver/pom.properties | 5 + .../common-config-starter.iml | 149 + common-config-starter/pom.xml | 116 + .../config/CommonConfigAutoConfiguration.java | 18 + .../common/config/ConfigServiceFactory.java | 35 + .../mosty/common/config/Excel/DictUtils.java | 131 + .../mosty/common/config/Excel/ExcelExp.java | 50 + .../mosty/common/config/Excel/ExcelUtil.java | 1300 + .../config/Excel/ExcelUtilManySheet.java | 958 + .../config/config/DictElementConfig.java | 84 + .../common/config/config/SystemConfig.java | 21 + .../constant/enums/DictElementEnum.java | 39 + .../controller/SysConfigController.java | 163 + .../config/controller/SysDictController.java | 323 + .../controller/SysDictItemController.java | 321 + .../SysVersionManageController.java | 168 + .../mosty/common/config/entity/SysConfig.java | 93 + .../mosty/common/config/entity/SysDict.java | 109 + .../common/config/entity/SysDictItem.java | 114 + .../config/entity/SysVersionManage.java | 100 + .../config/entity/vo/AddDictItemVO.java | 45 + .../config/entity/vo/AddPositionVO.java | 38 + .../config/entity/vo/AddSysConfigVO.java | 49 + .../common/config/entity/vo/AddSysDictVO.java | 49 + .../config/entity/vo/AddVersionManageVO.java | 50 + .../common/config/entity/vo/ConfigPage.java | 29 + .../common/config/entity/vo/DeleteVO.java | 24 + .../common/config/entity/vo/DictPage.java | 34 + .../config/entity/vo/EditDictItemVO.java | 42 + .../config/entity/vo/EditPositionVO.java | 38 + .../config/entity/vo/EditSysConfigVO.java | 47 + .../config/entity/vo/EditSysDictItemVO.java | 48 + .../config/entity/vo/EditSysDictVO.java | 51 + .../config/entity/vo/EditVersionManageVO.java | 47 + .../config/entity/vo/SysDictItemVO.java | 58 + .../config/entity/vo/SysDictQueryPage.java | 26 + .../config/entity/vo/SysDictQueryVo.java | 26 + .../common/config/entity/vo/SysDictVO.java | 43 + .../config/entity/vo/VersionManagePage.java | 34 + .../common/config/mapper/SysConfigMapper.java | 16 + .../config/mapper/SysDictItemMapper.java | 16 + .../common/config/mapper/SysDictMapper.java | 21 + .../config/mapper/SysVersionManageMapper.java | 16 + .../config/service/SysConfigService.java | 29 + .../config/service/SysDictItemService.java | 26 + .../common/config/service/SysDictService.java | 21 + .../service/SysVersionManageService.java | 25 + .../service/impl/SysConfigServiceImpl.java | 56 + .../service/impl/SysDictItemServiceImpl.java | 101 + .../service/impl/SysDictServiceImpl.java | 43 + .../impl/SysVersionManageServiceImpl.java | 46 + .../main/resources/META-INF/spring.factories | 5 + .../main/resources/mapper/SysConfigMapper.xml | 5 + .../resources/mapper/SysDictItemMapper.xml | 5 + .../main/resources/mapper/SysDictMapper.xml | 17 + .../mapper/SysVersionManageMapper.xml | 5 + .../target/classes/META-INF/spring.factories | 5 + .../CommonConfigAutoConfiguration.class | Bin 0 -> 555 bytes .../common/config/ConfigServiceFactory.class | Bin 0 -> 956 bytes .../mosty/common/config/Excel/DictUtils.class | Bin 0 -> 3836 bytes .../mosty/common/config/Excel/ExcelExp.class | Bin 0 -> 1454 bytes .../mosty/common/config/Excel/ExcelUtil.class | Bin 0 -> 40853 bytes .../config/Excel/ExcelUtilManySheet.class | Bin 0 -> 32605 bytes .../config/config/DictElementConfig.class | Bin 0 -> 8494 bytes .../common/config/config/SystemConfig.class | Bin 0 -> 1724 bytes .../constant/enums/DictElementEnum.class | Bin 0 -> 2484 bytes .../controller/SysConfigController.class | Bin 0 -> 7099 bytes .../config/controller/SysDictController.class | Bin 0 -> 20509 bytes .../controller/SysDictItemController.class | Bin 0 -> 20282 bytes .../SysVersionManageController.class | Bin 0 -> 7523 bytes .../common/config/entity/SysConfig.class | Bin 0 -> 11806 bytes .../mosty/common/config/entity/SysDict.class | Bin 0 -> 13882 bytes .../common/config/entity/SysDictItem.class | Bin 0 -> 15099 bytes .../config/entity/SysVersionManage.class | Bin 0 -> 12695 bytes .../config/entity/vo/AddDictItemVO.class | Bin 0 -> 4987 bytes .../config/entity/vo/AddPositionVO.class | Bin 0 -> 3475 bytes .../config/entity/vo/AddSysConfigVO.class | Bin 0 -> 3591 bytes .../config/entity/vo/AddSysDictVO.class | Bin 0 -> 4520 bytes .../config/entity/vo/AddVersionManageVO.class | Bin 0 -> 4418 bytes .../common/config/entity/vo/ConfigPage.class | Bin 0 -> 2032 bytes .../common/config/entity/vo/DeleteVO.class | Bin 0 -> 2472 bytes .../common/config/entity/vo/DictPage.class | Bin 0 -> 2584 bytes .../config/entity/vo/EditDictItemVO.class | Bin 0 -> 4607 bytes .../config/entity/vo/EditPositionVO.class | Bin 0 -> 3840 bytes .../config/entity/vo/EditSysConfigVO.class | Bin 0 -> 3958 bytes .../config/entity/vo/EditSysDictItemVO.class | Bin 0 -> 4207 bytes .../config/entity/vo/EditSysDictVO.class | Bin 0 -> 5223 bytes .../entity/vo/EditVersionManageVO.class | Bin 0 -> 4425 bytes .../config/entity/vo/SysDictItemVO.class | Bin 0 -> 6082 bytes .../config/entity/vo/SysDictQueryPage.class | Bin 0 -> 2020 bytes .../config/entity/vo/SysDictQueryVo.class | Bin 0 -> 1946 bytes .../common/config/entity/vo/SysDictVO.class | Bin 0 -> 5188 bytes .../config/entity/vo/VersionManagePage.class | Bin 0 -> 2583 bytes .../config/mapper/SysConfigMapper.class | Bin 0 -> 331 bytes .../config/mapper/SysDictItemMapper.class | Bin 0 -> 337 bytes .../common/config/mapper/SysDictMapper.class | Bin 0 -> 325 bytes .../mapper/SysVersionManageMapper.class | Bin 0 -> 352 bytes .../config/service/SysConfigService.class | Bin 0 -> 732 bytes .../config/service/SysDictItemService.class | Bin 0 -> 464 bytes .../config/service/SysDictService.class | Bin 0 -> 599 bytes .../service/SysVersionManageService.class | Bin 0 -> 653 bytes .../service/impl/SysConfigServiceImpl.class | Bin 0 -> 6128 bytes .../service/impl/SysDictItemServiceImpl.class | Bin 0 -> 7297 bytes .../service/impl/SysDictServiceImpl.class | Bin 0 -> 3682 bytes .../impl/SysVersionManageServiceImpl.class | Bin 0 -> 4358 bytes .../target/classes/mapper/SysConfigMapper.xml | 5 + .../classes/mapper/SysDictItemMapper.xml | 5 + .../target/classes/mapper/SysDictMapper.xml | 17 + .../classes/mapper/SysVersionManageMapper.xml | 5 + .../common-config-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 134278 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 48 + .../compile/default-compile/inputFiles.lst | 48 + common-core-starter/common-core-starter.iml | 165 + common-core-starter/pom.xml | 112 + .../common/core/CoreAutoConfiguration.java | 16 + .../SysAppHomeconfigController.java | 107 + .../SysAppHomeconfigPlateController.java | 127 + .../SysAppHomeconfigPlateListController.java | 127 + .../controller/SysDeptController.java | 227 + .../controller/SysLogininforController.java | 75 + .../controller/SysMenuController.java | 186 + .../controller/SysPositionController.java | 153 + .../controller/SysRoleController.java | 281 + .../SysUserAppHomeconfigController.java | 157 + .../SysUserAppHomeconfigPlateController.java | 130 + ...sUserAppHomeconfigPlateListController.java | 127 + .../controller/SysUserController.java | 313 + .../business/controller/TokenController.java | 106 + .../business/entity/SysAppHomeconfig.java | 88 + .../entity/SysAppHomeconfigPlate.java | 103 + .../entity/SysAppHomeconfigPlateList.java | 100 + .../common/core/business/entity/SysDept.java | 382 + .../core/business/entity/SysLogininfor.java | 110 + .../common/core/business/entity/SysMenu.java | 114 + .../common/core/business/entity/SysOss.java | 114 + .../core/business/entity/SysPosition.java | 94 + .../common/core/business/entity/SysRole.java | 269 + .../core/business/entity/SysRoleDept.java | 79 + .../core/business/entity/SysRoleMenu.java | 79 + .../common/core/business/entity/SysUser.java | 332 + .../business/entity/SysUserAppHomeconfig.java | 109 + .../entity/SysUserAppHomeconfigPlate.java | 103 + .../entity/SysUserAppHomeconfigPlateList.java | 103 + .../core/business/entity/SysUserDept.java | 90 + .../core/business/entity/SysUserRole.java | 88 + .../core/business/entity/TbJcglXfll.java | 183 + .../common/core/business/entity/Ybmj.java | 51 + .../business/entity/request/LoginLogPage.java | 20 + .../entity/request/SysAppHomeconfigPage.java | 34 + .../SysAppHomeconfigPlateListPage.java | 37 + .../request/SysAppHomeconfigPlatePage.java | 42 + .../entity/request/SysAppHomeconfigQuery.java | 30 + .../request/SysUserAppHomeconfigPage.java | 36 + .../SysUserAppHomeconfigPlateListPage.java | 36 + .../SysUserAppHomeconfigPlatePage.java | 39 + .../request/SysUserAppHomeconfigQuery.java | 36 + .../request/SysUserEditPasswordRequest.java | 20 + .../core/business/entity/vo/AddDeptVO.java | 81 + .../entity/vo/AddRoleDataPartitionVO.java | 36 + .../business/entity/vo/AddRoleDeptVO.java | 37 + .../business/entity/vo/AddRoleMenuVO.java | 29 + .../core/business/entity/vo/AddRoleVO.java | 60 + .../core/business/entity/vo/AddSysMenuVO.java | 55 + .../core/business/entity/vo/AddSysUserVO.java | 278 + .../business/entity/vo/AddUserDeptVO.java | 33 + .../core/business/entity/vo/Base64Str.java | 18 + .../business/entity/vo/DataPermissionVO.java | 18 + .../core/business/entity/vo/DeleteDeptVO.java | 23 + .../core/business/entity/vo/DeleteListVO.java | 19 + .../business/entity/vo/DeleteRoleDeptVO.java | 33 + .../business/entity/vo/DeleteUserDeptVO.java | 33 + .../core/business/entity/vo/DeptPage.java | 32 + .../core/business/entity/vo/DeptQuery.java | 25 + .../core/business/entity/vo/DeptTreeVO.java | 20 + .../core/business/entity/vo/DeptVo.java | 56 + .../business/entity/vo/EditSysMenuVO.java | 48 + .../core/business/entity/vo/GetUserPage.java | 24 + .../business/entity/vo/GetUserRoleListVo.java | 24 + .../business/entity/vo/LoginResponseVO.java | 23 + .../core/business/entity/vo/MenuPage.java | 29 + .../core/business/entity/vo/MenuQuery.java | 28 + .../core/business/entity/vo/PositionPage.java | 34 + .../business/entity/vo/RoleByDeptPage.java | 33 + .../core/business/entity/vo/RoleDeptVO.java | 64 + .../core/business/entity/vo/RolePage.java | 29 + .../core/business/entity/vo/RoleUserPage.java | 38 + .../core/business/entity/vo/RoleUserVO.java | 31 + .../entity/vo/SysAppHomeconfigPlateVo.java | 108 + .../entity/vo/SysAppHomeconfigRsVO.java | 92 + .../entity/vo/SysAppHomeconfigVO.java | 88 + .../core/business/entity/vo/SysDeptVO.java | 176 + .../core/business/entity/vo/SysRoleVO.java | 62 + .../vo/SysUserAppHomeconfigPlateVo.java | 107 + .../entity/vo/SysUserAppHomeconfigVo.java | 112 + .../business/entity/vo/SysUserDeptVO.java | 90 + .../business/entity/vo/SysUserEditVO.java | 97 + .../entity/vo/SysUserHomeconfigVo.java | 50 + .../business/entity/vo/SysUserInfoVO.java | 158 + .../core/business/entity/vo/SysUserVO.java | 74 + .../business/entity/vo/UnboundUserRoleVO.java | 26 + .../business/entity/vo/UserByDeptPage.java | 33 + .../core/business/entity/vo/UserDeptPage.java | 43 + .../core/business/entity/vo/UserDeptVO.java | 61 + .../core/business/entity/vo/UserPage.java | 44 + .../core/business/entity/vo/UserRoleVO.java | 31 + .../mapper/SysAppHomeconfigMapper.java | 19 + .../SysAppHomeconfigPlateListMapper.java | 23 + .../mapper/SysAppHomeconfigPlateMapper.java | 23 + .../core/business/mapper/SysDeptMapper.java | 47 + .../business/mapper/SysLogininforMapper.java | 26 + .../core/business/mapper/SysMenuMapper.java | 16 + .../core/business/mapper/SysOssMapper.java | 16 + .../business/mapper/SysPositionMapper.java | 16 + .../business/mapper/SysRoleDeptMapper.java | 18 + .../core/business/mapper/SysRoleMapper.java | 18 + .../business/mapper/SysRoleMenuMapper.java | 18 + .../mapper/SysUserAppHomeconfigMapper.java | 23 + .../SysUserAppHomeconfigPlateListMapper.java | 36 + .../SysUserAppHomeconfigPlateMapper.java | 30 + .../business/mapper/SysUserDeptMapper.java | 19 + .../core/business/mapper/SysUserMapper.java | 46 + .../business/mapper/SysUserRoleMapper.java | 38 + .../core/business/mapper/YbmjMapper.java | 13 + .../core/business/service/LoginService.java | 15 + .../SysAppHomeconfigPlateListService.java | 60 + .../service/SysAppHomeconfigPlateService.java | 60 + .../service/SysAppHomeconfigService.java | 56 + .../core/business/service/SysDeptService.java | 84 + .../service/SysLogininforService.java | 31 + .../core/business/service/SysMenuService.java | 40 + .../core/business/service/SysOssService.java | 23 + .../business/service/SysPositionService.java | 32 + .../business/service/SysRoleDeptService.java | 28 + .../business/service/SysRoleMenuService.java | 28 + .../core/business/service/SysRoleService.java | 49 + .../SysUserAppHomeconfigPlateListService.java | 63 + .../SysUserAppHomeconfigPlateService.java | 62 + .../service/SysUserAppHomeconfigService.java | 77 + .../business/service/SysUserDeptService.java | 42 + .../business/service/SysUserRoleService.java | 34 + .../core/business/service/SysUserService.java | 49 + .../service/impl/LoginServiceImpl.java | 67 + .../SysAppHomeconfigPlateListServiceImpl.java | 127 + .../SysAppHomeconfigPlateServiceImpl.java | 135 + .../impl/SysAppHomeconfigServiceImpl.java | 152 + .../service/impl/SysDeptServiceImpl.java | 592 + .../impl/SysLogininforServiceImpl.java | 191 + .../service/impl/SysMenuServiceImpl.java | 208 + .../service/impl/SysOssServiceImpl.java | 29 + .../service/impl/SysPositionServiceImpl.java | 83 + .../service/impl/SysRoleDeptServiceImpl.java | 38 + .../service/impl/SysRoleMenuServiceImpl.java | 42 + .../service/impl/SysRoleServiceImpl.java | 292 + ...UserAppHomeconfigPlateListServiceImpl.java | 175 + .../SysUserAppHomeconfigPlateServiceImpl.java | 176 + .../impl/SysUserAppHomeconfigServiceImpl.java | 343 + .../service/impl/SysUserDeptServiceImpl.java | 64 + .../service/impl/SysUserRoleServiceImpl.java | 112 + .../service/impl/SysUserServiceImpl.java | 551 + .../core/business/timer/DeptUserSys.java | 34 + .../common/core/config/CaptchaConfig.java | 72 + .../common/core/config/DefaultRoleConfig.java | 43 + .../common/core/config/MinIoClientConfig.java | 46 + .../core/constant/DataPermissionConstant.java | 44 + .../common/core/login/IdCardLoginRequest.java | 28 + .../common/core/login/ImageController.java | 74 + .../common/core/login/JwtTokenGenerator.java | 236 + .../mosty/common/core/login/LoginEntity.java | 32 + .../mosty/common/core/login/LoginRequest.java | 35 + .../common/core/login/LoginResponseVO.java | 108 + .../core/login/LoginServiceController.java | 331 + .../mosty/common/core/login/TokenRequest.java | 33 + .../core/login/UnifiedLoginRequest.java | 36 + .../core/login/UserPermissionsInfo.java | 41 + .../common/core/login/dto/DeptAllVo.java | 59 + .../mosty/common/core/login/dto/DeptDTO.java | 40 + .../common/core/login/dto/ImageRequest.java | 29 + .../common/core/minio/UploadController.java | 292 + .../core/util/BASE64DecodedMultipartFile.java | 59 + .../mosty/common/core/util/Base64Util.java | 83 + .../com/mosty/common/core/util/BeanUtils.java | 104 + .../mosty/common/core/util/CacheUtils.java | 179 + .../common/core/util/HttpClientUtil.java | 129 + .../common/core/util/KafkaProducerConfig.java | 70 + .../com/mosty/common/core/util/RSAUtil.java | 278 + .../mosty/common/core/util/ShiroUtils.java | 75 + .../common/core/util/http/HttpUtils.java | 463 + .../common/core/util/http/HttpsPostUtil.java | 259 + .../core/util/http/MyX509TrustManager.java | 20 + .../main/resources/META-INF/spring.factories | 2 + .../mapper/SysAppHomeconfigMapper.xml | 5 + .../SysAppHomeconfigPlateListMapper.xml | 10 + .../mapper/SysAppHomeconfigPlateMapper.xml | 10 + .../main/resources/mapper/SysDeptMapper.xml | 150 + .../resources/mapper/SysLogininforMapper.xml | 34 + .../main/resources/mapper/SysMenuMapper.xml | 5 + .../resources/mapper/SysOperLogMapper.xml | 223 + .../main/resources/mapper/SysOssMapper.xml | 5 + .../resources/mapper/SysPositionMapper.xml | 5 + .../resources/mapper/SysRoleDeptMapper.xml | 16 + .../main/resources/mapper/SysRoleMapper.xml | 40 + .../resources/mapper/SysRoleMenuMapper.xml | 16 + .../mapper/SysUserAppHomeconfigMapper.xml | 10 + .../SysUserAppHomeconfigPlateListMapper.xml | 22 + .../SysUserAppHomeconfigPlateMapper.xml | 15 + .../resources/mapper/SysUserDeptMapper.xml | 16 + .../main/resources/mapper/SysUserMapper.xml | 207 + .../resources/mapper/SysUserRoleMapper.xml | 54 + .../target/classes/META-INF/spring.factories | 2 + .../common/core/CoreAutoConfiguration.class | Bin 0 -> 534 bytes .../SysAppHomeconfigController.class | Bin 0 -> 5540 bytes .../SysAppHomeconfigPlateController.class | Bin 0 -> 5809 bytes .../SysAppHomeconfigPlateListController.class | Bin 0 -> 5917 bytes .../controller/SysDeptController.class | Bin 0 -> 14684 bytes .../controller/SysLogininforController.class | Bin 0 -> 6123 bytes .../controller/SysMenuController.class | Bin 0 -> 10219 bytes .../controller/SysPositionController.class | Bin 0 -> 7460 bytes .../controller/SysRoleController.class | Bin 0 -> 19956 bytes .../SysUserAppHomeconfigController.class | Bin 0 -> 7349 bytes .../SysUserAppHomeconfigPlateController.class | Bin 0 -> 5990 bytes ...UserAppHomeconfigPlateListController.class | Bin 0 -> 6140 bytes .../controller/SysUserController.class | Bin 0 -> 20377 bytes .../business/controller/TokenController.class | Bin 0 -> 6222 bytes .../business/entity/SysAppHomeconfig.class | Bin 0 -> 10928 bytes .../entity/SysAppHomeconfigPlate.class | Bin 0 -> 13734 bytes .../entity/SysAppHomeconfigPlateList.class | Bin 0 -> 13152 bytes .../common/core/business/entity/SysDept.class | Bin 0 -> 14726 bytes .../core/business/entity/SysLogininfor.class | Bin 0 -> 11938 bytes .../common/core/business/entity/SysMenu.class | Bin 0 -> 16018 bytes .../common/core/business/entity/SysOss.class | Bin 0 -> 15768 bytes .../core/business/entity/SysPosition.class | Bin 0 -> 11968 bytes .../common/core/business/entity/SysRole.class | Bin 0 -> 10032 bytes .../core/business/entity/SysRoleDept.class | Bin 0 -> 2850 bytes .../core/business/entity/SysRoleMenu.class | Bin 0 -> 2850 bytes .../common/core/business/entity/SysUser.class | Bin 0 -> 17182 bytes .../entity/SysUserAppHomeconfig.class | Bin 0 -> 14843 bytes .../entity/SysUserAppHomeconfigPlate.class | Bin 0 -> 13800 bytes .../SysUserAppHomeconfigPlateList.class | Bin 0 -> 13809 bytes .../core/business/entity/SysUserDept.class | Bin 0 -> 3267 bytes .../core/business/entity/SysUserRole.class | Bin 0 -> 3214 bytes .../core/business/entity/TbJcglXfll.class | Bin 0 -> 29869 bytes .../common/core/business/entity/Ybmj.class | Bin 0 -> 4433 bytes .../entity/request/LoginLogPage.class | Bin 0 -> 2375 bytes .../entity/request/SysAppHomeconfigPage.class | Bin 0 -> 2555 bytes .../SysAppHomeconfigPlateListPage.class | Bin 0 -> 2589 bytes .../request/SysAppHomeconfigPlatePage.class | Bin 0 -> 3193 bytes .../request/SysAppHomeconfigQuery.class | Bin 0 -> 2502 bytes .../request/SysUserAppHomeconfigPage.class | Bin 0 -> 3513 bytes .../SysUserAppHomeconfigPlateListPage.class | Bin 0 -> 3538 bytes .../SysUserAppHomeconfigPlatePage.class | Bin 0 -> 3569 bytes .../request/SysUserAppHomeconfigQuery.class | Bin 0 -> 3455 bytes .../request/SysUserEditPasswordRequest.class | Bin 0 -> 2656 bytes .../core/business/entity/vo/AddDeptVO.class | Bin 0 -> 11250 bytes .../entity/vo/AddRoleDataPartitionVO.class | Bin 0 -> 2457 bytes .../business/entity/vo/AddRoleDeptVO.class | Bin 0 -> 2751 bytes .../business/entity/vo/AddRoleMenuVO.class | Bin 0 -> 2707 bytes .../core/business/entity/vo/AddRoleVO.class | Bin 0 -> 4442 bytes .../business/entity/vo/AddSysMenuVO.class | Bin 0 -> 6119 bytes .../business/entity/vo/AddSysUserVO.class | Bin 0 -> 24881 bytes .../business/entity/vo/AddUserDeptVO.class | Bin 0 -> 2230 bytes .../core/business/entity/vo/Base64Str.class | Bin 0 -> 2069 bytes .../business/entity/vo/DataPermissionVO.class | Bin 0 -> 2618 bytes .../business/entity/vo/DeleteDeptVO.class | Bin 0 -> 2446 bytes .../business/entity/vo/DeleteListVO.class | Bin 0 -> 1969 bytes .../business/entity/vo/DeleteRoleDeptVO.class | Bin 0 -> 2356 bytes .../business/entity/vo/DeleteUserDeptVO.class | Bin 0 -> 2355 bytes .../core/business/entity/vo/DeptPage.class | Bin 0 -> 2947 bytes .../core/business/entity/vo/DeptQuery.class | Bin 0 -> 2547 bytes .../core/business/entity/vo/DeptTreeVO.class | Bin 0 -> 1636 bytes .../core/business/entity/vo/DeptVo.class | Bin 0 -> 6659 bytes .../business/entity/vo/EditSysMenuVO.class | Bin 0 -> 5535 bytes .../core/business/entity/vo/GetUserPage.class | Bin 0 -> 2091 bytes .../entity/vo/GetUserRoleListVo.class | Bin 0 -> 2879 bytes .../business/entity/vo/LoginResponseVO.class | Bin 0 -> 2312 bytes .../core/business/entity/vo/MenuPage.class | Bin 0 -> 1603 bytes .../core/business/entity/vo/MenuQuery.class | Bin 0 -> 1523 bytes .../business/entity/vo/PositionPage.class | Bin 0 -> 2098 bytes .../business/entity/vo/RoleByDeptPage.class | Bin 0 -> 2235 bytes .../core/business/entity/vo/RoleDeptVO.class | Bin 0 -> 4769 bytes .../core/business/entity/vo/RolePage.class | Bin 0 -> 2008 bytes .../business/entity/vo/RoleUserPage.class | Bin 0 -> 2785 bytes .../core/business/entity/vo/RoleUserVO.class | Bin 0 -> 2838 bytes .../entity/vo/SysAppHomeconfigPlateVo.class | Bin 0 -> 14887 bytes .../entity/vo/SysAppHomeconfigRsVO.class | Bin 0 -> 12058 bytes .../entity/vo/SysAppHomeconfigVO.class | Bin 0 -> 10951 bytes .../core/business/entity/vo/SysDeptVO.class | Bin 0 -> 8407 bytes .../core/business/entity/vo/SysRoleVO.class | Bin 0 -> 4870 bytes .../vo/SysUserAppHomeconfigPlateVo.class | Bin 0 -> 14979 bytes .../entity/vo/SysUserAppHomeconfigVo.class | Bin 0 -> 16000 bytes .../business/entity/vo/SysUserDeptVO.class | Bin 0 -> 12989 bytes .../business/entity/vo/SysUserEditVO.class | Bin 0 -> 15635 bytes .../entity/vo/SysUserHomeconfigVo.class | Bin 0 -> 4415 bytes .../business/entity/vo/SysUserInfoVO.class | Bin 0 -> 27291 bytes .../core/business/entity/vo/SysUserVO.class | Bin 0 -> 9763 bytes .../entity/vo/UnboundUserRoleVO.class | Bin 0 -> 2176 bytes .../business/entity/vo/UserByDeptPage.class | Bin 0 -> 2235 bytes .../business/entity/vo/UserDeptPage.class | Bin 0 -> 4879 bytes .../core/business/entity/vo/UserDeptVO.class | Bin 0 -> 4776 bytes .../core/business/entity/vo/UserPage.class | Bin 0 -> 5339 bytes .../core/business/entity/vo/UserRoleVO.class | Bin 0 -> 2818 bytes .../mapper/SysAppHomeconfigMapper.class | Bin 0 -> 366 bytes .../SysAppHomeconfigPlateListMapper.class | Bin 0 -> 554 bytes .../mapper/SysAppHomeconfigPlateMapper.class | Bin 0 -> 540 bytes .../core/business/mapper/SysDeptMapper.class | Bin 0 -> 2192 bytes .../business/mapper/SysLogininforMapper.class | Bin 0 -> 440 bytes .../core/business/mapper/SysMenuMapper.class | Bin 0 -> 339 bytes .../core/business/mapper/SysOssMapper.class | Bin 0 -> 336 bytes .../business/mapper/SysPositionMapper.class | Bin 0 -> 351 bytes .../business/mapper/SysRoleDeptMapper.class | Bin 0 -> 351 bytes .../core/business/mapper/SysRoleMapper.class | Bin 0 -> 339 bytes .../business/mapper/SysRoleMenuMapper.class | Bin 0 -> 351 bytes .../mapper/SysUserAppHomeconfigMapper.class | Bin 0 -> 535 bytes .../SysUserAppHomeconfigPlateListMapper.class | Bin 0 -> 825 bytes .../SysUserAppHomeconfigPlateMapper.class | Bin 0 -> 651 bytes .../business/mapper/SysUserDeptMapper.class | Bin 0 -> 351 bytes .../core/business/mapper/SysUserMapper.class | Bin 0 -> 1953 bytes .../business/mapper/SysUserRoleMapper.class | Bin 0 -> 1014 bytes .../core/business/mapper/YbmjMapper.class | Bin 0 -> 330 bytes .../core/business/service/LoginService.class | Bin 0 -> 660 bytes .../SysAppHomeconfigPlateListService.class | Bin 0 -> 1540 bytes .../SysAppHomeconfigPlateService.class | Bin 0 -> 1500 bytes .../service/SysAppHomeconfigService.class | Bin 0 -> 1277 bytes .../business/service/SysDeptService.class | Bin 0 -> 3069 bytes .../service/SysLogininforService.class | Bin 0 -> 977 bytes .../business/service/SysMenuService.class | Bin 0 -> 1722 bytes .../core/business/service/SysOssService.class | Bin 0 -> 420 bytes .../business/service/SysPositionService.class | Bin 0 -> 789 bytes .../business/service/SysRoleDeptService.class | Bin 0 -> 639 bytes .../business/service/SysRoleMenuService.class | Bin 0 -> 658 bytes .../business/service/SysRoleService.class | Bin 0 -> 2299 bytes ...SysUserAppHomeconfigPlateListService.class | Bin 0 -> 1580 bytes .../SysUserAppHomeconfigPlateService.class | Bin 0 -> 1540 bytes .../service/SysUserAppHomeconfigService.class | Bin 0 -> 1766 bytes .../business/service/SysUserDeptService.class | Bin 0 -> 904 bytes .../business/service/SysUserRoleService.class | Bin 0 -> 1289 bytes .../business/service/SysUserService.class | Bin 0 -> 2443 bytes .../service/impl/LoginServiceImpl.class | Bin 0 -> 5934 bytes ...SysAppHomeconfigPlateListServiceImpl.class | Bin 0 -> 8610 bytes .../SysAppHomeconfigPlateServiceImpl.class | Bin 0 -> 8690 bytes .../impl/SysAppHomeconfigServiceImpl.class | Bin 0 -> 14114 bytes .../service/impl/SysDeptServiceImpl.class | Bin 0 -> 37786 bytes .../impl/SysLogininforServiceImpl.class | Bin 0 -> 11857 bytes .../service/impl/SysMenuServiceImpl.class | Bin 0 -> 15766 bytes .../service/impl/SysOssServiceImpl.class | Bin 0 -> 1318 bytes .../service/impl/SysPositionServiceImpl.class | Bin 0 -> 7020 bytes .../service/impl/SysRoleDeptServiceImpl.class | Bin 0 -> 3852 bytes .../service/impl/SysRoleMenuServiceImpl.class | Bin 0 -> 4565 bytes .../service/impl/SysRoleServiceImpl.class | Bin 0 -> 21526 bytes ...serAppHomeconfigPlateListServiceImpl.class | Bin 0 -> 11695 bytes ...SysUserAppHomeconfigPlateServiceImpl.class | Bin 0 -> 11085 bytes .../SysUserAppHomeconfigServiceImpl.class | Bin 0 -> 24553 bytes .../service/impl/SysUserDeptServiceImpl.class | Bin 0 -> 5564 bytes .../service/impl/SysUserRoleServiceImpl.class | Bin 0 -> 9064 bytes .../service/impl/SysUserServiceImpl.class | Bin 0 -> 32411 bytes .../core/business/timer/DeptUserSys.class | Bin 0 -> 1163 bytes .../common/core/config/CaptchaConfig.class | Bin 0 -> 3815 bytes .../core/config/DefaultRoleConfig.class | Bin 0 -> 3033 bytes .../core/config/MinIoClientConfig.class | Bin 0 -> 4741 bytes .../constant/DataPermissionConstant.class | Bin 0 -> 648 bytes .../core/login/IdCardLoginRequest.class | Bin 0 -> 1860 bytes .../common/core/login/ImageController.class | Bin 0 -> 3582 bytes .../common/core/login/JwtTokenGenerator.class | Bin 0 -> 8184 bytes .../mosty/common/core/login/LoginEntity.class | Bin 0 -> 2816 bytes .../common/core/login/LoginRequest.class | Bin 0 -> 2851 bytes .../common/core/login/LoginResponseVO.class | Bin 0 -> 8615 bytes .../core/login/LoginServiceController.class | Bin 0 -> 20185 bytes .../common/core/login/TokenRequest.class | Bin 0 -> 3146 bytes .../core/login/UnifiedLoginRequest.class | Bin 0 -> 2347 bytes .../core/login/UserPermissionsInfo.class | Bin 0 -> 3971 bytes .../common/core/login/dto/DeptAllVo.class | Bin 0 -> 7343 bytes .../mosty/common/core/login/dto/DeptDTO.class | Bin 0 -> 4574 bytes .../common/core/login/dto/ImageRequest.class | Bin 0 -> 1825 bytes .../common/core/minio/UploadController.class | Bin 0 -> 16954 bytes .../util/BASE64DecodedMultipartFile.class | Bin 0 -> 2071 bytes .../mosty/common/core/util/Base64Util.class | Bin 0 -> 2420 bytes .../mosty/common/core/util/BeanUtils.class | Bin 0 -> 2745 bytes .../mosty/common/core/util/CacheUtils.class | Bin 0 -> 4525 bytes .../common/core/util/HttpClientUtil$1.class | Bin 0 -> 1077 bytes .../common/core/util/HttpClientUtil.class | Bin 0 -> 6491 bytes .../core/util/KafkaProducerConfig.class | Bin 0 -> 336 bytes .../com/mosty/common/core/util/RSAUtil.class | Bin 0 -> 6238 bytes .../mosty/common/core/util/ShiroUtils.class | Bin 0 -> 3069 bytes .../common/core/util/http/HttpUtils.class | Bin 0 -> 12633 bytes .../core/util/http/HttpsPostUtil$1.class | Bin 0 -> 688 bytes .../core/util/http/HttpsPostUtil$2.class | Bin 0 -> 998 bytes .../common/core/util/http/HttpsPostUtil.class | Bin 0 -> 8797 bytes .../core/util/http/MyX509TrustManager.class | Bin 0 -> 917 bytes .../classes/mapper/SysAppHomeconfigMapper.xml | 5 + .../SysAppHomeconfigPlateListMapper.xml | 10 + .../mapper/SysAppHomeconfigPlateMapper.xml | 10 + .../target/classes/mapper/SysDeptMapper.xml | 150 + .../classes/mapper/SysLogininforMapper.xml | 34 + .../target/classes/mapper/SysMenuMapper.xml | 5 + .../classes/mapper/SysOperLogMapper.xml | 223 + .../target/classes/mapper/SysOssMapper.xml | 5 + .../classes/mapper/SysPositionMapper.xml | 5 + .../classes/mapper/SysRoleDeptMapper.xml | 16 + .../target/classes/mapper/SysRoleMapper.xml | 40 + .../classes/mapper/SysRoleMenuMapper.xml | 16 + .../mapper/SysUserAppHomeconfigMapper.xml | 10 + .../SysUserAppHomeconfigPlateListMapper.xml | 22 + .../SysUserAppHomeconfigPlateMapper.xml | 15 + .../classes/mapper/SysUserDeptMapper.xml | 16 + .../target/classes/mapper/SysUserMapper.xml | 207 + .../classes/mapper/SysUserRoleMapper.xml | 54 + .../common-core-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 449907 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 178 + .../compile/default-compile/inputFiles.lst | 175 + .../common-dynamic-datasource-starter.iml | 129 + common-dynamic-datasource-starter/pom.xml | 33 + .../common/dynamic/datasource/DataSource.java | 19 + .../datasource/DynamicDataSourceAspect.java | 32 + .../DynamicDataSourceContextHolder.java | 55 + .../datasource/DynamicDataSourceRegister.java | 175 + .../datasource/DynamicRoutingDataSource.java | 21 + .../dynamic/datasource/DataSource.class | Bin 0 -> 541 bytes .../datasource/DynamicDataSourceAspect.class | Bin 0 -> 2313 bytes .../DynamicDataSourceContextHolder.class | Bin 0 -> 2320 bytes .../DynamicDataSourceRegister.class | Bin 0 -> 8417 bytes .../datasource/DynamicRoutingDataSource.class | Bin 0 -> 1019 bytes ...amic-datasource-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 9292 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 5 + .../compile/default-compile/inputFiles.lst | 5 + .../common-generator-starter.iml | 142 + common-generator-starter/pom.xml | 107 + .../generator/GeneratorAutoConfiguration.java | 16 + .../common/generator/config/BaseEntity.java | 113 + .../common/generator/config/GenConfig.java | 65 + .../generator/config/GenConfig_bak.java | 72 + .../common/generator/config/GenConstants.java | 181 + .../generator/controller/GenController.java | 194 + .../controller/GenController_bak.java | 281 + .../common/generator/domain/GenTable.java | 370 + .../generator/domain/GenTableColumn.java | 349 + .../generator/domain/GenTableColumn_bak.java | 349 + .../common/generator/domain/GenTable_bak.java | 365 + .../mapper/GenTableColumnMapper.java | 61 + .../mapper/GenTableColumnMapper_bak.java | 60 + .../generator/mapper/GenTableMapper.java | 84 + .../generator/mapper/GenTableMapper_bak.java | 91 + .../service/GenTableColumnServiceImpl.java | 64 + .../service/GenTableColumnService_bak.java | 63 + .../service/GenTableServiceImpl.java | 443 + .../service/GenTableService_bak.java | 439 + .../service/IGenTableColumnService.java | 45 + .../generator/service/IGenTableService.java | 122 + .../common/generator/util/CharsetKit.java | 89 + .../mosty/common/generator/util/Convert.java | 854 + .../mosty/common/generator/util/GenUtils.java | 221 + .../common/generator/util/GenUtils_bak.java | 219 + .../common/generator/util/StringUtils.java | 418 + .../generator/util/VelocityInitializer.java | 30 + .../util/VelocityInitializer_bak.java | 30 + .../common/generator/util/VelocityUtils.java | 333 + .../generator/util/VelocityUtils_bak.java | 333 + .../main/resources/META-INF/spring.factories | 2 + .../src/main/resources/generator.yml | 11 + .../mapper/GenTableColumnMapper.xml_bak | 127 + .../resources/mapper/GenTableMapper.xml_bak | 193 + .../mapper/generator/GenTableColumnMapper.xml | 127 + .../mapper/generator/GenTableMapper.xml | 202 + .../templates/tool/gen/createTable.html | 30 + .../resources/templates/tool/gen/edit.html | 607 + .../resources/templates/tool/gen/gen.html | 218 + .../templates/tool/gen/importTable.html | 95 + .../src/main/resources/vm/html/add.html.vm | 381 + .../src/main/resources/vm/html/edit.html.vm | 392 + .../main/resources/vm/html/list-tree.html.vm | 156 + .../src/main/resources/vm/html/list.html.vm | 154 + .../src/main/resources/vm/html/tree.html.vm | 51 + .../main/resources/vm/java/controller.java.vm | 202 + .../src/main/resources/vm/java/domain.java.vm | 105 + .../src/main/resources/vm/java/mapper.java.vm | 91 + .../main/resources/vm/java/service.java.vm | 73 + .../resources/vm/java/serviceImpl.java.vm | 213 + .../main/resources/vm/java/sub-domain.java.vm | 76 + .../src/main/resources/vm/js/api.js.vm | 44 + .../src/main/resources/vm/sql/sql.vm | 22 + .../main/resources/vm/vue/index-tree.vue.vm | 482 + .../src/main/resources/vm/vue/index.vue.vm | 573 + .../resources/vm/vue/v3/index-tree.vue.vm | 464 + .../src/main/resources/vm/vue/v3/index.vue.vm | 564 + .../src/main/resources/vm/vue/v3/readme.txt | 1 + .../src/main/resources/vm/xml/mapper.xml.vm | 147 + .../target/classes/META-INF/spring.factories | 2 + .../GeneratorAutoConfiguration.class | Bin 0 -> 555 bytes .../common/generator/config/BaseEntity.class | Bin 0 -> 2444 bytes .../common/generator/config/GenConfig.class | Bin 0 -> 1309 bytes .../generator/config/GenConstants.class | Bin 0 -> 2700 bytes .../generator/controller/GenController.class | Bin 0 -> 8415 bytes .../common/generator/domain/GenTable.class | Bin 0 -> 7777 bytes .../generator/domain/GenTableColumn.class | Bin 0 -> 7499 bytes .../mapper/GenTableColumnMapper.class | Bin 0 -> 833 bytes .../generator/mapper/GenTableMapper.class | Bin 0 -> 1042 bytes .../service/GenTableColumnServiceImpl.class | Bin 0 -> 1694 bytes .../service/GenTableServiceImpl.class | Bin 0 -> 15933 bytes .../service/IGenTableColumnService.class | Bin 0 -> 528 bytes .../generator/service/IGenTableService.class | Bin 0 -> 1358 bytes .../common/generator/util/CharsetKit.class | Bin 0 -> 1842 bytes .../mosty/common/generator/util/Convert.class | Bin 0 -> 13661 bytes .../common/generator/util/GenUtils.class | Bin 0 -> 5864 bytes .../common/generator/util/StringUtils.class | Bin 0 -> 7016 bytes .../generator/util/VelocityInitializer.class | Bin 0 -> 1092 bytes .../common/generator/util/VelocityUtils.class | Bin 0 -> 10529 bytes .../target/classes/generator.yml | 11 + .../mapper/GenTableColumnMapper.xml_bak | 127 + .../classes/mapper/GenTableMapper.xml_bak | 193 + .../mapper/generator/GenTableColumnMapper.xml | 127 + .../mapper/generator/GenTableMapper.xml | 202 + .../templates/tool/gen/createTable.html | 30 + .../classes/templates/tool/gen/edit.html | 607 + .../classes/templates/tool/gen/gen.html | 218 + .../templates/tool/gen/importTable.html | 95 + .../target/classes/vm/html/add.html.vm | 381 + .../target/classes/vm/html/edit.html.vm | 392 + .../target/classes/vm/html/list-tree.html.vm | 156 + .../target/classes/vm/html/list.html.vm | 154 + .../target/classes/vm/html/tree.html.vm | 51 + .../target/classes/vm/java/controller.java.vm | 202 + .../target/classes/vm/java/domain.java.vm | 105 + .../target/classes/vm/java/mapper.java.vm | 91 + .../target/classes/vm/java/service.java.vm | 73 + .../classes/vm/java/serviceImpl.java.vm | 213 + .../target/classes/vm/java/sub-domain.java.vm | 76 + .../target/classes/vm/js/api.js.vm | 44 + .../target/classes/vm/sql/sql.vm | 22 + .../target/classes/vm/vue/index-tree.vue.vm | 482 + .../target/classes/vm/vue/index.vue.vm | 573 + .../classes/vm/vue/v3/index-tree.vue.vm | 464 + .../target/classes/vm/vue/v3/index.vue.vm | 564 + .../target/classes/vm/vue/v3/readme.txt | 1 + .../target/classes/vm/xml/mapper.xml.vm | 147 + ...ommon-generator-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 103432 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 19 + .../compile/default-compile/inputFiles.lst | 30 + .../common-log-base-starter.iml | 135 + common-log-base-starter/pom.xml | 98 + .../mosty/operation/log/BaseController.java | 219 + .../mosty/operation/log/BusinessStatus.java | 18 + .../com/mosty/operation/log/LogAspect.java | 216 + .../mosty/operation/log/LogSaveStrategy.java | 42 + .../OperationLogBaseAutoConfiguration.java | 18 + .../log/controller/SysOperlogController.java | 118 + .../SysOperlogProviderController.java | 38 + .../operation/log/entity/BaseEntity.java | 115 + .../operation/log/entity/DeleteListVO.java | 20 + .../com/mosty/operation/log/entity/Excel.java | 175 + .../log/entity/ExcelHandlerAdapter.java | 19 + .../mosty/operation/log/entity/Excels.java | 18 + .../mosty/operation/log/entity/SysUser.java | 377 + .../operation/log/entity/VO/OperlogPage.java | 42 + .../log/mapper/SysOperLogMapper.java | 61 + .../log/service/SysOperLogService.java | 53 + .../service/impl/SysOperLogServiceImpl.java | 173 + .../com/mosty/operation/log/util/Convert.java | 854 + .../operation/log/util/ServletUtils.java | 155 + .../mosty/operation/log/util/StringUtils.java | 478 + .../main/resources/META-INF/spring.factories | 2 + .../target/classes/META-INF/spring.factories | 2 + .../operation/log/BaseController$1.class | Bin 0 -> 1137 bytes .../mosty/operation/log/BaseController.class | Bin 0 -> 1092 bytes .../mosty/operation/log/BusinessStatus.class | Bin 0 -> 1051 bytes .../com/mosty/operation/log/LogAspect.class | Bin 0 -> 10596 bytes .../mosty/operation/log/LogSaveStrategy.class | Bin 0 -> 1795 bytes .../OperationLogBaseAutoConfiguration.class | Bin 0 -> 673 bytes .../log/controller/SysOperlogController.class | Bin 0 -> 7316 bytes .../SysOperlogProviderController.class | Bin 0 -> 2087 bytes .../operation/log/entity/BaseEntity.class | Bin 0 -> 2438 bytes .../operation/log/entity/DeleteListVO.class | Bin 0 -> 1929 bytes .../operation/log/entity/Excel$Align.class | Bin 0 -> 1399 bytes .../log/entity/Excel$ColumnType.class | Bin 0 -> 1389 bytes .../operation/log/entity/Excel$Type.class | Bin 0 -> 1344 bytes .../mosty/operation/log/entity/Excel.class | Bin 0 -> 1803 bytes .../log/entity/ExcelHandlerAdapter.class | Bin 0 -> 227 bytes .../mosty/operation/log/entity/Excels.class | Bin 0 -> 447 bytes .../mosty/operation/log/entity/SysUser.class | Bin 0 -> 7140 bytes .../operation/log/entity/VO/OperlogPage.class | Bin 0 -> 3342 bytes .../log/mapper/SysOperLogMapper.class | Bin 0 -> 1692 bytes .../log/service/SysOperLogService.class | Bin 0 -> 1585 bytes .../service/impl/SysOperLogServiceImpl.class | Bin 0 -> 9887 bytes .../mosty/operation/log/util/Convert.class | Bin 0 -> 13652 bytes .../operation/log/util/ServletUtils.class | Bin 0 -> 4531 bytes .../operation/log/util/StringUtils.class | Bin 0 -> 7864 bytes ...common-log-base-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 44782 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 24 + .../compile/default-compile/inputFiles.lst | 20 + .../common-magic-api-starter.iml | 143 + common-magic-api-starter/pom.xml | 38 + .../magic/api/MagicApiAutoConfiguration.java | 15 + .../api/config/CustomJsonValueProvider.java | 60 + .../api/config/TokenParseInterceptor.java | 46 + .../main/resources/META-INF/spring.factories | 4 + .../target/classes/META-INF/spring.factories | 4 + .../magic/api/MagicApiAutoConfiguration.class | Bin 0 -> 451 bytes .../api/config/CustomJsonValueProvider.class | Bin 0 -> 2376 bytes .../api/config/TokenParseInterceptor.class | Bin 0 -> 1973 bytes ...ommon-magic-api-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 5499 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 3 + .../compile/default-compile/inputFiles.lst | 3 + common-redis-starter/common-redis-starter.iml | 73 + common-redis-starter/pom.xml | 69 + .../common/redis/RedisAutoConfiguration.java | 17 + .../FastJson2JsonRedisSerializer.java | 64 + .../common/redis/configure/RedisConfig.java | 48 + .../common/redis/service/RedisService.java | 232 + .../main/resources/META-INF/spring.factories | 4 + .../target/classes/META-INF/spring.factories | 4 + .../common/redis/RedisAutoConfiguration.class | Bin 0 -> 604 bytes .../FastJson2JsonRedisSerializer.class | Bin 0 -> 3304 bytes .../common/redis/configure/RedisConfig.class | Bin 0 -> 3645 bytes .../common/redis/service/RedisService.class | Bin 0 -> 8003 bytes .../common-redis-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 8978 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 4 + .../compile/default-compile/inputFiles.lst | 4 + common-task-starter/common-task-starter.iml | 166 + common-task-starter/pom.xml | 116 + .../common/task/TaskAutoConfiguration.java | 16 + .../constant/enums/ExecuteStatusEnum.java | 26 + .../task/constant/enums/ExecuteTypeEnum.java | 26 + .../constant/enums/GroupCountTypeEnum.java | 32 + .../constant/enums/LineChartTypeEnum.java | 26 + .../task/constant/enums/RuleTypeEnum.java | 26 + .../constant/enums/TaskItemStatusEnum.java | 28 + .../constant/enums/TaskLogStatusEnum.java | 43 + .../task/constant/enums/TaskTypeEnum.java | 42 + .../task/controller/SysTaskController.java | 110 + .../controller/SysTaskReportController.java | 84 + .../com/mosty/common/task/entity/SysTask.java | 261 + .../mosty/common/task/entity/SysTaskItem.java | 200 + .../mosty/common/task/entity/SysTaskLog.java | 58 + .../task/entity/vo/AddSysTaskDeptVO.java | 30 + .../task/entity/vo/AddSysTaskUserInfoVO.java | 41 + .../common/task/entity/vo/AddSysTaskVO.java | 166 + .../task/entity/vo/DetailSysTaskVO.java | 15 + .../task/entity/vo/FinishSysTaskVO.java | 25 + .../common/task/entity/vo/QueryTaskLogVO.java | 28 + .../common/task/entity/vo/QueryTaskVO.java | 69 + .../task/entity/vo/SysTaskCountGroup.java | 14 + .../task/entity/vo/SysTaskCountToday.java | 14 + .../common/task/entity/vo/SysTaskItemVO.java | 78 + .../task/entity/vo/SysTaskLineChartVO.java | 16 + .../common/task/entity/vo/SysTaskLogVO.java | 29 + .../common/task/mapper/SysTaskItemMapper.java | 17 + .../common/task/mapper/SysTaskLogMapper.java | 17 + .../common/task/mapper/SysTaskMapper.java | 40 + .../task/service/SysTaskItemService.java | 13 + .../task/service/SysTaskLogService.java | 13 + .../common/task/service/SysTaskService.java | 84 + .../service/impl/SysTaskItemServiceImpl.java | 22 + .../service/impl/SysTaskLogServiceImpl.java | 22 + .../task/service/impl/SysTaskServiceImpl.java | 515 + .../main/resources/META-INF/spring.factories | 2 + .../resources/mapper/SysTaskItemMapper.xml | 51 + .../resources/mapper/SysTaskLogMapper.xml | 20 + .../main/resources/mapper/SysTaskMapper.xml | 200 + .../target/classes/META-INF/spring.factories | 2 + .../common/task/TaskAutoConfiguration.class | Bin 0 -> 525 bytes .../constant/enums/ExecuteStatusEnum.class | Bin 0 -> 1562 bytes .../task/constant/enums/ExecuteTypeEnum.class | Bin 0 -> 1536 bytes .../constant/enums/GroupCountTypeEnum.class | Bin 0 -> 1695 bytes .../constant/enums/LineChartTypeEnum.class | Bin 0 -> 1544 bytes .../task/constant/enums/RuleTypeEnum.class | Bin 0 -> 1514 bytes .../constant/enums/TaskItemStatusEnum.class | Bin 0 -> 1641 bytes .../constant/enums/TaskLogStatusEnum.class | Bin 0 -> 1951 bytes .../task/constant/enums/TaskTypeEnum.class | Bin 0 -> 1795 bytes .../task/controller/SysTaskController.class | Bin 0 -> 6508 bytes .../controller/SysTaskReportController.class | Bin 0 -> 3530 bytes .../mosty/common/task/entity/SysTask.class | Bin 0 -> 22715 bytes .../common/task/entity/SysTaskItem.class | Bin 0 -> 16606 bytes .../mosty/common/task/entity/SysTaskLog.class | Bin 0 -> 4288 bytes .../task/entity/vo/AddSysTaskDeptVO.class | Bin 0 -> 2913 bytes .../task/entity/vo/AddSysTaskUserInfoVO.class | Bin 0 -> 2965 bytes .../common/task/entity/vo/AddSysTaskVO.class | Bin 0 -> 15394 bytes .../task/entity/vo/DetailSysTaskVO.class | Bin 0 -> 2235 bytes .../task/entity/vo/FinishSysTaskVO.class | Bin 0 -> 3343 bytes .../task/entity/vo/QueryTaskLogVO.class | Bin 0 -> 2631 bytes .../common/task/entity/vo/QueryTaskVO.class | Bin 0 -> 6186 bytes .../task/entity/vo/SysTaskCountGroup.class | Bin 0 -> 2140 bytes .../task/entity/vo/SysTaskCountToday.class | Bin 0 -> 2209 bytes .../common/task/entity/vo/SysTaskItemVO.class | Bin 0 -> 6964 bytes .../task/entity/vo/SysTaskLineChartVO.class | Bin 0 -> 2169 bytes .../common/task/entity/vo/SysTaskLogVO.class | Bin 0 -> 2712 bytes .../task/mapper/SysTaskItemMapper.class | Bin 0 -> 333 bytes .../common/task/mapper/SysTaskLogMapper.class | Bin 0 -> 330 bytes .../common/task/mapper/SysTaskMapper.class | Bin 0 -> 991 bytes .../task/service/SysTaskItemService.class | Bin 0 -> 344 bytes .../task/service/SysTaskLogService.class | Bin 0 -> 341 bytes .../common/task/service/SysTaskService.class | Bin 0 -> 1595 bytes .../service/impl/SysTaskItemServiceImpl.class | Bin 0 -> 769 bytes .../service/impl/SysTaskLogServiceImpl.class | Bin 0 -> 762 bytes .../service/impl/SysTaskServiceImpl.class | Bin 0 -> 32136 bytes .../classes/mapper/SysTaskItemMapper.xml | 51 + .../classes/mapper/SysTaskLogMapper.xml | 20 + .../target/classes/mapper/SysTaskMapper.xml | 200 + .../common-task-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 70904 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 35 + .../compile/default-compile/inputFiles.lst | 35 + common-token-starter/common-token-starter.iml | 131 + common-token-starter/pom.xml | 84 + .../java/com/mosty/common/token/DeptInfo.java | 60 + .../java/com/mosty/common/token/JWTUtil.java | 102 + .../com/mosty/common/token/JwtSysUser.java | 25 + .../common/token/SysUserInterceptor.java | 129 + .../java/com/mosty/common/token/UserInfo.java | 91 + .../com/mosty/common/token/UserInfoCache.java | 69 + .../mosty/common/token/UserInfoManager.java | 34 + .../common/token/UserPermissionsInfo.java | 36 + .../java/com/mosty/common/token/UserType.java | 28 + .../mosty/common/token/VirtualUserEnum.java | 43 + .../common/util/DataPermissionConstant.java | 27 + .../com/mosty/common/util/GeoHashKit.java | 139 + .../com/mosty/common/util/ImageUtils.java | 547 + .../java/com/mosty/common/util/JtsUtils.java | 206 + .../mosty/common/util/MyX509TrustManager.java | 22 + .../mosty/common/util/PermissionsUtil.java | 106 + .../com/mosty/common/util/UUIDGenerator.java | 41 + .../com/mosty/common/token/DeptInfo.class | Bin 0 -> 7141 bytes .../com/mosty/common/token/JWTUtil.class | Bin 0 -> 4745 bytes .../com/mosty/common/token/JwtSysUser.class | Bin 0 -> 511 bytes .../common/token/SysUserInterceptor.class | Bin 0 -> 5387 bytes .../com/mosty/common/token/UserInfo.class | Bin 0 -> 10784 bytes .../mosty/common/token/UserInfoManager.class | Bin 0 -> 1943 bytes .../common/token/UserPermissionsInfo.class | Bin 0 -> 3956 bytes .../mosty/common/token/VirtualUserEnum.class | Bin 0 -> 1779 bytes .../common/util/DataPermissionConstant.class | Bin 0 -> 630 bytes .../com/mosty/common/util/GeoHashKit.class | Bin 0 -> 4425 bytes .../com/mosty/common/util/ImageUtils$1.class | Bin 0 -> 888 bytes .../com/mosty/common/util/ImageUtils$2.class | Bin 0 -> 906 bytes .../com/mosty/common/util/ImageUtils.class | Bin 0 -> 13823 bytes .../com/mosty/common/util/JtsUtils.class | Bin 0 -> 7940 bytes .../common/util/MyX509TrustManager.class | Bin 0 -> 897 bytes .../mosty/common/util/PermissionsUtil.class | Bin 0 -> 3798 bytes .../com/mosty/common/util/UUIDGenerator.class | Bin 0 -> 1468 bytes .../common-token-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 37195 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 17 + .../compile/default-compile/inputFiles.lst | 17 + h5player.min.js | 26495 ++++++++++++++++ mosty-common.iml | 12 + .../operation-log-aspect-starter.iml | 151 + operation-log-aspect-starter/pom.xml | 95 + .../mosty/operation/log/aspect/LogAspect.java | 204 + .../OperationLogAspectAutoConfiguration.java | 18 + .../log/aspect/feign/OperationLogClient.java | 23 + .../feign/OperationLogFallbackFactory.java | 27 + .../log/aspect/kafka/KafkaProducerConfig.java | 53 + .../main/resources/META-INF/spring.factories | 2 + .../target/classes/META-INF/spring.factories | 2 + .../operation/log/aspect/LogAspect.class | Bin 0 -> 10812 bytes .../OperationLogAspectAutoConfiguration.class | Bin 0 -> 677 bytes .../log/aspect/feign/OperationLogClient.class | Bin 0 -> 925 bytes .../feign/OperationLogFallbackFactory.class | Bin 0 -> 2357 bytes .../aspect/kafka/KafkaProducerConfig.class | Bin 0 -> 356 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 5 + .../compile/default-compile/inputFiles.lst | 5 + ...tion-log-aspect-starter-1.0.0-SNAPSHOT.jar | Bin 0 -> 11084 bytes pom.xml | 97 + sql/common2022-0207.sql | 736 + 1291 files changed, 92328 insertions(+) create mode 100644 .idea/compiler.xml create mode 100644 .idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml create mode 100644 .idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml create mode 100644 .idea/libraries/Maven__cn_hutool_hutool_all_5_7_20.xml create mode 100644 .idea/libraries/Maven__com_alibaba_druid_1_2_8.xml create mode 100644 .idea/libraries/Maven__com_alibaba_druid_spring_boot_starter_1_2_8.xml create mode 100644 .idea/libraries/Maven__com_alibaba_fastjson_1_2_83.xml create mode 100644 .idea/libraries/Maven__com_alibaba_transmittable_thread_local_2_11_5.xml create mode 100644 .idea/libraries/Maven__com_auth0_java_jwt_3_8_1.xml create mode 100644 .idea/libraries/Maven__com_baomidou_mybatis_plus_3_4_3.xml create mode 100644 .idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_4_3.xml create mode 100644 .idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_4_3.xml create mode 100644 .idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_4_3.xml create mode 100644 .idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_4_3.xml create mode 100644 .idea/libraries/Maven__com_belerweb_pinyin4j_2_5_0.xml create mode 100644 .idea/libraries/Maven__com_carrotsearch_thirdparty_simple_xml_safe_2_7_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_2.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_4_3.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_7.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_9_0.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_2.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_4_3.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_9_9.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_4_3.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_9_9.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_11_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_1.xml create mode 100644 .idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_1.xml create mode 100644 .idea/libraries/Maven__com_github_caspar_chen_swagger_ui_layer_1_1_3.xml create mode 100644 .idea/libraries/Maven__com_github_jsqlparser_jsqlparser_4_2.xml create mode 100644 .idea/libraries/Maven__com_github_pagehelper_pagehelper_5_3_0.xml create mode 100644 .idea/libraries/Maven__com_github_penggle_kaptcha_2_3_2.xml create mode 100644 .idea/libraries/Maven__com_github_virtuald_curvesapi_1_06.xml create mode 100644 .idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml create mode 100644 .idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml create mode 100644 .idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml create mode 100644 .idea/libraries/Maven__com_google_guava_guava_29_0_jre.xml create mode 100644 .idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml create mode 100644 .idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml create mode 100644 .idea/libraries/Maven__com_jhlabs_filters_2_0_235_1.xml create mode 100644 .idea/libraries/Maven__com_netflix_archaius_archaius_core_0_7_6.xml create mode 100644 .idea/libraries/Maven__com_netflix_feign_feign_core_8_14_4.xml create mode 100644 .idea/libraries/Maven__com_netflix_feign_feign_slf4j_8_14_4.xml create mode 100644 .idea/libraries/Maven__com_netflix_hystrix_hystrix_core_1_5_18.xml create mode 100644 .idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_8_1.xml create mode 100644 .idea/libraries/Maven__com_squareup_okio_okio_2_7_0.xml create mode 100644 .idea/libraries/Maven__com_vividsolutions_jts_1_13.xml create mode 100644 .idea/libraries/Maven__com_zaxxer_HikariCP_3_4_5.xml create mode 100644 .idea/libraries/Maven__com_zaxxer_HikariCP_4_0_3.xml create mode 100644 .idea/libraries/Maven__com_zaxxer_SparseBitSet_1_2.xml create mode 100644 .idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_4.xml create mode 100644 .idea/libraries/Maven__commons_codec_commons_codec_1_12.xml create mode 100644 .idea/libraries/Maven__commons_codec_commons_codec_1_13.xml create mode 100644 .idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml create mode 100644 .idea/libraries/Maven__commons_configuration_commons_configuration_1_8.xml create mode 100644 .idea/libraries/Maven__commons_fileupload_commons_fileupload_1_4.xml create mode 100644 .idea/libraries/Maven__commons_io_commons_io_2_2.xml create mode 100644 .idea/libraries/Maven__commons_io_commons_io_2_7.xml create mode 100644 .idea/libraries/Maven__commons_lang_commons_lang_2_6.xml create mode 100644 .idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml create mode 100644 .idea/libraries/Maven__commons_logging_commons_logging_1_2.xml create mode 100644 .idea/libraries/Maven__io_github_openfeign_feign_core_10_10_1.xml create mode 100644 .idea/libraries/Maven__io_github_openfeign_feign_hystrix_10_10_1.xml create mode 100644 .idea/libraries/Maven__io_github_openfeign_form_feign_form_3_8_0.xml create mode 100644 .idea/libraries/Maven__io_github_openfeign_form_feign_form_spring_3_8_0.xml create mode 100644 .idea/libraries/Maven__io_lettuce_lettuce_core_5_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__io_micrometer_micrometer_core_1_5_1.xml create mode 100644 .idea/libraries/Maven__io_minio_minio_8_0_3.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_buffer_4_1_49_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_buffer_4_1_51_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_codec_4_1_49_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_codec_4_1_51_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_codec_dns_4_1_51_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_common_4_1_49_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_common_4_1_51_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_handler_4_1_49_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_handler_4_1_51_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_resolver_4_1_49_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_resolver_4_1_51_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_resolver_dns_4_1_51_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_transport_4_1_49_Final.xml create mode 100644 .idea/libraries/Maven__io_netty_netty_transport_4_1_51_Final.xml create mode 100644 .idea/libraries/Maven__io_projectreactor_reactor_core_3_3_4_RELEASE.xml create mode 100644 .idea/libraries/Maven__io_projectreactor_reactor_core_3_3_5_RELEASE.xml create mode 100644 .idea/libraries/Maven__io_reactivex_rxjava2_rxjava_2_2_19.xml create mode 100644 .idea/libraries/Maven__io_reactivex_rxjava_1_2_0.xml create mode 100644 .idea/libraries/Maven__io_springfox_springfox_core_2_8_0.xml create mode 100644 .idea/libraries/Maven__io_springfox_springfox_schema_2_8_0.xml create mode 100644 .idea/libraries/Maven__io_springfox_springfox_spi_2_8_0.xml create mode 100644 .idea/libraries/Maven__io_springfox_springfox_spring_web_2_8_0.xml create mode 100644 .idea/libraries/Maven__io_springfox_springfox_swagger2_2_8_0.xml create mode 100644 .idea/libraries/Maven__io_springfox_springfox_swagger_common_2_8_0.xml create mode 100644 .idea/libraries/Maven__io_springfox_springfox_swagger_ui_2_8_0.xml create mode 100644 .idea/libraries/Maven__io_swagger_swagger_annotations_1_5_14.xml create mode 100644 .idea/libraries/Maven__io_swagger_swagger_models_1_5_14.xml create mode 100644 .idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml create mode 100644 .idea/libraries/Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml create mode 100644 .idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml create mode 100644 .idea/libraries/Maven__javax_cache_cache_api_1_0_0.xml create mode 100644 .idea/libraries/Maven__javax_servlet_javax_servlet_api_3_1_0.xml create mode 100644 .idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_7.xml create mode 100644 .idea/libraries/Maven__net_bytebuddy_byte_buddy_1_7_9.xml create mode 100644 .idea/libraries/Maven__net_sf_ehcache_ehcache_core_2_6_11.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_collections4_4_4.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_compress_1_19.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_lang3_3_12_0.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml create mode 100644 .idea/libraries/Maven__org_apache_commons_commons_text_1_6.xml create mode 100644 .idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_12.xml create mode 100644 .idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_13.xml create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_2.xml create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_2.xml create mode 100644 .idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_3.xml create mode 100644 .idea/libraries/Maven__org_apache_poi_poi_4_1_2.xml create mode 100644 .idea/libraries/Maven__org_apache_poi_poi_ooxml_4_1_2.xml create mode 100644 .idea/libraries/Maven__org_apache_poi_poi_ooxml_schemas_4_1_2.xml create mode 100644 .idea/libraries/Maven__org_apache_shiro_shiro_cache_1_8_0.xml create mode 100644 .idea/libraries/Maven__org_apache_shiro_shiro_config_core_1_8_0.xml create mode 100644 .idea/libraries/Maven__org_apache_shiro_shiro_config_ogdl_1_8_0.xml create mode 100644 .idea/libraries/Maven__org_apache_shiro_shiro_core_1_8_0.xml create mode 100644 .idea/libraries/Maven__org_apache_shiro_shiro_crypto_cipher_1_8_0.xml create mode 100644 .idea/libraries/Maven__org_apache_shiro_shiro_crypto_core_1_8_0.xml create mode 100644 .idea/libraries/Maven__org_apache_shiro_shiro_crypto_hash_1_8_0.xml create mode 100644 .idea/libraries/Maven__org_apache_shiro_shiro_ehcache_1_8_0.xml create mode 100644 .idea/libraries/Maven__org_apache_shiro_shiro_event_1_8_0.xml create mode 100644 .idea/libraries/Maven__org_apache_shiro_shiro_lang_1_8_0.xml create mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_37.xml create mode 100644 .idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_37.xml create mode 100644 .idea/libraries/Maven__org_apache_velocity_velocity_engine_core_2_3.xml create mode 100644 .idea/libraries/Maven__org_apache_xmlbeans_xmlbeans_3_1_0.xml create mode 100644 .idea/libraries/Maven__org_aspectj_aspectjweaver_1_9_6.xml create mode 100644 .idea/libraries/Maven__org_checkerframework_checker_qual_2_11_1.xml create mode 100644 .idea/libraries/Maven__org_glassfish_jakarta_el_3_0_3.xml create mode 100644 .idea/libraries/Maven__org_hdrhistogram_HdrHistogram_2_1_12.xml create mode 100644 .idea/libraries/Maven__org_hdrhistogram_HdrHistogram_2_1_9.xml create mode 100644 .idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_1_5_Final.xml create mode 100644 .idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml create mode 100644 .idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_marshalling_jboss_marshalling_2_0_9_Final.xml create mode 100644 .idea/libraries/Maven__org_jboss_marshalling_jboss_marshalling_river_2_0_9_Final.xml create mode 100644 .idea/libraries/Maven__org_jetbrains_annotations_13_0.xml create mode 100644 .idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_3_72.xml create mode 100644 .idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_70.xml create mode 100644 .idea/libraries/Maven__org_jodd_jodd_bean_5_0_13.xml create mode 100644 .idea/libraries/Maven__org_jodd_jodd_core_5_0_13.xml create mode 100644 .idea/libraries/Maven__org_latencyutils_LatencyUtils_2_0_3.xml create mode 100644 .idea/libraries/Maven__org_mapstruct_mapstruct_1_2_0_Final.xml create mode 100644 .idea/libraries/Maven__org_mybatis_mybatis_3_5_7.xml create mode 100644 .idea/libraries/Maven__org_mybatis_mybatis_spring_2_0_6.xml create mode 100644 .idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_2_2_0.xml create mode 100644 .idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_2_2_0.xml create mode 100644 .idea/libraries/Maven__org_projectlombok_lombok_1_16_18.xml create mode 100644 .idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml create mode 100644 .idea/libraries/Maven__org_reactivestreams_reactive_streams_1_0_3.xml create mode 100644 .idea/libraries/Maven__org_redisson_redisson_3_13_3.xml create mode 100644 .idea/libraries/Maven__org_redisson_redisson_spring_boot_starter_3_13_3.xml create mode 100644 .idea/libraries/Maven__org_redisson_redisson_spring_data_23_3_13_3.xml create mode 100644 .idea/libraries/Maven__org_reflections_reflections_0_9_11.xml create mode 100644 .idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_30.xml create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_13.xml create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml create mode 100644 .idea/libraries/Maven__org_slf4j_slf4j_api_1_7_30.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_2_3_2_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_actuator_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_actuator_autoconfigure_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_12_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_2_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_4_5.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_3_2_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_actuator_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_aop_2_3_2_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_data_redis_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_4_5.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_5_0.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_3_2_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_3_2_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_3_2_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_2_3_2_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_3_2_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_boot_spring_boot_starter_websocket_2_4_5.xml create mode 100644 .idea/libraries/Maven__org_springframework_cloud_spring_cloud_netflix_archaius_2_2_5_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_cloud_spring_cloud_netflix_ribbon_2_2_5_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_cloud_spring_cloud_openfeign_core_2_2_5_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_data_spring_data_commons_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_data_spring_data_keyvalue_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_data_spring_data_redis_2_3_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_1_2_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_1_2_0_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_aop_5_2_6_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_aop_5_2_8_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_beans_4_0_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_beans_5_2_8_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_beans_5_3_6.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_beans_5_3_7.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_context_4_0_9_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_context_5_2_8_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_context_support_5_2_6_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_core_5_2_6_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_core_5_2_8_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_core_5_3_6.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_expression_5_2_8_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_jcl_5_2_6_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_jcl_5_2_8_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_jcl_5_3_6.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_jdbc_5_3_6.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_jdbc_5_3_7.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_messaging_5_3_6.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_oxm_5_2_6_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_tx_5_2_6_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_tx_5_3_6.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_tx_5_3_7.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_web_5_1_5_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_web_5_2_8_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_webmvc_5_2_8_RELEASE.xml create mode 100644 .idea/libraries/Maven__org_springframework_spring_websocket_5_3_6.xml create mode 100644 .idea/libraries/Maven__org_ssssssss_magic_api_2_0_1.xml create mode 100644 .idea/libraries/Maven__org_ssssssss_magic_api_plugin_swagger_2_0_1.xml create mode 100644 .idea/libraries/Maven__org_ssssssss_magic_api_spring_boot_starter_2_0_1.xml create mode 100644 .idea/libraries/Maven__org_ssssssss_magic_editor_2_0_1.xml create mode 100644 .idea/libraries/Maven__org_ssssssss_magic_script_1_8_5.xml create mode 100644 .idea/libraries/Maven__org_yaml_snakeyaml_1_26.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/workspace.xml create mode 100644 common-base-starter/common-base-starter.iml create mode 100644 common-base-starter/pom.xml create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/autoconfig/Desensitization.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/autoconfig/JacksonCustomizerConfig.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/autoconfig/swagger/SwaggerConfig.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/Constants.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/GenConstants.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/OnlineStatus.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/PermissionConstants.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/ScheduleConstants.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/ShiroConstants.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/SystemConfigConstants.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/UserConstants.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/enums/ConfigKeyEnum.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/enums/DeletedEnum.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/enums/DictTypeEnum.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/enums/MenuTypeEnum.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/enums/PasswordLevelEnum.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/constant/enums/PermissionLevelEnum.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/data/scope/DataScope.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/domain/BaseController.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/domain/CxSelect.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/domain/ResponseResult.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/domain/TableDataInfo.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/domain/page/PageDomain.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/domain/page/PageUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/domain/page/ServletUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/domain/page/SqlUtil.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/domain/page/TableSupport.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/BaseEntity.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/BusinessType.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/CharsetKit.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/Convert.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/Excel.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/ExcelHandlerAdapter.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/Excels.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/Log.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/LogConst.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/OperatorType.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/ReflectUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/SpringUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/StringUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/log/SysOperLog.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/entity/realm/SysUser.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/exception/Asserts.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessException.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessExceptionEnum.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessStatus.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/exception/MostyExceptionHandler.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/exception/ServiceException.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/exception/UtilException.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/AopTargetUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/EnableOptimisticLock.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/OptimisticLock.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/OptimisticLockConfiguration.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/OptimisticLockException.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/lock/redisson/CallBack.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/lock/redisson/RedisConcurrentException.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/mybatis/MybatisConfig.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/system/config/EnableSystemConfig.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/threadpool/SimpleThreadPool.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/threadpool/ThreadPool.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/threadpool/ThreadPoolEntity.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/threadpool/ThreadPoolInit.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/threadpool/log/OperationLogThreadPool.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/timeconsume/EnableTimeConsume.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/timeconsume/TimeConsume.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/timeconsume/TimeConsumeAction.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/timeconsume/TimeConsumeActionConfig.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/timeconsume/TimeConsumeStopWatch.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/token/MostyContext.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/token/MostyUserInfo.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/Base64Util.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/BeanValidators.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/ChineseCharacterUtil.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/DateUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/DistributedLockUtil.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/FileTypeUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/ImageUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/IpUtil.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/LocalDateTimeUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/Md5Utils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/MimeTypeUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/PasswordUtil.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/RandomUtil.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/ServletUtils.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/SpringIocContext.java create mode 100644 common-base-starter/src/main/java/com/mosty/common/base/util/StringUtils.java create mode 100644 common-base-starter/src/main/resources/META-INF/spring.factories create mode 100644 common-base-starter/target/classes/META-INF/spring.factories create mode 100644 common-base-starter/target/classes/com/mosty/common/base/autoconfig/Desensitization$BankCard.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/autoconfig/Desensitization$FullName.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/autoconfig/Desensitization$IdentityCard.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/autoconfig/Desensitization$Phone.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/autoconfig/Desensitization.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/autoconfig/swagger/SwaggerConfig.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/Constants.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/GenConstants.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/OnlineStatus.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/PermissionConstants.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/ScheduleConstants$Status.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/ScheduleConstants.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/ShiroConstants.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/SystemConfigConstants.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/UserConstants.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/enums/ConfigKeyEnum.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/enums/DeletedEnum.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/enums/DictTypeEnum.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/enums/MenuTypeEnum.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/enums/PasswordLevelEnum.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/constant/enums/PermissionLevelEnum.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/data/scope/DataScope.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/domain/BaseController$1.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/domain/BaseController.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/domain/CxSelect.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/domain/ResponseResult.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/domain/TableDataInfo.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/domain/page/PageDomain.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/domain/page/PageUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/domain/page/ServletUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/domain/page/SqlUtil.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/domain/page/TableSupport.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/BaseEntity.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/BusinessType.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/CharsetKit.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/Convert.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/Excel$ColumnType.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/Excel$Type.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/Excel.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/ExcelHandlerAdapter.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/Excels.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/Log.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/LogConst.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/OperatorType.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/ReflectUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/SpringUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/StringUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/log/SysOperLog.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/entity/realm/SysUser.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/exception/Asserts.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/exception/BusinessException.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/exception/BusinessExceptionEnum.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/exception/BusinessStatus.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/exception/MostyExceptionHandler.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/exception/ServiceException.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/exception/UtilException.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/lock/optimistic/AopTargetUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/lock/optimistic/EnableOptimisticLock.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/lock/optimistic/OptimisticLockException.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/lock/redisson/CallBack.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/lock/redisson/RedisConcurrentException.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/mybatis/MybatisConfig.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/system/config/EnableSystemConfig.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/threadpool/SimpleThreadPool.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/threadpool/ThreadPool.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/threadpool/ThreadPoolEntity.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/threadpool/ThreadPoolInit$DefaultThreadFactory.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/threadpool/ThreadPoolInit$PoolModel.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/threadpool/ThreadPoolInit.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/threadpool/log/OperationLogThreadPool.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/timeconsume/EnableTimeConsume.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/timeconsume/TimeConsume.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/timeconsume/TimeConsumeAction.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/timeconsume/TimeConsumeActionConfig.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/timeconsume/TimeConsumeStopWatch.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/token/MostyContext.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/token/MostyUserInfo.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/Base64Util.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/BeanValidators.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/ChineseCharacterUtil.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/DateUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/DistributedLockUtil$1.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/DistributedLockUtil$CacheConfig.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/DistributedLockUtil$Parameter.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/DistributedLockUtil$Singleton.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/DistributedLockUtil.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/FileTypeUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/ImageUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/IpUtil.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/LocalDateTimeUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/Md5Utils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/MimeTypeUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/PasswordUtil.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/RandomUtil.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/ServletUtils.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/SpringIocContext.class create mode 100644 common-base-starter/target/classes/com/mosty/common/base/util/StringUtils.class create mode 100644 common-base-starter/target/common-base-starter-1.0.0-SNAPSHOT-sources.jar create mode 100644 common-base-starter/target/common-base-starter-1.0.0-SNAPSHOT.jar create mode 100644 common-base-starter/target/maven-archiver/pom.properties create mode 100644 common-config-starter/common-config-starter.iml create mode 100644 common-config-starter/pom.xml create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/CommonConfigAutoConfiguration.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/ConfigServiceFactory.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/Excel/DictUtils.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/Excel/ExcelExp.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/Excel/ExcelUtil.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/Excel/ExcelUtilManySheet.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/config/DictElementConfig.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/config/SystemConfig.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/constant/enums/DictElementEnum.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/controller/SysConfigController.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/controller/SysDictController.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/controller/SysDictItemController.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/controller/SysVersionManageController.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/SysConfig.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/SysDict.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/SysDictItem.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/SysVersionManage.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/AddDictItemVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/AddPositionVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/AddSysConfigVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/AddSysDictVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/AddVersionManageVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/ConfigPage.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/DeleteVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/DictPage.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/EditDictItemVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/EditPositionVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/EditSysConfigVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/EditSysDictItemVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/EditSysDictVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/EditVersionManageVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/SysDictItemVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/SysDictQueryPage.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/SysDictQueryVo.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/SysDictVO.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/entity/vo/VersionManagePage.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/mapper/SysConfigMapper.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/mapper/SysDictItemMapper.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/mapper/SysDictMapper.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/mapper/SysVersionManageMapper.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/service/SysConfigService.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/service/SysDictItemService.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/service/SysDictService.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/service/SysVersionManageService.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/service/impl/SysConfigServiceImpl.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/service/impl/SysDictItemServiceImpl.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/service/impl/SysDictServiceImpl.java create mode 100644 common-config-starter/src/main/java/com/mosty/common/config/service/impl/SysVersionManageServiceImpl.java create mode 100644 common-config-starter/src/main/resources/META-INF/spring.factories create mode 100644 common-config-starter/src/main/resources/mapper/SysConfigMapper.xml create mode 100644 common-config-starter/src/main/resources/mapper/SysDictItemMapper.xml create mode 100644 common-config-starter/src/main/resources/mapper/SysDictMapper.xml create mode 100644 common-config-starter/src/main/resources/mapper/SysVersionManageMapper.xml create mode 100644 common-config-starter/target/classes/META-INF/spring.factories create mode 100644 common-config-starter/target/classes/com/mosty/common/config/CommonConfigAutoConfiguration.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/ConfigServiceFactory.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/Excel/DictUtils.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/Excel/ExcelExp.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/Excel/ExcelUtil.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/Excel/ExcelUtilManySheet.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/config/DictElementConfig.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/config/SystemConfig.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/constant/enums/DictElementEnum.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/controller/SysConfigController.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/controller/SysDictController.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/controller/SysDictItemController.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/controller/SysVersionManageController.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/SysConfig.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/SysDict.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/SysDictItem.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/SysVersionManage.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddDictItemVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddPositionVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddSysConfigVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddSysDictVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddVersionManageVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/ConfigPage.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/DeleteVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/DictPage.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditDictItemVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditPositionVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditSysConfigVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditSysDictItemVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditSysDictVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditVersionManageVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/SysDictItemVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/SysDictQueryPage.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/SysDictQueryVo.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/SysDictVO.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/entity/vo/VersionManagePage.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/mapper/SysConfigMapper.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/mapper/SysDictItemMapper.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/mapper/SysDictMapper.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/mapper/SysVersionManageMapper.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/service/SysConfigService.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/service/SysDictItemService.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/service/SysDictService.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/service/SysVersionManageService.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/service/impl/SysConfigServiceImpl.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/service/impl/SysDictItemServiceImpl.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/service/impl/SysDictServiceImpl.class create mode 100644 common-config-starter/target/classes/com/mosty/common/config/service/impl/SysVersionManageServiceImpl.class create mode 100644 common-config-starter/target/classes/mapper/SysConfigMapper.xml create mode 100644 common-config-starter/target/classes/mapper/SysDictItemMapper.xml create mode 100644 common-config-starter/target/classes/mapper/SysDictMapper.xml create mode 100644 common-config-starter/target/classes/mapper/SysVersionManageMapper.xml create mode 100644 common-config-starter/target/common-config-starter-1.0.0-SNAPSHOT.jar create mode 100644 common-config-starter/target/maven-archiver/pom.properties create mode 100644 common-config-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 common-config-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 common-core-starter/common-core-starter.iml create mode 100644 common-core-starter/pom.xml create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/CoreAutoConfiguration.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigPlateController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigPlateListController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysDeptController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysLogininforController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysMenuController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysPositionController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysRoleController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigPlateController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigPlateListController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/controller/TokenController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfig.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfigPlate.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfigPlateList.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysDept.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysLogininfor.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysMenu.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysOss.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysPosition.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRole.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRoleDept.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRoleMenu.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUser.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfig.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlate.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlateList.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserDept.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserRole.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/TbJcglXfll.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/Ybmj.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/LoginLogPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlateListPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlatePage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigQuery.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlateListPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlatePage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigQuery.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserEditPasswordRequest.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddDeptVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleDataPartitionVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleDeptVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleMenuVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddSysMenuVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddSysUserVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddUserDeptVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/Base64Str.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DataPermissionVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteDeptVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteListVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteRoleDeptVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteUserDeptVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptQuery.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptTreeVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptVo.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/EditSysMenuVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/GetUserPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/GetUserRoleListVo.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/LoginResponseVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/MenuPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/MenuQuery.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/PositionPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleByDeptPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleDeptVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RolePage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleUserPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleUserVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigPlateVo.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigRsVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysDeptVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysRoleVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserAppHomeconfigPlateVo.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserAppHomeconfigVo.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserDeptVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserEditVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserHomeconfigVo.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserInfoVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UnboundUserRoleVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserByDeptPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserDeptPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserDeptVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserPage.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserRoleVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateListMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysDeptMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysLogininforMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysMenuMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysOssMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysPositionMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleDeptMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleMenuMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateListMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserDeptMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserRoleMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/mapper/YbmjMapper.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/LoginService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigPlateListService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigPlateService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysDeptService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysLogininforService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysMenuService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysOssService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysPositionService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleDeptService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleMenuService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateListService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserDeptService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserRoleService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserService.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/LoginServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigPlateListServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigPlateServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysDeptServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysLogininforServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysMenuServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysOssServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysPositionServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleDeptServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleMenuServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateListServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserDeptServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserRoleServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserServiceImpl.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/business/timer/DeptUserSys.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/config/CaptchaConfig.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/config/DefaultRoleConfig.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/config/MinIoClientConfig.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/constant/DataPermissionConstant.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/IdCardLoginRequest.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/ImageController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/JwtTokenGenerator.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/LoginEntity.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/LoginRequest.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/LoginResponseVO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/LoginServiceController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/TokenRequest.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/UnifiedLoginRequest.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/UserPermissionsInfo.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/dto/DeptAllVo.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/dto/DeptDTO.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/login/dto/ImageRequest.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/minio/UploadController.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/BASE64DecodedMultipartFile.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/Base64Util.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/BeanUtils.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/CacheUtils.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/HttpClientUtil.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/KafkaProducerConfig.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/RSAUtil.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/ShiroUtils.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/http/HttpUtils.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/http/HttpsPostUtil.java create mode 100644 common-core-starter/src/main/java/com/mosty/common/core/util/http/MyX509TrustManager.java create mode 100644 common-core-starter/src/main/resources/META-INF/spring.factories create mode 100644 common-core-starter/src/main/resources/mapper/SysAppHomeconfigMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysAppHomeconfigPlateListMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysAppHomeconfigPlateMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysDeptMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysLogininforMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysMenuMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysOperLogMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysOssMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysPositionMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysRoleDeptMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysRoleMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysRoleMenuMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigPlateListMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigPlateMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysUserDeptMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysUserMapper.xml create mode 100644 common-core-starter/src/main/resources/mapper/SysUserRoleMapper.xml create mode 100644 common-core-starter/target/classes/META-INF/spring.factories create mode 100644 common-core-starter/target/classes/com/mosty/common/core/CoreAutoConfiguration.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysAppHomeconfigController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysAppHomeconfigPlateController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysAppHomeconfigPlateListController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysDeptController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysLogininforController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysMenuController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysPositionController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysRoleController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysUserAppHomeconfigController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysUserAppHomeconfigPlateController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysUserAppHomeconfigPlateListController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/SysUserController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/controller/TokenController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysAppHomeconfig.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysAppHomeconfigPlate.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysAppHomeconfigPlateList.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysDept.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysLogininfor.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysMenu.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysOss.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysPosition.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysRole.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysRoleDept.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysRoleMenu.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUser.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserAppHomeconfig.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlate.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlateList.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserDept.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserRole.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/TbJcglXfll.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/Ybmj.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/request/LoginLogPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysAppHomeconfigPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlateListPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlatePage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysAppHomeconfigQuery.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlateListPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlatePage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigQuery.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserEditPasswordRequest.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddDeptVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddRoleDataPartitionVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddRoleDeptVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddRoleMenuVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddRoleVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddSysMenuVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddSysUserVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddUserDeptVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/Base64Str.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DataPermissionVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeleteDeptVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeleteListVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeleteRoleDeptVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeleteUserDeptVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeptPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeptQuery.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeptTreeVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeptVo.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/EditSysMenuVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/GetUserPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/GetUserRoleListVo.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/LoginResponseVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/MenuPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/MenuQuery.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/PositionPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RoleByDeptPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RoleDeptVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RolePage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RoleUserPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RoleUserVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysAppHomeconfigPlateVo.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysAppHomeconfigRsVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysAppHomeconfigVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysDeptVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysRoleVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserAppHomeconfigPlateVo.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserAppHomeconfigVo.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserDeptVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserEditVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserHomeconfigVo.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserInfoVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UnboundUserRoleVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserByDeptPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserDeptPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserDeptVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserPage.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserRoleVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysAppHomeconfigMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateListMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysDeptMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysLogininforMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysMenuMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysOssMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysPositionMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysRoleDeptMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysRoleMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysRoleMenuMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserAppHomeconfigMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateListMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserDeptMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserRoleMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/mapper/YbmjMapper.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/LoginService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysAppHomeconfigPlateListService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysAppHomeconfigPlateService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysAppHomeconfigService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysDeptService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysLogininforService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysMenuService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysOssService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysPositionService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysRoleDeptService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysRoleMenuService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysRoleService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateListService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserAppHomeconfigService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserDeptService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserRoleService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserService.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/LoginServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysAppHomeconfigPlateListServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysAppHomeconfigPlateServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysAppHomeconfigServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysDeptServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysLogininforServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysMenuServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysOssServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysPositionServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysRoleDeptServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysRoleMenuServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysRoleServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateListServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysUserDeptServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysUserRoleServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysUserServiceImpl.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/business/timer/DeptUserSys.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/config/CaptchaConfig.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/config/DefaultRoleConfig.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/config/MinIoClientConfig.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/constant/DataPermissionConstant.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/IdCardLoginRequest.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/ImageController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/JwtTokenGenerator.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/LoginEntity.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/LoginRequest.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/LoginResponseVO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/LoginServiceController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/TokenRequest.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/UnifiedLoginRequest.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/UserPermissionsInfo.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/dto/DeptAllVo.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/dto/DeptDTO.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/login/dto/ImageRequest.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/minio/UploadController.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/BASE64DecodedMultipartFile.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/Base64Util.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/BeanUtils.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/CacheUtils.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/HttpClientUtil$1.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/HttpClientUtil.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/KafkaProducerConfig.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/RSAUtil.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/ShiroUtils.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/http/HttpUtils.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/http/HttpsPostUtil$1.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/http/HttpsPostUtil$2.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/http/HttpsPostUtil.class create mode 100644 common-core-starter/target/classes/com/mosty/common/core/util/http/MyX509TrustManager.class create mode 100644 common-core-starter/target/classes/mapper/SysAppHomeconfigMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysAppHomeconfigPlateListMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysAppHomeconfigPlateMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysDeptMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysLogininforMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysMenuMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysOperLogMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysOssMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysPositionMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysRoleDeptMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysRoleMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysRoleMenuMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysUserAppHomeconfigMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysUserAppHomeconfigPlateListMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysUserAppHomeconfigPlateMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysUserDeptMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysUserMapper.xml create mode 100644 common-core-starter/target/classes/mapper/SysUserRoleMapper.xml create mode 100644 common-core-starter/target/common-core-starter-1.0.0-SNAPSHOT.jar create mode 100644 common-core-starter/target/maven-archiver/pom.properties create mode 100644 common-core-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 common-core-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 common-dynamic-datasource-starter/common-dynamic-datasource-starter.iml create mode 100644 common-dynamic-datasource-starter/pom.xml create mode 100644 common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DataSource.java create mode 100644 common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceAspect.java create mode 100644 common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceContextHolder.java create mode 100644 common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceRegister.java create mode 100644 common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicRoutingDataSource.java create mode 100644 common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DataSource.class create mode 100644 common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DynamicDataSourceAspect.class create mode 100644 common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DynamicDataSourceContextHolder.class create mode 100644 common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DynamicDataSourceRegister.class create mode 100644 common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DynamicRoutingDataSource.class create mode 100644 common-dynamic-datasource-starter/target/common-dynamic-datasource-starter-1.0.0-SNAPSHOT.jar create mode 100644 common-dynamic-datasource-starter/target/maven-archiver/pom.properties create mode 100644 common-dynamic-datasource-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 common-dynamic-datasource-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 common-generator-starter/common-generator-starter.iml create mode 100644 common-generator-starter/pom.xml create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/GeneratorAutoConfiguration.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/config/BaseEntity.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConfig.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConfig_bak.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConstants.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/controller/GenController.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/controller/GenController_bak.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTable.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTableColumn.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTableColumn_bak.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTable_bak.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableColumnMapper.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableColumnMapper_bak.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableMapper.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableMapper_bak.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableColumnServiceImpl.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableColumnService_bak.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableServiceImpl.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableService_bak.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/service/IGenTableColumnService.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/service/IGenTableService.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/util/CharsetKit.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/util/Convert.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/util/GenUtils.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/util/GenUtils_bak.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/util/StringUtils.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityInitializer.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityInitializer_bak.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityUtils.java create mode 100644 common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityUtils_bak.java create mode 100644 common-generator-starter/src/main/resources/META-INF/spring.factories create mode 100644 common-generator-starter/src/main/resources/generator.yml create mode 100644 common-generator-starter/src/main/resources/mapper/GenTableColumnMapper.xml_bak create mode 100644 common-generator-starter/src/main/resources/mapper/GenTableMapper.xml_bak create mode 100644 common-generator-starter/src/main/resources/mapper/generator/GenTableColumnMapper.xml create mode 100644 common-generator-starter/src/main/resources/mapper/generator/GenTableMapper.xml create mode 100644 common-generator-starter/src/main/resources/templates/tool/gen/createTable.html create mode 100644 common-generator-starter/src/main/resources/templates/tool/gen/edit.html create mode 100644 common-generator-starter/src/main/resources/templates/tool/gen/gen.html create mode 100644 common-generator-starter/src/main/resources/templates/tool/gen/importTable.html create mode 100644 common-generator-starter/src/main/resources/vm/html/add.html.vm create mode 100644 common-generator-starter/src/main/resources/vm/html/edit.html.vm create mode 100644 common-generator-starter/src/main/resources/vm/html/list-tree.html.vm create mode 100644 common-generator-starter/src/main/resources/vm/html/list.html.vm create mode 100644 common-generator-starter/src/main/resources/vm/html/tree.html.vm create mode 100644 common-generator-starter/src/main/resources/vm/java/controller.java.vm create mode 100644 common-generator-starter/src/main/resources/vm/java/domain.java.vm create mode 100644 common-generator-starter/src/main/resources/vm/java/mapper.java.vm create mode 100644 common-generator-starter/src/main/resources/vm/java/service.java.vm create mode 100644 common-generator-starter/src/main/resources/vm/java/serviceImpl.java.vm create mode 100644 common-generator-starter/src/main/resources/vm/java/sub-domain.java.vm create mode 100644 common-generator-starter/src/main/resources/vm/js/api.js.vm create mode 100644 common-generator-starter/src/main/resources/vm/sql/sql.vm create mode 100644 common-generator-starter/src/main/resources/vm/vue/index-tree.vue.vm create mode 100644 common-generator-starter/src/main/resources/vm/vue/index.vue.vm create mode 100644 common-generator-starter/src/main/resources/vm/vue/v3/index-tree.vue.vm create mode 100644 common-generator-starter/src/main/resources/vm/vue/v3/index.vue.vm create mode 100644 common-generator-starter/src/main/resources/vm/vue/v3/readme.txt create mode 100644 common-generator-starter/src/main/resources/vm/xml/mapper.xml.vm create mode 100644 common-generator-starter/target/classes/META-INF/spring.factories create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/GeneratorAutoConfiguration.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/config/BaseEntity.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/config/GenConfig.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/config/GenConstants.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/controller/GenController.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/domain/GenTable.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/domain/GenTableColumn.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/mapper/GenTableColumnMapper.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/mapper/GenTableMapper.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/service/GenTableColumnServiceImpl.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/service/GenTableServiceImpl.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/service/IGenTableColumnService.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/service/IGenTableService.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/util/CharsetKit.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/util/Convert.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/util/GenUtils.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/util/StringUtils.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/util/VelocityInitializer.class create mode 100644 common-generator-starter/target/classes/com/mosty/common/generator/util/VelocityUtils.class create mode 100644 common-generator-starter/target/classes/generator.yml create mode 100644 common-generator-starter/target/classes/mapper/GenTableColumnMapper.xml_bak create mode 100644 common-generator-starter/target/classes/mapper/GenTableMapper.xml_bak create mode 100644 common-generator-starter/target/classes/mapper/generator/GenTableColumnMapper.xml create mode 100644 common-generator-starter/target/classes/mapper/generator/GenTableMapper.xml create mode 100644 common-generator-starter/target/classes/templates/tool/gen/createTable.html create mode 100644 common-generator-starter/target/classes/templates/tool/gen/edit.html create mode 100644 common-generator-starter/target/classes/templates/tool/gen/gen.html create mode 100644 common-generator-starter/target/classes/templates/tool/gen/importTable.html create mode 100644 common-generator-starter/target/classes/vm/html/add.html.vm create mode 100644 common-generator-starter/target/classes/vm/html/edit.html.vm create mode 100644 common-generator-starter/target/classes/vm/html/list-tree.html.vm create mode 100644 common-generator-starter/target/classes/vm/html/list.html.vm create mode 100644 common-generator-starter/target/classes/vm/html/tree.html.vm create mode 100644 common-generator-starter/target/classes/vm/java/controller.java.vm create mode 100644 common-generator-starter/target/classes/vm/java/domain.java.vm create mode 100644 common-generator-starter/target/classes/vm/java/mapper.java.vm create mode 100644 common-generator-starter/target/classes/vm/java/service.java.vm create mode 100644 common-generator-starter/target/classes/vm/java/serviceImpl.java.vm create mode 100644 common-generator-starter/target/classes/vm/java/sub-domain.java.vm create mode 100644 common-generator-starter/target/classes/vm/js/api.js.vm create mode 100644 common-generator-starter/target/classes/vm/sql/sql.vm create mode 100644 common-generator-starter/target/classes/vm/vue/index-tree.vue.vm create mode 100644 common-generator-starter/target/classes/vm/vue/index.vue.vm create mode 100644 common-generator-starter/target/classes/vm/vue/v3/index-tree.vue.vm create mode 100644 common-generator-starter/target/classes/vm/vue/v3/index.vue.vm create mode 100644 common-generator-starter/target/classes/vm/vue/v3/readme.txt create mode 100644 common-generator-starter/target/classes/vm/xml/mapper.xml.vm create mode 100644 common-generator-starter/target/common-generator-starter-1.0.0-SNAPSHOT.jar create mode 100644 common-generator-starter/target/maven-archiver/pom.properties create mode 100644 common-generator-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 common-generator-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 common-log-base-starter/common-log-base-starter.iml create mode 100644 common-log-base-starter/pom.xml create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/BaseController.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/BusinessStatus.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/LogAspect.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/LogSaveStrategy.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/OperationLogBaseAutoConfiguration.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/controller/SysOperlogController.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/controller/provider/SysOperlogProviderController.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/entity/BaseEntity.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/entity/DeleteListVO.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/entity/Excel.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/entity/ExcelHandlerAdapter.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/entity/Excels.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/entity/SysUser.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/entity/VO/OperlogPage.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/mapper/SysOperLogMapper.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/service/SysOperLogService.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/service/impl/SysOperLogServiceImpl.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/util/Convert.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/util/ServletUtils.java create mode 100644 common-log-base-starter/src/main/java/com/mosty/operation/log/util/StringUtils.java create mode 100644 common-log-base-starter/src/main/resources/META-INF/spring.factories create mode 100644 common-log-base-starter/target/classes/META-INF/spring.factories create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/BaseController$1.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/BaseController.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/BusinessStatus.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/LogAspect.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/LogSaveStrategy.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/OperationLogBaseAutoConfiguration.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/controller/SysOperlogController.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/controller/provider/SysOperlogProviderController.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/entity/BaseEntity.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/entity/DeleteListVO.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excel$Align.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excel$ColumnType.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excel$Type.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excel.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/entity/ExcelHandlerAdapter.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excels.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/entity/SysUser.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/entity/VO/OperlogPage.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/mapper/SysOperLogMapper.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/service/SysOperLogService.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/service/impl/SysOperLogServiceImpl.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/util/Convert.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/util/ServletUtils.class create mode 100644 common-log-base-starter/target/classes/com/mosty/operation/log/util/StringUtils.class create mode 100644 common-log-base-starter/target/common-log-base-starter-1.0.0-SNAPSHOT.jar create mode 100644 common-log-base-starter/target/maven-archiver/pom.properties create mode 100644 common-log-base-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 common-log-base-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 common-magic-api-starter/common-magic-api-starter.iml create mode 100644 common-magic-api-starter/pom.xml create mode 100644 common-magic-api-starter/src/main/java/com/mosty/common/magic/api/MagicApiAutoConfiguration.java create mode 100644 common-magic-api-starter/src/main/java/com/mosty/common/magic/api/config/CustomJsonValueProvider.java create mode 100644 common-magic-api-starter/src/main/java/com/mosty/common/magic/api/config/TokenParseInterceptor.java create mode 100644 common-magic-api-starter/src/main/resources/META-INF/spring.factories create mode 100644 common-magic-api-starter/target/classes/META-INF/spring.factories create mode 100644 common-magic-api-starter/target/classes/com/mosty/common/magic/api/MagicApiAutoConfiguration.class create mode 100644 common-magic-api-starter/target/classes/com/mosty/common/magic/api/config/CustomJsonValueProvider.class create mode 100644 common-magic-api-starter/target/classes/com/mosty/common/magic/api/config/TokenParseInterceptor.class create mode 100644 common-magic-api-starter/target/common-magic-api-starter-1.0.0-SNAPSHOT.jar create mode 100644 common-magic-api-starter/target/maven-archiver/pom.properties create mode 100644 common-magic-api-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 common-magic-api-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 common-redis-starter/common-redis-starter.iml create mode 100644 common-redis-starter/pom.xml create mode 100644 common-redis-starter/src/main/java/com/mosty/common/redis/RedisAutoConfiguration.java create mode 100644 common-redis-starter/src/main/java/com/mosty/common/redis/configure/FastJson2JsonRedisSerializer.java create mode 100644 common-redis-starter/src/main/java/com/mosty/common/redis/configure/RedisConfig.java create mode 100644 common-redis-starter/src/main/java/com/mosty/common/redis/service/RedisService.java create mode 100644 common-redis-starter/src/main/resources/META-INF/spring.factories create mode 100644 common-redis-starter/target/classes/META-INF/spring.factories create mode 100644 common-redis-starter/target/classes/com/mosty/common/redis/RedisAutoConfiguration.class create mode 100644 common-redis-starter/target/classes/com/mosty/common/redis/configure/FastJson2JsonRedisSerializer.class create mode 100644 common-redis-starter/target/classes/com/mosty/common/redis/configure/RedisConfig.class create mode 100644 common-redis-starter/target/classes/com/mosty/common/redis/service/RedisService.class create mode 100644 common-redis-starter/target/common-redis-starter-1.0.0-SNAPSHOT.jar create mode 100644 common-redis-starter/target/maven-archiver/pom.properties create mode 100644 common-redis-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 common-redis-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 common-task-starter/common-task-starter.iml create mode 100644 common-task-starter/pom.xml create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/TaskAutoConfiguration.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/constant/enums/ExecuteStatusEnum.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/constant/enums/ExecuteTypeEnum.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/constant/enums/GroupCountTypeEnum.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/constant/enums/LineChartTypeEnum.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/constant/enums/RuleTypeEnum.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskItemStatusEnum.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskLogStatusEnum.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskTypeEnum.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/controller/SysTaskController.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/controller/SysTaskReportController.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/SysTask.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/SysTaskItem.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/SysTaskLog.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskDeptVO.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskUserInfoVO.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskVO.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/DetailSysTaskVO.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/FinishSysTaskVO.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/QueryTaskLogVO.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/QueryTaskVO.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskCountGroup.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskCountToday.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskItemVO.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskLineChartVO.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskLogVO.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskItemMapper.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskLogMapper.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskMapper.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskItemService.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskLogService.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskService.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskItemServiceImpl.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskLogServiceImpl.java create mode 100644 common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskServiceImpl.java create mode 100644 common-task-starter/src/main/resources/META-INF/spring.factories create mode 100644 common-task-starter/src/main/resources/mapper/SysTaskItemMapper.xml create mode 100644 common-task-starter/src/main/resources/mapper/SysTaskLogMapper.xml create mode 100644 common-task-starter/src/main/resources/mapper/SysTaskMapper.xml create mode 100644 common-task-starter/target/classes/META-INF/spring.factories create mode 100644 common-task-starter/target/classes/com/mosty/common/task/TaskAutoConfiguration.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/constant/enums/ExecuteStatusEnum.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/constant/enums/ExecuteTypeEnum.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/constant/enums/GroupCountTypeEnum.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/constant/enums/LineChartTypeEnum.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/constant/enums/RuleTypeEnum.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/constant/enums/TaskItemStatusEnum.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/constant/enums/TaskLogStatusEnum.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/constant/enums/TaskTypeEnum.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/controller/SysTaskController.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/controller/SysTaskReportController.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/SysTask.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/SysTaskItem.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/SysTaskLog.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/AddSysTaskDeptVO.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/AddSysTaskUserInfoVO.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/AddSysTaskVO.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/DetailSysTaskVO.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/FinishSysTaskVO.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/QueryTaskLogVO.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/QueryTaskVO.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskCountGroup.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskCountToday.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskItemVO.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskLineChartVO.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskLogVO.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/mapper/SysTaskItemMapper.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/mapper/SysTaskLogMapper.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/mapper/SysTaskMapper.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/service/SysTaskItemService.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/service/SysTaskLogService.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/service/SysTaskService.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/service/impl/SysTaskItemServiceImpl.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/service/impl/SysTaskLogServiceImpl.class create mode 100644 common-task-starter/target/classes/com/mosty/common/task/service/impl/SysTaskServiceImpl.class create mode 100644 common-task-starter/target/classes/mapper/SysTaskItemMapper.xml create mode 100644 common-task-starter/target/classes/mapper/SysTaskLogMapper.xml create mode 100644 common-task-starter/target/classes/mapper/SysTaskMapper.xml create mode 100644 common-task-starter/target/common-task-starter-1.0.0-SNAPSHOT.jar create mode 100644 common-task-starter/target/maven-archiver/pom.properties create mode 100644 common-task-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 common-task-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 common-token-starter/common-token-starter.iml create mode 100644 common-token-starter/pom.xml create mode 100644 common-token-starter/src/main/java/com/mosty/common/token/DeptInfo.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/token/JWTUtil.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/token/JwtSysUser.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/token/SysUserInterceptor.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/token/UserInfo.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/token/UserInfoCache.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/token/UserInfoManager.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/token/UserPermissionsInfo.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/token/UserType.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/token/VirtualUserEnum.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/util/DataPermissionConstant.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/util/GeoHashKit.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/util/ImageUtils.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/util/JtsUtils.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/util/MyX509TrustManager.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/util/PermissionsUtil.java create mode 100644 common-token-starter/src/main/java/com/mosty/common/util/UUIDGenerator.java create mode 100644 common-token-starter/target/classes/com/mosty/common/token/DeptInfo.class create mode 100644 common-token-starter/target/classes/com/mosty/common/token/JWTUtil.class create mode 100644 common-token-starter/target/classes/com/mosty/common/token/JwtSysUser.class create mode 100644 common-token-starter/target/classes/com/mosty/common/token/SysUserInterceptor.class create mode 100644 common-token-starter/target/classes/com/mosty/common/token/UserInfo.class create mode 100644 common-token-starter/target/classes/com/mosty/common/token/UserInfoManager.class create mode 100644 common-token-starter/target/classes/com/mosty/common/token/UserPermissionsInfo.class create mode 100644 common-token-starter/target/classes/com/mosty/common/token/VirtualUserEnum.class create mode 100644 common-token-starter/target/classes/com/mosty/common/util/DataPermissionConstant.class create mode 100644 common-token-starter/target/classes/com/mosty/common/util/GeoHashKit.class create mode 100644 common-token-starter/target/classes/com/mosty/common/util/ImageUtils$1.class create mode 100644 common-token-starter/target/classes/com/mosty/common/util/ImageUtils$2.class create mode 100644 common-token-starter/target/classes/com/mosty/common/util/ImageUtils.class create mode 100644 common-token-starter/target/classes/com/mosty/common/util/JtsUtils.class create mode 100644 common-token-starter/target/classes/com/mosty/common/util/MyX509TrustManager.class create mode 100644 common-token-starter/target/classes/com/mosty/common/util/PermissionsUtil.class create mode 100644 common-token-starter/target/classes/com/mosty/common/util/UUIDGenerator.class create mode 100644 common-token-starter/target/common-token-starter-1.0.0-SNAPSHOT.jar create mode 100644 common-token-starter/target/maven-archiver/pom.properties create mode 100644 common-token-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 common-token-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 h5player.min.js create mode 100644 mosty-common.iml create mode 100644 operation-log-aspect-starter/operation-log-aspect-starter.iml create mode 100644 operation-log-aspect-starter/pom.xml create mode 100644 operation-log-aspect-starter/src/main/java/com/mosty/operation/log/aspect/LogAspect.java create mode 100644 operation-log-aspect-starter/src/main/java/com/mosty/operation/log/aspect/OperationLogAspectAutoConfiguration.java create mode 100644 operation-log-aspect-starter/src/main/java/com/mosty/operation/log/aspect/feign/OperationLogClient.java create mode 100644 operation-log-aspect-starter/src/main/java/com/mosty/operation/log/aspect/feign/OperationLogFallbackFactory.java create mode 100644 operation-log-aspect-starter/src/main/java/com/mosty/operation/log/aspect/kafka/KafkaProducerConfig.java create mode 100644 operation-log-aspect-starter/src/main/resources/META-INF/spring.factories create mode 100644 operation-log-aspect-starter/target/classes/META-INF/spring.factories create mode 100644 operation-log-aspect-starter/target/classes/com/mosty/operation/log/aspect/LogAspect.class create mode 100644 operation-log-aspect-starter/target/classes/com/mosty/operation/log/aspect/OperationLogAspectAutoConfiguration.class create mode 100644 operation-log-aspect-starter/target/classes/com/mosty/operation/log/aspect/feign/OperationLogClient.class create mode 100644 operation-log-aspect-starter/target/classes/com/mosty/operation/log/aspect/feign/OperationLogFallbackFactory.class create mode 100644 operation-log-aspect-starter/target/classes/com/mosty/operation/log/aspect/kafka/KafkaProducerConfig.class create mode 100644 operation-log-aspect-starter/target/maven-archiver/pom.properties create mode 100644 operation-log-aspect-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 operation-log-aspect-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 operation-log-aspect-starter/target/operation-log-aspect-starter-1.0.0-SNAPSHOT.jar create mode 100644 pom.xml create mode 100644 sql/common2022-0207.sql diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..85fa010 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml new file mode 100644 index 0000000..6fec8f4 --- /dev/null +++ b/.idea/libraries/Maven__ch_qos_logback_logback_classic_1_2_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml new file mode 100644 index 0000000..9eb8596 --- /dev/null +++ b/.idea/libraries/Maven__ch_qos_logback_logback_core_1_2_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__cn_hutool_hutool_all_5_7_20.xml b/.idea/libraries/Maven__cn_hutool_hutool_all_5_7_20.xml new file mode 100644 index 0000000..fa85ae7 --- /dev/null +++ b/.idea/libraries/Maven__cn_hutool_hutool_all_5_7_20.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_alibaba_druid_1_2_8.xml b/.idea/libraries/Maven__com_alibaba_druid_1_2_8.xml new file mode 100644 index 0000000..6b51017 --- /dev/null +++ b/.idea/libraries/Maven__com_alibaba_druid_1_2_8.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_alibaba_druid_spring_boot_starter_1_2_8.xml b/.idea/libraries/Maven__com_alibaba_druid_spring_boot_starter_1_2_8.xml new file mode 100644 index 0000000..725a929 --- /dev/null +++ b/.idea/libraries/Maven__com_alibaba_druid_spring_boot_starter_1_2_8.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_alibaba_fastjson_1_2_83.xml b/.idea/libraries/Maven__com_alibaba_fastjson_1_2_83.xml new file mode 100644 index 0000000..fb8e949 --- /dev/null +++ b/.idea/libraries/Maven__com_alibaba_fastjson_1_2_83.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_alibaba_transmittable_thread_local_2_11_5.xml b/.idea/libraries/Maven__com_alibaba_transmittable_thread_local_2_11_5.xml new file mode 100644 index 0000000..a34ba45 --- /dev/null +++ b/.idea/libraries/Maven__com_alibaba_transmittable_thread_local_2_11_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_auth0_java_jwt_3_8_1.xml b/.idea/libraries/Maven__com_auth0_java_jwt_3_8_1.xml new file mode 100644 index 0000000..1755ec4 --- /dev/null +++ b/.idea/libraries/Maven__com_auth0_java_jwt_3_8_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_3_4_3.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_3_4_3.xml new file mode 100644 index 0000000..ffb1369 --- /dev/null +++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_3_4_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_4_3.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_4_3.xml new file mode 100644 index 0000000..2570725 --- /dev/null +++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_annotation_3_4_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_4_3.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_4_3.xml new file mode 100644 index 0000000..fd9a3f6 --- /dev/null +++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_boot_starter_3_4_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_4_3.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_4_3.xml new file mode 100644 index 0000000..0e93676 --- /dev/null +++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_core_3_4_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_4_3.xml b/.idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_4_3.xml new file mode 100644 index 0000000..0bdbc71 --- /dev/null +++ b/.idea/libraries/Maven__com_baomidou_mybatis_plus_extension_3_4_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_belerweb_pinyin4j_2_5_0.xml b/.idea/libraries/Maven__com_belerweb_pinyin4j_2_5_0.xml new file mode 100644 index 0000000..2ca54a7 --- /dev/null +++ b/.idea/libraries/Maven__com_belerweb_pinyin4j_2_5_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_carrotsearch_thirdparty_simple_xml_safe_2_7_1.xml b/.idea/libraries/Maven__com_carrotsearch_thirdparty_simple_xml_safe_2_7_1.xml new file mode 100644 index 0000000..a918945 --- /dev/null +++ b/.idea/libraries/Maven__com_carrotsearch_thirdparty_simple_xml_safe_2_7_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml b/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml new file mode 100644 index 0000000..33c30b4 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_classmate_1_3_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_1.xml new file mode 100644 index 0000000..3aa8175 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_2.xml new file mode 100644 index 0000000..6447563 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_11_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_4_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_4_3.xml new file mode 100644 index 0000000..42a8d5b --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_4_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_7.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_7.xml new file mode 100644 index 0000000..45dbb56 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_8_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_9_0.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_9_0.xml new file mode 100644 index 0000000..06441f4 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_annotations_2_9_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_1.xml new file mode 100644 index 0000000..bd0d979 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_2.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_2.xml new file mode 100644 index 0000000..4923956 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_11_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_4_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_4_3.xml new file mode 100644 index 0000000..fc3ea3f --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_4_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_9_9.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_9_9.xml new file mode 100644 index 0000000..55b3f7b --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_core_2_9_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_1.xml new file mode 100644 index 0000000..08c0010 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_4_3.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_4_3.xml new file mode 100644 index 0000000..567d7e5 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_4_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_9_9.xml b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_9_9.xml new file mode 100644 index 0000000..b007cab --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_core_jackson_databind_2_9_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_11_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_11_1.xml new file mode 100644 index 0000000..27241b7 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_dataformat_jackson_dataformat_yaml_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_1.xml new file mode 100644 index 0000000..ea31a53 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jdk8_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_1.xml new file mode 100644 index 0000000..50b2736 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_datatype_jackson_datatype_jsr310_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_1.xml b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_1.xml new file mode 100644 index 0000000..6eac973 --- /dev/null +++ b/.idea/libraries/Maven__com_fasterxml_jackson_module_jackson_module_parameter_names_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_caspar_chen_swagger_ui_layer_1_1_3.xml b/.idea/libraries/Maven__com_github_caspar_chen_swagger_ui_layer_1_1_3.xml new file mode 100644 index 0000000..fc5a467 --- /dev/null +++ b/.idea/libraries/Maven__com_github_caspar_chen_swagger_ui_layer_1_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_jsqlparser_jsqlparser_4_2.xml b/.idea/libraries/Maven__com_github_jsqlparser_jsqlparser_4_2.xml new file mode 100644 index 0000000..87f32d8 --- /dev/null +++ b/.idea/libraries/Maven__com_github_jsqlparser_jsqlparser_4_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_pagehelper_pagehelper_5_3_0.xml b/.idea/libraries/Maven__com_github_pagehelper_pagehelper_5_3_0.xml new file mode 100644 index 0000000..798310e --- /dev/null +++ b/.idea/libraries/Maven__com_github_pagehelper_pagehelper_5_3_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_penggle_kaptcha_2_3_2.xml b/.idea/libraries/Maven__com_github_penggle_kaptcha_2_3_2.xml new file mode 100644 index 0000000..bc88169 --- /dev/null +++ b/.idea/libraries/Maven__com_github_penggle_kaptcha_2_3_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_github_virtuald_curvesapi_1_06.xml b/.idea/libraries/Maven__com_github_virtuald_curvesapi_1_06.xml new file mode 100644 index 0000000..d156c18 --- /dev/null +++ b/.idea/libraries/Maven__com_github_virtuald_curvesapi_1_06.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml new file mode 100644 index 0000000..1c380d0 --- /dev/null +++ b/.idea/libraries/Maven__com_google_code_findbugs_jsr305_3_0_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml new file mode 100644 index 0000000..848cecd --- /dev/null +++ b/.idea/libraries/Maven__com_google_errorprone_error_prone_annotations_2_3_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml b/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml new file mode 100644 index 0000000..36e948e --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_failureaccess_1_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_guava_29_0_jre.xml b/.idea/libraries/Maven__com_google_guava_guava_29_0_jre.xml new file mode 100644 index 0000000..f349d63 --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_guava_29_0_jre.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml b/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml new file mode 100644 index 0000000..4e15702 --- /dev/null +++ b/.idea/libraries/Maven__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml new file mode 100644 index 0000000..bacaa45 --- /dev/null +++ b/.idea/libraries/Maven__com_google_j2objc_j2objc_annotations_1_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_jhlabs_filters_2_0_235_1.xml b/.idea/libraries/Maven__com_jhlabs_filters_2_0_235_1.xml new file mode 100644 index 0000000..f674d8e --- /dev/null +++ b/.idea/libraries/Maven__com_jhlabs_filters_2_0_235_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_netflix_archaius_archaius_core_0_7_6.xml b/.idea/libraries/Maven__com_netflix_archaius_archaius_core_0_7_6.xml new file mode 100644 index 0000000..bd9061c --- /dev/null +++ b/.idea/libraries/Maven__com_netflix_archaius_archaius_core_0_7_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_netflix_feign_feign_core_8_14_4.xml b/.idea/libraries/Maven__com_netflix_feign_feign_core_8_14_4.xml new file mode 100644 index 0000000..d977a58 --- /dev/null +++ b/.idea/libraries/Maven__com_netflix_feign_feign_core_8_14_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_netflix_feign_feign_slf4j_8_14_4.xml b/.idea/libraries/Maven__com_netflix_feign_feign_slf4j_8_14_4.xml new file mode 100644 index 0000000..7b9a4b5 --- /dev/null +++ b/.idea/libraries/Maven__com_netflix_feign_feign_slf4j_8_14_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_netflix_hystrix_hystrix_core_1_5_18.xml b/.idea/libraries/Maven__com_netflix_hystrix_hystrix_core_1_5_18.xml new file mode 100644 index 0000000..588dca0 --- /dev/null +++ b/.idea/libraries/Maven__com_netflix_hystrix_hystrix_core_1_5_18.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_8_1.xml b/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_8_1.xml new file mode 100644 index 0000000..5b88b8a --- /dev/null +++ b/.idea/libraries/Maven__com_squareup_okhttp3_okhttp_4_8_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_squareup_okio_okio_2_7_0.xml b/.idea/libraries/Maven__com_squareup_okio_okio_2_7_0.xml new file mode 100644 index 0000000..95fd78d --- /dev/null +++ b/.idea/libraries/Maven__com_squareup_okio_okio_2_7_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_vividsolutions_jts_1_13.xml b/.idea/libraries/Maven__com_vividsolutions_jts_1_13.xml new file mode 100644 index 0000000..b7e360b --- /dev/null +++ b/.idea/libraries/Maven__com_vividsolutions_jts_1_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_zaxxer_HikariCP_3_4_5.xml b/.idea/libraries/Maven__com_zaxxer_HikariCP_3_4_5.xml new file mode 100644 index 0000000..97e2291 --- /dev/null +++ b/.idea/libraries/Maven__com_zaxxer_HikariCP_3_4_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_zaxxer_HikariCP_4_0_3.xml b/.idea/libraries/Maven__com_zaxxer_HikariCP_4_0_3.xml new file mode 100644 index 0000000..9314c36 --- /dev/null +++ b/.idea/libraries/Maven__com_zaxxer_HikariCP_4_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__com_zaxxer_SparseBitSet_1_2.xml b/.idea/libraries/Maven__com_zaxxer_SparseBitSet_1_2.xml new file mode 100644 index 0000000..6ce4aae --- /dev/null +++ b/.idea/libraries/Maven__com_zaxxer_SparseBitSet_1_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_4.xml b/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_4.xml new file mode 100644 index 0000000..84eb115 --- /dev/null +++ b/.idea/libraries/Maven__commons_beanutils_commons_beanutils_1_9_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_codec_commons_codec_1_12.xml b/.idea/libraries/Maven__commons_codec_commons_codec_1_12.xml new file mode 100644 index 0000000..0953394 --- /dev/null +++ b/.idea/libraries/Maven__commons_codec_commons_codec_1_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_codec_commons_codec_1_13.xml b/.idea/libraries/Maven__commons_codec_commons_codec_1_13.xml new file mode 100644 index 0000000..5384f7a --- /dev/null +++ b/.idea/libraries/Maven__commons_codec_commons_codec_1_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml b/.idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml new file mode 100644 index 0000000..13afda2 --- /dev/null +++ b/.idea/libraries/Maven__commons_collections_commons_collections_3_2_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_configuration_commons_configuration_1_8.xml b/.idea/libraries/Maven__commons_configuration_commons_configuration_1_8.xml new file mode 100644 index 0000000..772d6fe --- /dev/null +++ b/.idea/libraries/Maven__commons_configuration_commons_configuration_1_8.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_fileupload_commons_fileupload_1_4.xml b/.idea/libraries/Maven__commons_fileupload_commons_fileupload_1_4.xml new file mode 100644 index 0000000..3b9dcc0 --- /dev/null +++ b/.idea/libraries/Maven__commons_fileupload_commons_fileupload_1_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_io_commons_io_2_2.xml b/.idea/libraries/Maven__commons_io_commons_io_2_2.xml new file mode 100644 index 0000000..f8084ec --- /dev/null +++ b/.idea/libraries/Maven__commons_io_commons_io_2_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_io_commons_io_2_7.xml b/.idea/libraries/Maven__commons_io_commons_io_2_7.xml new file mode 100644 index 0000000..ded72c9 --- /dev/null +++ b/.idea/libraries/Maven__commons_io_commons_io_2_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml b/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml new file mode 100644 index 0000000..2ec8376 --- /dev/null +++ b/.idea/libraries/Maven__commons_lang_commons_lang_2_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml b/.idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml new file mode 100644 index 0000000..b770f56 --- /dev/null +++ b/.idea/libraries/Maven__commons_logging_commons_logging_1_1_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml new file mode 100644 index 0000000..eab40b3 --- /dev/null +++ b/.idea/libraries/Maven__commons_logging_commons_logging_1_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_github_openfeign_feign_core_10_10_1.xml b/.idea/libraries/Maven__io_github_openfeign_feign_core_10_10_1.xml new file mode 100644 index 0000000..efc64b2 --- /dev/null +++ b/.idea/libraries/Maven__io_github_openfeign_feign_core_10_10_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_github_openfeign_feign_hystrix_10_10_1.xml b/.idea/libraries/Maven__io_github_openfeign_feign_hystrix_10_10_1.xml new file mode 100644 index 0000000..11bde67 --- /dev/null +++ b/.idea/libraries/Maven__io_github_openfeign_feign_hystrix_10_10_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_github_openfeign_form_feign_form_3_8_0.xml b/.idea/libraries/Maven__io_github_openfeign_form_feign_form_3_8_0.xml new file mode 100644 index 0000000..0534476 --- /dev/null +++ b/.idea/libraries/Maven__io_github_openfeign_form_feign_form_3_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_github_openfeign_form_feign_form_spring_3_8_0.xml b/.idea/libraries/Maven__io_github_openfeign_form_feign_form_spring_3_8_0.xml new file mode 100644 index 0000000..47e101e --- /dev/null +++ b/.idea/libraries/Maven__io_github_openfeign_form_feign_form_spring_3_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_lettuce_lettuce_core_5_3_0_RELEASE.xml b/.idea/libraries/Maven__io_lettuce_lettuce_core_5_3_0_RELEASE.xml new file mode 100644 index 0000000..778f95d --- /dev/null +++ b/.idea/libraries/Maven__io_lettuce_lettuce_core_5_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_micrometer_micrometer_core_1_5_1.xml b/.idea/libraries/Maven__io_micrometer_micrometer_core_1_5_1.xml new file mode 100644 index 0000000..0db69cb --- /dev/null +++ b/.idea/libraries/Maven__io_micrometer_micrometer_core_1_5_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_minio_minio_8_0_3.xml b/.idea/libraries/Maven__io_minio_minio_8_0_3.xml new file mode 100644 index 0000000..c8743c4 --- /dev/null +++ b/.idea/libraries/Maven__io_minio_minio_8_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_buffer_4_1_49_Final.xml b/.idea/libraries/Maven__io_netty_netty_buffer_4_1_49_Final.xml new file mode 100644 index 0000000..9247b16 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_buffer_4_1_49_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_buffer_4_1_51_Final.xml b/.idea/libraries/Maven__io_netty_netty_buffer_4_1_51_Final.xml new file mode 100644 index 0000000..68df79d --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_buffer_4_1_51_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_codec_4_1_49_Final.xml b/.idea/libraries/Maven__io_netty_netty_codec_4_1_49_Final.xml new file mode 100644 index 0000000..a3b1c84 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_codec_4_1_49_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_codec_4_1_51_Final.xml b/.idea/libraries/Maven__io_netty_netty_codec_4_1_51_Final.xml new file mode 100644 index 0000000..62ec8c2 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_codec_4_1_51_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_codec_dns_4_1_51_Final.xml b/.idea/libraries/Maven__io_netty_netty_codec_dns_4_1_51_Final.xml new file mode 100644 index 0000000..684d838 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_codec_dns_4_1_51_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_common_4_1_49_Final.xml b/.idea/libraries/Maven__io_netty_netty_common_4_1_49_Final.xml new file mode 100644 index 0000000..0219231 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_common_4_1_49_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_common_4_1_51_Final.xml b/.idea/libraries/Maven__io_netty_netty_common_4_1_51_Final.xml new file mode 100644 index 0000000..36e612e --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_common_4_1_51_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_handler_4_1_49_Final.xml b/.idea/libraries/Maven__io_netty_netty_handler_4_1_49_Final.xml new file mode 100644 index 0000000..00e798d --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_handler_4_1_49_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_handler_4_1_51_Final.xml b/.idea/libraries/Maven__io_netty_netty_handler_4_1_51_Final.xml new file mode 100644 index 0000000..fb10871 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_handler_4_1_51_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_resolver_4_1_49_Final.xml b/.idea/libraries/Maven__io_netty_netty_resolver_4_1_49_Final.xml new file mode 100644 index 0000000..a080e6b --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_resolver_4_1_49_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_resolver_4_1_51_Final.xml b/.idea/libraries/Maven__io_netty_netty_resolver_4_1_51_Final.xml new file mode 100644 index 0000000..0281c5e --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_resolver_4_1_51_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_resolver_dns_4_1_51_Final.xml b/.idea/libraries/Maven__io_netty_netty_resolver_dns_4_1_51_Final.xml new file mode 100644 index 0000000..2b6768c --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_resolver_dns_4_1_51_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_transport_4_1_49_Final.xml b/.idea/libraries/Maven__io_netty_netty_transport_4_1_49_Final.xml new file mode 100644 index 0000000..f0b7741 --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_transport_4_1_49_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_netty_netty_transport_4_1_51_Final.xml b/.idea/libraries/Maven__io_netty_netty_transport_4_1_51_Final.xml new file mode 100644 index 0000000..425736e --- /dev/null +++ b/.idea/libraries/Maven__io_netty_netty_transport_4_1_51_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_projectreactor_reactor_core_3_3_4_RELEASE.xml b/.idea/libraries/Maven__io_projectreactor_reactor_core_3_3_4_RELEASE.xml new file mode 100644 index 0000000..eb81c2f --- /dev/null +++ b/.idea/libraries/Maven__io_projectreactor_reactor_core_3_3_4_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_projectreactor_reactor_core_3_3_5_RELEASE.xml b/.idea/libraries/Maven__io_projectreactor_reactor_core_3_3_5_RELEASE.xml new file mode 100644 index 0000000..a5baba9 --- /dev/null +++ b/.idea/libraries/Maven__io_projectreactor_reactor_core_3_3_5_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_reactivex_rxjava2_rxjava_2_2_19.xml b/.idea/libraries/Maven__io_reactivex_rxjava2_rxjava_2_2_19.xml new file mode 100644 index 0000000..4b5c378 --- /dev/null +++ b/.idea/libraries/Maven__io_reactivex_rxjava2_rxjava_2_2_19.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_reactivex_rxjava_1_2_0.xml b/.idea/libraries/Maven__io_reactivex_rxjava_1_2_0.xml new file mode 100644 index 0000000..27eb537 --- /dev/null +++ b/.idea/libraries/Maven__io_reactivex_rxjava_1_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_core_2_8_0.xml b/.idea/libraries/Maven__io_springfox_springfox_core_2_8_0.xml new file mode 100644 index 0000000..64855d8 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_core_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_schema_2_8_0.xml b/.idea/libraries/Maven__io_springfox_springfox_schema_2_8_0.xml new file mode 100644 index 0000000..c271a62 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_schema_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_spi_2_8_0.xml b/.idea/libraries/Maven__io_springfox_springfox_spi_2_8_0.xml new file mode 100644 index 0000000..c43a6ab --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_spi_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_spring_web_2_8_0.xml b/.idea/libraries/Maven__io_springfox_springfox_spring_web_2_8_0.xml new file mode 100644 index 0000000..5060ed3 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_spring_web_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_swagger2_2_8_0.xml b/.idea/libraries/Maven__io_springfox_springfox_swagger2_2_8_0.xml new file mode 100644 index 0000000..3838245 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_swagger2_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_swagger_common_2_8_0.xml b/.idea/libraries/Maven__io_springfox_springfox_swagger_common_2_8_0.xml new file mode 100644 index 0000000..830eefd --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_swagger_common_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_springfox_springfox_swagger_ui_2_8_0.xml b/.idea/libraries/Maven__io_springfox_springfox_swagger_ui_2_8_0.xml new file mode 100644 index 0000000..bd002c8 --- /dev/null +++ b/.idea/libraries/Maven__io_springfox_springfox_swagger_ui_2_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_swagger_swagger_annotations_1_5_14.xml b/.idea/libraries/Maven__io_swagger_swagger_annotations_1_5_14.xml new file mode 100644 index 0000000..ffd56aa --- /dev/null +++ b/.idea/libraries/Maven__io_swagger_swagger_annotations_1_5_14.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__io_swagger_swagger_models_1_5_14.xml b/.idea/libraries/Maven__io_swagger_swagger_models_1_5_14.xml new file mode 100644 index 0000000..000ff27 --- /dev/null +++ b/.idea/libraries/Maven__io_swagger_swagger_models_1_5_14.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml b/.idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml new file mode 100644 index 0000000..cba9dd2 --- /dev/null +++ b/.idea/libraries/Maven__jakarta_annotation_jakarta_annotation_api_1_3_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml b/.idea/libraries/Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml new file mode 100644 index 0000000..e66afb9 --- /dev/null +++ b/.idea/libraries/Maven__jakarta_validation_jakarta_validation_api_2_0_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml b/.idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml new file mode 100644 index 0000000..e74f3ab --- /dev/null +++ b/.idea/libraries/Maven__javax_annotation_javax_annotation_api_1_3_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_cache_cache_api_1_0_0.xml b/.idea/libraries/Maven__javax_cache_cache_api_1_0_0.xml new file mode 100644 index 0000000..4ff335f --- /dev/null +++ b/.idea/libraries/Maven__javax_cache_cache_api_1_0_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__javax_servlet_javax_servlet_api_3_1_0.xml b/.idea/libraries/Maven__javax_servlet_javax_servlet_api_3_1_0.xml new file mode 100644 index 0000000..c24f7e3 --- /dev/null +++ b/.idea/libraries/Maven__javax_servlet_javax_servlet_api_3_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_7.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_7.xml new file mode 100644 index 0000000..5589596 --- /dev/null +++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_10_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_7_9.xml b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_7_9.xml new file mode 100644 index 0000000..22f4f74 --- /dev/null +++ b/.idea/libraries/Maven__net_bytebuddy_byte_buddy_1_7_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__net_sf_ehcache_ehcache_core_2_6_11.xml b/.idea/libraries/Maven__net_sf_ehcache_ehcache_core_2_6_11.xml new file mode 100644 index 0000000..1c71163 --- /dev/null +++ b/.idea/libraries/Maven__net_sf_ehcache_ehcache_core_2_6_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_collections4_4_4.xml b/.idea/libraries/Maven__org_apache_commons_commons_collections4_4_4.xml new file mode 100644 index 0000000..5871c95 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_collections4_4_4.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_compress_1_19.xml b/.idea/libraries/Maven__org_apache_commons_commons_compress_1_19.xml new file mode 100644 index 0000000..7c25fef --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_compress_1_19.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_12_0.xml b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_12_0.xml new file mode 100644 index 0000000..28b8682 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_lang3_3_12_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml b/.idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml new file mode 100644 index 0000000..ebfe0a8 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_math3_3_6_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_commons_commons_text_1_6.xml b/.idea/libraries/Maven__org_apache_commons_commons_text_1_6.xml new file mode 100644 index 0000000..5a2fa29 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_commons_commons_text_1_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_12.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_12.xml new file mode 100644 index 0000000..9cb68a2 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpclient_4_5_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_13.xml b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_13.xml new file mode 100644 index 0000000..b475675 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_httpcomponents_httpcore_4_4_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_2.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_2.xml new file mode 100644 index 0000000..35caff2 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml new file mode 100644 index 0000000..8ad4996 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_api_2_13_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_2.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_2.xml new file mode 100644 index 0000000..5788de2 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_3.xml b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_3.xml new file mode 100644 index 0000000..57e6ac4 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_logging_log4j_log4j_to_slf4j_2_13_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_poi_poi_4_1_2.xml b/.idea/libraries/Maven__org_apache_poi_poi_4_1_2.xml new file mode 100644 index 0000000..c706d5b --- /dev/null +++ b/.idea/libraries/Maven__org_apache_poi_poi_4_1_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_poi_poi_ooxml_4_1_2.xml b/.idea/libraries/Maven__org_apache_poi_poi_ooxml_4_1_2.xml new file mode 100644 index 0000000..905ca0c --- /dev/null +++ b/.idea/libraries/Maven__org_apache_poi_poi_ooxml_4_1_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_poi_poi_ooxml_schemas_4_1_2.xml b/.idea/libraries/Maven__org_apache_poi_poi_ooxml_schemas_4_1_2.xml new file mode 100644 index 0000000..93d965d --- /dev/null +++ b/.idea/libraries/Maven__org_apache_poi_poi_ooxml_schemas_4_1_2.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_shiro_shiro_cache_1_8_0.xml b/.idea/libraries/Maven__org_apache_shiro_shiro_cache_1_8_0.xml new file mode 100644 index 0000000..5272a36 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_shiro_shiro_cache_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_shiro_shiro_config_core_1_8_0.xml b/.idea/libraries/Maven__org_apache_shiro_shiro_config_core_1_8_0.xml new file mode 100644 index 0000000..4578d1b --- /dev/null +++ b/.idea/libraries/Maven__org_apache_shiro_shiro_config_core_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_shiro_shiro_config_ogdl_1_8_0.xml b/.idea/libraries/Maven__org_apache_shiro_shiro_config_ogdl_1_8_0.xml new file mode 100644 index 0000000..e699787 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_shiro_shiro_config_ogdl_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_shiro_shiro_core_1_8_0.xml b/.idea/libraries/Maven__org_apache_shiro_shiro_core_1_8_0.xml new file mode 100644 index 0000000..aa3fdcf --- /dev/null +++ b/.idea/libraries/Maven__org_apache_shiro_shiro_core_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_shiro_shiro_crypto_cipher_1_8_0.xml b/.idea/libraries/Maven__org_apache_shiro_shiro_crypto_cipher_1_8_0.xml new file mode 100644 index 0000000..77a90b8 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_shiro_shiro_crypto_cipher_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_shiro_shiro_crypto_core_1_8_0.xml b/.idea/libraries/Maven__org_apache_shiro_shiro_crypto_core_1_8_0.xml new file mode 100644 index 0000000..dddd497 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_shiro_shiro_crypto_core_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_shiro_shiro_crypto_hash_1_8_0.xml b/.idea/libraries/Maven__org_apache_shiro_shiro_crypto_hash_1_8_0.xml new file mode 100644 index 0000000..ece1eae --- /dev/null +++ b/.idea/libraries/Maven__org_apache_shiro_shiro_crypto_hash_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_shiro_shiro_ehcache_1_8_0.xml b/.idea/libraries/Maven__org_apache_shiro_shiro_ehcache_1_8_0.xml new file mode 100644 index 0000000..c1049dc --- /dev/null +++ b/.idea/libraries/Maven__org_apache_shiro_shiro_ehcache_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_shiro_shiro_event_1_8_0.xml b/.idea/libraries/Maven__org_apache_shiro_shiro_event_1_8_0.xml new file mode 100644 index 0000000..b7a65df --- /dev/null +++ b/.idea/libraries/Maven__org_apache_shiro_shiro_event_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_shiro_shiro_lang_1_8_0.xml b/.idea/libraries/Maven__org_apache_shiro_shiro_lang_1_8_0.xml new file mode 100644 index 0000000..499eb00 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_shiro_shiro_lang_1_8_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_37.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_37.xml new file mode 100644 index 0000000..7e39935 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_core_9_0_37.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_37.xml b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_37.xml new file mode 100644 index 0000000..6a30056 --- /dev/null +++ b/.idea/libraries/Maven__org_apache_tomcat_embed_tomcat_embed_websocket_9_0_37.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_velocity_velocity_engine_core_2_3.xml b/.idea/libraries/Maven__org_apache_velocity_velocity_engine_core_2_3.xml new file mode 100644 index 0000000..ea2816e --- /dev/null +++ b/.idea/libraries/Maven__org_apache_velocity_velocity_engine_core_2_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_apache_xmlbeans_xmlbeans_3_1_0.xml b/.idea/libraries/Maven__org_apache_xmlbeans_xmlbeans_3_1_0.xml new file mode 100644 index 0000000..0695d4b --- /dev/null +++ b/.idea/libraries/Maven__org_apache_xmlbeans_xmlbeans_3_1_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_aspectj_aspectjweaver_1_9_6.xml b/.idea/libraries/Maven__org_aspectj_aspectjweaver_1_9_6.xml new file mode 100644 index 0000000..d0ca705 --- /dev/null +++ b/.idea/libraries/Maven__org_aspectj_aspectjweaver_1_9_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_checkerframework_checker_qual_2_11_1.xml b/.idea/libraries/Maven__org_checkerframework_checker_qual_2_11_1.xml new file mode 100644 index 0000000..6d622d2 --- /dev/null +++ b/.idea/libraries/Maven__org_checkerframework_checker_qual_2_11_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_glassfish_jakarta_el_3_0_3.xml b/.idea/libraries/Maven__org_glassfish_jakarta_el_3_0_3.xml new file mode 100644 index 0000000..ae5020d --- /dev/null +++ b/.idea/libraries/Maven__org_glassfish_jakarta_el_3_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hdrhistogram_HdrHistogram_2_1_12.xml b/.idea/libraries/Maven__org_hdrhistogram_HdrHistogram_2_1_12.xml new file mode 100644 index 0000000..6908885 --- /dev/null +++ b/.idea/libraries/Maven__org_hdrhistogram_HdrHistogram_2_1_12.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hdrhistogram_HdrHistogram_2_1_9.xml b/.idea/libraries/Maven__org_hdrhistogram_HdrHistogram_2_1_9.xml new file mode 100644 index 0000000..04cc804 --- /dev/null +++ b/.idea/libraries/Maven__org_hdrhistogram_HdrHistogram_2_1_9.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_1_5_Final.xml b/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_1_5_Final.xml new file mode 100644 index 0000000..6d045ad --- /dev/null +++ b/.idea/libraries/Maven__org_hibernate_validator_hibernate_validator_6_1_5_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml b/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml new file mode 100644 index 0000000..09c4cf0 --- /dev/null +++ b/.idea/libraries/Maven__org_javassist_javassist_3_21_0_GA.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml new file mode 100644 index 0000000..5f7dd01 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_logging_jboss_logging_3_3_2_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_marshalling_jboss_marshalling_2_0_9_Final.xml b/.idea/libraries/Maven__org_jboss_marshalling_jboss_marshalling_2_0_9_Final.xml new file mode 100644 index 0000000..ee45f31 --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_marshalling_jboss_marshalling_2_0_9_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jboss_marshalling_jboss_marshalling_river_2_0_9_Final.xml b/.idea/libraries/Maven__org_jboss_marshalling_jboss_marshalling_river_2_0_9_Final.xml new file mode 100644 index 0000000..9f3ba0d --- /dev/null +++ b/.idea/libraries/Maven__org_jboss_marshalling_jboss_marshalling_river_2_0_9_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_annotations_13_0.xml b/.idea/libraries/Maven__org_jetbrains_annotations_13_0.xml new file mode 100644 index 0000000..e2c8297 --- /dev/null +++ b/.idea/libraries/Maven__org_jetbrains_annotations_13_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_3_72.xml b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_3_72.xml new file mode 100644 index 0000000..3b29150 --- /dev/null +++ b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_1_3_72.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_70.xml b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_70.xml new file mode 100644 index 0000000..bbe5288 --- /dev/null +++ b/.idea/libraries/Maven__org_jetbrains_kotlin_kotlin_stdlib_common_1_3_70.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jodd_jodd_bean_5_0_13.xml b/.idea/libraries/Maven__org_jodd_jodd_bean_5_0_13.xml new file mode 100644 index 0000000..33b8f60 --- /dev/null +++ b/.idea/libraries/Maven__org_jodd_jodd_bean_5_0_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_jodd_jodd_core_5_0_13.xml b/.idea/libraries/Maven__org_jodd_jodd_core_5_0_13.xml new file mode 100644 index 0000000..735d215 --- /dev/null +++ b/.idea/libraries/Maven__org_jodd_jodd_core_5_0_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_latencyutils_LatencyUtils_2_0_3.xml b/.idea/libraries/Maven__org_latencyutils_LatencyUtils_2_0_3.xml new file mode 100644 index 0000000..bf68169 --- /dev/null +++ b/.idea/libraries/Maven__org_latencyutils_LatencyUtils_2_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_mapstruct_mapstruct_1_2_0_Final.xml b/.idea/libraries/Maven__org_mapstruct_mapstruct_1_2_0_Final.xml new file mode 100644 index 0000000..87cb599 --- /dev/null +++ b/.idea/libraries/Maven__org_mapstruct_mapstruct_1_2_0_Final.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_mybatis_mybatis_3_5_7.xml b/.idea/libraries/Maven__org_mybatis_mybatis_3_5_7.xml new file mode 100644 index 0000000..fab1459 --- /dev/null +++ b/.idea/libraries/Maven__org_mybatis_mybatis_3_5_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_mybatis_mybatis_spring_2_0_6.xml b/.idea/libraries/Maven__org_mybatis_mybatis_spring_2_0_6.xml new file mode 100644 index 0000000..a359305 --- /dev/null +++ b/.idea/libraries/Maven__org_mybatis_mybatis_spring_2_0_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_2_2_0.xml b/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_2_2_0.xml new file mode 100644 index 0000000..879dc41 --- /dev/null +++ b/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_autoconfigure_2_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_2_2_0.xml b/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_2_2_0.xml new file mode 100644 index 0000000..8161289 --- /dev/null +++ b/.idea/libraries/Maven__org_mybatis_spring_boot_mybatis_spring_boot_starter_2_2_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_projectlombok_lombok_1_16_18.xml b/.idea/libraries/Maven__org_projectlombok_lombok_1_16_18.xml new file mode 100644 index 0000000..8503cb4 --- /dev/null +++ b/.idea/libraries/Maven__org_projectlombok_lombok_1_16_18.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml new file mode 100644 index 0000000..9843fa4 --- /dev/null +++ b/.idea/libraries/Maven__org_projectlombok_lombok_1_18_8.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_reactivestreams_reactive_streams_1_0_3.xml b/.idea/libraries/Maven__org_reactivestreams_reactive_streams_1_0_3.xml new file mode 100644 index 0000000..f17253b --- /dev/null +++ b/.idea/libraries/Maven__org_reactivestreams_reactive_streams_1_0_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_redisson_redisson_3_13_3.xml b/.idea/libraries/Maven__org_redisson_redisson_3_13_3.xml new file mode 100644 index 0000000..fae323d --- /dev/null +++ b/.idea/libraries/Maven__org_redisson_redisson_3_13_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_redisson_redisson_spring_boot_starter_3_13_3.xml b/.idea/libraries/Maven__org_redisson_redisson_spring_boot_starter_3_13_3.xml new file mode 100644 index 0000000..009c3e8 --- /dev/null +++ b/.idea/libraries/Maven__org_redisson_redisson_spring_boot_starter_3_13_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_redisson_redisson_spring_data_23_3_13_3.xml b/.idea/libraries/Maven__org_redisson_redisson_spring_data_23_3_13_3.xml new file mode 100644 index 0000000..e16ba79 --- /dev/null +++ b/.idea/libraries/Maven__org_redisson_redisson_spring_data_23_3_13_3.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_reflections_reflections_0_9_11.xml b/.idea/libraries/Maven__org_reflections_reflections_0_9_11.xml new file mode 100644 index 0000000..d8b2fb5 --- /dev/null +++ b/.idea/libraries/Maven__org_reflections_reflections_0_9_11.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_30.xml b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_30.xml new file mode 100644 index 0000000..27229ce --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_jul_to_slf4j_1_7_30.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_13.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_13.xml new file mode 100644 index 0000000..4fd913d --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_13.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml new file mode 100644 index 0000000..20e8163 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_25.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml new file mode 100644 index 0000000..6545f77 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_26.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_30.xml b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_30.xml new file mode 100644 index 0000000..02b6812 --- /dev/null +++ b/.idea/libraries/Maven__org_slf4j_slf4j_api_1_7_30.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_3_0_RELEASE.xml new file mode 100644 index 0000000..90f25ec --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_3_2_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_3_2_RELEASE.xml new file mode 100644 index 0000000..158ddd9 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_2_3_2_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_actuator_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_actuator_2_3_0_RELEASE.xml new file mode 100644 index 0000000..4eaf24b --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_actuator_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_actuator_autoconfigure_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_actuator_autoconfigure_2_3_0_RELEASE.xml new file mode 100644 index 0000000..304d350 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_actuator_autoconfigure_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_12_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_12_RELEASE.xml new file mode 100644 index 0000000..45fdc55 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_1_5_12_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_0_RELEASE.xml new file mode 100644 index 0000000..04b7e81 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_2_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_2_RELEASE.xml new file mode 100644 index 0000000..d547da6 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_3_2_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_4_5.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_4_5.xml new file mode 100644 index 0000000..3f8b8a7 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_autoconfigure_2_4_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_3_0_RELEASE.xml new file mode 100644 index 0000000..cad03dc --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_3_2_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_3_2_RELEASE.xml new file mode 100644 index 0000000..0cfdca9 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_2_3_2_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_actuator_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_actuator_2_3_0_RELEASE.xml new file mode 100644 index 0000000..c2ad696 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_actuator_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_aop_2_3_2_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_aop_2_3_2_RELEASE.xml new file mode 100644 index 0000000..3a5b31d --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_aop_2_3_2_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_data_redis_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_data_redis_2_3_0_RELEASE.xml new file mode 100644 index 0000000..59fabda --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_data_redis_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_4_5.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_4_5.xml new file mode 100644 index 0000000..ab882ae --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_4_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_5_0.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_5_0.xml new file mode 100644 index 0000000..5206606 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_jdbc_2_5_0.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_3_2_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_3_2_RELEASE.xml new file mode 100644 index 0000000..b2bec55 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_json_2_3_2_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_3_0_RELEASE.xml new file mode 100644 index 0000000..b4b9a36 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_3_2_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_3_2_RELEASE.xml new file mode 100644 index 0000000..30cfcb1 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_logging_2_3_2_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_3_2_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_3_2_RELEASE.xml new file mode 100644 index 0000000..2aed09e --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_tomcat_2_3_2_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_2_3_2_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_2_3_2_RELEASE.xml new file mode 100644 index 0000000..a04fca2 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_validation_2_3_2_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_3_2_RELEASE.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_3_2_RELEASE.xml new file mode 100644 index 0000000..af10dc8 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_web_2_3_2_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_websocket_2_4_5.xml b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_websocket_2_4_5.xml new file mode 100644 index 0000000..bd16337 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_boot_spring_boot_starter_websocket_2_4_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_cloud_spring_cloud_netflix_archaius_2_2_5_RELEASE.xml b/.idea/libraries/Maven__org_springframework_cloud_spring_cloud_netflix_archaius_2_2_5_RELEASE.xml new file mode 100644 index 0000000..1f971e4 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_cloud_spring_cloud_netflix_archaius_2_2_5_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_cloud_spring_cloud_netflix_ribbon_2_2_5_RELEASE.xml b/.idea/libraries/Maven__org_springframework_cloud_spring_cloud_netflix_ribbon_2_2_5_RELEASE.xml new file mode 100644 index 0000000..eccd43a --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_cloud_spring_cloud_netflix_ribbon_2_2_5_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_cloud_spring_cloud_openfeign_core_2_2_5_RELEASE.xml b/.idea/libraries/Maven__org_springframework_cloud_spring_cloud_openfeign_core_2_2_5_RELEASE.xml new file mode 100644 index 0000000..a02663e --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_cloud_spring_cloud_openfeign_core_2_2_5_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_data_spring_data_commons_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_data_spring_data_commons_2_3_0_RELEASE.xml new file mode 100644 index 0000000..8e81cfb --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_data_spring_data_commons_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_data_spring_data_keyvalue_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_data_spring_data_keyvalue_2_3_0_RELEASE.xml new file mode 100644 index 0000000..1052151 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_data_spring_data_keyvalue_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_data_spring_data_redis_2_3_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_data_spring_data_redis_2_3_0_RELEASE.xml new file mode 100644 index 0000000..b9546e7 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_data_spring_data_redis_2_3_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_1_2_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_1_2_0_RELEASE.xml new file mode 100644 index 0000000..fbc0452 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_core_1_2_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_1_2_0_RELEASE.xml b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_1_2_0_RELEASE.xml new file mode 100644 index 0000000..7e6f096 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_plugin_spring_plugin_metadata_1_2_0_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_aop_5_2_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_aop_5_2_6_RELEASE.xml new file mode 100644 index 0000000..e31c2b2 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_aop_5_2_6_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_aop_5_2_8_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_aop_5_2_8_RELEASE.xml new file mode 100644 index 0000000..000f9ff --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_aop_5_2_8_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_beans_4_0_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_beans_4_0_9_RELEASE.xml new file mode 100644 index 0000000..f98ea8c --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_beans_4_0_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_beans_5_2_8_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_beans_5_2_8_RELEASE.xml new file mode 100644 index 0000000..ca7aa33 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_beans_5_2_8_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_beans_5_3_6.xml b/.idea/libraries/Maven__org_springframework_spring_beans_5_3_6.xml new file mode 100644 index 0000000..49a8b7f --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_beans_5_3_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_beans_5_3_7.xml b/.idea/libraries/Maven__org_springframework_spring_beans_5_3_7.xml new file mode 100644 index 0000000..eca6183 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_beans_5_3_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_context_4_0_9_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_context_4_0_9_RELEASE.xml new file mode 100644 index 0000000..802cb82 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_context_4_0_9_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_context_5_2_8_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_context_5_2_8_RELEASE.xml new file mode 100644 index 0000000..3194e8e --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_context_5_2_8_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_context_support_5_2_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_context_support_5_2_6_RELEASE.xml new file mode 100644 index 0000000..4a53bcf --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_context_support_5_2_6_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_core_5_2_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_core_5_2_6_RELEASE.xml new file mode 100644 index 0000000..44ad8a8 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_core_5_2_6_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_core_5_2_8_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_core_5_2_8_RELEASE.xml new file mode 100644 index 0000000..e7d5de5 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_core_5_2_8_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_core_5_3_6.xml b/.idea/libraries/Maven__org_springframework_spring_core_5_3_6.xml new file mode 100644 index 0000000..33a8f45 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_core_5_3_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_expression_5_2_8_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_expression_5_2_8_RELEASE.xml new file mode 100644 index 0000000..2d2456d --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_expression_5_2_8_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_jcl_5_2_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_jcl_5_2_6_RELEASE.xml new file mode 100644 index 0000000..b148bc1 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_jcl_5_2_6_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_jcl_5_2_8_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_jcl_5_2_8_RELEASE.xml new file mode 100644 index 0000000..4fea859 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_jcl_5_2_8_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_jcl_5_3_6.xml b/.idea/libraries/Maven__org_springframework_spring_jcl_5_3_6.xml new file mode 100644 index 0000000..005d9a6 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_jcl_5_3_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_jdbc_5_3_6.xml b/.idea/libraries/Maven__org_springframework_spring_jdbc_5_3_6.xml new file mode 100644 index 0000000..17ca07b --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_jdbc_5_3_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_jdbc_5_3_7.xml b/.idea/libraries/Maven__org_springframework_spring_jdbc_5_3_7.xml new file mode 100644 index 0000000..235b6d5 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_jdbc_5_3_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_messaging_5_3_6.xml b/.idea/libraries/Maven__org_springframework_spring_messaging_5_3_6.xml new file mode 100644 index 0000000..0aa1739 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_messaging_5_3_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_oxm_5_2_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_oxm_5_2_6_RELEASE.xml new file mode 100644 index 0000000..5cfaf2a --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_oxm_5_2_6_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_tx_5_2_6_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_tx_5_2_6_RELEASE.xml new file mode 100644 index 0000000..a77080c --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_tx_5_2_6_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_tx_5_3_6.xml b/.idea/libraries/Maven__org_springframework_spring_tx_5_3_6.xml new file mode 100644 index 0000000..ce9d784 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_tx_5_3_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_tx_5_3_7.xml b/.idea/libraries/Maven__org_springframework_spring_tx_5_3_7.xml new file mode 100644 index 0000000..765d963 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_tx_5_3_7.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_web_5_1_5_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_web_5_1_5_RELEASE.xml new file mode 100644 index 0000000..b8a2414 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_web_5_1_5_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_web_5_2_8_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_web_5_2_8_RELEASE.xml new file mode 100644 index 0000000..ae46cf0 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_web_5_2_8_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_webmvc_5_2_8_RELEASE.xml b/.idea/libraries/Maven__org_springframework_spring_webmvc_5_2_8_RELEASE.xml new file mode 100644 index 0000000..d584e24 --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_webmvc_5_2_8_RELEASE.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_springframework_spring_websocket_5_3_6.xml b/.idea/libraries/Maven__org_springframework_spring_websocket_5_3_6.xml new file mode 100644 index 0000000..6940ffa --- /dev/null +++ b/.idea/libraries/Maven__org_springframework_spring_websocket_5_3_6.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_ssssssss_magic_api_2_0_1.xml b/.idea/libraries/Maven__org_ssssssss_magic_api_2_0_1.xml new file mode 100644 index 0000000..d22b326 --- /dev/null +++ b/.idea/libraries/Maven__org_ssssssss_magic_api_2_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_ssssssss_magic_api_plugin_swagger_2_0_1.xml b/.idea/libraries/Maven__org_ssssssss_magic_api_plugin_swagger_2_0_1.xml new file mode 100644 index 0000000..58fbee2 --- /dev/null +++ b/.idea/libraries/Maven__org_ssssssss_magic_api_plugin_swagger_2_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_ssssssss_magic_api_spring_boot_starter_2_0_1.xml b/.idea/libraries/Maven__org_ssssssss_magic_api_spring_boot_starter_2_0_1.xml new file mode 100644 index 0000000..be2a716 --- /dev/null +++ b/.idea/libraries/Maven__org_ssssssss_magic_api_spring_boot_starter_2_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_ssssssss_magic_editor_2_0_1.xml b/.idea/libraries/Maven__org_ssssssss_magic_editor_2_0_1.xml new file mode 100644 index 0000000..5eedcb2 --- /dev/null +++ b/.idea/libraries/Maven__org_ssssssss_magic_editor_2_0_1.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_ssssssss_magic_script_1_8_5.xml b/.idea/libraries/Maven__org_ssssssss_magic_script_1_8_5.xml new file mode 100644 index 0000000..87ef154 --- /dev/null +++ b/.idea/libraries/Maven__org_ssssssss_magic_script_1_8_5.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/libraries/Maven__org_yaml_snakeyaml_1_26.xml b/.idea/libraries/Maven__org_yaml_snakeyaml_1_26.xml new file mode 100644 index 0000000..e998675 --- /dev/null +++ b/.idea/libraries/Maven__org_yaml_snakeyaml_1_26.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..4361200 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..0671122 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/workspace.xml b/.idea/workspace.xml new file mode 100644 index 0000000..5259ae3 --- /dev/null +++ b/.idea/workspace.xml @@ -0,0 +1,96 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + jr + + + + + + + + 1721098449559 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common-base-starter/common-base-starter.iml b/common-base-starter/common-base-starter.iml new file mode 100644 index 0000000..7ef687b --- /dev/null +++ b/common-base-starter/common-base-starter.iml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common-base-starter/pom.xml b/common-base-starter/pom.xml new file mode 100644 index 0000000..112cc3e --- /dev/null +++ b/common-base-starter/pom.xml @@ -0,0 +1,187 @@ + + + + mosty-common + com.mosty + 1.0.0-SNAPSHOT + + 4.0.0 + + common-base-starter + 1.0.0-SNAPSHOT + + + 8 + 8 + 3.13.3 + 2.8.0 + + + + + + org.apache.velocity + velocity-engine-core + 2.3 + + + + + io.springfox + springfox-swagger2 + ${springfox-version} + + + io.springfox + springfox-swagger-ui + ${springfox-version} + + + com.github.caspar-chen + swagger-ui-layer + 1.1.3 + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-dependencies.version} + + + cn.hutool + hutool-all + 5.7.20 + + + com.belerweb + pinyin4j + 2.5.0 + + + + com.alibaba + fastjson + ${fastjson.version} + + + org.apache.commons + commons-lang3 + 3.12.0 + + + com.google.guava + guava + 29.0-jre + + + org.projectlombok + lombok + 1.18.8 + + + com.alibaba + transmittable-thread-local + 2.11.5 + + + org.redisson + redisson-spring-boot-starter + ${redisson.version} + true + + + org.springframework.boot + spring-boot-starter-aop + ${spring-boot-dependencies.version} + + + com.github.pagehelper + pagehelper + 5.3.0 + compile + + + jakarta.validation + jakarta.validation-api + 2.0.2 + compile + + + + com.baomidou + mybatis-plus-boot-starter + 3.4.3 + + + com.baomidou + mybatis-plus-extension + 3.4.3 + + + + + org.apache.poi + poi-ooxml + 4.1.2 + + + + org.apache.poi + poi + 4.1.2 + + + + com.mosty + common-redis-starter + 1.0.0-SNAPSHOT + + + + + + + + org.apache.maven.plugins + maven-source-plugin + 2.4 + + true + + + + compile + + jar + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.4 + + true + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + + + \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/autoconfig/Desensitization.java b/common-base-starter/src/main/java/com/mosty/common/base/autoconfig/Desensitization.java new file mode 100644 index 0000000..18fa8e6 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/autoconfig/Desensitization.java @@ -0,0 +1,113 @@ +package com.mosty.common.base.autoconfig; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import org.apache.commons.lang3.StringUtils; + +import java.io.IOException; + +/** + * 脱敏类 + * @author kevin + * @date 2022/3/8 11:10 PM + * @since 1.0.0 + */ +@SuppressWarnings("unused") +public class Desensitization { + + /** + * 手机类型脱敏 + * @author kevin + * @date 2022/3/8 11:13 PM + * @since 1.0.0 + */ + public static class Phone extends JsonSerializer { + @Override + public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (StringUtils.isEmpty(value)) { + jsonGenerator.writeObject(value); + return; + } + String trim = value.trim(); + if (trim.length() == 11) { + String phone = trim.replaceAll("(\\d{3})\\d*(\\d{4})", "$1****$2"); + jsonGenerator.writeObject(phone); + return; + } + jsonGenerator.writeObject(value); + } + } + + /** + * 银行卡号类型脱敏 + * @author kevin + * @date 2022/3/8 11:13 PM + * @since 1.0.0 + */ + public static class BankCard extends JsonSerializer { + + @Override + public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (StringUtils.isEmpty(value)) { + jsonGenerator.writeObject(value); + return; + } + String trim = value.trim(); + String phone = trim.replaceAll("(\\d{6})\\d*(\\d{4})", "$1****$2"); + jsonGenerator.writeObject(phone); + } + } + + /** + * 身份证号类型脱敏 + * @author kevin + * @date 2022/3/8 11:13 PM + * @since 1.0.0 + */ + public static class IdentityCard extends JsonSerializer { + + @Override + public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (StringUtils.isEmpty(value)) { + jsonGenerator.writeObject(value); + return; + } + String trim = value.trim(); + String phone = trim.replaceAll("(\\d{6})\\d*(\\w{4})", "$1****$2"); + jsonGenerator.writeObject(phone); + } + } + + /** + * 姓名类型脱敏 + * @author kevin + * @date 2022/3/8 11:13 PM + * @since 1.0.0 + */ + public static class FullName extends JsonSerializer { + + @Override + public void serialize(String value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { + if (StringUtils.isEmpty(value) || value.length() == 1 || value.trim().length() == 1) { + jsonGenerator.writeObject(value); + return; + } + String trim = value.trim(); + if (trim.length() == 2) { + jsonGenerator.writeObject(value.charAt(0) + "*"); + return; + } + StringBuilder stringBuffer = new StringBuilder(); + for (int i = 0; i < value.length(); i++) { + if (i == 0 || i == value.length() - 1) { + stringBuffer.append(value.charAt(i)); + } else { + stringBuffer.append("*"); + } + } + jsonGenerator.writeObject(stringBuffer.toString()); + } + } + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/autoconfig/JacksonCustomizerConfig.java b/common-base-starter/src/main/java/com/mosty/common/base/autoconfig/JacksonCustomizerConfig.java new file mode 100644 index 0000000..a2b95fb --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/autoconfig/JacksonCustomizerConfig.java @@ -0,0 +1,88 @@ +//package com.mosty.common.base.autoconfig; +// +//import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +//import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +//import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; +//import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +//import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +//import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.commons.lang3.StringUtils; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.core.convert.converter.Converter; +//import org.springframework.stereotype.Component; +// +//import java.time.LocalDate; +//import java.time.LocalDateTime; +//import java.time.LocalTime; +//import java.time.format.DateTimeFormatter; +// +///** +// * 全局: 序列化,反序列化,格式处理 +// * @author kevin +// * @date 2022/3/28 2:37 PM +// * @since 1.0.0 +// */ +//@Slf4j +//@Configuration +//public class JacksonCustomizerConfig { +// +// @Value("${spring.jackson.date-format:yyyy-MM-dd HH:mm:ss}") +// private String localDateTimePattern; +// +// @Value("${spring.jackson.local-date-format:yyyy-MM-dd}") +// private String localDatePattern; +// +// @Value("${spring.jackson.local-time-format:HH:mm:ss}") +// private String localTimePattern; +// +// @Bean +// public Jackson2ObjectMapperBuilderCustomizer jackson2ObjectMapperBuilderCustomizer() { +// return builder -> { +// builder.serializerByType(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(localDateTimePattern))); +// builder.serializerByType(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(localDatePattern))); +// builder.serializerByType(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(localTimePattern))); +// builder.deserializerByType(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(localDateTimePattern))); +// builder.deserializerByType(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(localDatePattern))); +// builder.deserializerByType(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(localTimePattern))); +// }; +// } +// +// /** +// * 时间LocalDateTime转换 +// */ +// @Component +// public static class LocalDateTimeConverter implements Converter { +// @Override +// public LocalDateTime convert(String source) { +// if (StringUtils.isBlank(source)) { +// return null; +// } +// if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2} {1}\\d{1,2}:\\d{1,2}:\\d{1,2}$")) { +// return LocalDateTime.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); +// } +// throw new IllegalArgumentException("Invalid value '" + source + "'"); +// } +// } +// +// /** +// * 时间LocalDate转换 +// */ +// @Component +// public static class LocalDateConverter implements Converter { +// @Override +// public LocalDate convert(String source) { +// if (StringUtils.isBlank(source)) { +// return null; +// } +// if (source.matches("^\\d{4}-\\d{1,2}-\\d{1,2}$")) { +// return LocalDate.parse(source, DateTimeFormatter.ofPattern("yyyy-MM-dd")); +// } +// throw new IllegalArgumentException("Invalid value '" + source + "'"); +// } +// } +// +//} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/autoconfig/swagger/SwaggerConfig.java b/common-base-starter/src/main/java/com/mosty/common/base/autoconfig/swagger/SwaggerConfig.java new file mode 100644 index 0000000..a795c08 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/autoconfig/swagger/SwaggerConfig.java @@ -0,0 +1,87 @@ +package com.mosty.common.base.autoconfig.swagger; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.ParameterBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.schema.ModelRef; +import springfox.documentation.service.Contact; +import springfox.documentation.service.Parameter; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +import java.util.ArrayList; +import java.util.List; + +import static com.mosty.common.base.constant.SystemConfigConstants.TOKEN_HEADER; + +/** + * swagger 配置、自动装配类类 + * {@link ComponentScan} 具体扫描地址可以更改为: + * {@link ComponentScan({"com.mosty.common.config.controller","..."})} + * + * @author kevin + * @date 2022/1/22 5:47 PM + * @since 1.0.0 + */ +@Configuration +@EnableSwagger2 +@ComponentScan({"com.mosty.common"}) +@SuppressWarnings("unused") +public class SwaggerConfig { + + /** swagger基础扫描包 */ + private static final String SWAGGER_SCAN_BASE_PACKAGE = "com.mosty"; + + /** swagger默认关闭,则没有配置也保证不会启动报错 */ + @Value("${swagger.enable:true}") + private Boolean swaggerEnable; + @Value("${swagger.title:mosty}") + private String title; + @Value("${swagger.host:127.0.0.1}") + private String host; + @Value("${swagger.port:9999}") + private String port; + @Value("${swagger.version:1.0.0}") + private String version; + @Value("${swagger.name:基础服务}") + private String name; + @Value("${swagger.url:''}") + private String url; + @Value("${swagger.email:''}") + private String email; + @Value("${spring.application.name}") + private String serviceName; + + @Bean + public Docket createRestApi() { + if (swaggerEnable) { + List parameters = new ArrayList<>(); + parameters.add(new ParameterBuilder() + .name(TOKEN_HEADER) + .description("令牌") + .modelRef(new ModelRef("string")) + .parameterType("header") + .required(false) + .build()); + + return new Docket(DocumentationType.SWAGGER_2) + .host(host + ":" + port) + .apiInfo( + new ApiInfoBuilder().title(serviceName).description(serviceName) + .version(version).contact(new Contact(name, url, email)).build()) + .globalOperationParameters(parameters) + .select() + .apis(RequestHandlerSelectors.basePackage(SWAGGER_SCAN_BASE_PACKAGE)) + .paths(PathSelectors.any()) + .build(); + } + return new Docket(DocumentationType.SWAGGER_2).enable(false); + } + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/Constants.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/Constants.java new file mode 100644 index 0000000..d46f493 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/Constants.java @@ -0,0 +1,114 @@ +package com.mosty.common.base.constant; + +/** + * 通用常量信息 + * + * @author ruoyi + */ +public class Constants { + /** + * UTF-8 字符集 + */ + public static final String UTF8 = "UTF-8"; + + /** + * GBK 字符集 + */ + public static final String GBK = "GBK"; + + /** + * http请求 + */ + public static final String HTTP = "http://"; + + /** + * https请求 + */ + public static final String HTTPS = "https://"; + + /** + * 通用成功标识 + */ + public static final String SUCCESS = "0"; + + /** + * 通用失败标识 + */ + public static final String FAIL = "1"; + + /** + * 登录成功 + */ + public static final String LOGIN_SUCCESS = "Success"; + + /** + * 注销 + */ + public static final String LOGOUT = "Logout"; + + /** + * 注册 + */ + public static final String REGISTER = "Register"; + + /** + * 登录失败 + */ + public static final String LOGIN_FAIL = "Error"; + + /** + * 系统用户授权缓存 + */ + public static final String SYS_AUTH_CACHE = "sys-authCache"; + + /** + * 参数管理 cache name + */ + public static final String SYS_CONFIG_CACHE = "sys-config"; + + /** + * 参数管理 cache key + */ + public static final String SYS_CONFIG_KEY = "sys_config:"; + + /** + * 字典管理 cache name + */ + public static final String SYS_DICT_CACHE = "sys-dict"; + + /** + * 字典管理 cache key + */ + public static final String SYS_DICT_KEY = "sys_dict:"; + + /** + * 资源映射路径 前缀 + */ + public static final String RESOURCE_PREFIX = "/profile"; + + /** + * RMI 远程方法调用 + */ + public static final String LOOKUP_RMI = "rmi:"; + + /** + * LDAP 远程方法调用 + */ + public static final String LOOKUP_LDAP = "ldap:"; + + /** + * LDAPS 远程方法调用 + */ + public static final String LOOKUP_LDAPS = "ldaps:"; + + /** + * 定时任务白名单配置(仅允许访问的包名,如其他需要可以自行添加) + */ + public static final String[] JOB_WHITELIST_STR = {"com.ruoyi"}; + + /** + * 定时任务违规的字符 + */ + public static final String[] JOB_ERROR_STR = {"java.net.URL", "javax.naming.InitialContext", "org.yaml.snakeyaml", + "org.springframework", "org.apache", "com.ruoyi.common.utils.file"}; +} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/GenConstants.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/GenConstants.java new file mode 100644 index 0000000..a8b5079 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/GenConstants.java @@ -0,0 +1,176 @@ +package com.mosty.common.base.constant; + +/** + * 代码生成通用常量 + * + * @author ruoyi + */ +public class GenConstants { + /** + * 单表(增删改查) + */ + public static final String TPL_CRUD = "crud"; + + /** + * 树表(增删改查) + */ + public static final String TPL_TREE = "tree"; + + /** + * 主子表(增删改查) + */ + public static final String TPL_SUB = "sub"; + + /** + * 树编码字段 + */ + public static final String TREE_CODE = "treeCode"; + + /** + * 树父编码字段 + */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** + * 树名称字段 + */ + public static final String TREE_NAME = "treeName"; + + /** + * 上级菜单ID字段 + */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** + * 上级菜单名称字段 + */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** + * 数据库字符串类型 + */ + public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; + + /** + * 数据库文本类型 + */ + public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; + + /** + * 数据库时间类型 + */ + public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"}; + + /** + * 数据库数字类型 + */ + public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", + "bit", "bigint", "float", "double", "decimal"}; + + /** + * 页面不需要编辑字段 + */ + public static final String[] COLUMNNAME_NOT_EDIT = {"id", "create_by", "create_time", "del_flag"}; + + /** + * 页面不需要显示的列表字段 + */ + public static final String[] COLUMNNAME_NOT_LIST = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time"}; + + /** + * 页面不需要查询字段 + */ + public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark"}; + + /** + * Entity基类字段 + */ + public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime", "remark"}; + + /** + * Tree基类字段 + */ + public static final String[] TREE_ENTITY = {"parentName", "parentId", "orderNum", "ancestors"}; + + /** + * 文本框 + */ + public static final String HTML_INPUT = "input"; + + /** + * 文本域 + */ + public static final String HTML_TEXTAREA = "textarea"; + + /** + * 下拉框 + */ + public static final String HTML_SELECT = "select"; + + /** + * 单选框 + */ + public static final String HTML_RADIO = "radio"; + + /** + * 复选框 + */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** + * 日期控件 + */ + public static final String HTML_DATETIME = "datetime"; + + /** + * 上传控件 + */ + public static final String HTML_UPLOAD = "upload"; + + /** + * 富文本控件 + */ + public static final String HTML_SUMMERNOTE = "summernote"; + + /** + * 字符串类型 + */ + public static final String TYPE_STRING = "String"; + + /** + * 整型 + */ + public static final String TYPE_INTEGER = "Integer"; + + /** + * 长整型 + */ + public static final String TYPE_LONG = "Long"; + + /** + * 浮点型 + */ + public static final String TYPE_DOUBLE = "Double"; + + /** + * 高精度计算类型 + */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** + * 时间类型 + */ + public static final String TYPE_DATE = "Date"; + + /** + * 模糊查询 + */ + public static final String QUERY_LIKE = "LIKE"; + + /** + * 需要 + */ + public static final String REQUIRE = "1"; +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/OnlineStatus.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/OnlineStatus.java new file mode 100644 index 0000000..a065c2f --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/OnlineStatus.java @@ -0,0 +1,23 @@ +package com.mosty.common.base.constant; + +/** + * 用户会话 + * + * @author ruoyi + */ +public enum OnlineStatus { + /** + * 用户状态 + */ + on_line("在线"), off_line("离线"); + + private final String info; + + private OnlineStatus(String info) { + this.info = info; + } + + public String getInfo() { + return info; + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/PermissionConstants.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/PermissionConstants.java new file mode 100644 index 0000000..c9aeee0 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/PermissionConstants.java @@ -0,0 +1,38 @@ +package com.mosty.common.base.constant; + +/** + * 权限通用常量 + * + * @author ruoyi + */ +public class PermissionConstants { + /** + * 新增权限 + */ + public static final String ADD_PERMISSION = "add"; + + /** + * 修改权限 + */ + public static final String EDIT_PERMISSION = "edit"; + + /** + * 删除权限 + */ + public static final String REMOVE_PERMISSION = "remove"; + + /** + * 导出权限 + */ + public static final String EXPORT_PERMISSION = "export"; + + /** + * 显示权限 + */ + public static final String VIEW_PERMISSION = "view"; + + /** + * 查询权限 + */ + public static final String LIST_PERMISSION = "list"; +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/ScheduleConstants.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/ScheduleConstants.java new file mode 100644 index 0000000..b8cc821 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/ScheduleConstants.java @@ -0,0 +1,56 @@ +package com.mosty.common.base.constant; + +/** + * 任务调度通用常量 + * + * @author ruoyi + */ +public class ScheduleConstants { + public static final String TASK_CLASS_NAME = "TASK_CLASS_NAME"; + + /** + * 执行目标key + */ + public static final String TASK_PROPERTIES = "TASK_PROPERTIES"; + + /** + * 默认 + */ + public static final String MISFIRE_DEFAULT = "0"; + + /** + * 立即触发执行 + */ + public static final String MISFIRE_IGNORE_MISFIRES = "1"; + + /** + * 触发一次执行 + */ + public static final String MISFIRE_FIRE_AND_PROCEED = "2"; + + /** + * 不触发立即执行 + */ + public static final String MISFIRE_DO_NOTHING = "3"; + + public enum Status { + /** + * 正常 + */ + NORMAL("0"), + /** + * 暂停 + */ + PAUSE("1"); + + private String value; + + private Status(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/ShiroConstants.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/ShiroConstants.java new file mode 100644 index 0000000..3c0fcba --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/ShiroConstants.java @@ -0,0 +1,78 @@ +package com.mosty.common.base.constant; + +/** + * Shiro通用常量 + * + * @author ruoyi + */ +public class ShiroConstants { + /** + * 当前登录的用户 + */ + public static final String CURRENT_USER = "currentUser"; + + /** + * 用户名字段 + */ + public static final String CURRENT_USERNAME = "username"; + + /** + * 锁定屏幕字段 + */ + public static final String LOCK_SCREEN = "lockscreen"; + + /** + * 消息key + */ + public static final String MESSAGE = "message"; + + /** + * 错误key + */ + public static final String ERROR = "errorMsg"; + + /** + * 编码格式 + */ + public static final String ENCODING = "UTF-8"; + + /** + * 当前在线会话 + */ + public static final String ONLINE_SESSION = "online_session"; + + /** + * 验证码key + */ + public static final String CURRENT_CAPTCHA = "captcha"; + + /** + * 验证码开关 + */ + public static final String CURRENT_ENABLED = "captchaEnabled"; + + /** + * 验证码类型 + */ + public static final String CURRENT_TYPE = "captchaType"; + + /** + * 验证码 + */ + public static final String CURRENT_VALIDATECODE = "validateCode"; + + /** + * 验证码错误 + */ + public static final String CAPTCHA_ERROR = "captchaError"; + + /** + * 登录记录缓存 + */ + public static final String LOGINRECORDCACHE = "loginRecordCache"; + + /** + * 系统活跃用户缓存 + */ + public static final String SYS_USERCACHE = "sys-userCache"; +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/SystemConfigConstants.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/SystemConfigConstants.java new file mode 100644 index 0000000..05dda1b --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/SystemConfigConstants.java @@ -0,0 +1,26 @@ +package com.mosty.common.base.constant; + +/** + * 系统配置相关 + * @author kevin + * @date 2022/3/21 10:46 PM + * @since 1.0.0 + */ +public class SystemConfigConstants { + + // token请求的 Header头 key + public static final String TOKEN_HEADER = "Authorization"; + + // token加密key + public static final String TOKEN_KEY = "RVvjAORWxgmDyvGP8RkD7HuaYEuekN7rXyaDaLn2jbk6OJvFupTXzicR883pFUmI"; + + // token 主题 + public static final String TOKEN_ISSUER = "mosty-admin"; + + // token redis的key + public static final String TOKEN_PREFIX = "token:"; + + // redis中缓存的所有用户的登录信息 +// public static final String USER_INFO_LIST = "user_info_list:"; + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/UserConstants.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/UserConstants.java new file mode 100644 index 0000000..cf59650 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/UserConstants.java @@ -0,0 +1,148 @@ +package com.mosty.common.base.constant; + +/** + * 用户常量信息 + * + * @author ruoyi + */ +public class UserConstants { + + /** + * 平台内系统用户的唯一标志 + */ + public static final String SYS_USER = "SYS_USER"; + + /** + * 正常状态 + */ + public static final String NORMAL = "0"; + + /** + * 异常状态 + */ + public static final String EXCEPTION = "1"; + + /** + * 用户封禁状态 + */ + public static final String USER_DISABLE = "1"; + + /** + * 角色封禁状态 + */ + public static final String ROLE_DISABLE = "1"; + + /** + * 部门正常状态 + */ + public static final String DEPT_NORMAL = "0"; + + /** + * 部门停用状态 + */ + public static final String DEPT_DISABLE = "1"; + + /** + * 字典正常状态 + */ + public static final String DICT_NORMAL = "0"; + + /** + * 是否为系统默认(是) + */ + public static final String YES = "Y"; + + /** + * 用户名长度限制 + */ + public static final int USERNAME_MIN_LENGTH = 2; + public static final int USERNAME_MAX_LENGTH = 20; + + /** + * 登录名称是否唯一的返回结果码 + */ + public final static String USER_NAME_UNIQUE = "0"; + public final static String USER_NAME_NOT_UNIQUE = "1"; + + /** + * 手机号码是否唯一的返回结果 + */ + public final static String USER_PHONE_UNIQUE = "0"; + public final static String USER_PHONE_NOT_UNIQUE = "1"; + + /** + * e-mail 是否唯一的返回结果 + */ + public final static String USER_EMAIL_UNIQUE = "0"; + public final static String USER_EMAIL_NOT_UNIQUE = "1"; + + /** + * 部门名称是否唯一的返回结果码 + */ + public final static String DEPT_NAME_UNIQUE = "0"; + public final static String DEPT_NAME_NOT_UNIQUE = "1"; + + /** + * 角色名称是否唯一的返回结果码 + */ + public final static String ROLE_NAME_UNIQUE = "0"; + public final static String ROLE_NAME_NOT_UNIQUE = "1"; + + /** + * 岗位名称是否唯一的返回结果码 + */ + public final static String POST_NAME_UNIQUE = "0"; + public final static String POST_NAME_NOT_UNIQUE = "1"; + + /** + * 角色权限是否唯一的返回结果码 + */ + public final static String ROLE_KEY_UNIQUE = "0"; + public final static String ROLE_KEY_NOT_UNIQUE = "1"; + + /** + * 岗位编码是否唯一的返回结果码 + */ + public final static String POST_CODE_UNIQUE = "0"; + public final static String POST_CODE_NOT_UNIQUE = "1"; + + /** + * 菜单名称是否唯一的返回结果码 + */ + public final static String MENU_NAME_UNIQUE = "0"; + public final static String MENU_NAME_NOT_UNIQUE = "1"; + + /** + * 字典类型是否唯一的返回结果码 + */ + public final static String DICT_TYPE_UNIQUE = "0"; + public final static String DICT_TYPE_NOT_UNIQUE = "1"; + + /** + * 参数键名是否唯一的返回结果码 + */ + public final static String CONFIG_KEY_UNIQUE = "0"; + public final static String CONFIG_KEY_NOT_UNIQUE = "1"; + + /** + * 密码长度限制 + */ + public static final int PASSWORD_MIN_LENGTH = 5; + public static final int PASSWORD_MAX_LENGTH = 20; + + /** + * 用户类型 + */ + public static final String SYSTEM_USER_TYPE = "00"; + public static final String REGISTER_USER_TYPE = "01"; + + /** + * 手机号码格式限制 + */ + public static final String MOBILE_PHONE_NUMBER_PATTERN = "^0{0,1}(13[0-9]|15[0-9]|14[0-9]|18[0-9])[0-9]{8}$"; + + /** + * 邮箱格式限制 + */ + public static final String EMAIL_PATTERN = "^((([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+(\\.([a-z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(\\\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?"; +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/ConfigKeyEnum.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/ConfigKeyEnum.java new file mode 100644 index 0000000..2a6ef0a --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/ConfigKeyEnum.java @@ -0,0 +1,21 @@ +package com.mosty.common.base.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 系统配置key + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum ConfigKeyEnum { + /** 密码等级 */ + PASSWORD_LEVEL("password.level", "密码等级"); + + + /** key */ + public final String code; + + /** 描述 */ + public final String desc; +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/DeletedEnum.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/DeletedEnum.java new file mode 100644 index 0000000..fe5bbcd --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/DeletedEnum.java @@ -0,0 +1,26 @@ +package com.mosty.common.base.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 数据是否删除标识 + * @author kevin + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum DeletedEnum { + + /** 正常状态 */ + NATURE(0, "正常状态"), + + /** 注销状态 */ + DELETED(1, "注销状态"); + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/DictTypeEnum.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/DictTypeEnum.java new file mode 100644 index 0000000..b2e3499 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/DictTypeEnum.java @@ -0,0 +1,27 @@ +package com.mosty.common.base.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 字典类型枚举 + * + * @author kevin + * @date 2022/2/20 3:52 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum DictTypeEnum { + + /** 正常字典 */ + NATURE(1, "正常字典【列表】"), + + /** 树型字典 */ + TREE(2, "树型结构"); + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/MenuTypeEnum.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/MenuTypeEnum.java new file mode 100644 index 0000000..600fcef --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/MenuTypeEnum.java @@ -0,0 +1,43 @@ +package com.mosty.common.base.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 菜单类型枚举 + * @author kevin + * @date 2022/2/22 12:53 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum MenuTypeEnum { + + MENU_GROUP(1, "菜单组"), + MENU(2, "菜单"), + PAGE(3, "页面"), + RESOURCE(4, "资源"), + ; + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + + /** + * 根据编码匹配菜单类型 + * @param code 编码 + * @return 菜单类型枚举 + */ + public static MenuTypeEnum valueOf(Integer code) { + if (code == null) { + return null; + } + for (MenuTypeEnum menuTypeEnum : MenuTypeEnum.values()) { + if (menuTypeEnum.code.equals(code)) { + return menuTypeEnum; + } + } + return null; + } + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/PasswordLevelEnum.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/PasswordLevelEnum.java new file mode 100644 index 0000000..de93501 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/PasswordLevelEnum.java @@ -0,0 +1,22 @@ +package com.mosty.common.base.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 密码等级和对应规则 + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum PasswordLevelEnum { + + /** 密码等级 */ + PASSWORD_LEVEL_ONE(1, ""); + + + /** 等级 */ + public final Integer code; + + /** 规则 */ + public final String rule; +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/PermissionLevelEnum.java b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/PermissionLevelEnum.java new file mode 100644 index 0000000..5220bda --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/constant/enums/PermissionLevelEnum.java @@ -0,0 +1,38 @@ +package com.mosty.common.base.constant.enums; + +import lombok.AllArgsConstructor; + +@AllArgsConstructor +public enum PermissionLevelEnum { + + + /** + * 全部 + */ + ALL("1", "全部"), + + /** + * 部门及以下 + */ + DEPT_AND_CHILD("2", "部门及以下"), + /** + * 部门 + */ + DEPT("3", "仅部门权限"), + /** + * 部门及以下 + */ + ONESELF("4", "仅查看本人"); + + + /** + * 等级 + */ + public String level; + + /** + * 描述 + */ + public String desc; + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/data/scope/DataScope.java b/common-base-starter/src/main/java/com/mosty/common/base/data/scope/DataScope.java new file mode 100644 index 0000000..5f7ffdc --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/data/scope/DataScope.java @@ -0,0 +1,24 @@ +package com.mosty.common.base.data.scope; + +import java.lang.annotation.*; + +/** + * 数据权限过滤注解 + * + * @author ruoyi + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface DataScope { + + /** + * 部门表的别名 + */ + String deptAlias() default ""; + + /** + * 用户表的别名 + */ + String userAlias() default ""; +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/domain/BaseController.java b/common-base-starter/src/main/java/com/mosty/common/base/domain/BaseController.java new file mode 100644 index 0000000..1546ef1 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/domain/BaseController.java @@ -0,0 +1,207 @@ +package com.mosty.common.base.domain; + +import com.github.pagehelper.PageInfo; +import com.mosty.common.base.domain.page.PageUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.time.DateUtils; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import java.beans.PropertyEditorSupport; +import java.text.ParseException; +import java.util.Date; +import java.util.List; + +/** + * web层通用数据处理 + * + * @author ruoyi + */ +@Slf4j +public class BaseController { + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { + @Override + public void setAsText(String text) { + try { + setValue(DateUtils.parseDate(text)); + } catch (ParseException e) { + e.printStackTrace(); + } + } + }); + } + + /** + * 设置请求分页数据 + */ + protected void startPage() { + PageUtils.startPage(); + } +// +// /** +// * 设置请求排序数据 +// */ +// protected void startOrderBy() +// { +// PageDomain pageDomain = TableSupport.buildPageRequest(); +// if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) +// { +// String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); +// PageHelper.orderBy(orderBy); +// } +// } +// +// /** +// * 获取request +// */ +// public HttpServletRequest getRequest() +// { +// return ServletUtils.getRequest(); +// } +// +// /** +// * 获取response +// */ +// public HttpServletResponse getResponse() +// { +// return ServletUtils.getResponse(); +// } +// +// /** +// * 获取session +// */ +// public HttpSession getSession() +// { +// return getRequest().getSession(); +// } +// + + /** + * 响应请求分页数据 + */ + @SuppressWarnings({"rawtypes", "unchecked"}) + protected TableDataInfo getDataTable(List list) { + TableDataInfo rspData = new TableDataInfo(); + rspData.setCode(0); + rspData.setRows(list); + rspData.setTotal(new PageInfo(list).getTotal()); + return rspData; + } +// +// /** +// * 响应返回结果 +// * +// * @param rows 影响行数 +// * @return 操作结果 +// */ +// protected AjaxResult toAjax(int rows) +// { +// return rows > 0 ? success() : error(); +// } +// +// /** +// * 响应返回结果 +// * +// * @param result 结果 +// * @return 操作结果 +// */ +// protected AjaxResult toAjax(boolean result) +// { +// return result ? success() : error(); +// } +// +// /** +// * 返回成功 +// */ +// public AjaxResult success() +// { +// return AjaxResult.success(); +// } +// +// /** +// * 返回失败消息 +// */ +// public AjaxResult error() +// { +// return AjaxResult.error(); +// } +// +// /** +// * 返回成功消息 +// */ +// public AjaxResult success(String message) +// { +// return AjaxResult.success(message); +// } +// +// /** +// * 返回成功数据 +// */ +// public static AjaxResult success(Object data) +// { +// return AjaxResult.success("操作成功", data); +// } +// +// /** +// * 返回失败消息 +// */ +// public AjaxResult error(String message) +// { +// return AjaxResult.error(message); +// } +// +// /** +// * 返回错误码消息 +// */ +// public AjaxResult error(Type type, String message) +// { +// return new AjaxResult(type, message); +// } +// +// /** +// * 页面跳转 +// */ +// public String redirect(String url) +// { +// return StringUtils.format("redirect:{}", url); +// } +// +// /** +// * 获取用户缓存信息 +// */ +// public SysUser getSysUser() +// { +// return ShiroUtils.getSysUser(); +// } +// +// /** +// * 设置用户缓存信息 +// */ +// public void setSysUser(SysUser user) +// { +// ShiroUtils.setSysUser(user); +// } +// +// /** +// * 获取登录用户id +// */ +// public Long getUserId() +// { +// return getSysUser().getUserId(); +// } +// +// /** +// * 获取登录用户名 +// */ +// public String getLoginName() +// { +// return getSysUser().getLoginName(); +// } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/domain/CxSelect.java b/common-base-starter/src/main/java/com/mosty/common/base/domain/CxSelect.java new file mode 100644 index 0000000..015c5d0 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/domain/CxSelect.java @@ -0,0 +1,60 @@ +package com.mosty.common.base.domain; + +import java.io.Serializable; +import java.util.List; + +/** + * CxSelect树结构实体类 + * + * @author ruoyi + */ +public class CxSelect implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 数据值字段名称 + */ + private String v; + + /** + * 数据标题字段名称 + */ + private String n; + + /** + * 子集数据字段名称 + */ + private List s; + + public CxSelect() { + } + + public CxSelect(String v, String n) { + this.v = v; + this.n = n; + } + + public List getS() { + return s; + } + + public void setN(String n) { + this.n = n; + } + + public String getN() { + return n; + } + + public void setS(List s) { + this.s = s; + } + + public String getV() { + return v; + } + + public void setV(String v) { + this.v = v; + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/domain/ResponseResult.java b/common-base-starter/src/main/java/com/mosty/common/base/domain/ResponseResult.java new file mode 100644 index 0000000..3f0bf53 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/domain/ResponseResult.java @@ -0,0 +1,99 @@ +package com.mosty.common.base.domain; + +import lombok.Data; + +import java.io.Serializable; +import java.util.Objects; + +/** + * 基础请求返回类 + * @author kevin + * @date 2022/1/22 8:29 PM + * @since 1.0.0 + */ +@Data +@SuppressWarnings("unused") +public class ResponseResult implements Serializable { + + /** 调用成功编码 */ + private static final int SUCCESS_CODE = 10000; + + /** 调用失败编码 */ + private static final int FAIL_CODE = -1; + + /** 编号 */ + private int code = SUCCESS_CODE; + + /** 消息 */ + private String message; + + /** 数据 */ + private T data; + + public ResponseResult() { + } + + public ResponseResult(T data) { + this.message = "OK"; + this.data = data; + } + + public ResponseResult(int code, String msg) { + this.code = code; + this.message = msg; + this.data = null; + } + + public ResponseResult(int code, String msg, T data) { + this.code = code; + this.message = msg; + this.data = data; + } + + public static ResponseResult success() { + return new ResponseResult(SUCCESS_CODE, "OK", null); + } + + public static ResponseResult success(int code, String message, T data) { + return new ResponseResult(code, message, data); + } + + public static ResponseResult success(String message, T data) { + return new ResponseResult(SUCCESS_CODE, message, data); + } + + public static ResponseResult success(T data) { + return new ResponseResult(SUCCESS_CODE, "OK", data); + } + + public static ResponseResult fail(String message) { + return new ResponseResult(FAIL_CODE, message, (Object)null); + } + + public static ResponseResult fail(int code, String message) { + return new ResponseResult(code, message, (Object)null); + } + + public static ResponseResult fail(int code, String message, T t) { + return new ResponseResult(code, message, t); + } + + public boolean isSuccess() { + return SUCCESS_CODE == code; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) { + return false; + } + ResponseResult that = (ResponseResult) o; + return Objects.equals(code, that.code) && Objects.equals(message, that.message) && Objects.equals(data, that.data); + } + + @Override + public int hashCode() { + return Objects.hash(code, message, data); + } +} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/domain/TableDataInfo.java b/common-base-starter/src/main/java/com/mosty/common/base/domain/TableDataInfo.java new file mode 100644 index 0000000..ca35811 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/domain/TableDataInfo.java @@ -0,0 +1,82 @@ +package com.mosty.common.base.domain; + +import java.io.Serializable; +import java.util.List; + +/** + * 表格分页数据对象 + * + * @author ruoyi + */ +public class TableDataInfo implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 总记录数 + */ + private long total; + + /** + * 列表数据 + */ + private List rows; + + /** + * 消息状态码 + */ + private int code; + + /** + * 消息内容 + */ + private String msg; + + /** + * 表格数据对象 + */ + public TableDataInfo() { + } + + /** + * 分页 + * + * @param list 列表数据 + * @param total 总记录数 + */ + public TableDataInfo(List list, int total) { + this.rows = list; + this.total = total; + } + + public long getTotal() { + return total; + } + + public void setTotal(long total) { + this.total = total; + } + + public List getRows() { + return rows; + } + + public void setRows(List rows) { + this.rows = rows; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } +} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/domain/page/PageDomain.java b/common-base-starter/src/main/java/com/mosty/common/base/domain/page/PageDomain.java new file mode 100644 index 0000000..43e8e09 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/domain/page/PageDomain.java @@ -0,0 +1,86 @@ +package com.mosty.common.base.domain.page; + + +import com.mosty.common.base.util.StringUtils; + +/** + * 分页数据 + * + * @author ruoyi + */ +public class PageDomain { + /** + * 当前记录起始索引 + */ + private Integer pageNum; + + /** + * 每页显示记录数 + */ + private Integer pageSize; + + /** + * 排序列 + */ + private String orderByColumn; + + /** + * 排序的方向desc或者asc + */ + private String isAsc = "asc"; + + /** + * 分页参数合理化 + */ + private Boolean reasonable = true; + + public String getOrderBy() { + if (StringUtils.isEmpty(orderByColumn)) { + return ""; + } + return StringUtils.toUnderScoreCase(orderByColumn) + " " + isAsc; + } + + public Integer getPageNum() { + return pageNum; + } + + public void setPageNum(Integer pageNum) { + this.pageNum = pageNum; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String getOrderByColumn() { + return orderByColumn; + } + + public void setOrderByColumn(String orderByColumn) { + this.orderByColumn = orderByColumn; + } + + public String getIsAsc() { + return isAsc; + } + + public void setIsAsc(String isAsc) { + this.isAsc = isAsc; + } + + public Boolean getReasonable() { + if (StringUtils.isNull(reasonable)) { + return Boolean.TRUE; + } + return reasonable; + } + + public void setReasonable(Boolean reasonable) { + this.reasonable = reasonable; + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/domain/page/PageUtils.java b/common-base-starter/src/main/java/com/mosty/common/base/domain/page/PageUtils.java new file mode 100644 index 0000000..28861e7 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/domain/page/PageUtils.java @@ -0,0 +1,27 @@ +package com.mosty.common.base.domain.page; + +import com.github.pagehelper.PageHelper; + +import java.util.Objects; + +/** + * 分页工具类 + * + * @author ruoyi + */ +public class PageUtils extends PageHelper { + + /** + * 设置请求分页数据 + */ + public static void startPage() { + PageDomain pageDomain = TableSupport.buildPageRequest(); + Integer pageNum = pageDomain.getPageNum(); + Integer pageSize = pageDomain.getPageSize(); + if (!Objects.isNull(pageNum) && !Objects.isNull(pageSize)) { + String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); + Boolean reasonable = pageDomain.getReasonable(); + PageHelper.startPage(pageNum, pageSize, orderBy).setReasonable(reasonable); + } + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/domain/page/ServletUtils.java b/common-base-starter/src/main/java/com/mosty/common/base/domain/page/ServletUtils.java new file mode 100644 index 0000000..6d1d269 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/domain/page/ServletUtils.java @@ -0,0 +1,156 @@ +package com.mosty.common.base.domain.page; + +import cn.hutool.core.convert.Convert; +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +/** + * 客户端工具类 + * + * @author ruoyi + */ +public class ServletUtils { + /** + * 定义移动端请求的所有可能类型 + */ + private final static String[] agent = {"Android", "iPhone", "iPod", "iPad", "Windows Phone", "MQQBrowser"}; + + /** + * 获取String参数 + */ + public static String getParameter(String name) { + return getRequest().getParameter(name); + } + + /** + * 获取String参数 + */ + public static String getParameter(String name, String defaultValue) { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name) { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name) { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取request + */ + public static HttpServletRequest getRequest() { + return getRequestAttributes().getRequest(); + } + + /** + * 获取response + */ + public static HttpServletResponse getResponse() { + return getRequestAttributes().getResponse(); + } + + /** + * 获取session + */ + public static HttpSession getSession() { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + + /** + * 将字符串渲染到客户端 + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + * @return null + */ + public static String renderString(HttpServletResponse response, String string) { + try { + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 是否是Ajax异步请求 + * + * @param request + */ +// public static boolean isAjaxRequest(HttpServletRequest request) { +// String accept = request.getHeader("accept"); +// if (accept != null && accept.indexOf("application/json") != -1) { +// return true; +// } +// +// String xRequestedWith = request.getHeader("X-Requested-With"); +// if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) { +// return true; +// } +// +// String uri = request.getRequestURI(); +// if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) { +// return true; +// } +// +// String ajax = request.getParameter("__ajax"); +// if (StringUtils.inStringIgnoreCase(ajax, "json", "xml")) { +// return true; +// } +// return false; +// } + + /** + * 判断User-Agent 是不是来自于手机 + */ + public static boolean checkAgentIsMobile(String ua) { + boolean flag = false; + if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))) { + // 排除 苹果桌面系统 + if (!ua.contains("Windows NT") && !ua.contains("Macintosh")) { + for (String item : agent) { + if (ua.contains(item)) { + flag = true; + break; + } + } + } + } + return flag; + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/domain/page/SqlUtil.java b/common-base-starter/src/main/java/com/mosty/common/base/domain/page/SqlUtil.java new file mode 100644 index 0000000..17f5a06 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/domain/page/SqlUtil.java @@ -0,0 +1,53 @@ +package com.mosty.common.base.domain.page; + +import com.mosty.common.base.exception.BusinessException; +import org.apache.commons.lang3.StringUtils; + +/** + * sql操作工具类 + * + * @author ruoyi + */ +public class SqlUtil { + /** + * 定义常用的 sql关键字 + */ + public static String SQL_REGEX = "select |insert |delete |update |drop |count |exec |chr |mid |master |truncate |char |and |declare "; + + /** + * 仅支持字母、数字、下划线、空格、逗号、小数点(支持多个字段排序) + */ + public static String SQL_PATTERN = "[a-zA-Z0-9_\\ \\,\\.]+"; + + /** + * 检查字符,防止注入绕过 + */ + public static String escapeOrderBySql(String value) { + if (StringUtils.isNotEmpty(value) && !isValidOrderBySql(value)) { + throw new BusinessException("参数不符合规范,不能进行查询"); + } + return value; + } + + /** + * 验证 order by 语法是否符合规范 + */ + public static boolean isValidOrderBySql(String value) { + return value.matches(SQL_PATTERN); + } + + /** + * SQL关键字检查 + */ + public static void filterKeyword(String value) { + if (StringUtils.isEmpty(value)) { + return; + } + String[] sqlKeywords = StringUtils.split(SQL_REGEX, "\\|"); + for (int i = 0; i < sqlKeywords.length; i++) { + if (StringUtils.indexOfIgnoreCase(value, sqlKeywords[i]) > -1) { + throw new BusinessException("参数存在SQL注入风险"); + } + } + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/domain/page/TableSupport.java b/common-base-starter/src/main/java/com/mosty/common/base/domain/page/TableSupport.java new file mode 100644 index 0000000..70b28ac --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/domain/page/TableSupport.java @@ -0,0 +1,51 @@ +package com.mosty.common.base.domain.page; + + +/** + * 表格数据处理 + * + * @author ruoyi + */ +public class TableSupport { + /** + * 当前记录起始索引 + */ + public static final String PAGE_NUM = "pageNum"; + + /** + * 每页显示记录数 + */ + public static final String PAGE_SIZE = "pageSize"; + + /** + * 排序列 + */ + public static final String ORDER_BY_COLUMN = "orderByColumn"; + + /** + * 排序的方向 "desc" 或者 "asc". + */ + public static final String IS_ASC = "isAsc"; + + /** + * 分页参数合理化 + */ + public static final String REASONABLE = "reasonable"; + + /** + * 封装分页对象 + */ + public static PageDomain getPageDomain() { + PageDomain pageDomain = new PageDomain(); + pageDomain.setPageNum(ServletUtils.getParameterToInt(PAGE_NUM)); + pageDomain.setPageSize(ServletUtils.getParameterToInt(PAGE_SIZE)); + pageDomain.setOrderByColumn(ServletUtils.getParameter(ORDER_BY_COLUMN)); + pageDomain.setIsAsc(ServletUtils.getParameter(IS_ASC)); + pageDomain.setReasonable(ServletUtils.getParameterToBool(REASONABLE)); + return pageDomain; + } + + public static PageDomain buildPageRequest() { + return getPageDomain(); + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/BaseEntity.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/BaseEntity.java new file mode 100644 index 0000000..3c687e4 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/BaseEntity.java @@ -0,0 +1,141 @@ +package com.mosty.common.base.entity.log; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * Entity基类 + * + * @author ruoyi + */ +public class BaseEntity implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 搜索值 + */ + private String searchValue; + + /** + * 创建者id + */ + private Long createBy; + + /** + * 创建者名称 + */ + private String createName; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + + /** + * 更新者id + */ + private Long updateBy; + + /** + * 更新者名称 + */ + private String updateName; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime updateTime; + + /** + * 备注 + */ + private String remark; + + /** + * 请求参数 + */ + private Map params; + + public String getSearchValue() { + return searchValue; + } + + public void setSearchValue(String searchValue) { + this.searchValue = searchValue; + } + + public Long getCreateBy() { + return createBy; + } + + public void setCreateBy(Long createBy) { + this.createBy = createBy; + } + + public String getCreateName() { + return createName; + } + + public void setCreateName(String createName) { + this.createName = createName; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public Long getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(Long updateBy) { + this.updateBy = updateBy; + } + + public String getUpdateName() { + return updateName; + } + + public void setUpdateName(String updateName) { + this.updateName = updateName; + } + + public LocalDateTime getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(LocalDateTime updateTime) { + this.updateTime = updateTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Map getParams() { + if (params == null) { + params = new HashMap<>(); + } + return params; + } + + public void setParams(Map params) { + this.params = params; + } +} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/BusinessType.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/BusinessType.java new file mode 100644 index 0000000..f6fabbb --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/BusinessType.java @@ -0,0 +1,38 @@ +package com.mosty.common.base.entity.log; + +/** + * 业务操作类型 + * + * @author ruoyi + */ +public enum BusinessType { + // 其它 + OTHER, + + // 新增 + INSERT, + + // 修改 + UPDATE, + + // 删除 + DELETE, + + // 授权 + GRANT, + + // 导出 + EXPORT, + + // 导入 + IMPORT, + + // 强退 + FORCE, + + // 生成代码 + GENCODE, + + // 清空 + CLEAN, +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/CharsetKit.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/CharsetKit.java new file mode 100644 index 0000000..83c945d --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/CharsetKit.java @@ -0,0 +1,87 @@ +package com.mosty.common.base.entity.log; + +import org.apache.commons.lang3.StringUtils; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +/** + * 字符集工具类 + * + * @author ruoyi + */ +public class CharsetKit +{ + /** ISO-8859-1 */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** UTF-8 */ + public static final String UTF_8 = "UTF-8"; + /** GBK */ + public static final String GBK = "GBK"; + + /** ISO-8859-1 */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** UTF-8 */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** GBK */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) + { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, String srcCharset, String destCharset) + { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) + { + if (null == srcCharset) + { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) + { + destCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) + { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 系统字符集编码 + */ + public static String systemCharset() + { + return Charset.defaultCharset().name(); + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Convert.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Convert.java new file mode 100644 index 0000000..73ac91f --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Convert.java @@ -0,0 +1,1013 @@ +package com.mosty.common.base.entity.log; + +import org.apache.commons.lang3.StringUtils; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.math.RoundingMode; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; + +/** + * 类型转换器 + * + * @author ruoyi + */ +public class Convert +{ + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof String) + { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) + { + return toStr(value, null); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) + { + if (null == value) + { + return defaultValue; + } + if (value instanceof Character) + { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) + { + return toChar(value, null); + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Byte) + { + return (Byte) value; + } + if (value instanceof Number) + { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Byte.parseByte(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) + { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Short) + { + return (Short) value; + } + if (value instanceof Number) + { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Short.parseShort(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) + { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Number) + { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return NumberFormat.getInstance().parse(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) + { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Integer) + { + return (Integer) value; + } + if (value instanceof Number) + { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Integer.parseInt(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为int
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) + { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) + { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) + { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Integer[] {}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) + { + if (StringUtils.isEmpty(str)) + { + return new Long[] {}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) + { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) + { + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) + { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Long) + { + return (Long) value; + } + if (value instanceof Number) + { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为long
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) + { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Double) + { + return (Double) value; + } + if (value instanceof Number) + { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) + { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Float) + { + return (Float) value; + } + if (value instanceof Number) + { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Float.parseFloat(valueStr.trim()); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) + { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof Boolean) + { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) + { + case "true": + case "yes": + case "ok": + case "1": + return true; + case "false": + case "no": + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) + { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) + { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return Enum.valueOf(clazz, valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) + { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigInteger) + { + return (BigInteger) value; + } + if (value instanceof Long) + { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigInteger(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) + { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) + { + if (value == null) + { + return defaultValue; + } + if (value instanceof BigDecimal) + { + return (BigDecimal) value; + } + if (value instanceof Long) + { + return new BigDecimal((Long) value); + } + if (value instanceof Double) + { + return BigDecimal.valueOf((Double) value); + } + if (value instanceof Integer) + { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) + { + return defaultValue; + } + try + { + return new BigDecimal(valueStr); + } + catch (Exception e) + { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) + { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ + public static String utf8Str(Object obj) + { + return str(obj, CharsetKit.CHARSET_UTF_8); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) + { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) + { + if (null == obj) + { + return null; + } + + if (obj instanceof String) + { + return (String) obj; + } + else if (obj instanceof byte[] || obj instanceof Byte[]) + { + if (obj instanceof byte[]) + { + return str((byte[]) obj, charset); + } + else + { + Byte[] bytes = (Byte[]) obj; + int length = bytes.length; + byte[] dest = new byte[length]; + for (int i = 0; i < length; i++) + { + dest[i] = bytes[i]; + } + return str(dest, charset); + } + } + else if (obj instanceof ByteBuffer) + { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) + { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) + { + if (data == null) + { + return null; + } + + if (null == charset) + { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) + { + if (data == null) + { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) + { + if (null == charset) + { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) + { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) + { + char[] c = input.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == ' ') + { + c[i] = '\u3000'; + } + else if (c[i] < '\177') + { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) + { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) + { + char[] c = text.toCharArray(); + for (int i = 0; i < c.length; i++) + { + if (null != notConvertSet && notConvertSet.contains(c[i])) + { + // 跳过不替换的字符 + continue; + } + + if (c[i] == '\u3000') + { + c[i] = ' '; + } + else if (c[i] > '\uFF00' && c[i] < '\uFF5F') + { + c[i] = (char) (c[i] - 65248); + } + } + return new String(c); + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) + { + String[] fraction = { "角", "分" }; + String[] digit = { "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖" }; + String[][] unit = { { "元", "万", "亿" }, { "", "拾", "佰", "仟" } }; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) + { + // 优化double计算精度丢失问题 + BigDecimal nNum = new BigDecimal(n); + BigDecimal decimal = new BigDecimal(10); + BigDecimal scale = nNum.multiply(decimal).setScale(2, RoundingMode.HALF_EVEN); + double d = scale.doubleValue(); + s += (digit[(int) (Math.floor(d * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) + { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) + { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) + { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Excel.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Excel.java new file mode 100644 index 0000000..c883bad --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Excel.java @@ -0,0 +1,188 @@ +package com.mosty.common.base.entity.log; + +import org.apache.poi.ss.usermodel.HorizontalAlignment; +import org.apache.poi.ss.usermodel.IndexedColors; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.math.BigDecimal; + +/** + * 自定义导出Excel数据注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel { + /** + * 导出时在excel中排序 + */ + public int sort() default Integer.MAX_VALUE; + + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + public String separator() default ","; + + /** + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) + */ + public int scale() default -1; + + /** + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 导出时在excel中每个列的高度 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽度 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否需要纵向合并单元格,应对需求:含有list集合单元格) + */ + public boolean needMerge() default false; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 是否自动统计数据,在最后追加一行统计数据总和 + */ + public boolean isStatistics() default false; + + + /** + * 如果是字典类型,请设置字典的type值 + * >>>>>>>特别提醒,如若配置该字段,则“combo”和“readConverterExp”不启用 + */ + public String dictType() default ""; + + /** + * 导出类型(0数字 1字符串) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出列头背景颜色 + */ + public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT; + + /** + * 导出列头字体颜色 + */ + public IndexedColors headerColor() default IndexedColors.WHITE; + + /** + * 导出单元格背景颜色 + */ + public IndexedColors backgroundColor() default IndexedColors.WHITE; + + /** + * 导出单元格字体颜色 + */ + public IndexedColors color() default IndexedColors.BLACK; + + /** + * 导出字段对齐方式 + */ + public HorizontalAlignment align() default HorizontalAlignment.CENTER; + + /** + * 自定义数据处理器 + */ + public Class handler() default ExcelHandlerAdapter.class; + + /** + * 自定义数据处理器参数 + */ + public String[] args() default {}; + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type + { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + public enum ColumnType + { + NUMERIC(0), STRING(1), IMAGE(2); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/ExcelHandlerAdapter.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/ExcelHandlerAdapter.java new file mode 100644 index 0000000..2f62ae4 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/ExcelHandlerAdapter.java @@ -0,0 +1,17 @@ +package com.mosty.common.base.entity.log; + +/** + * Excel数据格式处理适配器 + * + * @author ruoyi + */ +public interface ExcelHandlerAdapter { + /** + * 格式化 + * + * @param value 单元格数据值 + * @param args excel注解args参数组 + * @return 处理后的值 + */ + Object format(Object value, String[] args); +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Excels.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Excels.java new file mode 100644 index 0000000..3eb5930 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Excels.java @@ -0,0 +1,18 @@ +package com.mosty.common.base.entity.log; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + * @author ruoyi + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels { + + Excel[] value(); +} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Log.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Log.java new file mode 100644 index 0000000..41684e6 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/Log.java @@ -0,0 +1,36 @@ +package com.mosty.common.base.entity.log; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 自定义操作日志记录注解 + * + * @author kevin + * @date 2022/1/25 9:10 PM + * @since 1.0.0 + */ +@Target({ ElementType.PARAMETER, ElementType.METHOD }) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface Log { + + // 模块 + String title() default ""; + + // 功能 + BusinessType businessType() default BusinessType.OTHER; + + // 操作人类别 + OperatorType operatorType() default OperatorType.MANAGE; + + // 是否保存请求的参数 + boolean isSaveRequestData() default true; + + // 是否保存响应的参数 + boolean isSaveResponseData() default true; + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/LogConst.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/LogConst.java new file mode 100644 index 0000000..094eb30 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/LogConst.java @@ -0,0 +1,15 @@ +package com.mosty.common.base.entity.log; + +/** + * 操作日志静态变量 + * + * @author kevin + * @date 2022/1/25 9:36 PM + * @since 1.0.0 + */ +public class LogConst { + + // 操作日志线程池名称 + public static final String LOG_THREAD_POOL = "OPERATION_LOG"; + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/OperatorType.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/OperatorType.java new file mode 100644 index 0000000..b678431 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/OperatorType.java @@ -0,0 +1,25 @@ +package com.mosty.common.base.entity.log; + +/** + * 操作人类别 + * + * @author kevin + * @date 2022/1/25 9:10 PM + * @since 1.0.0 + */ +public enum OperatorType { + /** + * 其它 + */ + OTHER, + + /** + * 后台用户 + */ + MANAGE, + + /** + * 手机端用户 + */ + MOBILE +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/ReflectUtils.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/ReflectUtils.java new file mode 100644 index 0000000..763adaa --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/ReflectUtils.java @@ -0,0 +1,410 @@ +package com.mosty.common.base.entity.log; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.lang.reflect.ParameterizedType; +import java.lang.reflect.Type; +import java.util.Date; + +import com.mosty.common.base.util.DateUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; +import org.apache.poi.ss.usermodel.DateUtil; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +/** + * 反射工具类. 提供调用getter/setter方法, 访问私有变量, 调用私有方法, 获取泛型类型Class, 被AOP过的真实类等工具函数. + * + * @author ruoyi + */ +@SuppressWarnings("rawtypes") +public class ReflectUtils +{ + private static final String SETTER_PREFIX = "set"; + + private static final String GETTER_PREFIX = "get"; + + private static final String CGLIB_CLASS_SEPARATOR = "$$"; + + private static Logger logger = LoggerFactory.getLogger(ReflectUtils.class); + + /** + * 调用Getter方法. + * 支持多级,如:对象名.对象名.方法 + */ + @SuppressWarnings("unchecked") + public static E invokeGetter(Object obj, String propertyName) + { + Object object = obj; + for (String name : StringUtils.split(propertyName, ".")) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(name); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + return (E) object; + } + + /** + * 调用Setter方法, 仅匹配方法名。 + * 支持多级,如:对象名.对象名.方法 + */ + public static void invokeSetter(Object obj, String propertyName, E value) + { + Object object = obj; + String[] names = StringUtils.split(propertyName, "."); + for (int i = 0; i < names.length; i++) + { + if (i < names.length - 1) + { + String getterMethodName = GETTER_PREFIX + StringUtils.capitalize(names[i]); + object = invokeMethod(object, getterMethodName, new Class[] {}, new Object[] {}); + } + else + { + String setterMethodName = SETTER_PREFIX + StringUtils.capitalize(names[i]); + invokeMethodByName(object, setterMethodName, new Object[] { value }); + } + } + } + + /** + * 直接读取对象属性值, 无视private/protected修饰符, 不经过getter函数. + */ + @SuppressWarnings("unchecked") + public static E getFieldValue(final Object obj, final String fieldName) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return null; + } + E result = null; + try + { + result = (E) field.get(obj); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常{}", e.getMessage()); + } + return result; + } + + /** + * 直接设置对象属性值, 无视private/protected修饰符, 不经过setter函数. + */ + public static void setFieldValue(final Object obj, final String fieldName, final E value) + { + Field field = getAccessibleField(obj, fieldName); + if (field == null) + { + // throw new IllegalArgumentException("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + fieldName + "] 字段 "); + return; + } + try + { + field.set(obj, value); + } + catch (IllegalAccessException e) + { + logger.error("不可能抛出的异常: {}", e.getMessage()); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符. + * 用于一次性调用的情况,否则应使用getAccessibleMethod()函数获得Method后反复调用. + * 同时匹配方法名+参数类型, + */ + @SuppressWarnings("unchecked") + public static E invokeMethod(final Object obj, final String methodName, final Class[] parameterTypes, + final Object[] args) + { + if (obj == null || methodName == null) + { + return null; + } + Method method = getAccessibleMethod(obj, methodName, parameterTypes); + if (method == null) + { + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 直接调用对象方法, 无视private/protected修饰符, + * 用于一次性调用的情况,否则应使用getAccessibleMethodByName()函数获得Method后反复调用. + * 只匹配函数名,如果有多个同名函数调用第一个。 + */ + @SuppressWarnings("unchecked") + public static E invokeMethodByName(final Object obj, final String methodName, final Object[] args) + { + Method method = getAccessibleMethodByName(obj, methodName, args.length); + if (method == null) + { + // 如果为空不报错,直接返回空。 + logger.debug("在 [" + obj.getClass() + "] 中,没有找到 [" + methodName + "] 方法 "); + return null; + } + try + { + // 类型转换(将参数数据类型转换为目标方法参数类型) + Class[] cs = method.getParameterTypes(); + for (int i = 0; i < cs.length; i++) + { + if (args[i] != null && !args[i].getClass().equals(cs[i])) + { + if (cs[i] == String.class) + { + args[i] = Convert.toStr(args[i]); + if (StringUtils.endsWith((String) args[i], ".0")) + { + args[i] = StringUtils.substringBefore((String) args[i], ".0"); + } + } + else if (cs[i] == Integer.class) + { + args[i] = Convert.toInt(args[i]); + } + else if (cs[i] == Long.class) + { + args[i] = Convert.toLong(args[i]); + } + else if (cs[i] == Double.class) + { + args[i] = Convert.toDouble(args[i]); + } + else if (cs[i] == Float.class) + { + args[i] = Convert.toFloat(args[i]); + } + else if (cs[i] == Date.class) + { + if (args[i] instanceof String) + { + args[i] = DateUtils.parseDate(args[i]); + } + else + { + args[i] = DateUtil.getJavaDate((Double) args[i]); + } + } + else if (cs[i] == boolean.class || cs[i] == Boolean.class) + { + args[i] = Convert.toBool(args[i]); + } + } + } + return (E) method.invoke(obj, args); + } + catch (Exception e) + { + String msg = "method: " + method + ", obj: " + obj + ", args: " + args + ""; + throw convertReflectionExceptionToUnchecked(msg, e); + } + } + + /** + * 循环向上转型, 获取对象的DeclaredField, 并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + */ + public static Field getAccessibleField(final Object obj, final String fieldName) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(fieldName, "fieldName can't be blank"); + for (Class superClass = obj.getClass(); superClass != Object.class; superClass = superClass.getSuperclass()) + { + try + { + Field field = superClass.getDeclaredField(fieldName); + makeAccessible(field); + return field; + } + catch (NoSuchFieldException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 匹配函数名+参数类型。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethod(final Object obj, final String methodName, + final Class... parameterTypes) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + try + { + Method method = searchType.getDeclaredMethod(methodName, parameterTypes); + makeAccessible(method); + return method; + } + catch (NoSuchMethodException e) + { + continue; + } + } + return null; + } + + /** + * 循环向上转型, 获取对象的DeclaredMethod,并强制设置为可访问. + * 如向上转型到Object仍无法找到, 返回null. + * 只匹配函数名。 + * 用于方法需要被多次调用的情况. 先使用本函数先取得Method,然后调用Method.invoke(Object obj, Object... args) + */ + public static Method getAccessibleMethodByName(final Object obj, final String methodName, int argsNum) + { + // 为空不报错。直接返回 null + if (obj == null) + { + return null; + } + Validate.notBlank(methodName, "methodName can't be blank"); + for (Class searchType = obj.getClass(); searchType != Object.class; searchType = searchType.getSuperclass()) + { + Method[] methods = searchType.getDeclaredMethods(); + for (Method method : methods) + { + if (method.getName().equals(methodName) && method.getParameterTypes().length == argsNum) + { + makeAccessible(method); + return method; + } + } + } + return null; + } + + /** + * 改变private/protected的方法为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Method method) + { + if ((!Modifier.isPublic(method.getModifiers()) || !Modifier.isPublic(method.getDeclaringClass().getModifiers())) + && !method.isAccessible()) + { + method.setAccessible(true); + } + } + + /** + * 改变private/protected的成员变量为public,尽量不调用实际改动的语句,避免JDK的SecurityManager抱怨。 + */ + public static void makeAccessible(Field field) + { + if ((!Modifier.isPublic(field.getModifiers()) || !Modifier.isPublic(field.getDeclaringClass().getModifiers()) + || Modifier.isFinal(field.getModifiers())) && !field.isAccessible()) + { + field.setAccessible(true); + } + } + + /** + * 通过反射, 获得Class定义中声明的泛型参数的类型, 注意泛型必须定义在父类处 + * 如无法找到, 返回Object.class. + */ + @SuppressWarnings("unchecked") + public static Class getClassGenricType(final Class clazz) + { + return getClassGenricType(clazz, 0); + } + + /** + * 通过反射, 获得Class定义中声明的父类的泛型参数的类型. + * 如无法找到, 返回Object.class. + */ + public static Class getClassGenricType(final Class clazz, final int index) + { + Type genType = clazz.getGenericSuperclass(); + + if (!(genType instanceof ParameterizedType)) + { + logger.debug(clazz.getSimpleName() + "'s superclass not ParameterizedType"); + return Object.class; + } + + Type[] params = ((ParameterizedType) genType).getActualTypeArguments(); + + if (index >= params.length || index < 0) + { + logger.debug("Index: " + index + ", Size of " + clazz.getSimpleName() + "'s Parameterized Type: " + + params.length); + return Object.class; + } + if (!(params[index] instanceof Class)) + { + logger.debug(clazz.getSimpleName() + " not set the actual class on superclass generic parameter"); + return Object.class; + } + + return (Class) params[index]; + } + + public static Class getUserClass(Object instance) + { + if (instance == null) + { + throw new RuntimeException("Instance must not be null"); + } + Class clazz = instance.getClass(); + if (clazz != null && clazz.getName().contains(CGLIB_CLASS_SEPARATOR)) + { + Class superClass = clazz.getSuperclass(); + if (superClass != null && !Object.class.equals(superClass)) + { + return superClass; + } + } + return clazz; + + } + + /** + * 将反射时的checked exception转换为unchecked exception. + */ + public static RuntimeException convertReflectionExceptionToUnchecked(String msg, Exception e) + { + if (e instanceof IllegalAccessException || e instanceof IllegalArgumentException + || e instanceof NoSuchMethodException) + { + return new IllegalArgumentException(msg, e); + } + else if (e instanceof InvocationTargetException) + { + return new RuntimeException(msg, ((InvocationTargetException) e).getTargetException()); + } + return new RuntimeException(msg, e); + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/SpringUtils.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/SpringUtils.java new file mode 100644 index 0000000..ae19071 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/SpringUtils.java @@ -0,0 +1,114 @@ +package com.mosty.common.base.entity.log; + +import org.springframework.aop.framework.AopContext; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.beans.factory.config.BeanFactoryPostProcessor; +import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; +import org.springframework.stereotype.Component; + +/** + * spring工具类 方便在非spring管理环境中获取bean + * + * @author ruoyi + */ +@Component +public final class SpringUtils implements BeanFactoryPostProcessor +{ + /** Spring应用上下文环境 */ + private static ConfigurableListableBeanFactory beanFactory; + + @Override + public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException + { + SpringUtils.beanFactory = beanFactory; + } + + /** + * 获取对象 + * + * @param name + * @return Object 一个以所给名字注册的bean的实例 + * @throws org.springframework.beans.BeansException + * + */ + @SuppressWarnings("unchecked") + public static T getBean(String name) throws BeansException + { + return (T) beanFactory.getBean(name); + } + + /** + * 获取类型为requiredType的对象 + * + * @param clz + * @return + * @throws org.springframework.beans.BeansException + * + */ + public static T getBean(Class clz) throws BeansException + { + T result = (T) beanFactory.getBean(clz); + return result; + } + + /** + * 如果BeanFactory包含一个与所给名称匹配的bean定义,则返回true + * + * @param name + * @return boolean + */ + public static boolean containsBean(String name) + { + return beanFactory.containsBean(name); + } + + /** + * 判断以给定名字注册的bean定义是一个singleton还是一个prototype。 如果与给定名字相应的bean定义没有被找到,将会抛出一个异常(NoSuchBeanDefinitionException) + * + * @param name + * @return boolean + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static boolean isSingleton(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.isSingleton(name); + } + + /** + * @param name + * @return Class 注册对象的类型 + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static Class getType(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getType(name); + } + + /** + * 如果给定的bean名字在bean定义中有别名,则返回这些别名 + * + * @param name + * @return + * @throws org.springframework.beans.factory.NoSuchBeanDefinitionException + * + */ + public static String[] getAliases(String name) throws NoSuchBeanDefinitionException + { + return beanFactory.getAliases(name); + } + + /** + * 获取aop代理对象 + * + * @param invoker + * @return + */ + @SuppressWarnings("unchecked") + public static T getAopProxy(T invoker) + { + return (T) AopContext.currentProxy(); + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/StringUtils.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/StringUtils.java new file mode 100644 index 0000000..ee4eb5c --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/StringUtils.java @@ -0,0 +1,562 @@ +package com.mosty.common.base.entity.log; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import cn.hutool.core.text.StrFormatter; +import com.mosty.common.base.constant.Constants; +import org.springframework.util.AntPathMatcher; + +/** + * 字符串工具类 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils +{ + /** 空字符串 */ + private static final String NULLSTR = ""; + + /** 下划线 */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) + { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) + { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) + { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + ** @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) + { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) + { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) + { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) + { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) + { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) + { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) + { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) + { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) + { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) + { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) + { + if (str == null) + { + return NULLSTR; + } + + if (start < 0) + { + start = str.length() + start; + } + + if (start < 0) + { + start = 0; + } + if (start > str.length()) + { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) + { + if (str == null) + { + return NULLSTR; + } + + if (end < 0) + { + end = str.length() + end; + } + if (start < 0) + { + start = str.length() + start; + } + + if (end > str.length()) + { + end = str.length(); + } + + if (start > end) + { + return NULLSTR; + } + + if (start < 0) + { + start = 0; + } + if (end < 0) + { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 判断是否为空,并且不是空白字符 + * + * @param str 要判断的value + * @return 结果 + */ + public static boolean hasText(String str) + { + return (str != null && !str.isEmpty() && containsText(str)); + } + + private static boolean containsText(CharSequence str) + { + int strLen = str.length(); + for (int i = 0; i < strLen; i++) + { + if (!Character.isWhitespace(str.charAt(i))) + { + return true; + } + } + return false; + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) + { + if (isEmpty(params) || isEmpty(template)) + { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) + { + return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); + } + + /** + * 判断给定的collection列表中是否包含数组array 判断给定的数组array中是否包含给定的元素value + * + * @param collection 给定的集合 + * @param array 给定的数组 + * @return boolean 结果 + */ + public static boolean containsAny(Collection collection, String... array) + { + if (isEmpty(collection) || isEmpty(array)) + { + return false; + } + else + { + for (String str : array) + { + if (collection.contains(str)) + { + return true; + } + } + return false; + } + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) + { + if (str == null) + { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) + { + char c = str.charAt(i); + if (i > 0) + { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } + else + { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) + { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) + { + sb.append(SEPARATOR); + } + else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) + { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) + { + if (str != null && strs != null) + { + for (String s : strs) + { + if (str.equalsIgnoreCase(trim(s))) + { + return true; + } + } + } + return false; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) + { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) + { + // 没必要转换 + return ""; + } + else if (!name.contains("_")) + { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) + { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) + { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 + * 例如:user_name->userName + */ + public static String toCamelCase(String s) + { + if (s == null) + { + return null; + } + if (s.indexOf(SEPARATOR) == -1) + { + return s; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) + { + char c = s.charAt(i); + + if (c == SEPARATOR) + { + upperCase = true; + } + else if (upperCase) + { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } + else + { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) + { + if (isEmpty(str) || isEmpty(strs)) + { + return false; + } + for (String pattern : strs) + { + if (isMatch(pattern, str)) + { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) + { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) + { + return (T) obj; + } + + /** + * 数字左边补齐0,使之达到指定长度。注意,如果数字转换为字符串后,长度大于size,则只保留 最后size个字符。 + * + * @param num 数字对象 + * @param size 字符串指定长度 + * @return 返回数字的字符串格式,该字符串为指定长度。 + */ + public static final String padl(final Number num, final int size) + { + return padl(num.toString(), size, '0'); + } + + /** + * 字符串左补齐。如果原始字符串s长度大于size,则只保留最后size个字符。 + * + * @param s 原始字符串 + * @param size 字符串指定长度 + * @param c 用于补齐的字符 + * @return 返回指定长度的字符串,由原字符串左补齐或截取得到。 + */ + public static final String padl(final String s, final int size, final char c) + { + final StringBuilder sb = new StringBuilder(size); + if (s != null) + { + final int len = s.length(); + if (s.length() <= size) + { + for (int i = size - len; i > 0; i--) + { + sb.append(c); + } + sb.append(s); + } + else + { + return s.substring(len - size, len); + } + } + else + { + for (int i = size; i > 0; i--) + { + sb.append(c); + } + } + return sb.toString(); + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/log/SysOperLog.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/SysOperLog.java new file mode 100644 index 0000000..3adc0dd --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/log/SysOperLog.java @@ -0,0 +1,96 @@ +package com.mosty.common.base.entity.log; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import org.springframework.validation.annotation.Validated; + +import java.io.Serializable; +import java.util.Date; + +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +@ApiModel(value = "巡防力量表", description = "") +@TableName("sys_oper_log") +@Validated +public class SysOperLog implements Serializable { + + private static final long serialVersionUID = 2222248015038776527L; + + @Excel(name = "操作序号", cellType = Excel.ColumnType.NUMERIC) + private Long operId; + + @Excel(name = "模块名称") + @ApiModelProperty(value = "模块名称") + private String mkmc; + + @Excel(name = "操作模块") + @ApiModelProperty(value = "操作模块") + private String title; + + @Excel(name = "业务类型", readConverterExp = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") + @ApiModelProperty(value = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") + private Integer businessType; + + @Excel(name = "请求方法") + @ApiModelProperty(value = "请求方法") + private String method; + + @Excel(name = "请求方式") + private String requestMethod; + + @Excel(name = "操作类别", readConverterExp = "0=其它,1=后台用户,2=手机端用户") + private Integer operatorType; + + @Excel(name = "操作人员") + @ApiModelProperty(value = "操作人员") + private String operName; + + @Excel(name = "操作人员ID") + @ApiModelProperty(value = "操作人员ID") + private String operUserId; + + @Excel(name = "操作人员身份证号") + @ApiModelProperty(value = "操作人员身份证号") + private String operSfzh; + + @Excel(name = "部门ID") + private String ssbmid; + + @Excel(name = "部门代码") + private String ssbmdm; + + @Excel(name = "部门名称") + private String ssbm; + + @Excel(name = "请求地址") + private String operUrl; + + @Excel(name = "操作地址") + private String operIp; + + @Excel(name = "请求参数") + private String operParam; + + @Excel(name = "返回参数") + private String jsonResult; + + @Excel(name = "状态", readConverterExp = "0=正常,1=异常") + private Integer status; + + @Excel(name = "错误消息") + private String errorMsg; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @Excel(name = "操作时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date operTime = new Date(); +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/entity/realm/SysUser.java b/common-base-starter/src/main/java/com/mosty/common/base/entity/realm/SysUser.java new file mode 100644 index 0000000..186f3e1 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/entity/realm/SysUser.java @@ -0,0 +1,380 @@ +package com.mosty.common.base.entity.realm; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.mosty.common.base.entity.log.BaseEntity; +import com.mosty.common.base.entity.log.Excel; +import com.mosty.common.base.entity.log.Excels; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.Date; + +/** + * 用户对象 sys_user + * + * @author ruoyi + */ +public class SysUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 用户ID */ + @Excel(name = "用户序号", cellType = Excel.ColumnType.NUMERIC, prompt = "用户编号") + private Long userId; + + /** 部门ID */ + @Excel(name = "部门编号", type = Excel.Type.IMPORT) + private Long deptId; + + /** 部门父ID */ + private Long parentId; + + /** 角色ID */ + private Long roleId; + + /** 登录名称 */ + @Excel(name = "登录名称") + private String loginName; + + /** 用户名称 */ + @Excel(name = "用户名称") + private String userName; + + /** 用户类型 */ + private String userType; + + /** 用户邮箱 */ + @Excel(name = "用户邮箱") + private String email; + + /** 手机号码 */ + @Excel(name = "手机号码") + private String phonenumber; + + /** 用户性别 */ + @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + private String sex; + + /** 用户头像 */ + private String avatar; + + /** 密码 */ + private String password; + + /** 盐加密 */ + private String salt; + + /** 帐号状态(0正常 1停用) */ + @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 最后登录IP */ + @Excel(name = "最后登录IP", type = Excel.Type.EXPORT) + private String loginIp; + + /** 最后登录时间 */ + @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.EXPORT) + private Date loginDate; + + /** 密码最后更新时间 */ + private Date pwdUpdateDate; + + /** 部门对象 */ + @Excels({ + @Excel(name = "部门名称", targetAttr = "deptName", type = Excel.Type.EXPORT), + @Excel(name = "部门负责人", targetAttr = "leader", type = Excel.Type.EXPORT) + }) +// private SysDept dept; +// +// private List roles; + + /** 角色组 */ + private Long[] roleIds; + + /** 岗位组 */ + private Long[] postIds; + + public SysUser() + { + + } + + public SysUser(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public boolean isAdmin() + { + return isAdmin(this.userId); + } + + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + +// @Xss(message = "登录账号不能包含脚本字符") +// @NotBlank(message = "登录账号不能为空") +// @Size(min = 0, max = 30, message = "登录账号长度不能超过30个字符") + public String getLoginName() + { + return loginName; + } + + public void setLoginName(String loginName) + { + this.loginName = loginName; + } + +// @Xss(message = "用户昵称不能包含脚本字符") +// @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserType() + { + return userType; + } + + public void setUserType(String userType) + { + this.userType = userType; + } + +// @Email(message = "邮箱格式不正确") +// @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + +// @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") + public String getPhonenumber() + { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) + { + this.phonenumber = phonenumber; + } + + public String getSex() + { + return sex; + } + + public void setSex(String sex) + { + this.sex = sex; + } + + public String getAvatar() + { + return avatar; + } + + public void setAvatar(String avatar) + { + this.avatar = avatar; + } + + @JsonIgnore + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getSalt() + { + return salt; + } + + public void setSalt(String salt) + { + this.salt = salt; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getLoginIp() + { + return loginIp; + } + + public void setLoginIp(String loginIp) + { + this.loginIp = loginIp; + } + + public Date getLoginDate() + { + return loginDate; + } + + public void setLoginDate(Date loginDate) + { + this.loginDate = loginDate; + } + + public Date getPwdUpdateDate() + { + return pwdUpdateDate; + } + + public void setPwdUpdateDate(Date pwdUpdateDate) + { + this.pwdUpdateDate = pwdUpdateDate; + } + +// public SysDept getDept() +// { +// if (dept == null) +// { +// dept = new SysDept(); +// } +// return dept; +// } +// +// public void setDept(SysDept dept) +// { +// this.dept = dept; +// } +// +// public List getRoles() +// { +// return roles; +// } +// +// public void setRoles(List roles) +// { +// this.roles = roles; +// } + + public Long[] getRoleIds() + { + return roleIds; + } + + public void setRoleIds(Long[] roleIds) + { + this.roleIds = roleIds; + } + + public Long[] getPostIds() + { + return postIds; + } + + public void setPostIds(Long[] postIds) + { + this.postIds = postIds; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("deptId", getDeptId()) + .append("loginName", getLoginName()) + .append("userName", getUserName()) + .append("userType", getUserType()) + .append("email", getEmail()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("avatar", getAvatar()) + .append("password", getPassword()) + .append("salt", getSalt()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) +// .append("dept", getDept()) +// .append("roles", getRoles()) + .toString(); + } +} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/exception/Asserts.java b/common-base-starter/src/main/java/com/mosty/common/base/exception/Asserts.java new file mode 100644 index 0000000..6095fe0 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/exception/Asserts.java @@ -0,0 +1,97 @@ +package com.mosty.common.base.exception; + + +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpStatus; + +/** + * 断言,快速业务异常 + * @author kevin + * @date 2022/4/28 1:49 下午 + * @since 1.0.0 + */ +@SuppressWarnings("unused") +public class Asserts { + + private Asserts() { + } + + + public static void directThrow(RuntimeException exception) { + throw exception; + } + + /** + * 断言 抛出 {@link BusinessExceptionEnum} 对应的业务异常 + * @param expression 表达式 + * @param message 异常信息 + */ + public static void checkAuth(boolean expression, String message) { + if (expression) { + throw new BusinessException(HttpStatus.UNAUTHORIZED.value(), message); + } + } + + /** + * 断言 抛出 {@link BusinessExceptionEnum} 对应的业务异常 + * @param expression 表达式 + * @param message 异常信息 + * @param args 参数信息 + */ + public static void checkAuth(boolean expression, String message, Object... args) { + if (expression) { + throw new BusinessException(HttpStatus.UNAUTHORIZED.value(), String.format(message, args)); + } + } + + public static void check(boolean expression, String message) { + if (expression) { + throw new BusinessException(message); + } + } + + /** + * 断言 抛出 {@link BusinessExceptionEnum} 对应的业务异常 + * @param expression 表达式 + * @param exceptionEnum 业务异常 + */ + public static void check(boolean expression, BusinessExceptionEnum exceptionEnum) { + check(expression, exceptionEnum.message); + } + + public static void check(boolean expression, RuntimeException e) { + if (expression) { + throw e; + } + } + + public static void check(boolean expression, String message, Object... args) { + if (expression) { + throw new BusinessException(String.format(message, args)); + } + } + + public static void check(boolean expression, String message, Object arg) { + if (expression) { + throw new BusinessException(String.format(message, arg)); + } + } + + public static void notNull(Object object, String name) { + if (object == null) { + throw new BusinessException(name + " is null"); + } + } + + public static void notEmpty(CharSequence s, String name) { + if (StringUtils.isEmpty(s)) { + throw new BusinessException(name + " is empty"); + } + } + + public static void notBlank(CharSequence s, String name) { + if (StringUtils.isBlank(s)) { + throw new BusinessException(name + " is blank"); + } + } +} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessException.java b/common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessException.java new file mode 100644 index 0000000..6bd9a3d --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessException.java @@ -0,0 +1,51 @@ +package com.mosty.common.base.exception; + +import io.swagger.models.auth.In; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 业务异常处理器 + * @author kevin + * @date 2022/1/22 4:38 PM + * @since 1.0.0 + */ +@Data +@SuppressWarnings("unused") +@EqualsAndHashCode(callSuper = true) +public class BusinessException extends RuntimeException { + + /** 异常编码 */ + private Integer code; + + /** + * 数据 + */ + private Object data; + + public BusinessException(String message) { + super(message); + } + + public BusinessException(String message, Object data) { + super(message); + this.data = data; + } + + public BusinessException(Integer code, String message, Object data) { + super(message); + this.code = code; + this.data = data; + } + + public BusinessException(Integer code, String message) { + super(message); + this.code = code; + this.data = null; + } + + public BusinessException(String message, Throwable arg) { + super(message, arg); + } + +} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessExceptionEnum.java b/common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessExceptionEnum.java new file mode 100644 index 0000000..2df7d91 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessExceptionEnum.java @@ -0,0 +1,26 @@ +package com.mosty.common.base.exception; + + +/** + * 业务异常枚举, code 为{@code 0} 表示默认值 + * + * @author hongmin.li + * @date 2021/8/17 10:55 + * @since 1.6.5 + */ +public enum BusinessExceptionEnum { + + /** 门店功能配置获取异常 */ + STORE_FUNCTION_EXCEPTION(0, "获取换货比例远程服务异常"), + ; + + public final int code; + + public final String message; + + BusinessExceptionEnum(int code, String message) { + this.code = code; + this.message = message; + } + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessStatus.java b/common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessStatus.java new file mode 100644 index 0000000..912c36e --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/exception/BusinessStatus.java @@ -0,0 +1,19 @@ +package com.mosty.common.base.exception; + +/** + * 操作状态 + * + * @author ruoyi + * + */ +public enum BusinessStatus { + /** + * 成功 + */ + SUCCESS, + + /** + * 失败 + */ + FAIL, +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/exception/MostyExceptionHandler.java b/common-base-starter/src/main/java/com/mosty/common/base/exception/MostyExceptionHandler.java new file mode 100644 index 0000000..0e6c6cd --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/exception/MostyExceptionHandler.java @@ -0,0 +1,76 @@ +package com.mosty.common.base.exception; + +import com.mosty.common.base.domain.ResponseResult; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.stereotype.Component; +import org.springframework.validation.ObjectError; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * 全局异常处理 + * @author kevin + * @date 2022/2/22 1:50 PM + * @since 1.0.0 + */ +@Slf4j +@Component +@SuppressWarnings("unused") +@ControllerAdvice(basePackages = "com.mosty") +public class MostyExceptionHandler { + + /** + * 业务异常捕获 + * 需要使用spring mvc的全局异常拦截器处理 + * @param throwable 全局异常 + * @return 信息体 + */ + @ResponseBody + @ExceptionHandler(Throwable.class) + public ResponseResult throwableHandler(Throwable throwable) { + throwable.printStackTrace(); + log.warn("throwable异常:message={}", throwable.getMessage()); + log.warn("throwable异常:stack={}", throwable.getStackTrace()); + return ResponseResult.fail("系统异常,请稍后重试"); + } + + /** + * spring valid框架验证器异常捕获 + * 需要使用spring mvc的全局异常拦截器处理 + * @param validException 验证异常 + * @return 信息体 + */ + @ResponseBody + @ExceptionHandler(MethodArgumentNotValidException.class) + public ResponseResult validHandler(MethodArgumentNotValidException validException) { + StringBuilder sb = new StringBuilder(); + List allErrors = validException.getBindingResult().getAllErrors(); + String message = allErrors.stream().map(DefaultMessageSourceResolvable::getDefaultMessage).collect(Collectors.joining(";")); + log.warn("调用接口验证异常:message={}", message); + return ResponseResult.fail(message); + } + + /** + * 业务异常捕获 + * 需要使用spring mvc的全局异常拦截器处理 + * @param businessException 业务异常 + * @return 信息体 + */ + @ResponseBody + @ExceptionHandler(BusinessException.class) + public ResponseResult businessHandler(BusinessException businessException) { + log.warn("业务异常:message={}", businessException.getMessage()); + if (businessException.getCode() != null) { + return ResponseResult.fail(businessException.getCode(), businessException.getMessage()); + } + return ResponseResult.fail(businessException.getMessage()); + } + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/exception/ServiceException.java b/common-base-starter/src/main/java/com/mosty/common/base/exception/ServiceException.java new file mode 100644 index 0000000..f81734c --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/exception/ServiceException.java @@ -0,0 +1,50 @@ +package com.mosty.common.base.exception; + +/** + * 业务异常 + * + * @author ruoyi + */ +public final class ServiceException extends RuntimeException { + + private static final long serialVersionUID = 1L; + + /** + * 错误提示 + */ + private String message; + + /** + * 错误明细,内部调试错误 + *

+ */ + private String detailMessage; + + /** + * 空构造方法,避免反序列化问题 + */ + public ServiceException() { + } + + public ServiceException(String message) { + this.message = message; + } + + public String getDetailMessage() { + return detailMessage; + } + + public ServiceException setDetailMessage(String detailMessage) { + this.detailMessage = detailMessage; + return this; + } + + public String getMessage() { + return message; + } + + public ServiceException setMessage(String message) { + this.message = message; + return this; + } +} \ No newline at end of file diff --git a/common-base-starter/src/main/java/com/mosty/common/base/exception/UtilException.java b/common-base-starter/src/main/java/com/mosty/common/base/exception/UtilException.java new file mode 100644 index 0000000..c80ca24 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/exception/UtilException.java @@ -0,0 +1,26 @@ +package com.mosty.common.base.exception; + +/** + * 工具类异常 + * + * @author ruoyi + */ +public class UtilException extends RuntimeException +{ + private static final long serialVersionUID = 8247610319171014183L; + + public UtilException(Throwable e) + { + super(e.getMessage(), e); + } + + public UtilException(String message) + { + super(message); + } + + public UtilException(String message, Throwable throwable) + { + super(message, throwable); + } +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/AopTargetUtils.java b/common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/AopTargetUtils.java new file mode 100644 index 0000000..ff6405a --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/AopTargetUtils.java @@ -0,0 +1,48 @@ +package com.mosty.common.base.lock.optimistic; + +import org.springframework.aop.framework.AdvisedSupport; +import org.springframework.aop.framework.AopProxy; +import org.springframework.aop.support.AopUtils; + +import java.lang.reflect.Field; + +public class AopTargetUtils { + + /** + * 递归获取代理的 目标对象 + * @param proxy 代理对象 + * @return 目标对象 + * @throws Exception + */ + public static Object getTarget(Object proxy) throws Exception { + if (!AopUtils.isAopProxy(proxy)) { + return proxy; + } + if (AopUtils.isJdkDynamicProxy(proxy)) { + proxy = getJdkDynamicProxyTargetObject(proxy); + } else { + proxy = getCglibProxyTargetObject(proxy); + } + return getTarget(proxy); + } + + private static Object getCglibProxyTargetObject(Object proxy) throws Exception { + Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0"); + h.setAccessible(true); + Object dynamicAdvisedInterceptor = h.get(proxy); + Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised"); + advised.setAccessible(true); + Object target = ((AdvisedSupport) advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget(); + return target; + } + + private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception { + Field h = proxy.getClass().getSuperclass().getDeclaredField("h"); + h.setAccessible(true); + AopProxy aopProxy = (AopProxy) h.get(proxy); + Field advised = aopProxy.getClass().getDeclaredField("advised"); + advised.setAccessible(true); + Object target = ((AdvisedSupport) advised.get(aopProxy)).getTargetSource().getTarget(); + return target; + } + } diff --git a/common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/EnableOptimisticLock.java b/common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/EnableOptimisticLock.java new file mode 100644 index 0000000..728b059 --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/EnableOptimisticLock.java @@ -0,0 +1,32 @@ +package com.mosty.common.base.lock.optimistic; + + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.support.AbstractApplicationContext; + +import java.lang.annotation.*; + + +/** + * 允许启动乐观锁自定义插件 + * + * @author kevin + * @date 2020/8/11 0:03 + * @since 1.0.0 + * @see AbstractApplicationContext#refresh() + * @see AbstractApplicationContext {@code invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory) } + * @see org.springframework.context.annotation + * {@code ConfigurationClassParser#processImports(ConfigurationClass, ConfigurationClassParser.SourceClass, Collection, boolean)} + * + * @see OptimisticLockException 需要关注跑出的检查异常,后面根据业务给予处理 + */ +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Configuration +//@Import(OptimisticLockConfiguration.class) +@Deprecated +public @interface EnableOptimisticLock { + +} diff --git a/common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/OptimisticLock.java b/common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/OptimisticLock.java new file mode 100644 index 0000000..35a6f1a --- /dev/null +++ b/common-base-starter/src/main/java/com/mosty/common/base/lock/optimistic/OptimisticLock.java @@ -0,0 +1,300 @@ +//package com.mosty.common.base.lock.optimistic; +// +//import lombok.extern.slf4j.Slf4j; +//import org.apache.ibatis.binding.MapperMethod; +//import org.apache.ibatis.executor.Executor; +//import org.apache.ibatis.executor.parameter.ParameterHandler; +//import org.apache.ibatis.executor.statement.StatementHandler; +//import org.apache.ibatis.mapping.BoundSql; +//import org.apache.ibatis.mapping.MappedStatement; +//import org.apache.ibatis.mapping.ParameterMapping; +//import org.apache.ibatis.mapping.SqlCommandType; +//import org.apache.ibatis.plugin.*; +//import org.apache.ibatis.reflection.MetaObject; +//import org.apache.ibatis.reflection.SystemMetaObject; +//import org.apache.ibatis.session.Configuration; +//import org.apache.ibatis.session.SqlSessionFactory; +//import org.apache.ibatis.type.JdbcType; +//import org.apache.ibatis.type.TypeException; +//import org.apache.ibatis.type.TypeHandler; +// +//import java.lang.reflect.Proxy; +//import java.sql.Connection; +//import java.sql.PreparedStatement; +//import java.sql.SQLException; +//import java.util.Objects; +//import java.util.Properties; +//import java.util.regex.Pattern; +// +// +///** +// * Mybatis 自定义插件,{@link OptimisticLock} 就是一个{@link Plugin} +// * +// * 使用:1、如果某些 Mapper 不想使用乐观锁,可以在Mapper.xml 中不添加 乐观锁字段即可,如: +// * +// * UPDATE CONF_ORDER_APPROVE +// * +// * ORDER_TYPE_CODE = #{orderTypeCode}, +// * RECEIVE_ORG_CODE = #{receiveOrgCode}, +// * +// * OBJECT_VERSION_NUMBER = #{objectVersionNumber}, +// * +// * WHERE ID = #{id} +// * +// * 2、业务端自行根据update的条数进行处理(给用户相应的提示等)或不处理(可能update本身就可能不会修改任何数据) +// * 3、乐观锁的字段类型必须为{@link Long} ,可以对乐观锁的数据库的java pojo字段进行定义,【注意: OptimisticLock只能放在SqlInterceptor和ResultInterceptor之后】如下: +// * +// * +// * +// * +// * +// * +// * +// * +// * +// * +// * +// * 每一个拦截器可以拦截下面的四种,当前只拦截了三种 +// * Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed) +// * ParameterHandler (getParameterObject, setParameters) +// * ResultSetHandler (handleResultSets, handleOutputParameters) +// * StatementHandler (prepare, parameterize, batch, update, query) +// * +// * @author kevin +// * @date 2020/8/10 22:14 +// * @since 1.0.0 +// * @see org.apache.ibatis.session.Configuration#interceptorChain +// * @see Plugin#signatureMap 其中:Map, Set> Class 为所有需要实现乐观锁的Mapper,Set集合为需要乐观锁的方法集合【原则上是所有写的方法】 +// * @see Invocation#proceed() 直接执行被代理对象的方法 +// * @see MappedStatement 对应每个mapper中的 + select * FROM sys_dict + + + zdmc like CONCAT('%',#{dictName,jdbcType=VARCHAR},'%') + + + zdmc = #{dictCode} + + + + + diff --git a/common-config-starter/src/main/resources/mapper/SysVersionManageMapper.xml b/common-config-starter/src/main/resources/mapper/SysVersionManageMapper.xml new file mode 100644 index 0000000..07a3ad7 --- /dev/null +++ b/common-config-starter/src/main/resources/mapper/SysVersionManageMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-config-starter/target/classes/META-INF/spring.factories b/common-config-starter/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..86b5520 --- /dev/null +++ b/common-config-starter/target/classes/META-INF/spring.factories @@ -0,0 +1,5 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.config.CommonConfigAutoConfiguration,\ +com.mosty.common.config.ConfigServiceFactory,\ +com.mosty.common.config.config.DictElementConfig,\ +com.mosty.common.config.config.SystemConfig \ No newline at end of file diff --git a/common-config-starter/target/classes/com/mosty/common/config/CommonConfigAutoConfiguration.class b/common-config-starter/target/classes/com/mosty/common/config/CommonConfigAutoConfiguration.class new file mode 100644 index 0000000000000000000000000000000000000000..c75df2aabeda11fc888ca9638fccd86610408ff7 GIT binary patch literal 555 zcmb7BJx{|h5Pfc&7D}O|z`%k86Ld%xJ_Zm{Rf#EpL{S$eC%D0-u`9j68@%i=+;1FANl+mtXqlQg}>X}s1o->s94+adCp1v0h%}^?F zm8X#~w>%nCryc5;j|bey0xy~s`yexhlQ7n4km}6N0;*E2D5;@Lf}TS?2fDe{^C~yo zO07;A>V2J?SX{{B6MKKM{SlvXhV7eNS(%D~%p@7m=~VCDIe!#cZXK>-O~PiX-b8x zpE`B}6?hCsH2eS6FtmzwgE3c0a2<_AY_W?H{kY;VdPtmNl~CX?;B{WXUZ_z*jbfGB hKnqJ08?N@SjJlhzxY)oduxC^w1Ix&zCw{sl0dn|uHO literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/ConfigServiceFactory.class b/common-config-starter/target/classes/com/mosty/common/config/ConfigServiceFactory.class new file mode 100644 index 0000000000000000000000000000000000000000..e3994e227733ccd640915537973deffa49aed8a4 GIT binary patch literal 956 zcma)4+invv5IxSNn}m?I2~f(d1Sqrx)d=M+6%qt0Rf+%+ly_%w7KdFs@;Zg^SBM7? z4}1V0g_yl4Exkx+H8Y+W&)GBM`TghTF901psG*D-9&Xlf3ma7waN9%M!ySfVXaa_2 z-`If1;kYy5eG>%Ib{QJ+Jbs~kH<0#F`I6yr-!~DDOzh^IPLa`M^jJ}4c7+fAsUVDI zj&a~*w7}{7FV3;51WSyav~R4LO6!!22htJ$t?eO0sb}63!R5Zv^3^OFN&8NWLW)ph zz6giHs>IKOCHFza47=yj=%rodeD{U#jGYsK+RM+roH}K6?BOoM(w@@FJ!Pou`C)#n z4b05?a$hBXUq1_IcOni2<=)P;Q;{61SP`{nS{o-)Y=)ieIi^1N7cPh#Bq1~^iHBp zt6K(59z|SB*wcDf>8qvo0_tRol)s1u-CQQ`Aqh+5E2#ojNH3*<4Xo0+o+Z&li@ZxD zC5l`op|O%qAUN3sqP+9{G)(IlOgV?CU~N&{PD_bpv+x7OZzv@^Xy&9d9;?LaDtQI0 KQ%hO&I`9`^hw_L3 literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/Excel/DictUtils.class b/common-config-starter/target/classes/com/mosty/common/config/Excel/DictUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..0ce1728dcb65b01da92e21636f04c0a542957df7 GIT binary patch literal 3836 zcmb_eTX!4P8QsT{GnO(jv12G`8WnG;YUbS*^(Myn*k@!SBoPf|z~Lzz+=k zP+`Mi$8*97g~Z^{8HMCjsbDMImUTRPwp^UI{nOUG%bo6QDQ~%FEZ>pmcrzI;I)TDa zHeV`cilrc2$#7LHd7QlS&O+wc<-F}?jyn19@z8ODaRoE5LwTOE@{2Tk_h9ydwQOZv z%Uj6gLf`Qg#-p7wFJ!V#5RMD3#6^2WKr|gzNEK-As1;g7vU%-Yg}z4MD@#@I6Kl>M zUYCXKg$}9ZRsumj9ooh52~tVroCVJc%RYJJzMRJ`+85U5LPN0bYT;yP4GX~~0TGl8 zNJn1cd~*ImWAM0P=R=;|lnbr=#Tjc!XH-|jsjuMW7P%;N=3U$J>k^-2LW!@h4*pch zb&1L;c?34x@`uCGZhf^#CN?rox}Z)-mF!)gK>bAqDymX_X-6FDtTk`DlPjlLCr7-( z8Otp*yT@BtY(~<&6DOz9Yf{pqFnTNHrqI3|K}m*0#>yzz=dH3EYPbeoQm7KpkZT0= z@4W2_t<`HWFNvEzam4o(_O)O+^mH>T1?BMnG^6;c3naAw(`y%NasprKW{(khzfPe1uZ4_h!U9CgS!+)n&ii~3r>&;Y=7Cw z+nH1Hl#3n=ylmn}c*VpcIAY?*_=$<1;#C8$nfMugZsK*kK|fk&Y7(R{*yLi~3T%d+*7p+Cf>#`P5cV)nD{k* zWAerEfQjGYcg(PfEBL*MKj4pSjwUp*-Zm?hi9d<8KMS?L$m*|nhdQ|yjEQ&go{9JI zH-YfVHLKyH4*6DCBF)hzi#micWVb~9UlRS-=~XaTo0GQXt$9aG zxmFO2*Ed#8%R2dL(JD}d(W;>9$~nF$Lfcstkm}Vh(~z3eufR&b)nZmDCzvgTvt^gf z*ii9RFmrqd=Pl`|1_;%ko8hw>T6IozP*-q+u2MK$JCrv9rB-2ke0S}^q2p|6YiY^$ z3JPQEJE)VkxSlD;9bqYYl`HfN)~70d!Lvtn7$$l9qC$VY`Kd+A&)JvCwwJfZhZv0x zr&d9IRbv`$wX*2YShRv!`!f0PD@G#d>4!$=wUkL^%@yVs$&ijLmp$9gt)s=L=;jK= zJWT}7^AsG~qs}Gxv*c^Ko=nYNLmp#_Lv#E%+s$u2`Imwcq2hQqpE8^k=l0=`pg!cH z4SP9m(3@S@$F&(9z#xYBl)^AZcuFomjRaRfS9jYrByON>_!^QU6|{??gf=9fcR)Wj zV?Z10i!NXkW8CLe+@mqv%XQ>PcJ|ZdecWlo{d7p(;Yu97%{jq&PrbtmHe^Sx!MK7= zoH}kGH8XluUFET)hR}z0uJ;ncK5Qk2U1YGE0EF8eG`EXJ4-$j`-4g@bj4gN&-yn=C zu;|o&p86)wbwGWA-3AWDFvkh=a4o3kcuImgP=(pOu>$i%^=Y_*O;4_ds8drqz%S_s z7^s69mxQ8|e-B}TcB&Ynork%T0$&(BBSD#nz4iPPolkv)+qySb&_y3z6?97!>NEOC z%{tJ7Nu7igrf@X2^$AZ)v`#XTTdrW53FS1&r=IKRRhS*Sjy^^4&v3C-;Rd!HN{(z# zRIXMJ8xX{k6j-3kJolP7}_9mmp_s~Da zb#L-IcC|^0n1`&>I>8C8@a9Wq}F`Xf535)Y_?yWXYbiUd=14!JYv33Jz3_M}r zNsi3x=eYB~ypzIHn2U)&%$!Qb8w93;JDylosz_j7Vt2n>SKD22A1i8fgc5Qg7%z7wZO^F<2<8Ysna)4G)q7f>&yh(lBkt#aYyByQ@;aZuu*(q9D< z5fTS}06z*bvvv~8awL41UGL7k^UUo0`TOfPfLA!lBZF2BY3OVY*tFRkW^j~&A&|Yc z9qYmzSpt>Lt@*_?9Mc^dm)^v7hi?QjH>NwVCR2gxr`Y>}>6uf@6Da%FGtYL6jy?4# zIMsK|`+I@SP~@3oPN#I2ervn7cPj8&3*82Jqf#LcKfcu!NS=)cgk9>`u5~dR^{mO2 z*>hwesyX*&+k4HVPR-_ z@0Z=FX{`{&vOfi?edSb-sfAJVB=up@$hy{wZDpRMmQD>V#%Ce*Zqf6~0xH~f)>(Q~ z1EQ4!i)4w18p&@{T}a4xU%XD1Gy;cOxTaP2^OxhU#zQ(`>{Ie);j~0v zf#&7u7U6D7xQ6ewgi8l-0*|m0XoW#iQIH)e69svUCvhODD9A2>G}nOe>u?92VmAgP z5e3}097rMxq7g`I4G2FHgFMGx3`jBx(vAgrf&Dm;&hB$?fuIe(d0aong@& zle^?@$D)`RZwY=#$FfkvQc>z}*=TBo(6Qyjtgsc~N7NC2bF5g53M@BlWjIzQCp+*X z3&2<%0fLnswQ{UZj+KjXtj=MpOO%FNU1L_<>gHJ8qf~75aIBtTs~1=99T9g}eWF%h zs~=b2FGf49{`}bAu?B>#fl-=d^wMg{Bl@?mh;Qu{4za4HT*JzUrHToCjZWItRte< zY^yAanscJoTJ3(qWC?E>&)i?kLCdvIMy*yIz@hrhjnb&I*xybaLK|b9b+wG zc*^;8F+VE!wUSc_$6CVpSjsueqE?l4Jg?w#eyt8$D`HlSRU5We^6v?Z`Z_MD=SKrS zR`FwX#9CvmpdIoo=1Mk2AT&S&nr!pF{ssee9$aslUE$d8L+v_XD@hvhKH7e}p2tVT6vYv97YN=F~M@us&>E8?&ynuII-M{J4?JZi-kpTeom(L&Un(x-E*w?fiNNKN|UQ zCqM4u$KCw6hadNb<-D+U9}jy!lg$I1dXQ5axp))z^$@2Xj#!(mCQfbPF`L6y3#0xK zemu&L$GGL=Os`My>yr^{tMwG8o@Nq%hAHUTu=QNndOm8sV7(Z&UgE5m`SA)@dzBx* zQ$q zEPt$jaSHNhj0O2~jP*6={hOPA6SKaxzH_Yaqaq8^11~=~){imkCu=)DAbWnaSoT;u znSpn4H@neT5kDXyuU8Uz%Hjtk&`M?F0aiglh#yW^g&{>$Bx?ObMfnj6D;MLa4D_!u z`OzV)Ac#&;9m6Uc7*IL<=oD7DG1Xah39GLB8|OCNxTHHjdW2O^%tZAHtKOKF>ci6l z{f<$6!>XU7_H)E7j_MEkR{Jw-1EOl68WdK8d7wPbfiPOGAdHr)LPre&$$+foE>#p( z2VlPHz^FJ$4dtAJK-m(LK1K}-tKmGU5!~%aForrfn@Ej|sYBHGm?}{dqH3a=#Hq=S zg4DTQ9m-Xw@?%<59i|TFM$@BehAL$kW`dj5EUtG1k2xD7sWL~+iHW6ZuA`2Oi7GXZ zD?-wouI7iv4>ODFsH3BzRxMym9K(-exsT&OQfgsDEmGzDSj?{#5L&8|*QAG|5@EFj z)3SPS@lq~c#;Gb!9nY!doT`qh6{-fyt!nwPk_%3N6jXJNs^{MZN3G)D)s9*dR%@f; zVyg$E=R|&-gjaPkr%vI5Az^hYPvEquI$fO+R%eFQSz&c{Se+xts;*rsD0_Ns-O{4^ z>LtUDFPdJvbZMe)w4jbtX3m~5cY4Xf*^>{QeAL3SIkUOq@#U+_i>k|OmKK#Y)K%3i zMa7JXwKeq(v`h z&P8etQi9xRH8qL4iPh!x^@(~xh0`l)R}`(Nt#3H72&omdHARcd>k~zZnuaQ5VMaxh z*H$E|`*Ul+C)X?%G(bjR<_L}x0f)Z(pXU`luz(PdSYiHWt zaYj7wGBo5q4;19oY6$`oOcVN^Tw!6kYO$VC7;KQJ)*{2@_P(?LX86?;DUMp_sPmCm zwPIy$U4xeCf(Cl)R8?Cvt!Cw_22ezze8uR&W}#9<133jg@g$;FSlq$NhN{{cfGwF( zyuv+ta?}Md9N>mI>Ow&U`!<}<1%ukIKCKP#%nEBHM3bNas=|Hj!XL8Os~=R#1{r%y ztSuny)kbG4tOrO(RAH4WJVwn4(7rD>!ONAPTq6ZhAMm;>>uOgf>KaZo+S@{p>4rjb z{cWv=l44Z@?CSs{%0W-Mj?w!zGhS3+mRK8LzZs^#wMDRd?!xZ-s?6z^5V+7`$#EO;GU{+6Xj{Og(7nCQAo|*qc`?lfC-{&5A{OFpx zs)mF%yrCYUO1yb-QcDl;dxG@}q;C z`WM28e?3EUk0vaV5Fmnx_0+WIYm6M!F4#$DCa82E%phNE?XEzHw%fr($WP;L_=d%l z+8Ru(eZzw5V2CjEL%FFRX{c>ri<#Tj{dX`2C7{n*?5qBgBbNf5#cAjAni_z>=${I^ zB2lMj1=^UhkI)3zkP+A#p;5M15_M*d*75|jm9}V7Lp}Ci4fVgwdk-l8m#&~EQz&Gn z@e!D5D3YK<-&o*Pbq{l1=J7sT6jJ1u_CmML@Bf&nNFPH$Mqr9eKSuITFy!QL4u7Y(^qU$p3@FbTeW|cQAgQ>hU(J-m5d<|kL z$bdgrSApEa+NT;5erO+0UZ)riI=elD{s)~IBgqBG(|87+nKo#_gu#g6bi|4bo*8urt`E@1{1T=B$g$rVe<+a+V0Tl*qEx@U_GL6$LkyF%Bxr~j`$CH(1AAH4!t;a ziKW0Xq*-BGU2q_Z`C~R>b%~P7O4wQT+M5=X$pjq4U_o0QB!gq=vw-h-v7;_QxY|*d z0*dlVPXes}zmos~bHV54l+&H=G3=YLh%x(mNZ9d=NR5s~ zw{P-rGw{P@Y@r#tm~f(|3yAL&!TNT~KIC|+J7{{dwrEJKD5JXbM-j&%}~$sQCmnLQ;bS3-Vx z`z4wHeLT*Bz+aI7^<(p@k_9W%B%D7TMS_In5Gp!tBMRSURJb0^L)vfUMho^8Td*RS z49yg>EVMtBR1hckp7kqLeOPc%SoUvgDT&LOvb9Un8fS`8JmgQ zGmCoiXGHsw+?a0xu1l^=w5lG3lOeMq-1_gmm%(tiGof!R zt)+w9Mp(eCAb|E|-!I4cbcbeVDu@D~oKu@`D{GIh^@unFlQ9KGGj4?%(^~EK) za!f_Fx4$-M%$(xD9K2@ZT4#Z;j3S&;#rtfTT4v0JaX5q}sw-X+@4DhqajPpH6SqR; zXgRAFXli-=G6V@+@sxPL70-$1UGbv01rA=SidN!GB(B&b9&*KP;zn28F79$gGg9&a z^ewmY0PpbQFLFbH)AQ0YrpdwN_mZG1i`$#RRL}dRN_`Zgka6>SjoiHd?f0A-n1pfF)j18(ej( zy3JL$t2?l1jZF+v+aS$ww-&sUe9fhowcpG`Q%ewwMpIW zC?NM?wHbcYFF@+|RK#=;==UYYRKYJaN*zWpT)=H1;fW#M>8d7im!r10s#&$T;%;$| zs~%C0y6Q3YxIYWty_uOD4Uw2nuUhxXqfPaE^5B!^OSav2&9>|Bbk!5Uzj{(#?W(Pu zdJ2oLo|eCL8d}- z(_QtJ`lBl?04raRFS_ba;2!n1ddF4os`tQ!sbQwq)+}|^`|8hWy&L<>RUfDiVO*tZ zPpPggZ*bK|>SN$fXJhkzSJOmVnDvUIK5^AH^{K1=rap7j-(B^& z`bQe#Ce+qeC(3IWxBqn27wTWG`jS!o71MA4E55MQ#b?mrnceA^@ zb`QI!WB1~h-mcxp?(5q9Z0xkzB?#VCJ9dB9-XA!z2iOB$dl0&?2itj$o$uNOcA;wz zv5Or00M|ay9_rc$$tPTU7*`x_7rFKbPL1T$!JHb!sbU)oXX{A1D-V~`U3;`W#+66N ziLN~sz}w>>wB=Coh-)8W4|MGDu3chJaP5iqB-ftIjWgJNGXfP)*Pdb@>e^EwK<#OG z$a1;ZwGXoockSu&6~~_8+B5B0u6=|(+Z8v9TU@)$o&#Mv_LRa?j>$h|JZz>&{{tL* zu4^ADFX1rgu^>7yvOSNXISNE<&*#U{+{*&y@SE&oT>DsimY^YfsFk(#^-BWBusE_e zF%T+s?c=m`vll|e*oz#y+_e|m6_Ay7r7Mq-$GUdHUgFAya*=B+E{hZjevA z_9_Skd$nt?vDdoxiOjWU%X3`&B>QC7KE(!xPXpBQJkC4aJ_GSG*FMueOHh6rX^vCcl<6)j907cfO#2(2s|<(;lPjm6Hz z5H|Kj0M@>kAD7sdx^j-3>&ok-uQ7cNy=~)X58uuj^I`ikZhZ+$E-b$_Y0`nN{VV%& z*Z#GAg=_!D?hKrPix<}}guJt_guGh_28D97ud=TODKBJlM9{>wuVFb7>D#}g|AEDL zxb}MHn`^nR>+I`Y`v&_)v@US%n{4dkiLtJIGt=2E@^lPgWLBEA_l(y*d*Cc>dD+@= z?G5&=u6>(*GE7$2zTLh9TSZW*pPl{qr#C;g?Xky!>9at+1H>&D zaxAo{yx+C&v+;Pqeh?}RdZnQrq2ZOr`mXN~vNvX_>+!QGOTO>g57`ep_GZ^^vbQ*P zvun55k2p3^`Yd>K>nWoA#9m&U8#%xuux%N}`(~kX&Yd>p0=i1NPFF5v#0LFd^ zHmLowYrg^^F5i%Ey5ezxCa>DR#VN?tOnn94%Kvrk*X-Z5CA!=8cU`f|hPZuQea6E3 zjn-_TX&gwvu^w!S6qT`5@cmJi18;(y!2k9i?6+Jwf#u*I?LRs8+bnY4aqV~c@gDd7 zz6~qEDC5>g_&`vQ!ZW$@2Q02WFTawnR{cm-pV}Ik?-`d|{I)(U`kAD!+(f#y)2Mjp? z9#eiRo!aKY=;N|DZPp(5cu|1f?bXq7u53L=t&682RAM6J1}EvKl6*{Qb9BzKy4p47 zfMZ6g1K6Og1z{Rfr;9+d&jJIgJt)(gAYjZ~r#EEs_Pv>)c4dw6odYvLU{6rj)bjf* zWtbhyR#jhG+u%h*(jpFqP;{U{)$3E!h*M01^fWHA#(Doid)W*@Erfn}3(drRrq#@< z#gyTds6kUWvKckKv5eHGBih_3Nyg{78u}X$^!VHG$Gt2;E(T6Io7gdJKiZS5sgGdz zZQF{*__)CYII4$P>O*x7LRBVM)d6u>b69z{-ZImt`r26Kwsi4m#&Q@@caMfUr-j&j z+6Ee&W##py*hmC2YxGYizosVbBo@-MJ=nd2k2vIBTg`h(g=pIbfJxNr($5V z0AjB3nkV2y>(aW~ReG0_`xzBn8*i*OB7(tSOcJ8*djMdVdFEW>$GR2Owe^W3R#hb$ zsu8;D>d>=qOOi1^^bLGWO*>Oj?OTVhNjJ! zHFGvh(zeX0B!+y2F{Qi$yK{grWM~^l{8FH%A0XXhzG)K1?+&=;khCWUaS$iP%pTC~ zFPv_OP8cmZT>^p`us6o_TX9$}c-}sQcg^};k(jmY#CrI4e5@Ad#AhyH1_En4DB`4! zazeV4uHtmKfkUTIuc)w^k2TC(!i(r15e)_h0Ih{{wtIwGJ$eqzzdhCu!=0=9?`p(q5^JVGD&v3!D2HcZc42e;_8LYL*F;osuR0DQo;Pl_ zFNLY^U2b{n381j+U(fr7f({BU_{3%9b!CYYRwV#oaKAP!pF_hPuscw%u{|LHvlY|f zg)B*)O@gXQ>$e&gUD5)isWUi5saC+7nlpdaWV5jF*z2k)u;ZE5QxHOi1b!sKqkC{$ z8w-a@`kDlmrlFQYE;=}$qV+bKa4moY!ZN{_y(2ieY34N4>Oc+aoc0MySHmc7Lv1RC zqgBZ-!L~=d2W|VeO)8ok*@*K5TqL>6(C*xm&CqkKQeP$UbQBac_EXyRHT~hx6a;Y? z0?eEPlW5Q+Pb3Gs?>y+}prH0bP#70$#4m!~!J`uoKh?HrZ<`YAdzy3{5`DD5F52 zy6nVyy-9D?veZmnGMEK<>t9!ZPyo7Tu4+i$U|`}m=uE*^W{y+`t6{m5W^|xKNXV7k zeKn3Xq#2Grrve4GK0u4Z03MS;SEu#N$~6#aouQAX;bK4)C`*ANLCqGffuSSb1cX_X zRaIY7U(dJPpzWvNQGr8L zRr&&!0y6?%9a0vv-b29_?p{o{lwB*Rs6CToYAtq{L4xJgCDp(&M`XcD6DOC>nLJz2 zf$iFdZM4PA*oY4F1*P*Jj;}4c!uA>+2^GsmNMIPa$L$>0ZPfs9GOxAD$634f;ceBz z*q>&B%mLm0ds!QP$~DfXFE$F!_KJzqNL&%9uzT6i=wFhWz1_=>VFpJ+yEo z4S!o3aY-Y0LT#OYsF{s{snbe-;c#19Eih4*a;A^j=4vNyJGBQ@U_1@n;Pxt~`6%F& zLuXH(zi{{g3ujH9%|s0Qz1^|WngdoA65b*F9DuC>Ht={p6LYA^n4VYyR>{UYr_w4h z3z&>KwTLRPFN{Q5l@7@&6KWe8v{2JIoKCA4g6u9~V>;UtdRmI;bK+R^7&a~%5K*Yt zhHWO?rJ95m5k^pUMxWSX=KG|HG?y(X0bAWu<`y_53>8#k)KXU2%<0o6@rBjNht8fk zw-hqE&C{Ss0@$Mmj|c*}2(`3N1cAEx^b1pX7_;$~!N%#|r4aT9?S;Xu}Z3=O)-&^Jo7b5c?R|0&&%2wML^ufLUpvR{CY z)3q)FCX?6t)>vHv_lYWSc^P-Rp^6Z!(!QiyX_m#advVJX+lVj|oYJ{7CeNNWk!R}h zf-xkp4)(MeC5OUw;lpeODIRa{w->T8F|3%5?fCJX{o6*JW=DNa-J5_GA$)E<6|YD$ zX8Axr8({%#wBkVD6=#Fp4+`+1l=fTsHL+w-7^1UqGFN{WAcUjy+LQ{eK&vsmll**C z6G8EYM6x-q!LVTy@JjL94{kqd*K(nalIfAANt;aw z@x#+V^k?5b!K4iYud3dJ+Id0EV2~Wi8zYyuPt)mh4RqEP2yF#)wUxgY3Qq$VV0MM> zDOrxoijr+tz#c)ClbBI3y@cG|3!n~ zvG>GP^{{+WnAVq*TG8--g3(l8z^&&&nfn16fqMxB`!okFlI0;k(6~psk7+8Wf)d^i zhmkXTa|gHJ7N-u7KpjrHwr=-7K_5=+g|MEkVf@N^t@OxhE$ zM#cD|OTYOy7T|enx6`f%cY+*}MyA&OVK7$J%E=t8;f)Y~S806EC-<-ylrw3buvUn^ zuWfn&3KY(LBYqPy@t8gK6+Af=?6M8fmGt)8Ip`YD#;GN9aTGUssGmis9~;xPlR?C^ zZ782c0<@j17{U?!GTw;87hLdp08kN&&_qRbd0hfuqQHl8_8#l<5u~dFKlls~Z&!2p z)#E*_>r8GDpy5wcMD6eGAMlYV`$vq;C$V6#^-in5WL1s6D_k_iOQ36WY)yAJ5qDb< zfzr2)BG4#!(Lt!;LI0z5A3=yxU7%~THQpLho)4r=0*E*;*maXkNiuajg=fag@0X4)h9FIgsgS!lTxsEiknfS}(u3Km|!wo7cwU6ir-E^ThOTHD((XpWMhh+@} zz4W+q&5m1}2cH83?(-ZvECOoL(SPubEURStbYqPln!vZVsw#|M(#>C^G_j!FKG@Je zX$cJ3a_z*F)GgJg27x6oK@dAWUcF}dT)J=2F=s9FzB*+OnxsRJ3IZOYpB;HE8jV!O z)>Qx%U^p;_R$^?ru?uMCvo|~4uZe-%4cz7CVn!T^0A;1Wbut~>Q=5o(% zLfDbtcmsgd2s`=UzrBQsxP>O6Z1ibn9q7`TFmvYg$t4I1@sM8hKTvK@o;`aeVu{Qf z+I|U?VfO;wP#_#U;Y71Dk!G25Cg#SmZ0!|t2YU0J{W{*MOlH^LfO!bs9*3)aZRg*tH1}UT^D#*z4Zi>B)v7EtizOZ*-3*oxGfWA6sar{j}&s}Lr8HMnSA z2gWuqr;qFVo0_9r^I#w+t)UhM|5c$GGB{N0j)RNfl};?jH3yvI80~}zSZsxmw&nvR z)qXwdOV?8oJ_y;Fy74swq~hWRaU%(F6Vj4C#ybwt>iiAj)@1&jB>DCS*Wn8w`WLqV z^e=99=wDpnK>Y`GdL!!L%1HA4VZ7s3Nb*6kn{>8CR{fpZw`WF{g^e;~L z>0ewUNw(jL_PDo_e197A!Kp>m6MU5=ng0S(xYdIEp-8eAw|n5LMtefPN6tmO19;9~AA>t@Ue6$;2NJo5(qw{zZ+i4!KjJsYQu3rMK9aQuo+^>Z6F^#iv5G4-bSo7U+xa~-T8l&RP~2`I zoEO!2jE6LuhuDu((R_q_zT(t@NHx>Yv=ulUkR^ zfVV98jq|^rxhlCFde!x!rxxZg!UufmDNOol(Ec;jot_1~KS%lWJWZn)Xg0k_3+N@P zqL(qTSHLN+f=hl2&Ug(=_d6`r@97Wp27N$((2F&j!f11t_^bE?T(W>l#5OEZ2z`}_ zPsQJ`l!Ixr_zVjOTY?@Ef5)Oq^fp?2j+BKy3&cN=VuJs$)uM8azo@-P?V{n1_@{8h z7u%_7Ck+!~H^dp0WWh;JS79V6iTqaE=>*b^r|YFzvT*$;6-^MPBIOOd?nvH3lkXdDY} zqZU{<6Md~g>|-h=0gDI&7#fQ0yl4Sli+IcOGg>S3G29z?haPyR8Q3`&Wt}n9ZF%5% zmdpjsG=4Lcc#>P=8^SFMWLuKoLK7r4q7q&pk0wegw&V5-l<_D{nx8#+3r%^FIRx83 zBSN{M8?Bk1t}AxpcFz`?iuz$|L?ky754RBF&>Lu4Je(V8p~FxTjYpg5@b%O$kMo*n zdK1kkj>VmLEH~0jr7bkmqIr$fG46;!#yJsi-bM(9S;Y~5v}hb%g7wil<}v>vobtHe zjk|{XGtha4$Mk(zoE}k}8P9y4I>e*#%(&}~xcl**YSD;TZY(!+t2{Ms=b|T`2~?T8 zg=Vj(P@`NViZkNT7O)fK#~h4|e$2>nG^g~)bBjBmNxVY~!CAv#O*9X)EY6B&0E0lO z(?mx#k{!=LU#K)+%PI?U>geK*sSE>pcD!Q~Ehx^(J|>=X2hECSHPf-ho#LIck87rd z>oEhJT2!3XNC(6_W*0P3IpkdnEe344@m#I2vhw1&@vJ7Q;961B1yb*9qRM#A?G(*E zg8S~O3z{jho-#POglli!L`zMbWo^}|;yRaaqT@}S2sv zmC1|~IHNSXjx!45Sx?b1-uU%gFr0Iiuji7jw7iKLnrRj1_uNFQP1kFDqC#5-}r ziyC)66<1807eiy86BCU)&x$LS30ky?5i|qoolp?Fr~~b$t^#LKg`}~<0{1yION41I zzJq_9aA}#ypfw_s&JrEyLXkyRi;i@M$fmnQ4sAi%XhN;W#X;g( zF$~gYxOi8LgyJ|@d?Q9l5~HEr$I1TU5IIDQms3TFoGm8EaxqaZ7n9^kVzN9(OpzCf zL*|eFe96Q@#laT@gzr)yA+%hopu zYTqQNeUqT}HK6jK+Ib7QY~0cS&Gl124+7AGWghGtM&7YW(<;A!ad%}3ID@a@n&~pVK_zlo=C9Kb@;MZRrSjj#~^z=zW z)5k!A$@MWFZNTi~`ivB&p8^lAe}nOverCW1o`dON{c8;Hp>WTVWC1290$G9Kc3+jCa5}X{71m&g3%WQKmM;*=?VZM8OP$g1~gS4Aa#{ zcZ{qmSlRF>e}Kcmx9!dRA!cm`g|;a`5AzNF___|uJJAib&2-bH&2;k^Yiy718|a0+ z?y$XYL8X*0S!#{oR>qlRbJw#dPvewlQNnvPcA66p8T%}py&(>JZb1{>x}GMYJ$yp8 zNF!{TYIiiBQ@Z`pZ2I~pT5&8d9xKdM=O|bNx6NzZ{dyye?|3+vbs9JgU1l`V?J$b+ zdcZll11sC8z0hJNZ-f8Y@ahTLAr5BlBQ^r}55s}kOe4h>I!ZKCxoDx|5fNJ>9tAx- zMz@K_X(J+GTf|m+Ry<8Fh-ctHK1=V4=ja3U@d@Hw(4e#gQvNo|fEND*8tNK~%OdEx zD3w!%)_4vbkH1ZG07}Dj6jjRup*KTtv+mY<&Z3djCJWR6l4j_&?(5?%8)P8`m@Y&PBkiA(3XfYlPypk1y(3Il}JAK25ILAl92OMAzJq zx{ac_wp!FkopbHn5Pma}$vv1RNOa8wnQ$P7yUh)?00~s=h~lv6WON>r$vx|-mrmS^ zd{mU|AKfPip&;2vUD}Fwz>Pvhk19bw9##FoDUT}Q{TQlr<1x?S0ady_RW`@N+9H0? z8j;E4-4F8YzS099sk@!*0U^*>DvfEbeHHfHPvKJ13swHJ`vK zkGk0{fh5_uo(9A_sV3TF-q|53&V>(B0Q8h@0@HnbdRVJnT@+wF)pkW zF04lClo!t^fZOKgM&S8z{l?w)IU&)wYe|ak?|>X4@dnxAP3nTMXJ7FavJ$Xym&1lxBfb;oiyy>A;zx0*_(@z2yX!aNX9(;a zqEYOGxZaI#CA}q{0tYZJZH0}s1~wvxW^%;>IzaPMCou{f%F*bKVhqidBft;Yu+P`Z zk!)MS@^6#}%TcgP->3IA&$$R>ys3FEgWjZVn&)DeX{jtm3kUN(T#lAwz>%9oL~~yR zR_+bj$_z36`!ZHMtvM3r7gB7OBAhE8mtz5e1#I3U$04PF(_7>rNZDEzBO2&IycOXU zGivALsN*rJ8Nuh_d#U4Y>aR^9&9egj3w3i26FX@tTV%2%XD7^Hu<~x2%BJGSel=5? z#^n6M=Gp+188eY{cF+XKfS<@_n~UwV_Ih9;k^LiO?Z#}`KJ)8xzD<&^)Eg5>9*4O* zn9X!A*f0aS^kI%NZlcXC)P!K{Cfd?M&9IGHs0I9kSY!4hE%d0QxXQ|Ep~pC(TIg|9 zjpO$T#CEfLBR0w5jbH2xy*}AOTXpwOHPO>8Fui#wWIh|ne9q5&K9Ko>pZQ`S^Q9z! zP-#AZb{3=u04!wPrU83-Z-9BTga-6G2_-v$w9}ou;&oC0^K}co+Csm@ob&Rx&}$}{ zigjIu&_3Z$w}quk9iX7}PJze&CS(z%Tvj6PU#Rk^|{GIf!=2!Eib9 zL=rv3kISzzz2#8@kh@pgzkP|=v6RA>8qSZkA8FC6; z2n1gzr_$|m8W#UBEdJs2BoO(6oI!8PQu&c8 z26~8KEAJ64Oha@8`YVMy?LetKqs1zFKwtZ0fRrHv&NE~XroYRXAPD1M^#M7U`Vf9P zbw5lo36aRPU_@)vwIf+ODaUtj--fN?Q35vW_`^n?^qCAwh(P*`^QBLc68vor(I3p_ zkwI#kBm0k`FQ*S>HI{M(ZI?9&71fHETq!!q6U6?qP7IOth3lY#?pkhA~b1bd!!`>q)6*97{d4nm@$OKp#Y63dvgII_1I}-#RXjZJ7N&s zJ)7v=INQU$e5rzRBUF%RYg^3NxD{y9mG{MZ`DBRdh6<4|M2Lh(gDKJTp2dreqZ;d} z4|l;EoA`~ZN`Ch2ncPAPL`G=<^M^bQfBN_g>MYO1OwNL~I2*CObD&ZnIe-qe%>Fx)tVNIWg%+HuTI8LoMFB|ExP4stvxC1fV;p^$H zLLN5z^k(`TJ|oiAh?+N245=m9h*;M`|FF>WS)1see#_O5(iihB{0E8hFF{w}=S!9X z*jY9?YEdvxE!sj~>HVT(*-h4w^@I5L>*5gV|C{6A-^7(kwjj(**kz4}n&`V0`rbmn zKfnOm2;>{*wUlzOkXI7E|3}&K8Z6{`8YHiyQSy2y(i`Dc-b5$Mo1tEBp}XX*Sg70R zb9p;`CGVgg;Wh1+cY+n~68-QyNZy-dzihasM?#(}gv|%bdGaW@rk~R|IbR-)yszkB zxd5dcv>NOa22#6VM6*deSd$3cRirpt-|n%?21upAST#CKM9&= z-czPjChHx!35_43EV)_F-;iw=9riUL6P$0z@-)qHpxlL!eI{ylIaCxYu3jLJ?K84} zh6A@_J=x)Vvv-+fC@XYt_}=7l>BB4XF|y_3lqsLUkWV5muobcLr}fZA4fgU;O1*&6 zqc9U2(TUrE@L*_-Yx#(baG)3A-FOV(l|v+(;}`QGtvI6fDkKC%RQB#BLDx|Zi;12c zyR2*x*a&H)9{N4MMMxYP7FIToONnsl>>H3_#P?dA=C((ki4vprtZ-JXE=Za~IQOHI#Xn`a#mv$XW>gA}Ww8F;);qGnk*f$D3;t@R;bCh!-Z?UQzktD&_ps>F0>^_1 zB@SID&NHM~>=bb5h&6F24-vk5*3)SIy;nzu5P2#@J*^!3dy3HlVM(lq4aJB!5{Q~@ z>4Dfl^p3N5Mj+blgZAx*a4-~4{ua@#IE*H|a~#1hHaLr;_{DxE_Sdm9k9F?pg_3ev zqGNL(d&-_Bx;yUZ8oj+5U0{hJ>~t2g1r9dh$WkMn#~c6XrLR{fZt5HxkH%xo0ta+- ztwr(hQ?znD4Us@pPl59;{kh&&T4~<#>;*L_dN+wao-$($rS@4nGjQR2);Je>ePRn= zXNbOexlmN448XCNalb~&E`|v@B1h~8!%_6NpsOB)w6er{oM;^Gsi@V|lXqdrvJ_=l zA?j>7)XR#{AS+6T;%|>1V`2Bz%A}jDj&zrmO&hHoYOy-eQ&uj$Zgr-=T3zTHtE+IV zxaeYa6NOfHafsDJEV6ov8mpH$)9NcOwDuG0t%2ftYkzU0H9*{B4bsGaDPljzKsm0J zCxTdeiIcH^%1+8%^p#dtVKCNbdY>`^)%uY<8KqGiDSBI;f>aFuGIV^Mt&{tG7DCFi zfW-a2;6REaNYDjH@qQ-TqxWlJVq^06Xf+u0X}LFu62c?){uDe|B3e7e`ufZZp_r|nWfhz1bD>vnV$AK6^afY@bt9g<$#w( zV#hojEy`;a`_E{kP-!8b8sbwt5wPEI0QM@XXvJmW43RaGB33cE*1=fJQPja2os_K^ z=+-|K)KPC7^ZYt$lyiR_Hy+C#Ti7B7gSTSP5_!-PF;8po zJ8KR8^|VIJ*BY@sw1z&!XdO#o>p1FfEu`VrBAQ^8(=@As%B)ISU@fHzYZ)!Ks%W*f zoKCY=(0NvkMj6PEr{t4AQoJF~8f0BkgRGP10*!16t<$=M$!eX}C9FZ#XlHOBm!ESt#wHhn`4u;E{O$n36JmV;cjH_psr9J)1Wl6-Q76+sCU0en%cj5Q*f8!dQZ z1B7iPH>!6gaF7d1rXV*uR7=HkqKLnLz>Qi&5zG2`)b}4kqi zddc+ZB~#N2&qpHy7Rqo*s5in2m>x&#GjOL+KkHN~vQERP!_(;q{LZt^qQ%zPAewU^ z#m}WiYaKmjT|j@dE`s#Fm_D~IrEjgvXovM{p{y%}YyAe2{3_AgS}z9T)X5m@dQE5> z5VIdj`|D^sB6(u0PjX0kBqzrDB!`qoa!9fH!V-6^PjX1H`NA>#u^!3w6W!%H5GltI zGUfRo;Rr3J_v8igLdg6^n2T)O#BhLgttLp9{zywTL1xfjVNS7elbIq&4V_PrWBKUC zP!?u5nX#Sv@5aubKJ}n29poEhhl?F~QM%OwnvL)Wl|2!{6UhXp+~bi#X?~6v*(45T zUzk0{Cq{(ucY1T3+|UL(6X)!lp&X6O5u>G~&X1>L>#OVX3?nCTfK8=>&P1UOOO0{t7An?;d$MQY?t>(fXRh zg}2II%PSy=IwBJF8?@D@YH-HI*$p!!oK!cCyb>m;wn7Om?hwjot4J@XUu(pVaNB;O z4*0=>;dA@{UoMzxW5KL;7fhuV%-Y+6J&Of<4h!}?7VHHq*o#=Om#|>?av z&k=_p@S7vXm(34l?<{K)CCq(-BK59U%Qr-G%IASb0_5mESo za1#4_oND5)x*ObqRSfQqEqtC9z%H4>amU%2&En8vj(LXQOX#>bpM(zO^JWW&lOZIg z7Au_EEw**OSF;bFCgyXgjF5&3bYiM+1V#!mrx9YB=R@dtrS&gZa$i!8^%eE8zNSL! zTVUsV8ex5hQ+huDJ3nd6aJ(`H4(bgEe=!!0O=96#IaETqaGtygl7q2utn2`M1OimL zzAx9a`1VDiBX7oj>n#xM`@y`x-+}N5sR8{nA@S{&P>VQB(2aB_(tIqYt3KeZ7HQ*Q zx~YI$j5G3$A>rLnd8LIk68f4ODmh}hwk|*{d^{Qw-`lpDmfW^F0=F^ZHe!+59%;Lq zO}Humh&axV-kU_JapZPCWWbmy0y^CohOotfs=f+=7$xZ-h4ZmW(JU3B8s*SQDomHE z2;Hutbf=2ZMwOAobPWOzrNF99ed$-)8{*3m=gC_UXhctRnxQhrl353>L3v-#)Vduh zQ|9Bm7heiE%0vSB!~;nW}eM@5&N(lq#8+*s8$*6rHB|wT(d`sT`DC6Gc`ud#e}2I8%@9q| za1VwoJA6IuhvP1YQuKhK{Xl6UtdKcO#^CQwh>~E9rst>jm9$f-4x~&q6ev81x~XB* zM-8WeYGjhWauAZ_dxRET&(STz*wTQWb9uY?pHH&#I;wXvV`7PpTNH4KKS85W+ zY!+QMqNVYcvsv&c?8B-5(>EDV<*#Ia4{xMs1iMJz(-%F7F6=%Yr-?aujN2EE;Rv=-B07Pu!hi}Gv57;LM+ z1H!SRi%hCq-}s8#&%<1_TW}g2j9YO#b@W~^c*Y&n%PeWWZT3r*zVuaQ&f(+q6nZyj z`bOq~c`%d#xpK2e;8iTyDwZ-2wuog23k}^W#uYm_*riWOZKf`9Xx=If(oJ5ne5$U(b*MNyhVS7;FB#xR!{ncSu_QN4Vr_(}JN>yqmtx~h-N`aWvYvf&{s>F5bcuh`x z!tibEA8f+rMTkD7n0y$V;?OEOMMtP?Q9w&{Dk>s4h`d=g;eC$N>Vyv?A2r~;BWdr24#%D zQR4CLR!!78S!)i z?x@y5EY;Is)qo{kMF%UhP0c77jNl?0R5taYTz?~)#(T(=G)}Z&izj$UlgoTjj>9Q@N zelzt-Ng{o)T%8ILdm1#<>6pVAn8TU-D2?#fu{`XuSIUC4xI1F%BYWIP2c?6;my-cn z50Cj6Dll6QKgI$07$$>P1JgwmQ5REZbqU1&r8G+YO2gF0jN;)Bk>hx_~u(tCb%pP0Hmst4*9n_K5RL!udL<5VrRku@C@@4fM zRK_oBm@p14MP;!Td(DN(8&su@bgK8(p+56!9Q%BfR`S)$8C%4OC|vZYIB9;4IC+aW zr4Y6ka?pu4(y4sg3NNSOELR!5B-AC7}`{^$A0BynTsb|$j`W}3A!`eo8Gl^R zqd$lh3`#VLms8z~fY~|tgA6_Jiyf8?w4b-QrEp6+!Y$Fudfx41TlebY-tS7 z4N2;0;OQCQ={f46o~PdG1sHBG(t&s%sb10ZW%llk^Q3wM8_@`aUJ+4ZBWzT1zN5^1 z14PMX{@h}uLOXDhZ9j9I8h@bBo6XPOY-SX^K%wlh4;DN{b-0e0U$B+xn#DRS^00!Z z#Q7jCWQp^e#RVp}7jiH3axZKa7n$5J^!JR?z%ekrMX3IW8U6|8>APV5_do^j!@mDB z9iTqI3_qkP>SH<_f5DJfmVL=CWXYFcf?Dvr{M5u`D*bi=-|J%GG()efq{FdPx@`at z!5arIjQQ-`TwFzh)d?Sq5}PJPrL=)MRO%@PU98;?jB&D22`pLDe_k?#C6r@ z8fIfk^)M?D7?*Q={Nqe&xA7Q2zKY#pb4TbhV4jz7SaQJpz<|B^TF$*1j!rtMcM*RH z5Odksd>4T)@|o{V3^P`{1}Rkrka$#-`F1&g8#>UESDXR!l;Z#r z(XnuHt0r*TK%bk&i4#}}x?TXU!P5p%TeHBSJ2;-!!*dE=#|-c%z|0JAkJ5O?(;pQV zLl$1LMO<21m~X-MyR1q4s!3cvuP`4kzvh%c^aXUgw23M28T9r6@^WuXOz7leN)yGK&*xfyalBtY&R z^yNwzUGmRKOJS}i6{6wU*Efr+9-Lqo4Mi-# fZkLXa+dtd8uqzW+qfigrsfzKLkI`z38vFkM<#9m8 literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/Excel/ExcelUtilManySheet.class b/common-config-starter/target/classes/com/mosty/common/config/Excel/ExcelUtilManySheet.class new file mode 100644 index 0000000000000000000000000000000000000000..619d165d338f413c9fce86bbba3f68fa2c583834 GIT binary patch literal 32605 zcmdVD2Y6If`Um`;GIM7pHzXtk7z9K>2`K~tqXsN=f+4U;6cO8y3=m8*F$F=_j$&JT z!!8yS8={0n>;>1}>+agIt##L33nJg|J@?Mcog@a_@Be(y^Rerlb5B3-dC%`H=bg#3 zzdi6U5smZtLiE0zZ^^?$B<1`doh*;w$B~viDnx!K=V;D}@MA#;k7`TS1Z0$x3xnb? zxhNzT%UUj85+Yk3lSa?WI)2n!vLPU2Ahv$@Wl zA$;D&74GI)+`|K|v*f)Ys*>~hu|6R0az8&dFlE|8a-(cd6JupZKt7NrH^~PB z@*)0wn5ppy*Ljp*ALG>H{CI+EKgo}$EV(&Eweo3x{FNWiaD``?ywCAoJkO~Yxa!%K zK-H7wiy`#-5~p6~$1A*zukzzH-o@8L@(uYKH+nN5-{PFN)8sqyT}%E=ksu1mzsrAc zyZ1u!efgRtKM2tZ`8MZ#$enx?lpo7a(&$>bB`80YpK$m*)jvwFi<6r#vH$Q&h$A7rL{|4lbY4RueGe3Ue?5zRug(ZLG;9Z-7))EIsn%jM&E@V)#8d=}cT@us&z{sS9v ztnrVti@DRiIkgX`_T{CN@HEDA-UNQ^7f}0K>Htn2$d8Hqn8eGN%uS~7V=50ejZ@S4 zF@vj=@?&O*O4UJl$lLj~%u=)XAT#@@a(>L_$DDxr6SzcGSgI0-LsePoVE#NLq~@wa z18Sb74zpy~QaA@&)#2RJ5g~P?Ix3)!<`qT)YC)Q+RyCH2hJ;ToXZ*>+|Iond_q=|fW zE@z*YMWilHQ62p(%`K6JmO~SAPad~G&>m*0k;X{%;%HH0thT7Rxu~@{+EgE_iPja(jWr#!AQn3YwS8v#f`;|j zppw^!+I~!;jwhAjtfaN2wytPaq!C5I%GyN@k(SmbtYBtp>4dJ!?s2rq(Ym@y9%%gj z=vdd)Hn#}M^z>PV9F*jA%9>DBWm@Mii@pT4GBZoXCP9?J; zOr8l{xu!bSu&~x;7Kde~E^BlMHlenmwq<`o*}0v%89(w6?7(Dj4exnvL$tiLenGUU zDuP9t15q8RJ0#Ln%kOTcZdqIlvW?l92^PgQ@N|0+j$UY5uW}3Uq?!-t#6Dq zwHTlfG{POHHda*H(Ae67UZauv@gqBLKEQ;x(miLLYU7x2ca1Hz06akjJJ)A?TlRIU zd$G_NzSA(>Ov<;^fmRLFs}nSIhhTz3Bx-?P)v>zP`UbGMhobQ_j5BCpBXLg6%$lML z>wpqP(-=|EjgGXmGzrSx$*o2Ug+W28nn+93IqjGW$YnP+#TuhcEz2Frps=J=`QXA6 zfYnUP5e+_oe$#SHb*l5}ML@98aFfl0HpPw;v|EpasfZnintn%&2(p-%=mVWEjz*el zFmR-<&a4~L9pFXI&O~u$*lZeWjEwqyJQOxKHX)C(e6okb67$^wqNa|^C zo;VtS?8vlO1B8Fi5{Bzwgb-k}Cfek*2)4vpSiR%cP5;}Zy|@$yG`2r}PpMDNok1?- z5RNkiHSDy!>XAAuF-k}FScS*K=)vY_3nvf379QpDn_(mO)a|VJ-0@hg;UAp@#yQ#EpD_PmLX z0^2if+)gnZP`sy|`~#giV%5f!OL+yZmXJGt(ny%1y|D{?=3t4|f<(~M%+Nb$PLA(! ziViCAh12whPEe>%q0Vp-F(U(H`iZ;OlGTho2 zX^ONk+nn=%w+hHQ&qDr}Y4^gknxojlXjKdlAZQ=&S&D-~k~A){T=eq-Ka{3s?qC2j zH)v57SrDz8w46yYv7yFwRqUX5cf4+U_tkNSg8K7OboAUAk%pSOXw$@+NFxX>sL?z3 z__qFE@S?$-Zf6y!HLjRycB(8iruM98%iY{ z{3$8AqFc>Uk6G$*cw8;@1gj zMtDL!^m-*Ljl*)dGe2VnA;+sz#aFQZcuPGgs27m2D$<0fOW;M`<;L+Uxy7k?zOxFA zcemX>G5ZGN9kyD`@K}f6NkI#T{&Z+=PlDwC)xd$|YE!Vk>uOzw?soc_j;d)?eB&>G zw#{x5EM(+PPOlkE>5sCh#*OChWGgfZF$2Y&6#1Ubc6^|}w_UvF=U5Up4y#UJr?~eQ zOjU_qVHH)y+_g;c^1=VO>tNJg4wd323WR`b+OTUK6w94rL_;4>uEz@2xu%q7%XsRt zXmQVYhjp>Oo+Ltos%jl z?u07W8ST~h_wQ~RAqRk_)v_4uXBa5OBRq(%#;pFN{V!YYx^l}kw_!!< zB{-36^|E@!R-_SDdec^Kskd!eAuDb5j(XQte^Y;lo5@!HQ198|SkYvw z_Z1B5J$ASfLs46Os6GM()W^2^1Y}TK)Tg%GmplGUeI6&Q*(-NvZS{rv5};_Sf2yzG z%d*wi>Kj{qtGxJzqa~O z{RA6s)M#7%tbVc8R%P1M4?$97v90^*{($*Ww)hE^#m{)iT)C^I z!?qrvcd_+A^)|HXNMmDNZM8Asik3FijH+)gG-wHTl&uG;mw+FwEei|xvGri}lC5{e zHj7ilskR=XceBMq;uTxYl6%^EC~whcdRTYN1D&Aj^^mQHtN++~cfE(LNATq4$UoWQ zXc4h>u6oUeR~;v8i}=*mBf+!c9f2yNd89mysq;BiAosL%p)D%-W-WWmJr8bK`G8@} zEf1cyrM>-x6Ky?8y=&b``LPbeSoD8wDm+i$<~wg6iZLF^)x-*)-&Wx zTbF7)4$@O>UB;%;XCwmwoHW$UAHY;}a^vp~-@+CRISFraZY*}7Wqix<|aK}7Qj zveYCp$6}v=Ejo%xiGPb9Y_S07sTb;bmd07B)k|!BjIOhFJvLG|FzfcyFR2vq z!m-p*-E8X?y+qKcPRm)=+`Q0p$IQC~%pQry~>+^LlTVKHJ?U$CVFVq*=vajrCi(>=` zaxw4VB|t#&BcJ7TCh<`xoap>N1z;RuY3ob%WwyRtUt#Mj@lf;hDqHR?_W^8)Um4DS zvc+$JH#u1DYU`^&41F~}uF==p`Z`9)ab3OEYCblhwl(zUxd~VB;GOyENyZPSF z@4tl)+h~1#9FSUS>!XNdz?CZlYZcyXeS^L+et=SoxoEYeZ^GQ=t{|ghP^SQ?x#s-ANur$2e&+U!Itwb|MaqTpZ?|UA+}zt z@4(hgnX)I$FI(TK?-G>X%>ch=YBHnUZR>mVI#_MCzE`ie^?iJl?$;Y^-KG)UF}hQC z-EcDK<1tok-OfF9s85021-5=bZ$bhX@*p3Php@H!VV0PG(}3qkah{NROwg`Lk>gyW zJC2ehMCr$w4W3Y6g1lQUJnQqjZ?s_nG=hV`GWtnYU)20j&}84M&`}>X0VuT&yX9V;R+f)*P=>Bj<}kP-Gji9dy-{?`Jp-boQ9Pv%)4(@9^@nHRtd(WTxJc1Cx>}60|aKT2DP0>p3gg zq7?2q$NA}K(ME1oEpCb(=R|qz!BuyB-4xfII^6?xJzgoxN~N6;)mNGiAPU#+(+ZhQAoD2ft%O;ab_X6I1sFK@~ksD&8HN zvbD|Sv6iXu3!>K?uhHqKjN?b*I+-nYmlJRomc)~Il^zFk{9hO;-pNEPdkH`NcQg`efe!t<>5qj5I?0eC-Mbn2T@97iqGu@*;~%YpTV6ioV+;FR2eL z&7F^vlc<@(PKhb&s(Ev!I!CRwKH5}UEoc{SUtOjMivSgOl+y^`vbVbec7Ys6W?4k1xL?>6z3f15V=!a5c7857suDLZr7iIse<_Y zBB-RB1$NV-`(F4^Ik9db$GbhzMAG@;+5pQV%-P$y%Uj-_oUG&>Mq&3{?S!+LsOSnO zcF$#RyS8Cz?3gG}#oR`w#2>nQ>{&|+|EKUL-#Oqi0vayh59gfk>>RM@!x=cH&6UBa^*&Gd8=Uubh8OB&q)=or|<@xv_I zSwF&5aIF$YFSE_8hNCZL1$MYPdl7WB7bBnjfR_j(f$z8`pe{bE>tfCL%xFZYI)X$I zt6GKCA!j#6iXLa}Ol1~?1HuwuQLqx^jhsjC(WWN8aUapm#(Q=me*V~np2VkFCR76f zptayj4SvR1$Z*!elHYhzaFYN6^rU?ys)8;>Jyo0$YpOjSdmX8pScfq8dUH?fpFFj^ zYHEd`J$oFao3 z^X<~Y%yvXigHMVz!JXx9oUWQtTF%!;JJ|vg<>Tn|QQ-vgBOrNaTeI3SvZu!+f3M*yBUEwx{~L_8kUn^ z7G1~(8t+O}T3TYbP3CQN(kT_)s4*vQZTJpOj~n;a zqqoQDDGj4>%E6o*_szL;D{Yt)1G=zw@8%l;+|zEDftfzN08kB1aNsmVR2UK5Q^VwW z=hl6BJj5o#3lm+`6l*nM6^uyTxt9`w2;2g3VSxAsH=w9;c3J5Z{+7qo=@qjNE(a2I z8w>G!J-EE<=@%w*&%EoY%X2V?i>Ws$RtLf4n>(YlYAU!4IdOg}n>r0#>Z>T7J_Dc3 zGE56sm59H(hi}gvN><~(ACA5eP45sPObl{Z3pNGQdX*5J{4g>P~R`GVzZs@c@WGZ8O4|@Kqr+L)hpdgp7{e z0pYq=a4;x@CF}J)vruQ*n6UtAW(pjqsOs*dy>5};J;&H|Uo#XSkkdB!4t;!<`6?Sj zW2I9vfT`weN>?ilo&^)c*vYtaC*j%3guB#WF)Sv>(#m&_W9m%`U$n$cX~R2Q*>I@S zV`}YgYj!~fpi=VomLoh}K4f%>2R$Cx4LEoS+0|tf_c$d&BQ-*lfPDRvns{mzhF)W5 z2};>EcaOZIb+c`5mg7@oGX?_6ja*K6hIhbD-L(Q~-6K7@wHfLUthVNOIlicFp6d1o6n#d6P295po@A2wcqWwJ1G3U%P#OrPr#Wv1}5y9Omj>)>ZBM1-43iV zm-EdM`3x}P^Jwf{{3BE1jt4sM3m8JoLv0J&tw|~iIw&PRDL$b;Fi5g9 zP@q4rqP4M+BU7i~D|u65$2A~=h=XrgYvu(`Wjoan$JdN00U5g^Qi`Y6ofQOnwW}>m zY+#Qg*siv5D!V)E+U8_@B|~%EC1aco38z$|z42J4I8_rXPoBj@GxiLZMNAN}(JTCj zkE}FdX4ME%0V=yLgJzuNOw>(rJnz^S6F>9DPYojSa3Er|shYpEjxNoV478bOEM)m3 zCh(UPk>3Xa)57&r_`ypP*=-+oQOguUzvAy>BIMXyhh*0_CtcZdu!qJl@8iWe7u4Vx z&1dn~1vtCCSjU?1Rd>FTWM8H$9?S%s+#(R4zcCxqzv!*_B?A2`i%SIQV3T)EslTwb z!A!Sknwvn^PK=Sep8CXB4}zE*UX0UdFYlte_Tin;WYdZ-@X)mrXw-G4ydDVkC^&CV zZ`Yp2-ab=T2^u6f)Gcy1!kEMCoy8#)G&p7Hooixx7L)?sKV#wiexGrX=XJbc1&iIU z=(D|I^wqdpRqBz%*cnjJh~a^${xYW|=|N;wm#rYj)Yy@#8?T8~^yqYr*MsM|M@)*> zW2*2k1RPv85#9hy2?v&)=v?mFXW(*v1D?8HAvXI6FLh5?&n?Uu$>PIlh~nwenlyWM z+0=>fvG912FUyAm$j@s>}6id_iO-Fk3Zd#*>j(aH2aetD%A4dCECq{5;~985wSg0!SlNOEv3 zr#ZgXd?GT|d?G^7d?LmS^=nKzih791O}sD0JK_fu?@REGfGblMk-drh28@p=7~~6% zeof>zBZc7K#Ct0ZM|!C^4*e`c?PEz{mP9#u8%gACA~|m(sSTv_@;8w0UKA*?9M3G$ zcrL{AP|Bc1)Q1*}5z1DGMGetikG@4HE5Gs(ENw^Ir^VU-a6Q!V?GB;3fmuBUnMCZ3t)+)-%yPtaJcTl#Z61|2p_*HdKAASw%rzw3C z<;=_KyOH`m64o7r0NY|;j_*3v-{pZ4e^{e_81*ex9LNcTtq$-Qt)|kjl@sWoT~HDX z2is}jDjJ%{d2KYPjRu#5!v1h5C(us2cF+(-bJtMsuwQsGRs_VF?e}6ryS35Kl0baG zAbxf#Cln4myqXq<1395FC28TbtYK|5{81WKVu$U`G$U+x(C&iP(;l~=SLX#Cg>I$7 zaGGwT5f~e}xq>=qq@+hFuOvO3zL_$@!Ekyw&6&`O5XQe!^JqD~)pC!p&IvgyO%oU= z*g^T+z5thbXxu@Cf>w#|IWBHNuBQW? zIup5$DVW3s7pO0$3buirVOqthso&6_9G9Lrb#PP%h`pbDQj9$l~Vk2h`qnn$H`^gl(t8 z*Zh`N$ZT|kq`Ay2+ukYUQ*D4p6w@rE&jkFe1Qeb{{pf5OK<7XboJXVS0-8V<(?q(2 z4x-Dcims%2bQLY2YXDQ%(g}1OT3%1*(+zYr-AHS3obIBVXcNjFqc!v_-A=C|_dU9U zw$PpQJ>4aG(>6(aUmQdPUBlS7imgCL{E^Jcizo z$J3i~1-&KDrMKl}^p3oS-jz4g-{jr&ciBe&kel&CZEw&A@&o!veoi0DALtXgmA0q= zeX2&$XKFlst}5wEbvS*cj-s#CVro+j^c|z17(fHD?hJ7*Bw`4Z*h`!z{z5@OcZE0~ zQZs;6_7)e23n?AzKSW%FRi%LnGsPw1QsCs9bd0zR^+H(9U~xHm$;KL|iYt)H!b}#M zdRdrHL|kb~FBZ>=RpKg)*)DE2{bhBmh#3 z^^*Fjc}4&!8lVp0?*{DB#TG4$QSKuwC=%NM{-Vti8-J#eDEJl9`ZpSi7M5tYM8`JT*AfpPJrV!?MhBR>n=rty zGy>0`@iU;k`t%C&|1$gc>lNBYv(OhxhHnSidUZb;cj&|*M8A;S4h75Kxqdgo@<9m8 zhs49KXuc8zX02j)e%6s4bd;q0tfM<9A}Oz+a6K((qv||JNSJ$V6iw%-npo)EXZS0_9Az}Psza#EwB&UqHYbvqA`1T0P;6PqD0AcA{;S+7tJa^6Z z*U%}8-!^JlMZNL{g&~4lArP0YP!O?)p@>xw5V(Vm1J&`mnfmZY2f>ZDh63e62rG0p8`|B|3HbYIWVA?PWXcVh6q zo`&(VaPX0Pfm3e)k3Xaw`j&p8t@zBO7lneV8x}*w?)V%lCWr&v{OQ;>C9(v6&Vg!q zILhlpD>TI%F&#gBhMtEJ|Yv!Xm8q6WC0CxXf9B{TJ)!dK+Tn6 z7rIakr0c{Wx={?KyTz`wK@0)dryk zd8m6hY8{EX)u>yCx~(W*hPub2?#W^=ahllM9F;2}9WMlSJqhFvKvwn>PeCSGR1I8b zq}4DdDuMODJ}BHxN^bx4@SMdx|zs6HSqnBqnPwbJ%J1~(t64=QtLKxLe@zIGN zQKZ}>iWFN`(jcudTud!g>|#;n5XLb^T*OMw(ctPUcw%nqM9j?w zkqdF2U=lbUygr;zdNkS$ji}TUmR>Sz~)>&+c?ABjTEho4w$CZS5z|EA3DX>_afqFaDLu|t!Cmb?JaxL8o4KD}wOB*0D z2ito&^gd`?^Z|X0_pj(X`nQ|E6{U~S%Rn5$c}>Sj&k?(bUByt8Z-sc`a>o>Ymd2n? zIW&gZG*HaJhF4ONsG>2@4=cr7Ivkt31bSk>`DuWz;oVsNOIW!yqXNXtDYdB?VU2Kr_KqB?H!I0Nc3gK$- zLedZM6cE=zjx;emo?`Zn9~GqD5O0F{6V|#ZV{4u9qJgruQ6B}s$n^q7e*ngID7?}f z`nL=e;0uceJl;0o;l3E~NONnUKmM1%4z6RcBi;=L<*$%BM-d(+KO_|4cYgOD1cr1@ z<7#R`x?zxpwgVwQiwhh@;dkZz_*8kXAn(VPz~*-kBTglZYaGdfu!e2!XaHwI19;3x z`jtt)%ou|VCqm&q3Cws3Oz~4;PM=0);&eJ#te_*snNSE;QY)}!83=lkILDyV;ZS4` zh5%%hKR`!f(^+r?sfVM%nEM@_1R^o?mph}+A zL1#-s;+zgT*CfvCpud>J`E7JT2VEG?yvUPzaXj-9Pv)iZ%*#BPmqT^!pevxE!FQ8& zWe2U26xNyWT3m%%?7z8MQbE==g^q(GJ~8CDj)!YI=sMG1*O@vKyxx@F&_OpQhVq4d z@u7U~P+=d2T8*)N>**%5u$y^&pF937oyPA%7xE%**J&w+UI1En!@m?3th<`wj`b<1;4jgPvX6E>zL5ls- zxb+kt^0%IWlo{e(@t$}eY=0uq`UCMHj?L#Vgg!#b2jyao_!ud_N1x)}Sf6tGU|)6( z-lX^hXoWApJD3FtsByH2_G0_wPRAh$&M;29yI>~d7r;olJFEd)_hj9Y0Vf1>ji}Q*g|+)?^{JSGVW)KW`OIDg81Knyf(Hi*$dS{SlJrd zu%0%?+vaiG;;gyt)DB-6(o^9WTSI9`9RQ!=$`0yKXmZ+mdLZ6p=_cAVPvIX}^g%(F z;Nu}St{%p9w8_y&d-L?s8|e|_5H2pkX*LeCvHbaHi68YJW53tqVeKS4;4`AIKQHWW zqbED)DTRJF!+o2C_7WK3guTR<|)b-Ok+F$$=wKXWTkN6ro3iHIbi7opUUZShamVIkBk4@`u z%|8@+TjWgGRPcR#4|FEfu0H1DW_Zv*$CSF8Kb>&KjL%8>Uavl(tA`sZ;i zT#}e9omn#o$NVk4y)EeB>!3(;vGeK{zLVs=p_m8B3@ka52Fq;PTlS^NvOgUvccBGx z5Vhj#_Ix4bT=^_bEPrX@;4e)a{G~>D@NyB?j}yXAdT{?C1F?Sm7KXzN@+%yCHhAhq ziN65Te76G*Q5MO6=c|EfNc;n`*(%6^BxFE?fJ3c&vflGQMDNd2DE~lE?> z#YLF4VawFm)veJFHzKI}DQAD?);TjAGIe%y>x7*;#orEB+TQiApRs#{SJ_;SUN(v<_UWj0**}u;5$BC2+Kp+?|xnrF5A`ePuqFp^$Rr zD0ufqMI0%oiY0QoVWt&uLk||?#g8~Q7S+PIVMq$#hVgUbd=AobZ0t`c z4biD!~gnrdr+9CYof4 zx6@si`UNKdKgHqVz*bC{abQ-#)8x-eUsv!LjmLFWet~ljRlbJCA?rW5cjT=9w9|ia zJB8fA$olwK)6cWkkiWd}5on9}WhN*SHtc!l{?~zO+}O)H z3d$J%E>u0(wt+HaV*;zv(JeCzi-6wdUIYoGnB};?3`s~ieku5@wxfGEk>dM_J$^gs zOkP1y93dKvlLj6@KZ^=l0p$T_vW>=+XeXKVi}es~ou{(i2P9?v3OLHzRyog~^?YR; z{lID+gV3doCb8Gi}wE-$4qxM&+MFNZ+80vvv&S^V+N91_bbGs*;$u?&(P zEMZbXq?mQeWC*$}6QoS0A;qdxnY58&7ATYHNLfIxDY6%YXaGWbADJn8gI#y05i$z` zH3X;10NF?80KpP&4p{9D;t2k!AD2Ee&?jyuXueAyIPwZQ@JF&hDW=XKhdfN2VAx{v zIK+Xw{V`#$f>a2BHtEpi`Lh>m#cAOX=!>j;rldSB)$IeMxP5UAo!ybcJhM*b~PHz+0t7u4J{N6mM$MDg0 ztQ0&Et`S^e!=bu)4P|qSJktQ%sK=~ZVWHq8T*e$)&@TEUbzox|$j7itk5g~?1m(*o z@kg_sqWy4Ne3*Qi7RtZUDe@UQ9q;GK7w8K4B3*-etL3X^*D65m!(bWky>L41MT_JR z>{Sqso@3>1$b;@jcgUeg@xMFdFr@e>++jqnMEOl}I4cJ50$wHeKwE7@V>wydX%Gbx zh-t|Y*bB2AgsZ(#l-^wt=Ot25Ym^|)a=xnXKY8}=SH z?0sz52iUL=v0)!!!#>7_eS!_!f(`o=8}>0a>`QFeKe1sSV8g!s|J8;`{*fFNp-$c(+Mt` z0)w3eU0F3cajM@7zAS{ds8}!$veLQ-_?YB>A^CqqFxF2r1k6+jTWhTRjf&+q0P%J@ zTshav?6$}T+T_au1Lj90aO?*){!1R_(`iZZ-4@P8d}(38h~j4A`+>MX#mG3=W% zroug0x2D)Gz$>_O;N^fjfkUT&Tkic%DW}Z+PF{(xfUj-#?4g_WVldB%or;LyY7>Ye zW7o;{`#85l3=u|{IW3JG)`%&G&~+ z**p*%l z6AYSNf}ULFs2iO68+@Zq=q2uYwd{s`hs)Cvk zk#@4GqO;V&v|1fPx8w63HILS-!{{wFAAgbaaI;P(X3~N}#jbxHooCysXy@Lp%=RDF+2(x5A@BWnc5jykV1)@*-nL?2On%=wpeay6<2Bvmz-x`sxo zC{0ug@mEh58EUbwZ6xkOm|8v>f*TQz@GwS*OBqQs5v~53OBu&2>Y5ZrKkG+&8^9ZD z+eQTzHQ``SQ$K;Yl7E-cUF7BHoXI_|U^9&YJMQkr|7JRAEF9s#VP3y4X|+~5(VIy& zF>YGbK!a2ae`obrvjE3eIxcY%$C<6=lQ_kD=TDOyl!J}H&jq`4oQ-93 zyNtX|VxM`v#Sa_BzKF_Bntk{q+2GRS02Is2&`zfr&d{D=IEVR0Nc>K(+xf%joT)m8 zPe|_$+yc=Ch-ve-QHeWHGmWNQI2V*VxL1cF= z$Mfc*UGDF$g(tmBViidWny(`A&M!4{bIx0CVs5!+MxMKRTr9Do*5=-il~<P8Bxn7gx}ToJ*F#=Xo9I>Og0HIw=uP#Y*$2kXEL=yi(^3;6EfPMOw-bBww$ZAXZ{9X; zPWG3*WL$Dy4&wT84hmDqzYS_Edok}HGO%~Q0l!c`c2la%5P!AFWvhL`RL=P`IM*S{ znNqv5pq54p_j57+)*#;zxMxou0<^+irJS2M#(c%k|N3Q%+3jM^eQpn4< znNgVT%yBlV{SnXvYLGAGq3~7m=V1u1A-D=O!fl3$`3HvKusA_n>&GAVreS*VfnmMf X2R{~=_%Eo3$*A*5sSDJF>Z1P#L2Cky literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/config/DictElementConfig.class b/common-config-starter/target/classes/com/mosty/common/config/config/DictElementConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..d3d332915db521f3a5ec8dc4a39a4bab6a45b82c GIT binary patch literal 8494 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 literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/config/SystemConfig.class b/common-config-starter/target/classes/com/mosty/common/config/config/SystemConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..92a1cc228c28ebcd44841bb9f256723cc68d0e74 GIT binary patch literal 1724 zcmb7EU2hvj6g{(E+gry;95+cZIHaWk{1Inq>jWAnh1PAQN=d026bYV~I2(IgdpGQ^ z3lZW!@XQaOFL@{uxDrSRUW&wT0?L`)B~5IyTJqL`(L`=zCeEK zk$fV}u5{YwPT<*2yCG0`*mnZEXYJa)z1OvFI*uF2z;+#9puXjLZPPzgR}VbdvzX_x zxo1hoHxFbhaJ?f_o&=b?vfHL`1FP2z&j>Hywu0Nk+{~8B=MzL3m@-2vRXl- z{F#7o&kiB}M8@2pV|fCzs-vYLwwN#cJbFI46Uf%%ZFv|HLXm`nH(JuUqmT#~9qD%> zPD$`R7JBgT-u4|Lp`Y?BpZXBUjb=6iH&Tc|X23EDjW z&-<7~nhsgudV!xzT0xtvJcsy!j)vE`rozKX6zFH83wRxGa3>TCT+aso2<_QW@cFU9 zZ(=bHUS}yym8w*Kf;PVNd~_o&tzbn>@tw2P2*fkqNit8fTKOJH{kZx&65k=2IIjMN z#P)J!06pB&N#0-PvaZ+uz(hfRftjbs)(ZLnsqlt=%ruFS{_9ct6A(?jh082HhZQW5 z6OHR4-sV|?GAZC4dOF@^t~sRA#$T99qx3iC($)z)QbFFAjmZ3)4aAjC`d{%WrYg^t>e(cNVVC9>i#Fg|^bbNS2w g6AC0vKFei*$zl1N)?P7&rr~PH(6vz2N~3k)Uq&%qX#fBK literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/constant/enums/DictElementEnum.class b/common-config-starter/target/classes/com/mosty/common/config/constant/enums/DictElementEnum.class new file mode 100644 index 0000000000000000000000000000000000000000..5b67c6de7c769ba6181d0430f6153f6286dde743 GIT binary patch literal 2484 zcmbtVYjYD-7=E@*o0G7m=|X{`C?H5%gos?^QcBY#&_LS6Y+8+|b(?P6h0SisZYp@i z3l+*u9A}(ykQw;^I*tyc12}X*KKs$%VA}F09N%*i#wh&+ndv_JKIb{_d)~|0{_*$S z`vA7#Yacw&{1`&ki$h)v`>_i;e~j>zQT`ZX*v()t9PyKNlv5@{2Sbj*;+D;@mtmaY z7`O5aoeU0x%dG;#K86W~_qcVOp^M=J!~5L&fFZ>2A;U-9`k0}c;S+|F-1?Lu%jvHEHe@slhIUfOjRkt!FWtfOYmgvVO@d}KcY=& zK~u9vgQ}Z1tWiqCGpsvV3Ep)Bp?H6k4z%m=Q`BTaGYh&SVNYw@Q@HVj#d#a!hNbrv zazlDPtqqx!fmirXj7W&LKAue5lOJ4(+gZ&V(DDWkREg%Xv>XMk?=URG?Ub;4ftaz! zkMTIuHb8ZD#|$crPc=p@%`N1~@rDKbExfrURj^zmrwUgVVkt)3%4xC&qc3=YKd^x^h;=Ua_JN7qXB1 zm43Nax-coDldlBEZPRcK8ka=DrR_)Q4$pq``)qOM;rCbPi|1tQRsBhnN3*Pn?&n>W<3wl~jdQxLRWX0cjUS*DF=E3V? z-y6sfHc{L+>F@Ai)Hpcc(4}K|3vUxe=}N~aDf&rmGw@^-U#;R-7Ttk7jRrw1_9%@? zKoCuWQ0kN=%2Giz3u0NlvRqjqh!#Pt^eWFNlnD7)C5Y#k^1QNI5NianHc+p;psW+j zdcnLH@G2XWR>71{(jH*SM&%{JY!aHy0iP07UKY$2!MqaiD_fOqg4r&Z9f3v4s}*Kv zK)y#g)fUm9W;{hSshPSWn$=8w5iM%QTf{0g!-`m=W&%X5Cm^nkfXGb*z9O~|&>(Cl zSX9JLbs7@yNqHJ}pn={Sslox8nkH literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/controller/SysConfigController.class b/common-config-starter/target/classes/com/mosty/common/config/controller/SysConfigController.class new file mode 100644 index 0000000000000000000000000000000000000000..482ae60fd20b6fcbfb4d6d3330086964e29e6af6 GIT binary patch literal 7099 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 XsO$Y!c~qV*-K+|fW!kC%YT*9>x3`b4 literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/controller/SysDictItemController.class b/common-config-starter/target/classes/com/mosty/common/config/controller/SysDictItemController.class new file mode 100644 index 0000000000000000000000000000000000000000..91ba56f8389d7602fe3995cda676bf6fcb0337ed GIT binary patch literal 20282 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 Y-wEw2`M3OrJ-R#H`j2$$KlzRS2B%LsG5`Po literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/controller/SysVersionManageController.class b/common-config-starter/target/classes/com/mosty/common/config/controller/SysVersionManageController.class new file mode 100644 index 0000000000000000000000000000000000000000..1e67af6ee52e0910b3a37879533f4284dabdf00e GIT binary patch literal 7523 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 H#N1y4({Z=3 literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/SysDictItem.class b/common-config-starter/target/classes/com/mosty/common/config/entity/SysDictItem.class new file mode 100644 index 0000000000000000000000000000000000000000..cb227d92e9d0a802dc427f6b6dd8d83388fa0151 GIT binary patch literal 15099 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 G!ruUsoog-t literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/SysVersionManage.class b/common-config-starter/target/classes/com/mosty/common/config/entity/SysVersionManage.class new file mode 100644 index 0000000000000000000000000000000000000000..88a670a2bd74fefae82ee03a80ec2024e6250ac2 GIT binary patch literal 12695 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 literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddSysConfigVO.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddSysConfigVO.class new file mode 100644 index 0000000000000000000000000000000000000000..70ac32ed6e1b140516678fa64b60fbc159c2155c GIT binary patch literal 3591 zcmbVP>vI!T6hAlF&2B$rh<-uGzk|~9-H#&v&h92n+K4Da?mhS1bAIT5i_uFx9_oe)%E=@~;ybn6+*FjITmwg?hC1eI+zQ~1ZQ)n&xQ|AZhZ zJ(P?Ks%#(7j%d+@mg3%*D5HoJDakNq~2{jq?#1%}Ci+w9~Y=Ce!vHP?V%@Sz4biX!hMxXU1+^7=8cD*tv_hubmk`dE@rA z>tkPE7gX17m{IGf*4L+JqT0kk(T!=N!|c@)yE0~4&p3cG&ddTXTnHy<$%7;6GKO?S z<4NTgX!Y@{pq0rLDeqA-48DmrxVQUahCW) z(EPmO?ngIAub(YG4(9=HD33RK;>VJB&;!puE@;66@K!cA1JKt4yuj#}r|(?(iWB}# z&?D|@Y6LCp5LjoV4EsrhQd`#zVr)j)1x;@^QhH}L*`sInXdnSo#f*bs8fb>Kr@*LQ_PBkMqgA1lb}3eMmP5Mb`4tKBh=kHnIL_-y~|>6@)V+KmN9Qe6Zvznob9%@*HR8ytAuEnGw_0_L zSuE?awfLb9E$uW1Zv`F)7{s;IRt_6tzh?Ej{YA6e5Y?{TZ5>+?HsnA?x3UQvN-rV_ zGa}##;Qpn2M5xQmX5#ubgBej(+|m{Nln7e%Z&wa9OfhN=(|lSGrbZrC^00;$2&$R}6XCifK%9;W4_=q^ zRvSa^#R_QYw4Uk})Ko|+?=_x!F}$=}X%W5zHH2c4OmirLAFeuXypQJMhZ163i1lLf z!&cB@i1@OhlbU{|X%Xob%{WKlrie65)j5lBOomA~7Kq4f z6Szf{=cp_qM*;;#VhPrE;{Xj6rcoc zqrH$6%D}H1l1d-oA$$%}kUqwv`aGl%?L!=EXu6{QN#zRdzelqadIA4cagS!ZV(=eC zoQ&^-$AGn%`IgAs0#2^*WpI;o?}(gFPDVU zEMCNZO42KI0FlZlxCY6G0v@CuWZ}nWsDt8=Bs8*xdLhXuZVej3?cg$hL+X7fB$QbQ zloo%o+=t`D+Q*7&l5++*8>v|3nFR{WCM+jwJ!7TVc*4HK23(NYL8pg(&ewJta_+|u HA6esXCPe$n literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddSysDictVO.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddSysDictVO.class new file mode 100644 index 0000000000000000000000000000000000000000..af6fae83562ea04b5cf5d082cce8355cecb731e8 GIT binary patch literal 4520 zcmb7HTXPiG5$@UD*_mC<>arkU1K6@5wyrEzdAsonGg?Ga9|2P+&Hd zNh%Z_I%pm;<7qQH5g&E(c6MSwq1c}3tYc@aF}q-or>$+-Y|b$qJC`je)HP)1;)TQJ z#DtZPn-xub+mt<=OIhjN`P`J1cV^&6J!Gb*ErpEY@6Q>`QhGxp?Vah3PsE{Oqj@mv1k;($SA?fmA3so0>VC9!F(`)s1WCizhDd5yyYW_xB;bMvZqC zaLe(@N|+086i;2P4O3Qj(N&c*E0&+(b7p3ImMO7tX7TmQH{YBq&b_RVkN1Mb-^|_o z!)1>0Zwjpzt41&V8&RO(W;<&;TT$1}t}(FrF;GvTmLWT9jZA08t^8gS%w>M(l4g3$ z%-g({n*nFi29-AsC3Bg0CRcD~K)_5Umt`J4Yfr>2&>x$Ja`A1c)aXp%aXaaZ?Lx)0 z3ClU)HqP?SuBzgfTSowx8|^iK3Ohos3sED1<{Y!M-_48)X*;r^6-r07cQ&5Hmlg;< zYehApbQD8Et`m8fE4zn5l7~U!!-CfH(`FhusX1%c_(3b_40Ih(NXgZ{6;g#B&pDG; z9w%{5*NaCb?C!}$Nx^ZJ6})JY79u*MWFwX(D-O48#S5VjB$5iT&|G)SBVD*+F*53y z$>)a6DYx=?RNc2vPny{sd|_ZG&BCN0512HF`|RE`IJ^TFh8)aWh3T||O?eldIdl!P zh?93XEOotz!oS{)z{v?lAo$VTbUtZ4VKW=ss_C?WUtWVArELb?O&tdH(FTM1S$dd< z1P`03L!k{{jHd=YNBa!=I_)&*TPzLIlLkG-%OM_yc^Kg#O&Nt&)_(!EPuuAf*ECuk zZYS4vi$Q1U91_sm!I^NEzeG`Z$qCsaRpXOF;-o-Qdpq1&=`!dr?Nq3>a;9Jsl5I{+ zS=p3Aebr=^jn&v|GD!4f4ZcL#hK?!W=^lJD@4^!kBp;_8<2_j2OMd*v$D}~(>B|uA zE71Ma32oOPb@Qr+dVyO@zGYMfK&*xMxQNo_a?EkzX=BOv1Fn+@DX=W-d|Y&C6vHgz z_)5w5gM9o$u4UAhSCA#~166J{CF z02CmkJgX|yEu|y2a;RTx3{~#8!58?BaXUP70u;<@_f=BfgW#jbFb3VtHhLVgApo?4 zp1?|BPGhV!{v-L`tutQfX^b}TF!t9Q-|cCP_VF+d)Elq!G)CKb7_0Thou0;MR}bT0 zy>XAHG1}b2SgSXVdm8Ve-O@OL+W5FO-97J<&%0JD1VYw|>&WfJCH@BO@$%zesvqtt z_A}}oPhhEjxXswlUT;6@QvGnhv7c{x`w1@9k7zQ5#=QM#OZCG&$?@Q^$B6Fm1yG9? z)ay=9_eD|zS9<nh=02B39S-h=nIL68$SdDBWM$5?qHRvz^Q3`Y()dB<A& zpsNa&Rp6MgYDs9W3iOgzT1nNK&|Q^YR)KV|TH{TDr^OBAJ^l1HWhsaIsdRy+Ao) literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddVersionManageVO.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/AddVersionManageVO.class new file mode 100644 index 0000000000000000000000000000000000000000..f8d291bf0fce84b2744ddeb1fd3ff2b5dff3e467 GIT binary patch literal 4418 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 F{{scE3grL* literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/DictPage.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/DictPage.class new file mode 100644 index 0000000000000000000000000000000000000000..fca2c5d4c2b270197eca0f104711080b32cbc935 GIT binary patch literal 2584 zcmb7GZBrXn6n<{9o86ENg|yJdqN1Wg5}I03+W>u|V6i}Hsr1F#x`Z`s%?li8b z6P@t~$QM57jM5pMar8@_@i$rPbNB9&0Qo>?n0wAW_c`Z2=jCqr=fB_n05FD!UFgG1 z9KHBhE?4C;Yv7YE=$J8aP0G108s|+cNO|4FqLeq}$xRbWQrMS%XD^C5Ey;AnCsTJ+=vR!xOJ}_$Dn%fY_%@u2ve5Ka# z9_Oi5YE_Ermu@NVR6Uo*javQ+2`}0uhgT*_jwiQ@|FPkbHe$OOgdoKyPM14D9({Wp zTA3so?O`ttAB;Nkl01We0R`?t3YXf0hYVgay6M$avh0ELb<-}hkbUiOudh6Eir)AL z+bwE)`y3nz=rwQ6sS6}!BZgW-(e2yY3@w1lrVXGB2|q$OE0*#Px5*{XE`Bv{uls%H zOd9x%Lsqn_(~>#WHM_B<0&$LJNo?`v?EEyDQ;*f1Mzib*#M=ldUAY)T;YD3bwPwBO z%(!yolHtspk`r#>BnB+>)S7{w_I6POezNcR=HR&iHr z&3xtYitV|L^>VY3cQ!qz+Hm=5xGlNWMtSPai*NQAA|%sYPV{eaRM3CLm;QxW39=o>EZinWqpx z`>@xz#(ZNpUZ-v;00tQx)Y%ZOd!2tl40-o{+kw^yCh@Q%9)ppr>;kRQJbryU!=0?h;eH zE6%%~WHUcP*S52Nq4x*q(e3P?=$+5;)|9`^WS`=w(nw?>$EBc+{*6RhdxqXESfgoe zr-euqbV3q^SX!5u*fXTIkWB08SQ{u=FbGN(%(NjvW&kqMOhnzKZIfCQtzqu*r{cb% zyxZ0%d;zDKP#?a>dmQix({pi#wkZECDB^u;8g5{QyVLxMzm1FdfLaV2M1M%lz;}F4 zA5k-LmUrfmG|Yd|ZQxw|Irm)7d3;ESjVZ>Sb#pwO8XM94N9OxNe3%TD)Flk=#t3Lfd D{JP~j literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditDictItemVO.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditDictItemVO.class new file mode 100644 index 0000000000000000000000000000000000000000..354ea1c67c664a05869c84a13edf7641b99da05b GIT binary patch literal 4607 zcmbtWTW}j!8UEI~>`GqQvTVl{O=;3P;A@qHa;cmIk~(P(wiA-zl5ndmZR|~Taiw({ zr$AdmDZS*<3k`&}Fu;()1Spg`nZ$JHOPS%BCwO8ePRLUqc_EbV-?OqLd&`(GWB=#d z|8~xQJ4b*1_ocT1+>O_wSdT{|h~Vo&z9HnBLLL+HxR57=d`rjiDA#Wbc~XqNBj_n1 z-xcz-kY|KEE95y*IicfZ6dicfz$sZz3whqa3kF^^@REV=8F<;i83W%J$q#g#)zD<; zG{i>_XO3i2`Al&tHCif84QWX3oh>?c!J4ou_GI4LUM!ZJjANII6%8M8)sLo*Wb$^- zWu~$eIOU98bSkOwk~2P=&(n!suqu_zl%=8L%EimqU;4G3yK?cwKaT(5%Ee39esM`d z@2Fi$RUXMqOKD-eC72`i%*}p z{_0QOTX=5qaS_wSuY_-OFTXXdShS*7$5;(kk!I zuqqN-DVxbpWXiUDd(5CSZL>_9N3*3us!*ypbF5FHP%2894%t&Fi=`#=NGY{5XFJ1o z)){fE!o+UL@|5L_uq6^by>;PuO`%hG&`oJagLo;aNwGS#qYWGDlH*qFaXDa5*lFxJ)%9QN>mt zRe?mgB#;l~MyA4ZBTzAAEIg(_kI8gYnS_cdo$fIO#`Zax>_cOj8Ml3T^SKw3kQnA0s9{D<}^J(^b2yRR}v~?R-v(oM=3JkDc3U z;)i%e$g9l$z&c6JRu2`jM4^Foxq@0}=DhW&S|^Wj)p|`F#W3H9+ODd(nEK4jj8$Yy z4c2$%(rncX8ji_Jra`~j#dY)EsL!V@!hb+VlN5opn_nGVH-N8E1s_EZL2m_p=%*wG ztsOO4lN60|F>2=O>E1?9uMG)Ol_xT;sCEjc^GcsAb9~k1^>jCh=P1W|B5dYg*ZNc z!B>dFd`REISBZ3#@f&=N$iVYBjR%P$ID==9A&O$2@AD*4GZtVWOJw42e42AaG5no- zT0||py4T|nQL7flt(YQ;W12BMfLnCqUue-`-@qCjhxun{H^_Bia z4Oe6=iP*TxDv^%3BKE9j6>&vt{hQ~I3eHPG0B@s+5Z@gaqIC3PikRk&5~T7`KF kbtP_7xJ_(7tZ+j3x0B3co&UqFexl{P7Sk~2&f>BE06|-HQ~&?~ literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditPositionVO.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditPositionVO.class new file mode 100644 index 0000000000000000000000000000000000000000..657265bd2f24060db330a3419e6414db61a3e00e GIT binary patch literal 3840 zcmbtWYmXb%8GerK@yy!e&Ei}Q0Ycf5y<(cun>PUxvY}~rHz7&4KyS=?2k#`d$JpbA zq!$Pvs9Hr(sRF5=`k^9JN~^TAOBC+?01|(IAJ7ef|4>Swcg}ci?~X(YlJ(Ae&ig#? zd2e&ZAN=?7TLA9FGa1}~$^c9(iSR_66md#K)kH1BXI+FZ(1vJ_ifD>xi3r5dHnE(+ z5GocPljq|iPFpx*;pY~9Vd0k+ekFTPn0Qhl;Vmi*&75?WonqCgSBf)!y)vaxIM%KQ zUd^5NTHZp{-CwW!ffIOsy`^wl2!Fh|>{PwQaI;vZA!s^YJ!lo@{9vwKtAQ2@Mir*w|cbc zH{51$n$8R!*QP6L_0sE~{Qj>J_l^BQo;cm;57cV-t>9kzQONhCcsyu&VUoK)H<9UD zBRqVEj{oW#FJArQ+5Q~tUK7KUGv}Nd&x}Y{UO0F4{KZ(3Hbta^ZmX;ix%=q(=Rbb? zBKxy&Mj?IWPtSey>MKh4^-w%|5TIBb?=>zAGCywmh# z9c`w9C6C?PGgJ0!#TuhL&9>EQeqFlvh*v4P>^L`<{o?eZ7aa9lo-};^h!nr#28UVk z{K#leA){Hz(nxev=`DSbwOV&Tx-^}Y&RM)4V4g-xpK@?y{UM`YBlkJ>of}M zOSz3Qi4KV};Yu<|yN|Y=DyzM<_tYZ`C*5)|HTsZ(^805pGO-4Ju;e!R?nt+WWy-B^ zCscFcrc9Xb{Gc{oT z`n2Rp?2^-3(lK!~4>OIU#}3a|0w& zF}f=$2Uo_#u7xvvs!2Pxh-=uD90KSE9bERZjDErC(K;q&$^0rtq2P}r1Tu;6}mdwG7A*a@pZ;B;zpkv6! zdh#u?WWES7Z0PeC%Zy zsSD%p!u$h_wv;Xy zf=R!J{CVUGMj_n;vP&jGcF8K30Ar)CH83%2$OGaqo zB!ncZV028mQaUuH*G!xb%^ED3p^2jrvCPo4Grp0>beK^xN&Ff=#!r}pfoJhkY6+J9 zEPloWleiU2c$iv>U+q~q)C^W`4;HAU5nwyY)XcCg|3>CBZlu^2rPvB6^%-4s*9qC! z3Znz)U{d{C5iH#U>mt|hMqsla+{MQjB8s(v(q+ZlNMxD#2SRro%Pf_A;bvaP(1Wkx zx_o{Go2Bt9*plC>^(-IxZCd9WwmH9D>p9VPXnj!h0>uihkH5I}hjJ!rnc`a`Q~JpN E01CPWbpQYW literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditSysConfigVO.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditSysConfigVO.class new file mode 100644 index 0000000000000000000000000000000000000000..e21e1e0c9548d70432abf816b6b7a8905446f195 GIT binary patch literal 3958 zcmbVOYi}IY8GdGWW@mQ2cFe|3vLVnw)8H#hAoQ|MXp`VjgYBeoa2tAKygS(A?CvZ( zvj)32DAxuefmEqdzqFOArj=3(P3zDED%wg^?bm+b2Qwo_D%AWxo#Q79%hLgljRAqTwmYOWCES`>f3OXDEE3!Y4qVP#Us|MEO@Err+ zmHm4LzAyU^3_KqEs*Q(iOY2K>2wo`d{>V5^v zg9>_&IThD4E8e_Ws$1H>{&Ckszwf#CZwg{|kxtXg=8BmsnU%%dv{PA}P>?-UuXuLZ znzvnhp=2GYR2YWT(NeH` z^U~GLt3Uhjx$~QEzh)P&y?OqFXWqW{=9SIgTv0GQZ96&l33GALs^!eqmvTp{_KZ`s zN+)Yh)v9@`45{&>bq2hpGr!ZT)y^E%>RP#=Ak$XaoL95`+U~e+{*&dZ|FvB~!W*xg z-@Nd8XVU3*m4bM6ZCSx!ApG#huXP$Hn{wZBt!cUO)LW63lyf!=TNA6OExEW&vd~l=gN-j zt#V}LvQv@CJ!UWFEKZxk6(=`Yw7t1imxQ5w{)F^=(ekE9lg!X?TRTId=v1Ecdp*#h zZgxB28?ZS6U`Z11sO)YKcXFsZ?C>YbQ)j#&l?U1*hM9b_m;=`mb42YZx#KFM` z6-+DHkP|n=Os**=4q^+J!q@_P=RC7;cE+sw1mSza2ZRO%voa~Q5H6YSQou11Zi=a% zJT)~l$y$gLHOsA+JaW-bRNEKirE+H;vhfq~ee$8yoKvqAtmC$DbD)b{cgnk?;I`{M z03_kA_b*@FIQR4RcVy#tfBN8!U!?JQd?Ah7@#!>1F_y+%vfLxfXECN=XX|YX=5@4g zmx|K#?OoXn*~Pc!E&VCPSv#V?M& zgPk*D%x0H=l(c5Yxa8IGzoRFszKfeKAU&Q{*O6^l^yM|0^yL#-O>7eHB69(~SuLAr zGwRRlH0sYASzU~b&`8f3ZAO`Vl17<)Dw`CeRA`jUvc~4;2J$^L8px-!Jz|s&jffgX z>P40oZ+kEXeEvThl-wlndpL=&upxu^D^Bqdk%#sY<|vEv<@zm76REr-ui#-KjUzmV zd7=bLIE$|m>8QcN*N6G;-1*rDUw{AVa1VOIc?*N04uKW!nS1av#3A*tKl(lW6H6St(LZ_t`uI9_KPvLRyef*U8fpxoL!j!qMPYap-tDpDi#(tXvQ=s}(e(hQ4<<3$uuWDy#k=QxTiBZa5&7z>Q^ z_j3u0L@Eb7Lo9yUkbAu%$pL0rS~K0hLXQ_6rCmX>Cd@6_uOaOLEJ8gx$M= z#1AYLP_VQpQpRyc862uJRdA5BwDs#3oZ(0P#TkEcCTZk%QlGpL5Q>|F28G2XH6O#&IL&V%Ul&WO!1Bc^MXD___?=F!0SdOw5`1mdsDZDg3se z6DFRP#Yq$2k@*=D&&vFqiSNq%JrmE%{DO(^i~T7BFUtC~eDsVAFB$lOfgfsUtJr17 z%1_$mic=~+II>@Z_JD@uzEZK`T19u#%2#duuV+HGGs-=ZJzm)={YO!brH#MW7qhWg!ZrSlRm{|VR z+2v<0u3UL#`Sb-1G%aK`_|oMwr&i9r#p>h=HQCbT*H?aag0k89n(XQeS3daZ+muZ$ zXoxQV{JE=d|AJtbQ*_*WG=zKmCK-AkccP(n)G6BI)xwlrK4P(?l2<9qR#|Kq*S;{~ z&N!^`U8C7jAzdg{+<6waP$(6p#*aGFX`6kaaITa-kaOIL`O1DL>yEf~Ve+6!ReIGMpgAr9y zBaJcroc_P4-cA_b+X-iHC!A#`rdv|qV8iUkt5%*>?`q88;M8$D>kjuF;}I$~v&dJm z93^+gE|clfwH`T3rYG@W%o8dO#+6ttRuz(7O(6>vMo8y}5vYX1I$tPI359mPP+)Sx zwX%T03$>*dYUF*{6b#l8Cco{!R zU=Q{RdWB^i+%CJMVjp-_ddotV%LB612e;=6T-@s~X6L!M&tFU}aB;sZw7vwsDBzBd zab^>E6cY&?mSGyat=j5)QZ(c3>4|t%PI#BQv!L#es5Lul7jqhh8fjZQIQ2M9wPCrN z>{n^taGsm(aWkKq8=>JQ7)0B-*06)GUI@4FpB>`(39dJD?xn7;f_@AT3|26Nozx_u zb)v2dNk^#{rxwn>?I-EaF0WVIK?OU%UU3%{WW##JXQ&`U)+_EtJB6ec$6fqHIKWw7>)adYOwtE9N7p(J1UmDO1UMUOop%O0kKh5{d6?x5vB*aMz&i-_ zuXR_=+M-PSX3^N=r}X#>7!3*(-f$qrSq)>sfg&3Yq&Ti&JUEcP;Xvw4XgC-gD7xW5 z>I`W(6dcIda3FQ&G`SA_Vn5A>$N@Wg8RkP55bKC9qNRTkiA5wkHYwc7siRHdcEKGA zcM9IDaF^gM3U>>>j>95S!8A~3_Gszu6{*0DXXLt-cuS;V$gi`I-zlh#Z$rHf7UJ#?HyGNq@Y z4My!5gGTKcGi8X8=^Gg-v%#n{6QfaQCZ39kQQS9*rC6@o=eja2H0sJEQY~VX@QsKX zjJh*P8g*wjrIKQ_$u~--SZoz3a-RDSH{5fb-pPAa)uncHuHgtCWYxN`f=S+eA@tyH z_!4Dd-tT|GQKAT+!*}oykmV5uybC&gaD`Dbb$;yMLm{}W{1 ze06<>-pyI=6du&+%B-nKI(lsjroh8$2mU_8cpVOobALKsWBZPChjILb?G*~#f|Do^MM$0* z6p3^aVGJdrC|thevqT0?qZ^MCnbJmW2NEAq5MdiNjje;GeZ*k(bw~tV&{qvsZ6eJg z-z?f-R<~R$^^J{YY^Nj94V7@-sO|{hy9~Ro6XaWd`1;4u4-6lgfyW8Cf zB=}J(wtTb*C@mEgp{+nGNUJtPnri)FJ;$FO&++*2$0M86U;OqQD?absne6Olu<;zv z$+`2~`##Tm-+Sk|cQ(KK_qAUV(MRY?ggWSOm?Ct9n`gLrmYbv8e2bf7+#KiTgi7Cz z;Q1YHPO|bjM$dC|ikla>`7Sr7x%nP9-)G(rR5}x(1$0=WAM*1oH|I2ZQKOeMdRe0% zX>?wr3mRS2=oJpWs?v`I1_^SPl_g7mGUIm;Z$>@Z8_U^cTZ zm&;p8%gpCWg6_2GV~IVsRZ3tUF7!hLUp0Red&>uptxsw+pMB#FEA?8l#d^sx$v5xyWV$AeIo_CjzwN! z^>Q#@c1%!_JL_a7(s zGwWBU?w-EN=P2K4pS(I1 zPq`Ex;mVZ`S!i7cSEhEjWoTAjzICj0TYj{d%4{(0Gg4*pm3&!8=|OrZN_WtmQA*I= zQG99cjnc;$8QiSl=HuL~qk9GM@%dj4Qk2FBb9{MY_0vF zjhpQp7$+=dVdYCAm$H7;%%<5Z%~gx&G}CLMbcrr=^Al`BPdo408V6;^fWkb+JLirL z4ok$l2c-10+fVT14q{9!kJ8gLfNxr*5NTVyr(~g!$-%5Eyr;-LXP%>3RXOgID!zL@ zZpo*m_$YVaZ)2wnCt3BCfV*xhZ+-z%+ z2S%J5cmM&Ib8cWgwP6tcM%#zd5_k$cm9DEKUIz%!2DBl2Fh-vMj!FW3k~X3z*tlq` z#XqOOYc=9FUopJyBd)6z>%L-~5g&1|R=m_#jI-q7HG422#u~sWy=_|(F;Uf;$ihF&t_6L;KTl}BdH5ROdcNqNN1bmT zc{2$5l7Aj;zIo(DBIwKh`y8Hc9(nHw{1 z)crO^270#qoIJ(XoPfyIiYtbet{Zv zMGtvMO@<0mlcDJY9fXGr}OnjEEj)Qp6#J^@xYmY}A9)Y(({XCPf_*kcSjE z8bFF0jd}x<8XZ!D-smB<7)>Cx7%{zxNim1iq{lp@R-+lDRwJ%AGb!$nn)SF#3SPoV ztebO7zb$vzJ%3^Y4N?mG-zIt~jhj0_9by?}FjhxhVhKG86vVl|Nkc#iZkd15Fi?oH z^k*`GR4URRXg82XC+H1&3@A*e=n5Dqe1<3JIE?_+(-a+{98i@00#+WVf&PZM3P6qc zx@@4wfto~!9zf0%#l#)>ke7g(MK>)b3n)&bSl1veR<(aoqe^?;qXjDM#h)hLqeT*i z{|^wW#_uobOu8RWzS$JEBya58&!4>56nA5>RcVyV2NyreWSY8V(A7iz*VwAn!8Nvx zm&8^L!^B#w`vR#eCaCQZ9&a>)9MFSKL}P2qP?Mq9A-LKWX}aQuVn)agg=RzWx>PkA zsvUyO9hK^a;)Z62wAm2MFI6o@*bc$>jw!h*Kmi!#_w;q_SRLI?zn~|8g0z;-(0(8Vm-+#E5-0={4AVD&R5}JT9sttl zRs1gdCQz7uLksCCpa|PU{FGuhF%X1Jgn%_jh?|(8(hu-J8!0ZqNatfSK_7@OmKay39$zAH6OZ2}F>Xse{y~YG8GlG(T#$Oa hUE&tTOC@e)?K0pAy1n*?kM{>|!SS%5gZ4de=s&**9Af|g literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditVersionManageVO.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/EditVersionManageVO.class new file mode 100644 index 0000000000000000000000000000000000000000..5c9164cc391591c77d009964ef8d000ea4225a60 GIT binary patch literal 4425 zcmbtWTW}ml6+OM$*_qv))zh-PwqxW(5IwUH5<*6{!OujAWE;y7P6&{ZG?vC$?JB#o zPHf&W3h5PkN^7RZvfnZ7gE@UN)nrKQVx&H;R!jMlEY~^d`ZWbQ!r35@D(|KHAUsu zr1W(I-;j$Z4V;nlHw}DC&QBS5TF%cHcvjA54SZYTzoX+hx&E&F=s7u@*Kt9|_XOI@ zPRX_NQ%iA>|3HYI;FK~nPKFrV z&;Y7&*h<*pFne37xJdpae0P|$Bozk&o@73INRL)ld5!fqr!{cHd(ALrcsuupV+Xsr z@#w9L-oV0{$>V2h*%n+#v$i*3F#++FR;*r4)34Sm(2Pz}0vAJ))C0jxon_F>h2 zGF71JQY9(-Do9d_nMu!{d33^F^qYm38gDTIX6(X#NeabzyF9P@jm@j_BEuc_f_+1>63}1CX1EQjB~)1eY`265pRz7 zcJr}exA7ubdH$WX_ucZV@4WZ=B@=hylO{flkC+(3u!-A{Gx0GgeOwNAVpyQ3ejlqk z*;8@zv+}TeB9iNOXLp+TKAtzR3!jqG56JCsZ=DaCKaJf2t;4+`TBzNFy}mZY4z>Fv zHaXm@NTOoDRA|G!)2F#OAQxi5#9=Aic|#YQ2?s|^d`1q(!7I1DzGGG3d@_6$pPEVk zNpnxDYc^poE;F{sppwPK z@owfNza}_qgKtB;?k8?>O!&$!j8Zlg06VagD1ty|1($*bF^@PB| z=s<~e2U0yGa40&EzV1M(=Y+iU0*;>Kfyf3sb`8dZZzI{6T0(ko3FZ&pl-{|rX|P> zK$JqD9xFpokJXyZNKk74%4A8liWI-f{kNcg&u#EK?}v()TI*cLB#x4`Zmi+~-hDCj z;m??&u7!8_pYT~qaomHqaEy}1a()#LQc56?^LU7ojuOt|bCe8Rz@vDWQW6*Ws(qeP z3QK$?zd$LCU-9MrA|(@l;S=%*r40UxEwCxIVw(AmqgywwqgBVu``D;smVbtLADfhz z{GUYT&6hQ((7QRydqtC_AgPJ1p+?;*T8$cwgh*cqu18x5_nkcAlPRMeujCt+@FR^I6*1KLwk`2DNEoMoZ&&s z64*u50ws;dKY;?J1U%f1A|)N?(1S%vhCD`bGt3XDi1QeQ;L$;d4;ZYzj!8u~v?`#A zi8rbOSRw?gBb&7WSZ@T^@ezi=#aQD~_lmX!j>#y;y6=B9)153o=2u~<_RFcvGvF^L F@87C(j~f60 literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/SysDictItemVO.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/SysDictItemVO.class new file mode 100644 index 0000000000000000000000000000000000000000..3265475a6ee84b70379f84821f5b7156bb16d58d GIT binary patch literal 6082 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 literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/SysDictVO.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/SysDictVO.class new file mode 100644 index 0000000000000000000000000000000000000000..0d0a8116745f1363b10e365b5ab928df70396191 GIT binary patch literal 5188 zcmb_eYjjjs75>gV?@Vrz$>c!?s8UF49;8!ht@Z}6K#5YrLsFyQtCM7!TsoOaXC^@K z)mmF976GNDqE@JtU`t2fWXk3TLM&|my^Eh~Qeo;#VzmO#9~KRFfu-@5ZCK>CLJi|ZD(4u^vcQ76BkRzj$EC7-Jxdo zD>PS8w`7ZH&dbnuUwQ7e(y_BwP9HD*;sxz@ZT8ffzdicc<%>sXyEc2Mbm-*Y&z!q9 z`_zg%sn$$|(1DSueVHLHL3>@kc&c>x%+)t8l@7h^%sDis;I8EA?6ak#7pR?@8ag1_ z*=MevICtgr!P3DenLW{kN-rL~@{@A}YwfIET(98o=p3ZWCgwt+vER<7w@r=@rSlJ@ zm`d4sZa9@0OyzBPc9ntRn9bbwEdCUEf(mt`Y3Dd~$;3N4YpQ~j%?p(8u2h0D70+*O zlInU1)41C?*Ou~h^G{Y2m(QG*fLA#vX%lsRe@475qP=dUC~tYKPpI$GTctFuvINIu%C8Rc{cCE^5e6XIYe zAw+IMh$JDQ^dpn042x&pT-%5Cq=$>Wox2rOZvJ(1P25DTIF`;U)JyTTS6WYlqpwng zHG%szToYl$QR>?q)oT4vHpuSg4DwLtdgwiwWgq=m_L5D`dC7w|=nLo?^n+fN+(CC$ z0_z8gso{sWrY4+=#RjhX>ToK%S<*!ASgJ6l?05c5D({2t@8>`XI?B1=Wwm_DoFDBvC}>8evUpl;I8gB;gf3dR~@*nmNw0Bt3`@I-UM4hzjr+@oI&3|g-_yBUU348jiaxt!Y=IgiW6LH9DTbLKJC4p z&|>50W}xsH?>OPb#?ie);j`XxjK#*$tw!N<-f<#}jiWo0l2?$aH2oIgbS9w$&6?pyxNJO9b9V(=^PUL|_K>Wk!P)B&ER$ zC4#~Uy^Z)Z>J!04sEX8Rg-L3(j6_&ShD!=3j4D#hijWkuqKSx*qAn?th*puBtU8jK zEHhCjB-14kRgvOWJxOt^AyF@+2A5QyXs9AJTa6?&Td_o=kYX;WF%hdGwOCCgwOH{) zlaS&rsVNaJlLF^GZ{}M%!{wW)`jEm9^WUo0V3@t#hjz6RBh>lPrIsU26kwyij)#bX z{5be0Mu|em;7=GM3L}r-!zMCt9B*O|Q3NOP8XhK!Vg|>^9pYPY7KbrTWa7`XWr^zX zSI&?lYT)~)4--Uz+oqX9legioU@Lh#?VhEryh~HZ@v7$Hc03oQy=UY>HVS#}t|~ zvDUR$lNEMMEOXZ@TsFlm!!a3iCKkW;YPKSdiFNOKMarfYE9#h{b0*#fdM)=Zy9vE- zH#>g(5eM)EW+jL};EO~)7RvANC1%WzRrndcOcdbv$@BOMQIO5}aXd;C;_;8+F`_Vz zvKYTgWZ)%!NjuJq)gkvB0I`-&OJtPA-row$UyT^Fzt@w$7#TQCSaw}us-bo#)-{{Y=&_W}R_ literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/entity/vo/VersionManagePage.class b/common-config-starter/target/classes/com/mosty/common/config/entity/vo/VersionManagePage.class new file mode 100644 index 0000000000000000000000000000000000000000..2d12d67b81409ae631963978a3bdba7c45237116 GIT binary patch literal 2583 zcmbVMT~ixX7=BK&n_cn&;VW${RjR0vghpGcZ34A|V6i}HLA0HYx`Y+BCcBv3pv-vX zpXiJ~KyJ9u8HE|0arCCn_?xWtIlEiP*F~o@$$8)Ne(iIf_dVyI|9<-ez!dJqF@)J3 zq%kL#59BhhVId9`vpPPM@@AaIMI9eWc}vHVl*>9+r1Q3hRk^Yj;dQE$)#SojeY|FbY z5FMY`5K!ivEr#_iS+=>-sBN0{bz`$i%fOOTF{&Fz-IDvzsCYY;D{y70;?#;Y$MyD$ z)M}1RVSj0D7fsuhZq{4=yr@j8P;)*gw&IPo|1Ymmm~Cb=OO6+)JgX_^1-*n9KY4WZ#~NAeuSzV=Kn(a2dL4*{GUiK z7x>kFf1Ar6V<6B7WTn8Rq)h&eL{@o>{sSZ@v&zwFM53fJBvFcGRT&d|jDZ8BvT8Qg z6qG7y3`&*stR{o>Fi6YtAi=kkLqdz^mKQ>mW7R|#6e7xEPf%80AXi!uB2ba`5t8A+FS zc((_?n2}?!BDdsTPv;MyO&*2zL`jj3tP*;3*^wY6RZ@Kyo8c$vS=D!qbm#Ya@aYg> z6c12BnZQ)s$27GFU#DA`A?PTfU&3{23U2a^dXJjwGx!Z+Pf4yq28AGL5aKDrPxldN e7>4>R;8~2)Y6`<*O<|{z?N$a8<_(|q_x}g=V)DiS literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/mapper/SysConfigMapper.class b/common-config-starter/target/classes/com/mosty/common/config/mapper/SysConfigMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..846cc0635f8f4bc54305210d6410c2bff9694110 GIT binary patch literal 331 zcmb7AIS#@w5FB%vKtsVha6=bF0TLC6A}?@)i5$gt6gx=y8U+vFQ3%H%3PeM(yQ95k zcJGht4ZsppiZMk*F(HT&nQQKvS`e6h!7rSZT<7eV79w-;J~N7?+$ec64O4B(owQZi zSeBVuFvY7%)NI48I0U!~1Ik#}`VOUx_CcRz&V+W-CzIB0Ln21anJ^=|TXjcFL literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/mapper/SysDictItemMapper.class b/common-config-starter/target/classes/com/mosty/common/config/mapper/SysDictItemMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..4b64870bb7e7628764ccec37521ef8fae175576f GIT binary patch literal 337 zcmb7=I}XAy42J*kDvyPUV-NvUENl(DY#6G|EFgFeWF3hksXMx|X!?$%DIa2^u$BU9vD ztYqo|MsMBczHvoFFsU$pZG8cJ=?I3Ow-8iB{~XgHAZU1N`nSPnt=hNIsblZ})w^nx literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/mapper/SysDictMapper.class b/common-config-starter/target/classes/com/mosty/common/config/mapper/SysDictMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..376d45571440717df48ea5d1ef401172a01a2fea GIT binary patch literal 325 zcmb7AyAFad6g~BY;9~p^V;47!gE3AR2fm!_E?PPfA zz#kBg4;)ifw{bf^~w8z`9Viq0l)NxMf$mk!;A+@?2iI3TakZElaXmU2G?H zUs6!MZ8|S2>sV@PTXyn9p7XIij0@WO&_{*V*2H2yR4v&A6^BLd-`RO(O-_btPLHX; zrm&r>_)RsD;(03hb$%Jx1oi{aoc|xn{IbAqdYZrh_@CRB0s;>)7V(RS-Q$>_upDdh E1DBw1_W%F@ literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/service/SysConfigService.class b/common-config-starter/target/classes/com/mosty/common/config/service/SysConfigService.class new file mode 100644 index 0000000000000000000000000000000000000000..8aaab3636f292b5976c573b5c512c208728bf8ae GIT binary patch literal 732 zcmcIi%}N6?5T4Z9wLfYvzJp$jptltd6@_Az-|D00qipvS#lON`>mSm!xe%4quZ zgG@PUC&^hFepx%Jgz%^ikA+ckVG6E%ES$8DSz#$HN3PI`g>ZsT>u?7BNTyo2BBy50 z|Jv;QHztv{4U_O9WH3z8%{5N^4SELmYetKO#Yzn8gmxrHp=>J!rCbqg)%ZcY@0JYg zY$-~?Goe#HkC(KBaI={BN2azfA1g~XA3pn_ir!96|jl|$& z(+zw!U(I7MUM0iew5qc9G&Zy8F<{W4w?&uQ=`!fTHlbdHARxR0{n~Ck0~pq5^a1QB B^I`x1 literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/service/SysDictItemService.class b/common-config-starter/target/classes/com/mosty/common/config/service/SysDictItemService.class new file mode 100644 index 0000000000000000000000000000000000000000..175fc50ae78925c8a9464040a529151178802a57 GIT binary patch literal 464 zcmb7BO-lnY5Pef?*VYfb^)KkffO=aI1Q7~_9s;G;Y&I?_n?yF*#rN2wdlMXVdHezAy_Mbo literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/service/SysDictService.class b/common-config-starter/target/classes/com/mosty/common/config/service/SysDictService.class new file mode 100644 index 0000000000000000000000000000000000000000..86076859cb00938aaac1735c7ee3b32e7e4cc2c0 GIT binary patch literal 599 zcmcIiu};H447E#XXekJZpMa$vU<+bE2&qz~B4uT{q$av5cL%vkM1FveV&DV#D1?)i z0Yrot7_57?Y(GEy-riqc0pJ`CBiN5%8o>d=)N{dExN2@y&IorWi_94^&WDBs8E56O z_c|xGK})c9bgi?{rpKpUa;lusD_4SC6nQxRw^i(cj*Y@MCVq8suZf{ zf26wjO-0i9Rz-XnBRnqFs#a7eo6|B~%QoVEUHlZ-dM#`5T-G{cnkO6ZC(cRYsxspn zUC1Vmx6^DJ&DwDgW_^eFB>q~3aP(aU!dctn$NTi_7$G1G#CGJf;1FR5yW)++8$cws KL3=RnB9jmC<;6V! literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/service/SysVersionManageService.class b/common-config-starter/target/classes/com/mosty/common/config/service/SysVersionManageService.class new file mode 100644 index 0000000000000000000000000000000000000000..cbf9c5cefadb8381908fd80b55ecb4f81de9e9e0 GIT binary patch literal 653 zcmcgq%}T>S5T32Iv9*d1-~;HzIVgCDc<>+;S`-4_C+QfrWOpUI3C1V!Sv>dvK9o2~ z^5!+!J4H?wc=FRuV_2Ky20Mlg+FPr=l4!CAO!ZYgI4d^FFTLF0UAP$J{3 zID4;iWE->;YlnASdhP6jtYBJPeB7Z@az-y*g{Da9=L*oO@#_h+h#u=vtQy!fr5e9mV7ZaR4{~X R$wrb5AQD?gJ237llMkS&+jRf{ literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/service/impl/SysConfigServiceImpl.class b/common-config-starter/target/classes/com/mosty/common/config/service/impl/SysConfigServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..dde35e728a512220e1570116f5354c76132be8b0 GIT binary patch literal 6128 zcmcIoX>`=q75?N+<3V6EEGcV%81M$dCMi$@4R)Y$v4LQg0BwjoBW&3kX&7k?cK4)B z)1)n=TS`mXbWPf{DQUqZrcG$trfrfg>Avs#{wwG7bUFQ=q?wWJ84olkbB^>Dy?fui z_uc#5`{v32jy($CYWzb+A_@t56i3h(ML&!fKiFa}CFYLC*t26OgB#`gjEtdan1*9A zjz=*adJN@wO*LMN*NNdRF;s}*>+uHhx=qF#1=Z~`-W0_((5pGPBZ@om<|y8Rw?=S6 zv?n9DOH95^yxtzcJEC|ePKv?1BDh<$?~dSH?evyQsOYd0+^43?u=E|7WUrpyqxG7ciFMg=&D^J@4KWTT zE8Kp=k4f1Lw&kcEp?X7zoMOx!ui$VhtEBN<7;h}4Rqn{!HdBb{J+2lXq`!CuW}HZrbaB~6CdNoHE9`3lB<*K@sNjiaZl4L7~fqxc? zh~Uuk=Am&?n&TX^(}^y9NH-;1J=wOUca%_WTQp_kWMWDxVzI!^RT~YTR_Wz ztVjqq?2|BWcZR{4)b|;V!Qk0qS+>hKq+uj1>l)C8G__aP=$IYCR_RRKwbQ%OHZj9B zbcb$HIi#5x3O%bXp);fm%``^zE-l%c(CQ?ttM_@Bn$@Qo){s4@s|+!JRl;9JOMClx zYj*Yy5L3vv%Jg_hxGMCu7zY{mOPJ$R)P-TGu2sUdzF~?Z4Xrdq_z5e?$FiYZaFZ4Z zR&nbW#E9n-xNSnDf`Y7(@KkZm`f*pc9GgLi&oC~M`gy{v* z9y^nc>)Q;0^YbPy5GcJ`_>P47E<4?)I;pf_^&LrTNu9wss5-8m)@_%7DZEa=J$bf? zO!t3!gMwZ7n2e7rcmStmd_ut|@t}m-cH4Ft9$Knfcl+&xQ&WXc)#41BhiY+1!Kd*V z1!r+i!6;61_B@}5#q=Wz#&AKx>dQ;N3OSR(WJMF4H+cH*M;GT@{DfqtNP|56V4lDS97_0~bSpZT6a7)1taazHT1j+3B@PZy! zxF+3i&baAL%hmhzH0PJ)L9o*_^*+tqlJ3hSX_BqS<9bTSCSh@>MZ7fAm~eI6Jv>5tFrlPI21FS%l8h_(37(L!p_uK*V?wst3&KW3+EkHK8d?HxDU?sM zJ5LO6##P=XzWu0Cy+FU_Vpr zX0L0QOn_0t*k4jiyz+Xd)vmQKo zN*Lugg(A9;RM+vE=;{ekR5J>8Y}vDS_f~2&xpXK&Of$?1iIPW7kq%hxOW0P*g9`dY z9%FKWu{1wdq~w$^le-F7^fSJXE0KQ9>G!Xx#HmiION`J2loW)9gA=)IH$*5eAm?m4 z(oCUe`iK_SJ51g&#$lo_uY@Iq3Br;spK3|y8Ydt@XccTWHyHY?LhHuq6L^&X<_gmo z)Mflu!SC=V1&48yf|rZeK~V<%8Gli5LS)FhaL>4u7ns>EP`H~$jd|7J?QL2zKa%k` z+O*5I2Qw+&vO6tHPkWN;G|basZw~nRa$iq`Gt#>~Fw}_!nCnN00LlHBpgnzX0jLd6acGjiUTvRGh+$=B6=Jf)#bu zeoo5y$%sGMJceq&*EovkMNDgIegsN6&X8RNHuAlgn*nu*U^%y6fkmjtN;IGqP5izJ zoA`B!zdbhN#T-!(T#GFfF@g@X^C`o1oK*f+)>+Kyp66?ep*a|^5vn^vAZ9I<`G&Y^XyoYi- zRBK&Ja-TXF#>w5U?IRweUy4ooAVjsukFRc#_@L3+h{I0T1JgNl` zkfxPS*}2;j18nE5A5iMqu55}e9L1tjm{q>%KFnx}E%rv06`K|c5d$Viy5rYY7!x#dw5WYZ8j^BT|NNkb163?(uouuo>#N`~d5SX)T06;m-} z82d4DGc;~fhF;IDgvsI@|B;XQ3;Xx@EB=6a5H7QkG=tQ|L=sleOXqqHd&68Y!Z>>+ NUWHc&qg(ya{{WEcK@tD} literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/service/impl/SysDictItemServiceImpl.class b/common-config-starter/target/classes/com/mosty/common/config/service/impl/SysDictItemServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..4283cfcd5ae9bbe5fcbb5612346905682896dfff GIT binary patch literal 7297 zcmb_g349!9b^kv}t68nb*ZM+TUu^PTOh_9fdGL72oU~nW>y+myGg^Z zKWV@3z3+JUd*AoXXMS_y;{aAmz6ICgP6O{up#gWLId)G9@5B2Qy*CXB(GR4F-jl?A z20l0iAHs(X+@HkX7y$r#7G0<_p?${ z|Kb}u`+h~gnZmd5WC}Ow-qZMY3TN=0B)+Tt_mcR25>M&)548DV5>KZv9p6*rM@jrx z`=2E7jP^fG;(qOamc+A3JZIqNN&F&({rIJU=TrCop;sF7?vNne=Xyh# zQhsptp-i7UG-P|7f|;e!Qje4MdwsjG)fySGJ;9}YS+|fWxFvryL#W^u*%b$!p-drI zk?B8s4+%}Pa=F;JU|)M(GIr5-Nc)JJ>B{A*-1ltn>^o!~u`+q9IF#x4J*PNSV`S+b zK~uMzvjx-poT9z0To|yuUDiOJBUCYK<@Z>gqj)sflB0e-mT#2=GeQ<+-^pkCoRUw$ zoBUyiGwbR~Te7_)PS(yig^_$*_5N_Ym%}78mHLmV;tDRQORt{xf~4oV{tn9@R!t_^ zLeS!j&|scjqP&f6kqWPPDK0UWP{=7UZ&`NTDcF0Ql0$!Y6^pKK`HowpeLBKuAJH%x^sIt?i|ZZE_?}fPSy^3^vBs8X zc8w2P>dYygo6irB^=6m(Fem1VO-Hl#h;HYq=Cw}I@z)D3uOI4lGe+b1!jSNQO`$T~ z6x;X8S>N?`crFvsckB|mB#v15GF?4uQO>3_94qhKYWG=%ft+P{ zaB^-rQy3kf8%iVjaw%gU_3dIw?M>lhc{H9p^`oM$@m^jW)m>ecC>D0KoeD|&r25^m zm$f%LT3F7VyhQWPdfMNZJA^|hw8vaV-qvCTO_7-w!S z+umpHL}(AhuvIhdb2dmz%$bm*f>KHjXa=(1}1(i z&CDDVPvJR}36z|kkQNi)$8!Wy%;QypRsUzPA}I`+Vu~qK1%L-Fg$_f@DQ!bX-hGa}x zr8F;5a+fM}nL?{op34=wLdULDXpL^ZN}&#II<;A=%{pz?Yx7FkAec9>}I9mKu)hJP>98e_>>Xtd}@ddp_-wv-YvnPy4mj)Kr zal7^A^Y)OH@A8Jq1qS0-{T7_xTV!c~Lq z)IS9$SAp7RQYYQ1%xW4bsEu_4jTO7WzFDxQMsURrxccFyxAYIN5qc`9gfHg;%xo&z zc^<6W^;Whyv_yR^Vii6rrM2yG(Im?cSS6chYIF(7bd?x}KCe58?693ZELhrpAf|1U z5C>yJRRiz@pHi~@ontpnx^FydqK%<9Y8j%2M@f){V~6E&u9v4=dO~jYxxCJ^wvgw6 zoKCNg^9yEQCbzIm6|z;L3TX-3G0L87f?n~X5zf9V&a_%aUM64VvGLZBX0;E>W}w;t zFYikxxou*?Y_*CO>lg3PB*hC@6!jDAJaGptH#sJQSYRlXe5>eZ>|(i4%JeV_eLJ^_ z2(NhCx_0f}xvA!h?j<&pVN*7EWzC9(Mb%DY;VxY+TD3eKL#wQJsTHe@rx~qJ>|?ug^2Rp z2n|Wa)=dz;8h13)yt6+tZRT^^^;nZN@51j+XBj_E-n5)fwu6wx5Br|)9McWJb*)-c5nin+X9S`==q z@fj+XDHAsC;&ZRF)_FU5L${UB_dC8#HF~#n+*YAO3FQH@{c$8|*oH z@8laWt_3La6I_Gk6(lNXegX|AU<7Eginfqg zDnO<@2D1TAU}{HGYtyG;G~I`$#`Ltr&wSI+|M(4`IP0Xsh5t zPMyR;GFnu@;yAK|NNaNi7gf++!O{p@R>ATJq)?n#8DSS!kRdomYgIHJZoeeLxc$-y z47XnvVcfo&;K~Xv54$V&s)1V*kKxJ&?5*0uXf;k^4W+%RmD+Sv(5d~}3f5JyJ}{CI z4ZJekZ#;$#4Y(pXC;48ipWre&rSUkrsy?Czb?3&ao4Om&(GrZbwj4*#$AUl@X8RCU zu)P>Fk--A2;@>5>g7^kphJLKZjqEL4jzb*18CT-fxC*zU19zYkcVjK?#X3BI^*F{I zr_jZ(?A`bRdhktb!jG^S&*N%o!4{c~Yora=N(Oz>fvvIy+oT^m_`JJLEc8nOd*lfA z%AMFJ@56ri2oA`@I4GaO_40Y#AYUi^ByN%)GK?KcJctzW6y-V$>MlOox8v@89)QAo8QIy~_zz@moC=*KHlw5`*xCPDRKZ>IqGswM*@U2KvU+}|;M7&-@ zUa#fIGBo}Qy#`*lL0*u1(PH5B27b@LZNdNRIAP%T*-{Gp0e{md&l~u={U9WZHxhai z-W;YNZP%bOBDL%oHZ5EJC`7%}0QF9@>VYMJ#&g3}RXwS@CbW#ve+%J1B>fVyGg5df z{)jkJykQOX=0_lTiqX2cuVEe2?&|wVbqjxu&%fCkWWO%)wR2w2KC|YK+0MRgd3s9) zy?3Lnaov5GzdU_SfX!+mHf?$O+5k%=*3JJg7nAlM2c1d{%;)bx{(eb*eaU;MQw3Yo z+bY<8H?AVQBYj-}uOz%P-5KA6#g2Jg>@7piW*~L5S3dTFG;+t5(Q%J zb6)c=l80bos#3lr52;k;52aH1dUk+Cc0gjKsM+a0bNci--}%nz=8u1#{R-e+e4WCX zGz8A3k-@n%&SSWXA1-Oxhgx>Iiz7}mxYC6tJ=%qjQ@FYn2C`{%<7_)6<87GGORlxy zx_;ki!_5?ODcnlow!pTa8eFoia9ozl$`?4AwY-v9@`A8xa#ZqMzT9cMXqF-kGgq&l z5ikPfC@UPPUYA8B@SrczfO12dR_8oZZ>ZHX{gHBBdL_HyRm@T~FGD*hJC%UD`pPV+ zP!?n;&9O*bpk>r6aF>p(?W&1NDX;unGVf5*mGvy?OiJI@^H|st&e(y#nM9WY<8bn1<9#@oKo$_N)&uOIlSLO@*9%EV=0%_<`$*17Gp{7GG)htESFF(UulpVg zC$v>Sl(x)Cr$RV(IkJ>5$lm(e=sh9eBshL)Vy>>9m9j}rSVQDro`#8h_+?h(6Jf7TU#R3}xSFYEb5 zGbsDETb%Y~Nj>rWSu+Tgue^}uX0BMw=>C}8vDPhR1A~}MVamWA+)d%0f%|wM&^h9H zA^9ZB<0_o-3PDFJKIz1#d_C;MX9gtl1}qc|DBPuV+CULA9M}dPVOC&hGfmrogOY(g z*h_}YhYuI#^9u%CcTd)4|A8T8#zqX!TvE@x$Y2R9@2?C_|@2+Vr@1Kq!6L^Q;wo~sY zAM-v$fIXdQ&1B9sh@Ldp3i`elTV(P_B4%cnc5rxJz=pYQe5H!g8SZlD0 z22+c8t&zcl8yIBOtu?rl2AdNM9$3#H$xs9LJ-ko9n{X-uMgw@7^94TopSpQ`fhw8y W0p~iQ7x-Mn2tlfiK3X1)Vf0@kJTPql literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/com/mosty/common/config/service/impl/SysVersionManageServiceImpl.class b/common-config-starter/target/classes/com/mosty/common/config/service/impl/SysVersionManageServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..412242a1a1ae4ec3b7f88e905cff3443cddeeefe GIT binary patch literal 4358 zcmcgwZFd{R6@ErCmaQzYqlC06B+%d#$9CDgkOojl6FUK1~G3(;v})z#rgncxJV>6-npwU zzq$E2fCunF2B)(Sn9O1dXRQY5&ES&Znako% z%xCb+Z5YN=S=@!mK~kO`z~w>w3cogwXAI*N^Z3mGqQ2QA?Rv8$wG%XIVL&~6W!IIK6{)2?9kC1aO?ed_H&k$3 zbuO%zls_v=HBxc~uPkeG(s#@}Cidw?C!pgKbqkcg?39)5)El);wia89(_Ev$JC@rW z*s}UqqTp^u(|ON^%5Tp5aTFfu;RS}I;%Ejhu%nIkg|_WfZTGFVHyf+=H@=VH6TOVv zh>iS7>T-Kg%kmQO6@`Gv7Z@x$RaffJXP7?tf8b5dkoW9Hf_@;V-JL?BFdK{sT7AGqa>W*zl8oIpP$@W12} z)pf00Q}OIulYBj?lVQ?5%v;Ed#4W43ZOo;(_7D%*q8IvQ^{8X2+&u|=rbgXwz$GwR z@cgPBG!S0f_-_$N77k+}gQ|r^I2l~Eu!Nex@TBKy z;#xLllwR~I!B9Wy!*KcXhH>0N1J7FU5m?Z0NDVD4M}upeTsP}Y*2hLzsyV^p6_ZI6 z8l_E5x>dWVja?RQ;5iG=(~c(X?~>oF z?p3AN1q|)pUZ7tU3J-JQY*5PGFa;jkMe8-k>v6a7s>TardYLZ zt5$dPZm*kaLwDEXytaES?wr1R`*>&*>PxiQ^t^$VuC|pM)&u(tTU)IvXE`CR&YhmU zbn&dfk(JI^Rlv_5=@?P57V(ZB6d)t#TK6Xmh zYDGt@dAxPp`fF<;>l}ue^Sa@8L=c`#JlHUv_D}m;Md$ z)Tc%@UI;@~;?JL+mKemFQ zFEBhl@fmic@ez;f!@YctfxD>80M*G+oxK>reK>$4e4fB49wWyEjPq-9f-8nIQk5J( z;fzX?ZUR~taPQC~DJ9Zf&z`o(EK|1Hg$$9E+r0f{W z?fL|F`~$mJ@PjWP<~JTQ79C>@ATu7MNuVI+O)O}Nf{da=<2j2?9ZV22+NSMLy9p%fT2XogC#iP|KaV_YB5{iI oKl5k)Pk0Z1#rurRW1No>QIFF()A$9Rh(}MZjV`Q>F5-!A0R@=`DgXcg literal 0 HcmV?d00001 diff --git a/common-config-starter/target/classes/mapper/SysConfigMapper.xml b/common-config-starter/target/classes/mapper/SysConfigMapper.xml new file mode 100644 index 0000000..2da6eea --- /dev/null +++ b/common-config-starter/target/classes/mapper/SysConfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-config-starter/target/classes/mapper/SysDictItemMapper.xml b/common-config-starter/target/classes/mapper/SysDictItemMapper.xml new file mode 100644 index 0000000..df53459 --- /dev/null +++ b/common-config-starter/target/classes/mapper/SysDictItemMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-config-starter/target/classes/mapper/SysDictMapper.xml b/common-config-starter/target/classes/mapper/SysDictMapper.xml new file mode 100644 index 0000000..6d34a17 --- /dev/null +++ b/common-config-starter/target/classes/mapper/SysDictMapper.xml @@ -0,0 +1,17 @@ + + + + + + + diff --git a/common-config-starter/target/classes/mapper/SysVersionManageMapper.xml b/common-config-starter/target/classes/mapper/SysVersionManageMapper.xml new file mode 100644 index 0000000..07a3ad7 --- /dev/null +++ b/common-config-starter/target/classes/mapper/SysVersionManageMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-config-starter/target/common-config-starter-1.0.0-SNAPSHOT.jar b/common-config-starter/target/common-config-starter-1.0.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..ae3f404f82ca57c227c4136e7fc19192ae76dea2 GIT binary patch literal 134278 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

rOj~J#%okp8GdrceoxlXZ; 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 AB!08^Fe3@ek5f@FobV+sn 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 Ee@i2}fB*mh literal 0 HcmV?d00001 diff --git a/common-config-starter/target/maven-archiver/pom.properties b/common-config-starter/target/maven-archiver/pom.properties new file mode 100644 index 0000000..32f2ba7 --- /dev/null +++ b/common-config-starter/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Thu Apr 18 12:45:15 CST 2024 +version=1.0.0-SNAPSHOT +groupId=com.mosty +artifactId=common-config-starter diff --git a/common-config-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/common-config-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..fef343b --- /dev/null +++ b/common-config-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,48 @@ +com\mosty\common\config\CommonConfigAutoConfiguration.class +com\mosty\common\config\entity\vo\EditSysDictVO.class +com\mosty\common\config\controller\SysConfigController.class +com\mosty\common\config\config\DictElementConfig.class +com\mosty\common\config\service\impl\SysVersionManageServiceImpl.class +com\mosty\common\config\entity\vo\AddVersionManageVO.class +com\mosty\common\config\mapper\SysVersionManageMapper.class +com\mosty\common\config\entity\SysConfig.class +com\mosty\common\config\ConfigServiceFactory.class +com\mosty\common\config\controller\SysDictController.class +com\mosty\common\config\service\impl\SysDictItemServiceImpl.class +com\mosty\common\config\mapper\SysDictItemMapper.class +com\mosty\common\config\service\impl\SysDictServiceImpl.class +com\mosty\common\config\Excel\ExcelUtilManySheet.class +com\mosty\common\config\entity\vo\EditSysDictItemVO.class +com\mosty\common\config\entity\vo\AddSysConfigVO.class +com\mosty\common\config\Excel\ExcelExp.class +com\mosty\common\config\entity\SysDict.class +com\mosty\common\config\entity\vo\SysDictQueryPage.class +com\mosty\common\config\entity\vo\VersionManagePage.class +com\mosty\common\config\controller\SysVersionManageController.class +com\mosty\common\config\entity\vo\SysDictQueryVo.class +com\mosty\common\config\mapper\SysConfigMapper.class +com\mosty\common\config\service\SysDictService.class +com\mosty\common\config\service\SysVersionManageService.class +com\mosty\common\config\controller\SysDictItemController.class +com\mosty\common\config\entity\vo\AddDictItemVO.class +com\mosty\common\config\Excel\ExcelUtil.class +com\mosty\common\config\service\SysConfigService.class +com\mosty\common\config\entity\vo\EditDictItemVO.class +com\mosty\common\config\entity\vo\SysDictItemVO.class +com\mosty\common\config\entity\SysVersionManage.class +com\mosty\common\config\constant\enums\DictElementEnum.class +com\mosty\common\config\config\SystemConfig.class +com\mosty\common\config\entity\vo\EditPositionVO.class +com\mosty\common\config\entity\vo\AddPositionVO.class +com\mosty\common\config\entity\vo\EditVersionManageVO.class +com\mosty\common\config\entity\vo\AddSysDictVO.class +com\mosty\common\config\entity\SysDictItem.class +com\mosty\common\config\mapper\SysDictMapper.class +com\mosty\common\config\entity\vo\EditSysConfigVO.class +com\mosty\common\config\service\impl\SysConfigServiceImpl.class +com\mosty\common\config\entity\vo\SysDictVO.class +com\mosty\common\config\entity\vo\ConfigPage.class +com\mosty\common\config\Excel\DictUtils.class +com\mosty\common\config\entity\vo\DeleteVO.class +com\mosty\common\config\entity\vo\DictPage.class +com\mosty\common\config\service\SysDictItemService.class diff --git a/common-config-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/common-config-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..cf731cb --- /dev/null +++ b/common-config-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,48 @@ +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\controller\SysConfigController.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\EditPositionVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\SysDictVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\EditVersionManageVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\CommonConfigAutoConfiguration.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\SysDict.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\mapper\SysConfigMapper.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\ConfigServiceFactory.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\EditSysDictVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\mapper\SysVersionManageMapper.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\SysVersionManage.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\config\DictElementConfig.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\ConfigPage.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\AddVersionManageVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\service\impl\SysVersionManageServiceImpl.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\SysDictItem.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\controller\SysDictItemController.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\AddSysDictVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\SysDictQueryPage.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\service\SysDictItemService.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\service\SysDictService.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\AddDictItemVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\EditSysConfigVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\config\SystemConfig.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\Excel\ExcelUtil.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\service\impl\SysDictServiceImpl.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\Excel\ExcelUtilManySheet.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\DeleteVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\EditDictItemVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\SysDictItemVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\EditSysDictItemVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\Excel\ExcelExp.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\AddSysConfigVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\AddPositionVO.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\service\SysConfigService.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\service\SysVersionManageService.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\constant\enums\DictElementEnum.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\SysDictQueryVo.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\Excel\DictUtils.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\mapper\SysDictMapper.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\service\impl\SysConfigServiceImpl.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\SysConfig.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\VersionManagePage.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\service\impl\SysDictItemServiceImpl.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\controller\SysDictController.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\mapper\SysDictItemMapper.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\controller\SysVersionManageController.java +C:\tools\dy外网\mosty-common\common-config-starter\src\main\java\com\mosty\common\config\entity\vo\DictPage.java diff --git a/common-core-starter/common-core-starter.iml b/common-core-starter/common-core-starter.iml new file mode 100644 index 0000000..c70e5ea --- /dev/null +++ b/common-core-starter/common-core-starter.iml @@ -0,0 +1,165 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common-core-starter/pom.xml b/common-core-starter/pom.xml new file mode 100644 index 0000000..cad3794 --- /dev/null +++ b/common-core-starter/pom.xml @@ -0,0 +1,112 @@ + + + + mosty-common + com.mosty + 1.0.0-SNAPSHOT + + 4.0.0 + + common-core-starter + + + 8 + 8 + 1.8.0 + 2.3.2 + + + + + com.mosty + common-config-starter + 1.0.0-SNAPSHOT + + + com.mosty + common-token-starter + 1.0.0-SNAPSHOT + + + + org.projectlombok + lombok + 1.16.18 + provided + + + + + org.apache.shiro + shiro-core + + + + + org.apache.shiro + shiro-ehcache + + + + + org.springframework.boot + spring-boot-starter-validation + ${spring-boot-dependencies.version} + + + + + com.github.penggle + kaptcha + ${kaptcha.version} + + + com.mosty + common-redis-starter + 1.0.0-SNAPSHOT + + + + com.auth0 + java-jwt + 3.8.1 + + + + + io.minio + minio + 8.0.3 + + + + org.apache.httpcomponents + httpclient + 4.5.12 + + + + + + mosty-nexus-releases + release version + http://47.108.232.77:8181/repository/maven-releases/ + + + mosty-nexus-snapshots + snapshots version + http://47.108.232.77:8181/repository/maven-snapshots/ + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + + \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/CoreAutoConfiguration.java b/common-core-starter/src/main/java/com/mosty/common/core/CoreAutoConfiguration.java new file mode 100644 index 0000000..7a2e9c0 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/CoreAutoConfiguration.java @@ -0,0 +1,16 @@ +package com.mosty.common.core; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Configuration; + +/** + * + * @author kevin + * @date 2022/2/3 7:28 PM + * @since 1.0.0 + */ +@Configuration +@MapperScan("com.mosty.common.core.business.mapper") +public class CoreAutoConfiguration { + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigController.java new file mode 100644 index 0000000..7654249 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigController.java @@ -0,0 +1,107 @@ +package com.mosty.common.core.business.controller; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.core.business.entity.SysAppHomeconfig; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPage; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigQuery; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.core.business.service.SysAppHomeconfigService; +import com.mosty.common.token.JwtSysUser; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * app首页表 前端控制器 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Api(tags = "app首页接口") +@RestController +@AllArgsConstructor +@RequestMapping("/sysAppHomeconfig") +public class SysAppHomeconfigController { + + private SysAppHomeconfigService sysAppHomeconfigService; + + /** + * 添加首页应用 + * @param configVO 部门 + * @return 添加结果 + */ + @PostMapping("addAppHome") + @JwtSysUser + @ApiOperation(value = "添加首页应用", httpMethod = "POST", response = Boolean.class) + @Log(title = "添加首页应用",businessType = BusinessType.INSERT) + public ResponseResult addApp(@RequestBody @Valid SysAppHomeconfigVO configVO, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysAppHomeconfigService.saveInfo(configVO, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 修改首页 + * @param configVO 首页信息 + * @return 修改结果 + */ + @PostMapping("updateAppHome") + @JwtSysUser + @Log(title = "首页应用",businessType = BusinessType.UPDATE) + @ApiOperation(value = "修改首页", httpMethod = "POST", response = Boolean.class) + public ResponseResult updateAppHome(@RequestBody @Valid SysAppHomeconfigVO configVO, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysAppHomeconfigService.updateInfo(configVO, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 删除应用信息 + * @param list 应用id + * @return 删除结果 + */ + @Log(title = "应用功能",businessType = BusinessType.DELETE) + @PostMapping("deleteApp") + @JwtSysUser + @ApiOperation(value = "删除应用信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult deleteApp(@RequestBody List list, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); +// UserInfo userInfo = UserInfoManager.get(); + sysAppHomeconfigService.delete(list, ipAddress, null); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("selectPage") + @ApiOperation(value = "分页查询应用信息", httpMethod = "GET", response = SysDept.class) + public ResponseResult> selectPage(SysAppHomeconfigPage deptPage) { + IPage deptIPage = sysAppHomeconfigService.selectByPage(deptPage); + return ResponseResult.success(deptIPage); + } + + @GetMapping("queryConfig") + @ApiOperation(value = "查询应用配置", httpMethod = "GET", response = SysDept.class) + public ResponseResult queryConfig(SysAppHomeconfigQuery configQuery) { + SysAppHomeconfigRsVO vo = sysAppHomeconfigService.queryConfig(configQuery); + return ResponseResult.success(vo); + } + + +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigPlateController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigPlateController.java new file mode 100644 index 0000000..8ec4c1c --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigPlateController.java @@ -0,0 +1,127 @@ +package com.mosty.common.core.business.controller; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlate; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPlatePage; +import com.mosty.common.core.business.service.SysAppHomeconfigPlateService; +import com.mosty.common.token.JwtSysUser; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * app首页-板块表 前端控制器 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Api(tags = "app首页板块接口") +@RestController +@AllArgsConstructor +@RequestMapping("/sysAppHomeconfigPlate") +public class SysAppHomeconfigPlateController { + + private SysAppHomeconfigPlateService sysAppHomeconfigPlateService; + + /** + * 添加首页应用 + * @param plate 部门 + * @return 添加结果 + */ + @PostMapping("addPlate") + @JwtSysUser + @ApiOperation(value = "添加首页应用板块", httpMethod = "POST", response = Boolean.class) + @Log(title = "添加首页应用板块",businessType = BusinessType.INSERT) + public ResponseResult addPlate(@RequestBody @Valid SysAppHomeconfigPlate plate, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysAppHomeconfigPlateService.saveInfo(plate, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 添加首页应用 + * @param plates 部门 + * @return 添加结果 + */ + @PostMapping("addBatch") + @JwtSysUser + @ApiOperation(value = "批量添加首页应用板块", httpMethod = "POST", response = Boolean.class) + @Log(title = "批量添加首页应用板块",businessType = BusinessType.INSERT) + public ResponseResult addPlateBatch(@RequestBody List plates, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysAppHomeconfigPlateService.saveInfoBatch(plates, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 修改首页板块 + * @param plate 首页板块信息 + * @return 修改结果 + */ + @PostMapping("updatePlate") + @JwtSysUser + @Log(title = "首页应用板块",businessType = BusinessType.UPDATE) + @ApiOperation(value = "修改首页应用板块", httpMethod = "POST", response = Boolean.class) + public ResponseResult updatePlate(@RequestBody @Valid SysAppHomeconfigPlate plate, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysAppHomeconfigPlateService.updateInfo(plate, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 批量修改首页应用板块 + * @param plates 首页板块信息 + * @return 修改结果 + */ + @PostMapping("updateBatch") + @JwtSysUser + @Log(title = "批量修改首页应用板块",businessType = BusinessType.UPDATE) + @ApiOperation(value = "批量修改首页应用板块", httpMethod = "POST", response = Boolean.class) + public ResponseResult updateBatch(@RequestBody List plates, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysAppHomeconfigPlateService.updateInfoBatch(plates, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 删除应用板块信息 + * @param list 应用id + * @return 删除结果 + */ + @Log(title = "删除应用板块功能",businessType = BusinessType.DELETE) + @PostMapping("deletePlate") + @JwtSysUser + @ApiOperation(value = "删除应用信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult deletePlate(@RequestBody List list, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); +// UserInfo userInfo = UserInfoManager.get(); + sysAppHomeconfigPlateService.delete(list, ipAddress, null); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("selectPage") + @ApiOperation(value = "分页查询应用信息", httpMethod = "GET", response = SysDept.class) + public ResponseResult> selectPage(SysAppHomeconfigPlatePage deptPage) { + IPage deptIPage = sysAppHomeconfigPlateService.selectByPage(deptPage); + return ResponseResult.success(deptIPage); + } + +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigPlateListController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigPlateListController.java new file mode 100644 index 0000000..78d36b7 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysAppHomeconfigPlateListController.java @@ -0,0 +1,127 @@ +package com.mosty.common.core.business.controller; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlateList; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPlateListPage; +import com.mosty.common.core.business.service.SysAppHomeconfigPlateListService; +import com.mosty.common.token.JwtSysUser; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * app首页配置-板块内容表 前端控制器 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Api(tags = "app板块内容接口") +@RestController +@AllArgsConstructor +@RequestMapping("/sysAppHomeconfigPlatelList") +public class SysAppHomeconfigPlateListController { + + private SysAppHomeconfigPlateListService sysAppHomeconfigPlateListService; + + /** + * 添加首页应用板块内容 + * @param plate 部门 + * @return 添加结果 + */ + @PostMapping("addPlate") + @JwtSysUser + @ApiOperation(value = "添加首页应用板块内容", httpMethod = "POST", response = Boolean.class) + @Log(title = "添加首页应用板块",businessType = BusinessType.INSERT) + public ResponseResult addPlate(@RequestBody SysAppHomeconfigPlateList plate, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysAppHomeconfigPlateListService.saveInfo(plate, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 添加首页应用板块内容 + * @param plates 部门 + * @return 添加结果 + */ + @PostMapping("addBatch") + @JwtSysUser + @ApiOperation(value = "批量添加首页应用板块内容", httpMethod = "POST", response = Boolean.class) + @Log(title = "批量添加首页应用板块内容",businessType = BusinessType.INSERT) + public ResponseResult addPlateBatch(@RequestBody List plates, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysAppHomeconfigPlateListService.saveInfoBatch(plates, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 修改首页板块 + * @param plate 首页板块内容信息 + * @return 修改结果 + */ + @PostMapping("updatePlate") + @JwtSysUser + @Log(title = "首页应用板块内容",businessType = BusinessType.UPDATE) + @ApiOperation(value = "修改首页应用板块内容", httpMethod = "POST", response = Boolean.class) + public ResponseResult updatePlate(@RequestBody @Valid SysAppHomeconfigPlateList plate, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysAppHomeconfigPlateListService.updateInfo(plate, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 批量修改首页应用板块内容 + * @param plates 首页板块信息内容 + * @return 修改结果 + */ + @PostMapping("updateBatch") + @JwtSysUser + @Log(title = "批量修改首页应用板块内容",businessType = BusinessType.UPDATE) + @ApiOperation(value = "批量修改首页应用板块内容", httpMethod = "POST", response = Boolean.class) + public ResponseResult updateBatch(@RequestBody List plates, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysAppHomeconfigPlateListService.updateInfoBatch(plates, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 删除应用板块信息内容 + * @param list 应用id + * @return 删除结果 + */ + @Log(title = "删除应用板块内容功能",businessType = BusinessType.DELETE) + @PostMapping("deletePlate") + @JwtSysUser + @ApiOperation(value = "删除应用板块内容功能", httpMethod = "POST", response = Boolean.class) + public ResponseResult deletePlate(@RequestBody List list, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); +// UserInfo userInfo = UserInfoManager.get(); + sysAppHomeconfigPlateListService.delete(list, ipAddress, null); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("selectPage") + @ApiOperation(value = "分页查询应用信息", httpMethod = "GET", response = SysDept.class) + public ResponseResult> selectPage(SysAppHomeconfigPlateListPage deptPage) { + IPage deptIPage = sysAppHomeconfigPlateListService.selectByPage(deptPage); + return ResponseResult.success(deptIPage); + } + +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysDeptController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysDeptController.java new file mode 100644 index 0000000..299b2e4 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysDeptController.java @@ -0,0 +1,227 @@ +package com.mosty.common.core.business.controller; + + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.google.common.collect.Lists; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.core.business.service.SysDeptService; +import com.mosty.common.token.JwtSysUser; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * 部门表 前端控制器 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +@Slf4j +@SuppressWarnings("unused") +@RestController +@AllArgsConstructor +@RequestMapping("/sysDept") +@Api(tags = "部门信息接口") +public class SysDeptController { + + private final SysDeptService sysDeptService; + + @PostMapping("addSysDept") + @JwtSysUser + @ApiOperation(value = "添加部门", httpMethod = "POST", response = Boolean.class) + @Log(title = "部门功能-添加部门", businessType = BusinessType.INSERT) + public ResponseResult addSysDept(@RequestBody @Valid AddDeptVO addDeptVO, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysDeptService.saveInfo(addDeptVO, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + @PostMapping("updateSysDept") + @JwtSysUser + @Log(title = "部门功能-修改部门", businessType = BusinessType.UPDATE) + @ApiOperation(value = "修改部门", httpMethod = "POST", response = Boolean.class) + public ResponseResult updateSysDept(@RequestBody @Valid SysDeptVO sysDept, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysDeptService.updateInfo(sysDept, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + @Log(title = "部门功能-删除部门信息", businessType = BusinessType.DELETE) + @PostMapping("deleteSysDept") + @JwtSysUser + @ApiOperation(value = "删除部门信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult deleteSysDept(@RequestBody DeleteDeptVO deleteDeptVO, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + UserInfo userInfo = UserInfoManager.get(); + sysDeptService.delete(deleteDeptVO, ipAddress, userInfo); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("selectPage") + @ApiOperation(value = "分页查询部门信息", httpMethod = "GET", response = SysDept.class) + public ResponseResult> selectPage(DeptPage deptPage) { + + IPage deptIPage = sysDeptService.selectByPage(deptPage); + return ResponseResult.success(deptIPage); + } + + @PostMapping("getChildDeptList") + @ApiOperation(value = "查询子部门集合", httpMethod = "POST", response = SysDeptVO.class) + public ResponseResult> getChildDeptList(Long deptId) { + List list = sysDeptService.getChildDeptList(deptId); + + List resultList = Lists.newArrayList(); + if (CollectionUtils.isNotEmpty(list)) { + resultList = BeanUtil.copyToList(resultList, SysDeptVO.class); + } + return ResponseResult.success(resultList); + } + + @GetMapping("getChildDeptList") + @ApiOperation(value = "查询子部门集合", httpMethod = "POST", response = SysDeptVO.class) + public ResponseResult getDeptByOrgCode(@RequestParam("orgCode") String orgCode) { + Asserts.check(StringUtils.isBlank(orgCode), "查询的组织机构编码不能为空!"); + SysDept sysDept = sysDeptService.getDeptByOrgCode(orgCode); + Asserts.check(sysDept == null, "组织机构编码对应的部门不存在!"); + SysDeptVO sysDeptVO = BeanUtil.copyProperties(sysDept, SysDeptVO.class); + return ResponseResult.success(sysDeptVO); + } + + @JwtSysUser + @PostMapping("getRootDept") + @ApiOperation(value = "获取当前token对应的部门信息", httpMethod = "POST", response = SysDeptVO.class) + public ResponseResult getRootDept(/*Long deptId*/) { + UserInfo userInfo = UserInfoManager.get(); + SysDept sysDept = sysDeptService.getById(userInfo.getDeptId()); + Asserts.check(sysDept == null || DeletedEnum.DELETED.code.equals(sysDept.getXtZxbz()), + "部门不存在,请重新登陆"); + SysDeptVO sysDeptVO = BeanUtil.copyProperties(sysDept, SysDeptVO.class); + return ResponseResult.success(sysDeptVO); + } + + @JwtSysUser + // @PostMapping("getAllChildDeptList") + @ApiOperation(value = "查询所有子部门树", httpMethod = "POST", response = SysDeptVO.class) + public ResponseResult getAllChildDeptList(@RequestBody DeptTreeVO deptTreeVO) { + UserInfo userInfo = UserInfoManager.get(); + SysDept sysDept = sysDeptService.getById(userInfo.getDeptId()); + Asserts.check(sysDept == null || DeletedEnum.DELETED.code.equals(sysDept.getXtZxbz()), + "部门不存在,请求重新登陆"); + SysDeptVO rootSysDeptVo = sysDeptService.getAllChildDeptList(sysDept, deptTreeVO); + return ResponseResult.success(rootSysDeptVo); + } + + @GetMapping("selectUserPageByDept") + @ApiOperation(value = "分页查询部门下用户信息", httpMethod = "GET", response = SysDept.class) + public ResponseResult> selectUserPageByDept(UserByDeptPage userByDeptPage) { + IPage deptIPage = sysDeptService.selectUserPageByDept(userByDeptPage); + return ResponseResult.success(deptIPage); + } + + @GetMapping("selectRolePageByDept") + @ApiOperation(value = "分页查询部门下角色信息", httpMethod = "GET", response = SysDept.class) + public ResponseResult> selectRolePageByDept(RoleByDeptPage roleByDeptPage) { + IPage deptIPage = sysDeptService.selectRolePageByDept(roleByDeptPage); + return ResponseResult.success(deptIPage); + } + + @PostMapping("saveUserDeptInfo") + @JwtSysUser + @Log(title = "部门功能", businessType = BusinessType.GRANT) + @ApiOperation(value = "添加用户部门关联关系", httpMethod = "POST", response = Boolean.class) + public ResponseResult saveUserDeptInfo(@RequestBody AddUserDeptVO addUserDeptVO) { + sysDeptService.saveUserDeptInfo(addUserDeptVO); + return ResponseResult.success(Boolean.TRUE); + } + + @PostMapping("saveRoleDeptInfo") + @JwtSysUser + @Log(title = "部门功能", businessType = BusinessType.GRANT) + @ApiOperation(value = "添加角色部门关联关系", httpMethod = "POST", response = Boolean.class) + public ResponseResult saveRoleDeptInfo(@RequestBody AddRoleDeptVO roleDeptVO) { + sysDeptService.saveRoleDeptInfo(roleDeptVO); + return ResponseResult.success(Boolean.TRUE); + } + + @PostMapping("deleteUserDeptInfo") + @JwtSysUser + @Log(title = "部门功能", businessType = BusinessType.OTHER) + @ApiOperation(value = "删除用户部门关联关系", httpMethod = "POST", response = Boolean.class) + public ResponseResult deleteUserDeptInfo(@RequestBody DeleteUserDeptVO deleteUserDeptVO) { + sysDeptService.deleteUserDeptInfo(deleteUserDeptVO); + return ResponseResult.success(Boolean.TRUE); + } + + @JwtSysUser + @GetMapping("selectDept") + @ApiOperation(value = "查询部门列表信息", httpMethod = "GET", response = SysDept.class) + public ResponseResult> selectDept(DeptQuery dto) { + return ResponseResult.success(sysDeptService.selectDept(dto)); + } + + +// @PostMapping("deleteRoleDeptInfo") +// @JwtSysUser +// @Log(title = "部门功能", businessType = BusinessType.OTHER) +// @ApiOperation(value = "删除角色部门关联关系", httpMethod = "POST", response = Boolean.class) +// public ResponseResult deleteRoleDeptInfo(@RequestBody DeleteRoleDeptVO deleteRoleDeptVO) { +// sysDeptService.deleteRoleDeptInfo(deleteRoleDeptVO); +// return ResponseResult.success(Boolean.TRUE); +// } +// +// @JwtSysUser +// @GetMapping("selectNextPage") +// @ApiOperation(value = "根据部门编码分页查询当前及下级部门信息", httpMethod = "GET", response = SysDept.class) +// public ResponseResult> selectNextPage(DeptPage deptPage) { +// IPage deptIPage = sysDeptService.selectNextPage(deptPage); +// return ResponseResult.success(deptIPage); +// } + + @GetMapping("getDeptList") + @ApiOperation(value = "根据部门编码分页查询当前及下级部门信息--第三方接口", httpMethod = "GET", response = SysDept.class) + public ResponseResult> getDeptList(DeptPage deptPage) { + IPage deptIPage = sysDeptService.getDeptList(deptPage); + return ResponseResult.success(deptIPage); + } + + @GetMapping("deptSys") + @ApiOperation(value = "部门信息同步", httpMethod = "GET", response = Boolean.class) + public ResponseResult deptSys() { + Boolean bool = sysDeptService.deptSys(); + return ResponseResult.success(bool); + } + + @ApiOperation("查询部门下的所有子部门信息") + @GetMapping("getChildDept/{deptid}") + public ResponseResult> getChildDept(@PathVariable("deptid") String deptid) { + return ResponseResult.success(this.sysDeptService.getChildDept(deptid)); + } + + @ApiOperation("查询部门下的所有子部门信息") + @GetMapping("getChildDeptByOrgCode/{orgcode}") + public ResponseResult> getChildDeptByOrgCode(@PathVariable("orgcode") String orgcode) { + return ResponseResult.success(this.sysDeptService.getChildDeptByOrgCode(orgcode)); + } + +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysLogininforController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysLogininforController.java new file mode 100644 index 0000000..d005362 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysLogininforController.java @@ -0,0 +1,75 @@ +package com.mosty.common.core.business.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.entity.log.SysOperLog; +import com.mosty.common.config.Excel.ExcelUtil; +import com.mosty.common.core.business.entity.SysLogininfor; +import com.mosty.common.core.business.entity.request.LoginLogPage; +import com.mosty.common.core.business.entity.vo.DeleteListVO; +import com.mosty.common.core.business.service.SysLogininforService; +import com.mosty.common.token.JwtSysUser; +import io.swagger.annotations.Api; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.util.List; + +@Slf4j +@SuppressWarnings("unused") +@RestController +@AllArgsConstructor +@RequestMapping("/sysLoginLog") +@Api(tags = "登录日志") +public class SysLogininforController { + + private final SysLogininforService sysLogininforService; + + @PostMapping("/list") + @JwtSysUser + @Log(title = "查询登录日志列表", businessType = BusinessType.DELETE) + public ResponseResult> list(@RequestBody LoginLogPage loginLogPage) { + IPage sysOperLogPage = sysLogininforService.selectByPage(loginLogPage); + return ResponseResult.success(sysOperLogPage); + } + + @Log(title = "登录日志删除", businessType = BusinessType.OTHER) + @PostMapping("/remove") + public ResponseResult remove(@RequestBody DeleteListVO vo) { + sysLogininforService.deleteOperLogByIds(vo.getIds()); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("/detail/{id}") + public ResponseResult detail(@PathVariable("id") Long id) { + SysLogininfor log = sysLogininforService.getOne(new LambdaQueryWrapper() + .eq(SysLogininfor::getInfoId,id)); + return ResponseResult.success(log); + } + + @Log(title = "登录日志", businessType = BusinessType.CLEAN) + @PostMapping("/clean") + @ResponseBody + public ResponseResult clean() { + sysLogininforService.cleanOperLog(); + return ResponseResult.success(Boolean.TRUE); + } + + +// @Log(title = "导出巡防力量", businessType = BusinessType.EXPORT) +// @PostMapping("/exportZY") +// @JwtSysUser +// public void export(HttpServletResponse response) { +// List list = sysLogininforService.export(); +// ExcelUtil util = new ExcelUtil< +// >(SysLogininfor.class); +// util.exportExcel(response, list, "登录日志"); +// } + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysMenuController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysMenuController.java new file mode 100644 index 0000000..b45644d --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysMenuController.java @@ -0,0 +1,186 @@ +package com.mosty.common.core.business.controller; + + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.constant.enums.MenuTypeEnum; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.config.entity.vo.DeleteVO; +import com.mosty.common.core.business.entity.SysMenu; +import com.mosty.common.core.business.entity.vo.AddSysMenuVO; +import com.mosty.common.core.business.entity.vo.EditSysMenuVO; +import com.mosty.common.core.business.entity.vo.MenuPage; +import com.mosty.common.core.business.entity.vo.MenuQuery; +import com.mosty.common.core.business.service.SysMenuService; +import com.mosty.common.token.JwtSysUser; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.validation.Valid; +import java.util.Date; +import java.util.List; + +/** + *

+ * 菜单表 前端控制器 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +@Slf4j +@RestController +@AllArgsConstructor +@SuppressWarnings("unused") +@RequestMapping("/sysMenu") +@Api(tags = "菜单信息接口") +public class SysMenuController { + + private final SysMenuService sysMenuService; + + /** + * 添加菜单 + * @param addSysMenuVo 添加菜单请求 + * @return 添加结果 + */ + @JwtSysUser + @PostMapping("addSysMenu") + @Log(title = "菜单功能",businessType = BusinessType.INSERT) + @ApiOperation(value = "添加菜单", httpMethod = "POST", response = Boolean.class) + public ResponseResult addSysMenu(@RequestBody @Valid AddSysMenuVO addSysMenuVo) { + + MenuTypeEnum menuTypeEnum = MenuTypeEnum.valueOf(addSysMenuVo.getMenuType()); + Asserts.check(menuTypeEnum == null, "菜单类型有误,请检查"); + /* Asserts.check(menuTypeEnum == MenuTypeEnum.RESOURCE && StringUtils.isNotBlank(addSysMenuVo.getMenuUrl()), + "资源类型菜单不能配置url地址");*/ + + String menuCode = addSysMenuVo.getMenuCode(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("menu_code", menuCode); + queryWrapper.eq("xt_zxbz", DeletedEnum.NATURE.code); + List list = sysMenuService.list(queryWrapper); + Asserts.check(CollectionUtils.isNotEmpty(list), "菜单编码%s已存在,请修改", menuCode); + + SysMenu parentMenu = null; + if (addSysMenuVo.getParentId() != null) { + parentMenu = sysMenuService.getById(addSysMenuVo.getParentId()); + Asserts.check(parentMenu == null || DeletedEnum.DELETED.code.equals(parentMenu.getXtZxbz()), + "父菜单不存在或已删除"); + } + // 添加菜单信息 + sysMenuService.addSysMenuInfo(addSysMenuVo, parentMenu); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 修改菜单 + * @param editSysMenuVo 修改菜单请求 + * @return 修改结果 + */ + @JwtSysUser + @Log(title = "菜单功能",businessType = BusinessType.UPDATE) + @PostMapping("updateSysMenu") + @ApiOperation(value = "修改菜单", httpMethod = "POST", response = Boolean.class) + public ResponseResult updateSysMenu(@RequestBody @Valid EditSysMenuVO editSysMenuVo) { + Asserts.check(editSysMenuVo.getId() == null, "主键id不能为空!"); + SysMenu oldSysMenu = sysMenuService.getBaseMapper().selectById(editSysMenuVo.getId()); + Asserts.check(oldSysMenu == null, "主键为 %s 的菜单信息不存在", editSysMenuVo.getId()); + + String menuCode = editSysMenuVo.getMenuCode(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.ne("id", editSysMenuVo.getId()); + queryWrapper.eq("menu_code", menuCode); + queryWrapper.eq("xt_zxbz", DeletedEnum.NATURE.code); + List list = sysMenuService.list(queryWrapper); + Asserts.check(CollectionUtils.isNotEmpty(list), "菜单编码%s已存在,请修改", menuCode); + + oldSysMenu.setMenuName(editSysMenuVo.getMenuName()); + oldSysMenu.setMenuCode(editSysMenuVo.getMenuCode()); + oldSysMenu.setMenuUrl(editSysMenuVo.getMenuUrl()); + + oldSysMenu.setOrderNo(editSysMenuVo.getOrderNo()); + oldSysMenu.setShowMode(editSysMenuVo.getShowMode()); + oldSysMenu.setBz(editSysMenuVo.getBz()); + + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(); + + UserInfo userInfo = UserInfoManager.get(); + Asserts.checkAuth(userInfo == null, "用户信息为空,请登陆"); + oldSysMenu.setXtZhxgsj(new Date()); + oldSysMenu.setXtZhxgrid(userInfo.getUserId().toString()); + oldSysMenu.setXtZhxgrxm(userInfo.getUserName()); + oldSysMenu.setXtZhxgrbmid(userInfo.getDeptId().toString()); + oldSysMenu.setXtZhxgrbm(userInfo.getDeptName()); + oldSysMenu.setXtZhxgip(ipAddress); + + sysMenuService.getBaseMapper().updateById(oldSysMenu); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 删除菜单信息 + * @param deleteVO 菜单id + * @return 删除结果 + */ + @PostMapping("deleteSysMenu") + @JwtSysUser + @Log(title = "菜单功能",businessType = BusinessType.DELETE) + @ApiOperation(value = "删除菜单信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult deleteSysMenu(@RequestBody DeleteVO deleteVO) { + SysMenu oldSysMenu = sysMenuService.getBaseMapper().selectById(deleteVO.getId()); + Asserts.check(oldSysMenu == null, "主键为 %s 的岗位信息不存在", deleteVO.getId()); + + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(); + + UserInfo userInfo = UserInfoManager.get(); + Asserts.checkAuth(userInfo == null, "用户信息为空,请登陆"); + oldSysMenu.setXtZhxgsj(new Date()); + oldSysMenu.setXtZhxgrid(userInfo.getUserId().toString()); + oldSysMenu.setXtZhxgrxm(userInfo.getUserName()); + oldSysMenu.setXtZhxgrbmid(userInfo.getDeptId().toString()); + oldSysMenu.setXtZhxgrbm(userInfo.getDeptName()); + oldSysMenu.setXtZhxgip(ipAddress); + + oldSysMenu.setXtZxbz(DeletedEnum.DELETED.code); + oldSysMenu.setXtZxyy(deleteVO.getZxyy()); + + sysMenuService.getBaseMapper().updateById(oldSysMenu); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("selectPage") + @ApiOperation(value = "分页查询菜单信息", httpMethod = "GET", response = SysMenu.class) + public ResponseResult> selectPage(MenuPage positionPage) { + IPage positionIPage = sysMenuService.selectByPage(positionPage); + return ResponseResult.success(positionIPage); + } + + @GetMapping("getMenuChild/{menuId}") + @ApiOperation(value = "根据菜单id查询菜单和子页面信息", httpMethod = "GET", response = SysMenu.class) + public ResponseResult getMenuChild(@PathVariable("menuId") Long menuId) { + SysMenu menus= sysMenuService.getMenuChild(menuId); + return ResponseResult.success(menus); + } + + @GetMapping("selectList") + @ApiOperation(value = "查询菜单信息树形", httpMethod = "GET", response = SysMenu.class) + public ResponseResult> selectList(MenuQuery menuQuery) { + List menus = sysMenuService.selectList(menuQuery); + return ResponseResult.success(menus); + } + +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysPositionController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysPositionController.java new file mode 100644 index 0000000..057831d --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysPositionController.java @@ -0,0 +1,153 @@ +package com.mosty.common.core.business.controller; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.config.entity.vo.AddPositionVO; +import com.mosty.common.config.entity.vo.DeleteVO; +import com.mosty.common.config.entity.vo.EditPositionVO; +import com.mosty.common.core.business.entity.SysPosition; +import com.mosty.common.core.business.entity.vo.PositionPage; +import com.mosty.common.core.business.service.SysPositionService; +import com.mosty.common.token.JwtSysUser; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.Date; + +/** + *

+ * 岗位表 前端控制器 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +@Slf4j +@RestController +@AllArgsConstructor +@SuppressWarnings("unused") +@RequestMapping("/sysPosition") +@Api(tags = "岗位信息接口") +public class SysPositionController { + + private final SysPositionService sysPositionService; + + /** + * 添加岗位 + * @param addPositionVO 添加岗位请求 + * @return 添加结果 + */ + @JwtSysUser + @PostMapping("addSysPosition") + @Log(title = "岗位功能",businessType = BusinessType.INSERT) + @ApiOperation(value = "添加岗位", httpMethod = "POST", response = Boolean.class) + public ResponseResult addSysPosition(@RequestBody @Valid AddPositionVO addPositionVO) { + + SysPosition position = new SysPosition(); + + position.setPostDesc(addPositionVO.getPostDesc()); + position.setPostCode(addPositionVO.getPostCode()); + position.setPostName(addPositionVO.getPostName()); + position.setBz(addPositionVO.getBz()); + + UserInfo userInfo = UserInfoManager.get(); + position.setXtZxbz(DeletedEnum.NATURE.code); + + position.setXtCjsj(new Date()); + position.setXtZhxgsj(new Date()); + position.setXtZhxgrid(userInfo.getUserId().toString()); + position.setXtZhxgrxm(userInfo.getUserName()); + position.setXtZhxgrbmid(userInfo.getDeptId().toString()); + position.setXtZhxgrbm(userInfo.getDeptName()); + + position.setXtLrsj(new Date()); + position.setXtLrrid(userInfo.getUserId().toString()); + position.setXtLrrxm(userInfo.getUserName()); + position.setXtLrrbmid(userInfo.getDeptId().toString()); + position.setXtLrrbm(userInfo.getDeptName()); + + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(); + position.setXtLrip(ipAddress); + position.setXtZhxgip(ipAddress); + + sysPositionService.getBaseMapper().insert(position); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 修改岗位 + * @param editPositionVO 修改岗位请求 + * @return 修改结果 + */ + @JwtSysUser + @PostMapping("updateSysPosition") + @Log(title = "岗位功能",businessType = BusinessType.UPDATE) + @ApiOperation(value = "修改岗位", httpMethod = "POST", response = Boolean.class) + public ResponseResult updateSysPosition(@RequestBody @Valid EditPositionVO editPositionVO) { + Asserts.check(editPositionVO.getId() == null, "主键id不能为空!"); + SysPosition oldSysPosition = sysPositionService.getBaseMapper().selectById(editPositionVO.getId()); + Asserts.check(oldSysPosition == null, "主键为 %s 的岗位信息不存在", editPositionVO.getId()); + + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(); + oldSysPosition.setXtZhxgip(ipAddress); + + sysPositionService.updateSysPost(oldSysPosition, editPositionVO); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 删除岗位信息 + * @param deleteVO 岗位id + * @return 删除结果 + */ + @PostMapping("deleteSysPosition") + @JwtSysUser + @Log(title = "岗位功能",businessType = BusinessType.DELETE) + @ApiOperation(value = "删除岗位信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult deleteSysPosition(@RequestBody DeleteVO deleteVO) { + SysPosition oldSysPosition = sysPositionService.getBaseMapper().selectById(deleteVO.getId()); + Asserts.check(oldSysPosition == null, "主键为 %s 的岗位信息不存在", deleteVO.getId()); + + oldSysPosition.setXtZxbz(DeletedEnum.DELETED.code); + oldSysPosition.setXtZxyy(deleteVO.getZxyy()); + + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(); + + UserInfo userInfo = UserInfoManager.get(); + Asserts.checkAuth(userInfo == null, "用户信息为空,请登陆"); + oldSysPosition.setXtZhxgsj(new Date()); + oldSysPosition.setXtZhxgrid(userInfo.getUserId().toString()); + oldSysPosition.setXtZhxgrxm(userInfo.getUserName()); + oldSysPosition.setXtZhxgrbmid(userInfo.getDeptId().toString()); + oldSysPosition.setXtZhxgrbm(userInfo.getDeptName()); + oldSysPosition.setXtZhxgip(ipAddress); + + sysPositionService.getBaseMapper().updateById(oldSysPosition); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("selectPage") + @ApiOperation(value = "分页查询岗位信息", httpMethod = "GET", response = SysPosition.class) + public ResponseResult> selectPage(PositionPage positionPage) { + IPage positionIPage = sysPositionService.selectByPage(positionPage); + return ResponseResult.success(positionIPage); + } + +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysRoleController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysRoleController.java new file mode 100644 index 0000000..cebb826 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysRoleController.java @@ -0,0 +1,281 @@ +package com.mosty.common.core.business.controller; + + +import cn.hutool.core.bean.BeanUtil; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.entity.log.OperatorType; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.config.entity.vo.DeleteVO; +import com.mosty.common.core.business.entity.*; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.core.business.service.*; +import com.mosty.common.core.config.DefaultRoleConfig; +import com.mosty.common.token.JwtSysUser; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.Date; +import java.util.List; + +/** + *

+ * 角色表 前端控制器 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +@SuppressWarnings("unused") +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("/sysRole") +@Api(tags = "角色信息接口") +public class SysRoleController { + + private final SysUserService sysUserService; + private final SysRoleService sysRoleService; + private final SysDeptService sysDeptService; + private final SysUserRoleService sysUserRoleService; + private final SysRoleDeptService sysRoleDeptService; + private final DefaultRoleConfig defaultRoleConfig; + private final LoginService loginService; + + @JwtSysUser + @PostMapping("addSysRole") + @Log(title = "角色功能--添加角色", businessType = BusinessType.INSERT) + @ApiOperation(value = "添加角色", httpMethod = "POST", response = Boolean.class) + public ResponseResult addSysRole(@RequestBody @Valid AddRoleVO addRoleVo, + HttpServletRequest servletRequest) { + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(servletRequest); + + String roleCode = addRoleVo.getRoleCode(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("role_code", roleCode); + queryWrapper.eq("xt_zxbz", DeletedEnum.NATURE.code); + List list = sysRoleService.list(queryWrapper); + Asserts.check(CollectionUtils.isNotEmpty(list), "角色编码%s已存在,请修改", roleCode); + + sysRoleService.insertRole(addRoleVo, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + @JwtSysUser + @PostMapping("updateSysRole") + @Log(title = "角色功能--修改角色信息", businessType = BusinessType.UPDATE) + @ApiOperation(value = "修改角色信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult updateSysRole(@RequestBody @Valid SysRoleVO sysRoleVO, + HttpServletRequest servletRequest) { + + Asserts.check(sysRoleVO.getId() == null, "主键id不能为空!"); + SysRole oldSysRole = sysRoleService.getBaseMapper().selectById(sysRoleVO.getId()); + Asserts.check(oldSysRole == null, "主键为 %s 的角色信息不存在", sysRoleVO.getId()); + + String roleCode = sysRoleVO.getRoleCode(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.ne("id", sysRoleVO.getId()); + queryWrapper.eq("role_code", roleCode); + queryWrapper.eq("xt_zxbz", DeletedEnum.NATURE.code); + List list = sysRoleService.list(queryWrapper); + Asserts.check(CollectionUtils.isNotEmpty(list), "角色编码%s已存在,请修改", roleCode); + + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(servletRequest); + + UserInfo userInfo = UserInfoManager.get(); + oldSysRole.setXtZhxgsj(new Date()); + oldSysRole.setXtZhxgrid(userInfo.getUserId().toString()); + oldSysRole.setXtZhxgrxm(userInfo.getUserName()); + oldSysRole.setXtZhxgrbmid(userInfo.getDeptId().toString()); + oldSysRole.setXtZhxgrbm(userInfo.getDeptName()); + oldSysRole.setXtZhxgip(ipAddress); + + oldSysRole.setRoleName(sysRoleVO.getRoleName()); + oldSysRole.setRoleCode(sysRoleVO.getRoleCode()); + oldSysRole.setRoleDesc(sysRoleVO.getRoleDesc()); + oldSysRole.setBz(sysRoleVO.getBz()); + oldSysRole.setOrderNo(sysRoleVO.getOrderNo()); + oldSysRole.setDataPermissionLevel(sysRoleVO.getDataPermissionLevel()); + + sysRoleService.getBaseMapper().updateById(oldSysRole); + return ResponseResult.success(Boolean.TRUE); + } + + @JwtSysUser + @PostMapping("deleteSysRole") + @Log(title = "角色功能--删除角色信息", businessType = BusinessType.DELETE) + @ApiOperation(value = "删除角色信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult deleteSysRole(@RequestBody DeleteVO deleteVO, HttpServletRequest servletRequest) { + SysRole oldSysRole = sysRoleService.getBaseMapper().selectById(deleteVO.getId()); + Asserts.check(oldSysRole == null, "主键为 %s 的角色信息不存在", deleteVO.getId()); + + QueryWrapper countUserWrapper = new QueryWrapper<>(); + countUserWrapper.eq("role_id", oldSysRole.getId()); + Integer countUser = sysUserRoleService.getBaseMapper().selectCount(countUserWrapper); + Asserts.check(countUser > 0, "存在用户角色,请先删除!"); + + QueryWrapper countDeptWrapper = new QueryWrapper<>(); + countDeptWrapper.eq("role_id", oldSysRole.getId()); + Integer countDept = sysRoleDeptService.getBaseMapper().selectCount(countDeptWrapper); + Asserts.check(countDept > 0, "存在部门角色,请先删除!"); + + // 默认角色不能进行删除 + defaultRoleConfig.getDefaultRoleList().forEach(roleId -> + Asserts.check(oldSysRole.getId().equals(roleId), "默认角色不能进行删除!")); + + oldSysRole.setXtZxbz(DeletedEnum.DELETED.code); + oldSysRole.setXtZxyy(deleteVO.getZxyy()); + + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(servletRequest); + + UserInfo userInfo = UserInfoManager.get(); + oldSysRole.setXtZhxgsj(new Date()); + oldSysRole.setXtZhxgrid(userInfo.getUserId().toString()); + oldSysRole.setXtZhxgrxm(userInfo.getUserName()); + oldSysRole.setXtZhxgrbmid(userInfo.getDeptId().toString()); + oldSysRole.setXtZhxgrbm(userInfo.getDeptName()); + oldSysRole.setXtZhxgip(ipAddress); + + sysRoleService.getBaseMapper().updateById(oldSysRole); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("selectUnAccreditPage") + @ApiOperation(value = "分页查询未绑定当前用户的角色", httpMethod = "GET", response = SysRole.class) + public ResponseResult> selectUnAccreditPage(RolePage rolePage) { + IPage roleIPage = sysRoleService.selectUnAccreditPage(rolePage); + return ResponseResult.success(roleIPage); + } + + @JwtSysUser + @GetMapping("selectPage") + @ApiOperation(value = "分页查询角色信息", httpMethod = "GET", response = SysRole.class) + public ResponseResult> selectPage(RolePage rolePage) { + + IPage roleIPage = sysRoleService.selectByPage(rolePage); + return ResponseResult.success(roleIPage); + } + + @JwtSysUser + @GetMapping("roleUserList") + @Log(title = "角色功能", businessType = BusinessType.GRANT) + @ApiOperation(value = "查询角色管理的用户【需要控制当前人的权限】", httpMethod = "GET", response = SysUserVO.class) + public ResponseResult> roleUserList(RoleUserPage roleUserPage) { + UserInfo userInfo = UserInfoManager.get(); + SysDept sysDept = sysDeptService.getById(userInfo.getDeptId()); + IPage userPage = sysUserRoleService.roleUserList(sysDept.getRootPath(), roleUserPage); + return ResponseResult.success(userPage); + } + + @JwtSysUser + @PostMapping("grantRoleToUser") + @Log(title = "角色功能--为用户授予角色", businessType = BusinessType.GRANT) + @ApiOperation(value = "为用户授予角色", httpMethod = "POST", response = Boolean.class) + public ResponseResult grantRoleToUser(@RequestBody UserRoleVO userRoleVo) { + UserInfo userInfo = UserInfoManager.get(); + boolean save = sysUserRoleService.grantRoleToUser(userRoleVo); + return ResponseResult.success(save); + } + + @PostMapping("grantUserToRole") + @Log(title = "角色功能--为角色授予用户", businessType = BusinessType.GRANT) + @ApiOperation(value = "为角色授予用户", httpMethod = "POST", response = Boolean.class) + public ResponseResult grantUserToRole(@RequestBody RoleUserVO roleUserVO) { + boolean save = sysUserRoleService.grantUserToRole(roleUserVO); + return ResponseResult.success(save); + } + + @JwtSysUser + @PostMapping("batchUnboundUserRole") + @Log(title = "角色功能--批量解绑用户角色", businessType = BusinessType.OTHER) + @ApiOperation(value = "批量解绑用户角色", httpMethod = "POST", response = Boolean.class) + public ResponseResult batchUnboundUserRole(@RequestBody UnboundUserRoleVO unboundUserRoleVo) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.and(wrapper -> wrapper.in("id", unboundUserRoleVo.getIds())); + boolean save = sysUserRoleService.remove(queryWrapper); + return ResponseResult.success(save); + } + + @GetMapping("getUserRoleList/{userId}") + @ApiOperation(value = "查询用户角色列表", httpMethod = "GET", response = SysRoleVO.class) + public ResponseResult> getUserRoleList(@PathVariable Long userId) { + List userRoleList = sysRoleService.getUserRoleList(userId); + return ResponseResult.success(userRoleList); + } + + + @GetMapping("getRoleUserList") + @ApiOperation(value = "查询角色下用户列表", httpMethod = "GET", response = SysRoleVO.class) + public ResponseResult> getRoleUserList(GetUserRoleListVo vo) { + IPage deptIPage = sysRoleService.getRoleUserList(vo); + return ResponseResult.success(deptIPage); + + } + + @PostMapping("saveRoleMenuInfo") + @JwtSysUser + @Log(title = "角色功能--添加角色菜单关联关系", businessType = BusinessType.GRANT) + @ApiOperation(value = "添加角色菜单关联关系", httpMethod = "POST", response = Boolean.class) + public ResponseResult saveRoleMenuInfo(@RequestBody AddRoleMenuVO roleMenuVO) { + log.info("添加角色菜单关联关系 roleMenuVO={}", JSON.toJSONString(roleMenuVO)); + + SysRole sysRole = sysRoleService.getById(roleMenuVO.getRoleId()); + Asserts.check(sysRole == null || DeletedEnum.DELETED.code.equals(sysRole.getXtZxbz()), + "角色id不存在或已删除"); + + sysRoleService.saveRoleMenuInfo(roleMenuVO); + return ResponseResult.success(Boolean.TRUE); + } + + @PostMapping("saveDataPermission") + @JwtSysUser + @Log(title = "角色功能", businessType = BusinessType.GRANT) + @ApiOperation(value = "添加数据权限", httpMethod = "POST", response = Boolean.class) + public ResponseResult saveDataPermission(@RequestBody AddRoleDataPartitionVO addRoleDataPartitionVO, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysRoleService.saveDataPermission(addRoleDataPartitionVO, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 根据菜单标识查询数据权限 + * + * @param menuUrl 菜单URL + * @return 删除结果 + */ + @PostMapping("getDataPermission/{menuUrl}") + @ApiOperation(value = "根据菜单标识查询数据权限", httpMethod = "GET", response = Boolean.class) + public ResponseResult getDataPermission(@PathVariable("menuUrl") String menuUrl) { + DataPermissionVO dataPermissionVO = sysRoleService.getDataPermission(menuUrl); + return ResponseResult.success(dataPermissionVO); + } + + @GetMapping("getRoleMenuIds/{roleId}") + @ApiOperation(value = "查询用户绑定的菜单ids", httpMethod = "GET", response = SysRoleVO.class) + public ResponseResult> getRoleMenuIds(@PathVariable Long roleId) { + List menuIds = sysRoleService.getRoleMenuIds(roleId); + return ResponseResult.success(menuIds); + + } + + +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigController.java new file mode 100644 index 0000000..e7b3b0f --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigController.java @@ -0,0 +1,157 @@ +package com.mosty.common.core.business.controller; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.SysUserAppHomeconfig; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPage; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigPage; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigQuery; +import com.mosty.common.core.business.entity.vo.SysAppHomeconfigRsVO; +import com.mosty.common.core.business.entity.vo.SysUserAppHomeconfigVo; +import com.mosty.common.core.business.entity.vo.SysUserHomeconfigVo; +import com.mosty.common.core.business.service.SysUserAppHomeconfigService; +import com.mosty.common.token.JwtSysUser; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * 用户app首页配置表 前端控制器 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Api(tags = "app用户首页接口") +@RestController +@AllArgsConstructor +@RequestMapping("/sysUserAppHomeconfig") +public class SysUserAppHomeconfigController { + + private SysUserAppHomeconfigService sysUserAppHomeconfigService; + + /** + * 添加用户首页应用 + * @param config + * @return 添加结果 + */ + @PostMapping("add") + @JwtSysUser + @ApiOperation(value = "添加首页应用", httpMethod = "POST", response = Boolean.class) + @Log(title = "添加首页应用板块",businessType = BusinessType.INSERT) + public ResponseResult add(@RequestBody @Valid SysUserAppHomeconfig config, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigService.saveInfo(config, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 添加用户首页应用 + * @param plates 部门 + * @return 添加结果 + */ + @PostMapping("addBatch") + @JwtSysUser + @ApiOperation(value = "批量添加首页应用板块", httpMethod = "POST", response = Boolean.class) + @Log(title = "批量添加首页应用板块",businessType = BusinessType.INSERT) + public ResponseResult addBatch(@RequestBody List plates, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigService.saveInfoBatch(plates, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 修改用户首页应用 + * @param config 修改用户首页应用信息 + * @return 修改结果 + */ + @PostMapping("update") + @JwtSysUser + @Log(title = "用户首页应用",businessType = BusinessType.UPDATE) + @ApiOperation(value = "修改用户首页应用", httpMethod = "POST", response = Boolean.class) + public ResponseResult update(@RequestBody @Valid SysUserAppHomeconfig config, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigService.updateInfo(config, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 批量修改用户首页应用 + * @param plates 首页板块信息 + * @return 修改结果 + */ + @PostMapping("updateBatch") + @JwtSysUser + @Log(title = "批量修改用户首页应用",businessType = BusinessType.UPDATE) + @ApiOperation(value = "批量修改用户首页应用", httpMethod = "POST", response = Boolean.class) + public ResponseResult updateBatch(@RequestBody List plates, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigService.updateInfoBatch(plates, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 删除用户应用信息 + * @param list 应用id + * @return 删除结果 + */ + @Log(title = "删除用户应用功能",businessType = BusinessType.DELETE) + @PostMapping("deletePlate") + @JwtSysUser + @ApiOperation(value = "删除用户应用信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult deletePlate(@RequestBody List list, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); +// UserInfo userInfo = UserInfoManager.get(); + sysUserAppHomeconfigService.delete(list, ipAddress, null); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("selectPage") + @ApiOperation(value = "分页查询应用信息", httpMethod = "GET", response = SysDept.class) + public ResponseResult> selectPage(SysUserAppHomeconfigPage deptPage) { + IPage deptIPage = sysUserAppHomeconfigService.selectByPage(deptPage); + return ResponseResult.success(deptIPage); + } + + @GetMapping("queryUserConfig") + @ApiOperation(value = "查询用户配置", httpMethod = "GET", response = SysDept.class) + public ResponseResult> queryUserConfig(SysUserAppHomeconfigQuery cofigQuery) { + List vos = sysUserAppHomeconfigService.queryUserConfig(cofigQuery); + return ResponseResult.success(vos); + } + + + /** + * 添加用户默认配置 + * @param config + * @return 添加结果 + */ + @PostMapping("addDefaultConfig") + @JwtSysUser + @ApiOperation(value = "添加用户默认配置", httpMethod = "POST", response = Boolean.class) + @Log(title = "添加用户默认配置",businessType = BusinessType.INSERT) + public ResponseResult addDefaultConfig(@RequestBody @Valid SysUserHomeconfigVo config, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigService.saveDefaultConfig(config, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigPlateController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigPlateController.java new file mode 100644 index 0000000..36fd0f0 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigPlateController.java @@ -0,0 +1,130 @@ +package com.mosty.common.core.business.controller; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.SysUserAppHomeconfig; +import com.mosty.common.core.business.entity.SysUserAppHomeconfigPlate; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigPage; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigPlatePage; +import com.mosty.common.core.business.mapper.SysUserAppHomeconfigPlateMapper; +import com.mosty.common.core.business.service.SysUserAppHomeconfigPlateService; +import com.mosty.common.token.JwtSysUser; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * 用户app首页配置-板块表 前端控制器 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Api(tags = "app用户首页板块接口") +@RestController +@AllArgsConstructor +@RequestMapping("/sysuserAppHomeconfigPlate") +public class SysUserAppHomeconfigPlateController { + + private SysUserAppHomeconfigPlateService sysUserAppHomeconfigPlateService; + + /** + * 添加用户首页应用板块 + * @param config + * @return 添加结果 + */ + @PostMapping("add") + @JwtSysUser + @ApiOperation(value = "添加用户首页应用板块", httpMethod = "POST", response = Boolean.class) + @Log(title = "添加首页应用板块",businessType = BusinessType.INSERT) + public ResponseResult add(@RequestBody @Valid SysUserAppHomeconfigPlate config, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigPlateService.saveInfo(config, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 添加用户首页应用 + * @param plates 部门 + * @return 添加结果 + */ + @PostMapping("addBatch") + @JwtSysUser + @ApiOperation(value = "批量添加用户首页应用板块", httpMethod = "POST", response = Boolean.class) + @Log(title = "批量添加首页应用板块",businessType = BusinessType.INSERT) + public ResponseResult addBatch(@RequestBody List plates, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigPlateService.saveInfoBatch(plates, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 修改用户首页应用 + * @param plate 修改用户首页应用信息 + * @return 修改结果 + */ + @PostMapping("update") + @JwtSysUser + @Log(title = "首页应用板块",businessType = BusinessType.UPDATE) + @ApiOperation(value = "修改用户首页应用板块", httpMethod = "POST", response = Boolean.class) + public ResponseResult update(@RequestBody @Valid SysUserAppHomeconfigPlate plate, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigPlateService.updateInfo(plate, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 批量修改用户首页应用板块 + * @param plates 首页板块信息 + * @return 修改结果 + */ + @PostMapping("updateBatch") + @JwtSysUser + @Log(title = "批量修改用户首页应用板块",businessType = BusinessType.UPDATE) + @ApiOperation(value = "批量修改用户首页应用板块", httpMethod = "POST", response = Boolean.class) + public ResponseResult updateBatch(@RequestBody List plates, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigPlateService.updateInfoBatch(plates, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 删除应用板块信息 + * @param list 应用id + * @return 删除结果 + */ + @Log(title = "删除用户应用板块功能",businessType = BusinessType.DELETE) + @PostMapping("deletePlate") + @JwtSysUser + @ApiOperation(value = "删除用户应用板块信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult deletePlate(@RequestBody List list, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); +// UserInfo userInfo = UserInfoManager.get(); + sysUserAppHomeconfigPlateService.delete(list, ipAddress, null); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("selectPage") + @ApiOperation(value = "分页查询应用板块信息", httpMethod = "GET", response = SysDept.class) + public ResponseResult> selectPage(SysUserAppHomeconfigPlatePage deptPage) { + IPage deptIPage = sysUserAppHomeconfigPlateService.selectByPage(deptPage); + return ResponseResult.success(deptIPage); + } + +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigPlateListController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigPlateListController.java new file mode 100644 index 0000000..4d59f17 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserAppHomeconfigPlateListController.java @@ -0,0 +1,127 @@ +package com.mosty.common.core.business.controller; + + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.SysUserAppHomeconfigPlateList; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigPlateListPage; +import com.mosty.common.core.business.service.SysUserAppHomeconfigPlateListService; +import com.mosty.common.token.JwtSysUser; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; + +/** + *

+ * 用户app首页配置-板块内容表 前端控制器 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Api(tags = "app用户首页板块内容接口") +@RestController +@AllArgsConstructor +@RequestMapping("/sysUserAppHomeconfigPlateList") +public class SysUserAppHomeconfigPlateListController { + + private SysUserAppHomeconfigPlateListService sysUserAppHomeconfigPlateListService; + + /** + * 添加用户首页应用板块内容 + * @param config + * @return 添加结果 + */ + @PostMapping("add") + @JwtSysUser + @ApiOperation(value = "添加用户首页应用板块内容", httpMethod = "POST", response = Boolean.class) + @Log(title = "添加首页应用板块内容",businessType = BusinessType.INSERT) + public ResponseResult add(@RequestBody @Valid SysUserAppHomeconfigPlateList config, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigPlateListService.saveInfo(config, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 添加用户首页应用内容 + * @param plates + * @return 添加结果 + */ + @PostMapping("addBatch") + @JwtSysUser + @ApiOperation(value = "批量添加用户首页应用板块内容", httpMethod = "POST", response = Boolean.class) + @Log(title = "批量添加首页应用板块内容",businessType = BusinessType.INSERT) + public ResponseResult addBatch(@RequestBody List plates, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigPlateListService.saveInfoBatch(plates, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 修改用户首页应用 + * @param plate 修改用户首页应用信息 + * @return 修改结果 + */ + @PostMapping("update") + @JwtSysUser + @Log(title = "首页应用板块内容",businessType = BusinessType.UPDATE) + @ApiOperation(value = "修改用户首页应用板块内容", httpMethod = "POST", response = Boolean.class) + public ResponseResult update(@RequestBody @Valid SysUserAppHomeconfigPlateList plate, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigPlateListService.updateInfo(plate, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 批量修改用户首页应用板块 + * @param plates 首页板块信息 + * @return 修改结果 + */ + @PostMapping("updateBatch") + @JwtSysUser + @Log(title = "批量修改用户首页应用板块内容",businessType = BusinessType.UPDATE) + @ApiOperation(value = "批量修改用户首页应用板块内容", httpMethod = "POST", response = Boolean.class) + public ResponseResult updateBatch(@RequestBody List plates, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserAppHomeconfigPlateListService.updateInfoBatch(plates, ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 删除应用板块信息 + * @param list 应用id + * @return 删除结果 + */ + @Log(title = "删除用户应用板块内容功能",businessType = BusinessType.DELETE) + @PostMapping("deletePlate") + @JwtSysUser + @ApiOperation(value = "删除用户应用板块内容信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult deletePlate(@RequestBody List list, + HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); +// UserInfo userInfo = UserInfoManager.get(); + sysUserAppHomeconfigPlateListService.delete(list, ipAddress, null); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("selectPage") + @ApiOperation(value = "分页查询应用板块内容信息", httpMethod = "GET", response = SysDept.class) + public ResponseResult> selectPage(SysUserAppHomeconfigPlateListPage deptPage) { + IPage deptIPage = sysUserAppHomeconfigPlateListService.selectByPage(deptPage); + return ResponseResult.success(deptIPage); + } + +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserController.java new file mode 100644 index 0000000..e671078 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/SysUserController.java @@ -0,0 +1,313 @@ +package com.mosty.common.core.business.controller; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.constant.enums.ConfigKeyEnum; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.constant.enums.PasswordLevelEnum; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.config.entity.SysConfig; +import com.mosty.common.config.entity.vo.DeleteVO; +import com.mosty.common.config.service.SysConfigService; +import com.mosty.common.core.business.entity.*; +import com.mosty.common.core.business.entity.request.SysUserEditPasswordRequest; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.core.business.mapper.SysUserDeptMapper; +import com.mosty.common.core.business.mapper.SysUserRoleMapper; +import com.mosty.common.core.business.mapper.YbmjMapper; +import com.mosty.common.core.business.service.*; +import com.mosty.common.redis.service.RedisService; +import com.mosty.common.token.JwtSysUser; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; +import java.util.Objects; + + +/** + * 用户控制类 + * + * @author kevin + * @date 2022/2/12 10:17 PM + * @since 1.0.0 + */ +@SuppressWarnings("unused") +@RestController +@AllArgsConstructor +@RequestMapping("/sysUser") +@Api(tags = "用户接口") +public class SysUserController { + + private final SysUserService sysUserService; + private final SysDeptService sysDeptService; + private final SysPositionService sysPositionService; + private final SysConfigService sysConfigService; + private final SysUserDeptService sysUserDeptService; + private final SysUserRoleService sysUserRoleService; + private final RedisService redisService; + private final SysUserRoleMapper sysUserRoleMapper; + private final SysUserDeptMapper sysUserDeptMapper; + private final YbmjMapper ybmjMapper; + + @JwtSysUser + @PostMapping("addUser") + @Log(title = "添加用户信息", businessType = BusinessType.INSERT) + @ApiOperation(value = "添加用户信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult addSysUser(@RequestBody @Valid AddSysUserVO sysUserVo, + HttpServletRequest servletRequest) { + +/* QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("login_name", sysUserVo.getLoginName()); + SysUser sysUser = sysUserService.getBaseMapper().selectOne(queryWrapper); + if (sysUser != null) + return ResponseResult.fail("登录账号重复!!");*/ + + if (sysUserService.getBaseMapper().selectCount(new LambdaQueryWrapper().eq(SysUser::getIdEntityCard, sysUserVo.getIdEntityCard())) > 0) + return ResponseResult.fail("身份证重复!!"); + + if (sysUserService.getBaseMapper().selectCount(new LambdaQueryWrapper().eq(SysUser::getInDustRialId, sysUserVo.getInDustRialId())) > 0) + return ResponseResult.fail("警号重复!!"); + + + // 验证岗位信息并且设置岗位名称 + SysPosition sysPosition = sysPositionService.getById(sysUserVo.getPositionId()); +// if (sysPosition == null || sysPosition.getXtZxbz() != 0) +// return ResponseResult.fail("岗位 %s 不存在!"); + sysUserVo.setPositionName(sysPosition != null ? sysPosition.getPostName() : ""); + + UserInfo userInfo = UserInfoManager.get(); + + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserVo.setXtLrip(ipAddress); + sysUserVo.setXtZhxgrip(ipAddress); + + // 保存用户信息 + sysUserService.saveInfo(sysUserVo); + + return ResponseResult.success(Boolean.TRUE); + } + + + @JwtSysUser + @PostMapping("addUserTbYb") + @Log(title = "同步宜宾人员", businessType = BusinessType.INSERT) + @ApiOperation(value = "同步宜宾人员", httpMethod = "POST", response = Boolean.class) + public ResponseResult addUserTbYb() { + + List ybmjs = ybmjMapper.selectList(new QueryWrapper<>()); + if (!CollectionUtils.isEmpty(ybmjs)) { + for (Ybmj ybmj : ybmjs) { + SysUser sysUser = sysUserService.getBaseMapper().selectOne(new QueryWrapper().eq("id_entity_card", ybmj.getSfzh())); + if (sysUser == null) { + AddSysUserVO sysUserVo = new AddSysUserVO(); + sysUserVo.setSsbmdm(ybmj.getSsbmdm()); + sysUserVo.setLoginName(ybmj.getXm()); + sysUserVo.setPassword("E10ADC3949BA59ABBEcm9OiHRC56E057F20F883E"); + sysUserVo.setUserName(ybmj.getXm()); + sysUserVo.setUserType("00"); + sysUserVo.setMobile(ybmj.getDh()); + sysUserVo.setTelePhone(ybmj.getDh()); + sysUserVo.setIdEntityCard(ybmj.getSfzh()); + sysUserVo.setInDustRialId(ybmj.getJh()); + //计算男女 + int gender = Integer.parseInt(ybmj.getSfzh().substring(16, 17)); + if (gender % 2 == 1) { + sysUserVo.setSex("0"); + } else { + sysUserVo.setSex("1"); + } + sysUserVo.setNation("01"); + sysUserVo.setType("01"); + sysUserVo.setIsVirtualUser("2"); + sysUserVo.setSfrh("0"); + UserInfo userInfo = UserInfoManager.get(); + // 获取ip地址 +// String ipAddress = IpUtil.getIpAddress(servletRequest); +// sysUserVo.setXtLrip(ipAddress); +// sysUserVo.setXtZhxgrip(ipAddress); + // 保存用户信息 + sysUserService.saveInfo(sysUserVo); + ybmjMapper.deleteById(ybmj); + } else { + if (DeletedEnum.DELETED.code.equals(sysUser.getXtZxbz())) + return ResponseResult.fail("用户不存在!"); + SysUserEditVO sysUserEditVo = new SysUserEditVO(); + sysUserEditVo.setSsbmdm(ybmj.getSsbmdm()); + sysUserEditVo.setLoginName(ybmj.getXm()); +// sysUserEditVo.setPassword("E10ADC3949BA59ABBEcm9OiHRC56E057F20F883E"); + sysUserEditVo.setUserName(ybmj.getXm()); + sysUserEditVo.setUserType("01"); + sysUserEditVo.setMobile(ybmj.getDh()); + sysUserEditVo.setTelePhone(ybmj.getDh()); + sysUserEditVo.setIdEntityCard(ybmj.getSfzh()); + sysUserEditVo.setInDustRialId(ybmj.getJh()); + //计算男女 + int gender = Integer.parseInt(ybmj.getSfzh().substring(16, 17)); + if (gender % 2 == 1) { + sysUserEditVo.setSex("1"); + } else { + sysUserEditVo.setSex("2"); + } + sysUserEditVo.setNation("01"); + sysUserEditVo.setType("01"); + sysUserEditVo.setIsVirtualUser("2"); + sysUserEditVo.setSfrh("0"); + sysUserEditVo.setId(sysUser.getId()); + UserInfo userInfo = UserInfoManager.get(); + sysUserService.editInfo(sysUserEditVo, sysUser); + ybmjMapper.deleteById(ybmj); + } + } + return ResponseResult.success(Boolean.TRUE); + } + return null; + } + + + @JwtSysUser + @PostMapping("editSysUser") + @Log(title = "用户功能--编辑用户信息", businessType = BusinessType.UPDATE) + @ApiOperation(value = "编辑用户信息", httpMethod = "POST", response = Boolean.class) + public ResponseResult editSysUser(@RequestBody @Valid SysUserEditVO sysUserEditVo) { + + Long id = sysUserEditVo.getId(); + SysUser sysUser = sysUserService.getUserInfo(id); + if (sysUser == null || DeletedEnum.DELETED.code.equals(sysUser.getXtZxbz())) + return ResponseResult.fail("用户不存在!"); + sysUserService.editInfo(sysUserEditVo, sysUser); + return ResponseResult.success(Boolean.TRUE); + } + + @JwtSysUser + @PostMapping("editPassword") + @Log(title = "用户功能--编辑密码", businessType = BusinessType.UPDATE) + @ApiOperation(value = "编辑密码", httpMethod = "POST", response = Boolean.class) + public ResponseResult editPassword(@RequestBody @Valid SysUserEditPasswordRequest sysUserEditPasswordRequest) { + sysUserService.editPassword(sysUserEditPasswordRequest); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("resetPassword") + @Log(title = "用户功能--重置密码", businessType = BusinessType.UPDATE) + @ApiOperation(value = "重置密码", httpMethod = "POST", response = Boolean.class) + public ResponseResult resetPassword(@RequestParam("userId") Long userId) { + SysUser user = sysUserService.getUserInfo(userId); + + Asserts.check(user == null || DeletedEnum.DELETED.code.equals(user.getXtZxbz()), + "用户不存在或已删除"); + + sysUserService.resetPassword(user); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("getUserInfo/{id}") + @JwtSysUser + @ApiOperation(value = "查询用户信息", httpMethod = "GET", response = SysUserInfoVO.class) + public ResponseResult getUserInfo(@PathVariable("id") Long id) { + UserInfo user1 = UserInfoManager.get(); + SysUser user = sysUserService.getUserInfo(id); + Asserts.check(user == null || DeletedEnum.DELETED.code.equals(user.getXtZxbz()), + "用户不存在或已删除"); + List deptIds = sysUserDeptService.listByUserId(user.getId()); + SysUserInfoVO sysUserInfoVO = BeanUtil.copyProperties(user, SysUserInfoVO.class); + if (!CollectionUtils.isEmpty(deptIds)) { + sysUserInfoVO.setDeptIds(deptIds); + SysDept dept = sysDeptService.getById(deptIds.get(0)); + if (dept != null) { + sysUserInfoVO.setSsbm(dept.getOrgName()); + sysUserInfoVO.setSsbmdm(dept.getOrgCode()); + } + } + return ResponseResult.success(sysUserInfoVO); + } + + @GetMapping("selectUnAccreditPage") + @ApiOperation(value = "分页查询未绑定当前角色的用户", httpMethod = "GET", response = SysRole.class) + public ResponseResult> selectUnAccreditPage(UserPage userPage) { + IPage roleIPage = sysUserService.selectUnAccreditPage(userPage); + return ResponseResult.success(roleIPage); + } + + @GetMapping("selectPage") + @JwtSysUser + @ApiOperation(value = "分页查询用户信息", httpMethod = "GET", response = SysUserVO.class) + public ResponseResult> selectPage(UserPage userPage) { + IPage userVoPage = sysUserService.selectByPage(userPage); + return ResponseResult.success(userVoPage); + } + + @GetMapping("getUserList") + @JwtSysUser + @ApiOperation(value = "根据条件查询用户信息", httpMethod = "GET", response = SysUserVO.class) + public ResponseResult> getUserList(GetUserPage dto) { + return ResponseResult.success(sysUserService.getUserList(dto)); + } + + + @PostMapping("selectUserDeptPage") + @JwtSysUser + @ApiOperation(value = "查询用户和部门分页", httpMethod = "POST", response = SysRole.class) + public ResponseResult> selectUserDeptPage(@RequestBody UserDeptPage userDeptPage) { + IPage sysUserDeptVOIPage = sysUserService.selectUserDeptPage(userDeptPage); + return ResponseResult.success(sysUserDeptVOIPage); + } + + @JwtSysUser + @GetMapping("getPasswordLevel") + @ApiOperation(value = "当前系统的密码等级", httpMethod = "GET", response = Integer.class) + public ResponseResult getPasswordLevel() { + UserInfo userInfo = UserInfoManager.get(); + SysConfig config = sysConfigService.getOneByKey(ConfigKeyEnum.PASSWORD_LEVEL); + if (Objects.isNull(config)) { + return ResponseResult.success(PasswordLevelEnum.PASSWORD_LEVEL_ONE.code); + } + return ResponseResult.success(Integer.valueOf(config.getPzz())); + } + + @JwtSysUser + @PostMapping("deleteSysUser") + @Log(title = "删除用户", businessType = BusinessType.DELETE) + @ApiOperation(value = "删除用户", httpMethod = "POST", response = Boolean.class) + public ResponseResult deleteSysRole(@RequestBody DeleteVO deleteVO, HttpServletRequest servletRequest) { + SysUser oldSysUser = sysUserService.getBaseMapper().selectById(deleteVO.getId()); + if (oldSysUser == null) + return ResponseResult.fail("用户不存在或已删除"); + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysUserService.delById(oldSysUser.getId()); + // 删除关联角色 + this.sysUserRoleMapper.delete( + new LambdaQueryWrapper() + .eq(SysUserRole::getUserId, oldSysUser.getId()) + ); + // 删除关联部门 + this.sysUserDeptMapper.delete( + new LambdaQueryWrapper() + .eq(SysUserDept::getUserId, oldSysUser.getId()) + ); + return ResponseResult.success(Boolean.TRUE); + } + + @GetMapping("userSys") + @ApiOperation(value = "用户信息同步", httpMethod = "GET", response = Boolean.class) + public ResponseResult userSys() { + Boolean bool = sysUserService.userSys(); + return ResponseResult.success(bool); + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/controller/TokenController.java b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/TokenController.java new file mode 100644 index 0000000..e2b8169 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/controller/TokenController.java @@ -0,0 +1,106 @@ +package com.mosty.common.core.business.controller; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.google.common.collect.Maps; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.core.business.entity.vo.LoginResponseVO; +import com.mosty.common.core.util.HttpClientUtil; +import com.mosty.common.core.util.RSAUtil; +import io.swagger.annotations.Api; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.Header; +import org.apache.http.HttpResponse; +import org.apache.http.util.EntityUtils; +import org.springframework.web.bind.annotation.*; + +import java.net.URLEncoder; +import java.util.HashMap; +import java.util.Objects; + +import static com.google.common.base.Charsets.UTF_8; + +/** + *

+ * 应用信息表 前端控制器 + *

+ * + * @author kevin + * @since 2022-04-21 + */ +@RestController +@AllArgsConstructor +@RequestMapping("yjxx/token") +@Api(tags = "获取托尔思预警token") +@Slf4j +public class TokenController { + + /** + * 获取预警token + * + * @param idCard 添加应用信息请求 + * @return 添加结果 + */ + @GetMapping("getToken") + public ResponseResult getToken(@RequestParam("idCard") String idCard) throws Exception { + String rsa = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCKtrYCRHk/++b/yZteGW5pSfKynGjfNZ9TkC/+v8SrAZ8Gb24lEbB0zUp/rXabNHfSY6X3z6tCCA7pCig0TQIQT5iIz1eBuMPWcY61U1sySqVANu4IxchLzaPmKamttz2GXKby94rVa71eTVZ2kC0Vi424PjfL7C/iBQsgvoPV8wIDAQAB"; + String url = "https://80.35.1.27:7001/login/app?key="; + log.info("公钥:{}", rsa); + log.info("身份证号:{}", idCard); + String rsaStr = RSAUtil.encryptByPubKey(idCard, rsa); + String idCardRas = URLEncoder.encode(rsaStr, "UTF-8"); + String urls = url + idCardRas; + + HashMap loginMap = Maps.newHashMap(); + loginMap.put("Content-Type", "multipart/form-data"); + loginMap.put("Authorization", "Basic eXE6YWRtaW4="); + loginMap.put("User-Agent", "trs"); + + HttpResponse response = HttpClientUtil.postRequest(urls, loginMap); + String body = EntityUtils.toString(response.getEntity(), UTF_8); + + JSONObject jsonObject = JSONObject.parseObject(body); + String accessToken = jsonObject.getString("access_token"); + log.info("获取到的access_token={}", accessToken); + + if (response.getStatusLine().getStatusCode() != 200) { + log.warn("调用登陆服务异常{}", JSON.toJSONString(response)); + throw new RuntimeException("POST调用异常 : " + response.getStatusLine().getStatusCode()); + } + + + HashMap cookieMap = Maps.newHashMap(); + cookieMap.put("Authorization", "Bearer " + accessToken); + + String getCookieUrl = "http://80.35.1.27:7000/dispatchWarning/yjxx/getYjxxList?page=2&pageSize=10&type=9&lev=0&datasource=&datetype=nolimit&startdate=&enddate=&bklx=0&emphasiscode=&searchType=1&otherinfo=&yjlx=0"; + HttpResponse cookieResponse = HttpClientUtil.postRequest(getCookieUrl, cookieMap); + Header firstHeader = cookieResponse.getFirstHeader("Set-Cookie"); + + log.warn("调用cookie接口的 Http status = {}", response.getStatusLine().getStatusCode()); + + if (Objects.isNull(firstHeader)) { + log.warn("响应体cookie为空 ------{}", JSON.toJSONString(response.getAllHeaders())); + throw new RuntimeException("POST调用异常 : " + response.getStatusLine().getStatusCode()); + } + log.info("获取到的cookie={}", firstHeader.getValue()); + + LoginResponseVO loginResponseVO = new LoginResponseVO(); + loginResponseVO.setLoginResponseBody(body); + loginResponseVO.setLoginResponseCookie(firstHeader.getValue()); + + log.info("响应体 ------{}", JSON.toJSONString(loginResponseVO)); + return ResponseResult.success(loginResponseVO); + + } + + public static void main(String[] args) { + try { + LoginResponseVO vo = new TokenController().getToken("510603198807207837").getData(); + System.err.println(vo); + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfig.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfig.java new file mode 100644 index 0000000..1af074a --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfig.java @@ -0,0 +1,88 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * app首页表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("mosty_base.sys_app_homeconfig") +@ApiModel(value="SysAppHomeconfig对象", description="app首页表") +public class SysAppHomeconfig implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "首页名称,如:领导端") + private String homename; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfigPlate.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfigPlate.java new file mode 100644 index 0000000..1b4c93f --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfigPlate.java @@ -0,0 +1,103 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * app首页-板块表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("mosty_base.sys_app_homeconfig_plate") +@ApiModel(value="SysAppHomeconfigPlate对象", description="app首页-板块表") +public class SysAppHomeconfigPlate implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "首页ID") + private Long homeid; + + @ApiModelProperty(value = "板块类型(00-置顶按钮,01-五情板块,02-工作任务板块,03-概况板块,04-风险板块)") + private String bklx; + + @ApiModelProperty(value = "板块名称") + private String bkmc; + + @ApiModelProperty(value = "板块样式") + private String dyys; + + @ApiModelProperty(value = "板块顺序") + private Integer bksx; + + @ApiModelProperty(value = "跳转地址") + private String tzdz; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfigPlateList.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfigPlateList.java new file mode 100644 index 0000000..2046df4 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysAppHomeconfigPlateList.java @@ -0,0 +1,100 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * app首页配置-板块内容表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("mosty_base.sys_app_homeconfig_plate_list") +@ApiModel(value="SysAppHomeconfigPlateList对象", description="app首页配置-板块内容表") +public class SysAppHomeconfigPlateList implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "板块ID") + private Long plateId; + + @ApiModelProperty(value = "内容名称") + private String nrmc; + + @ApiModelProperty(value = "内容样式") + private String nrys; + + @ApiModelProperty(value = "路由跳转地址") + private String tzdz; + + @ApiModelProperty(value = "内容顺序") + private Integer nrsx; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysDept.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysDept.java new file mode 100644 index 0000000..029427e --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysDept.java @@ -0,0 +1,382 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mosty.common.core.business.entity.vo.SysDeptVO; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 部门表 + * @TableName sys_dept + */ +@TableName(value ="sys_dept") +@Data +public class SysDept implements Serializable { + /** + * 部门id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 部门代码 + */ + @TableField(value = "org_code") + private String orgCode; + + /** + * 部门名称 + */ + @TableField(value = "org_name") + private String orgName; + + /** + * 根节点开始的id路径 + */ + @TableField(value = "root_path") + private String rootPath; + + /** + * 部门类型 + */ + @TableField(value = "org_type") + private String orgType; + + /** + * 部门等级 + */ + @TableField(value = "org_level") + private String orgLevel; + + /** + * 部门业务类型 + */ + @TableField(value = "org_biz_type") + private String orgBizType; + + /** + * 部门顺序号 + */ + @TableField(value = "org_no") + private String orgNo; + + /** + * 上级部门主键 + */ + @TableField(value = "parent_id") + private Long parentId; + + /** + * 部门名称拼音首字母 + */ + @TableField(value = "bmpyszm") + private String bmpyszm; + + /** + * 部门简称 + */ + @TableField(value = "org_jc") + private String orgJc; + + /** + * 部门全称 + */ + @TableField(value = "org_qc") + private String orgQc; + + /** + * 部门地址 + */ + @TableField(value = "address") + private String address; + + /** + * 部门电话 + */ + @TableField(value = "link_tel") + private String linkTel; + + /** + * 部门联系人 + */ + @TableField(value = "link_man") + private String linkMan; + + /** + * 部门联系人电话 + */ + @TableField(value = "link_man_tel") + private String linkManTel; + + /** + * 部门主页 + */ + @TableField(value = "web_url") + private String webUrl; + + /** + * 部门邮箱 + */ + @TableField(value = "email") + private String email; + + /** + * 部门所属行政区划 + */ + @TableField(value = "xzqh") + private String xzqh; + + /** + * 备注 + */ + @TableField(value = "bz") + private String bz; + + /** + * 注销标志0正常 1.注销 + */ + @TableField(value = "xt_zxbz") + private Integer xtZxbz; + + /** + * 注销原因 + */ + @TableField(value = "xt_zxyy") + private String xtZxyy; + + /** + * 采集时间 + */ + @TableField(value = "xt_cjsj") + private Date xtCjsj; + + /** + * 录入时间 + */ + @TableField(value = "xt_lrsj") + private Date xtLrsj; + + /** + * 录入人姓名 + */ + @TableField(value = "xt_lrrxm") + private String xtLrrxm; + + /** + * 录入人id + */ + @TableField(value = "xt_lrrid") + private Long xtLrrid; + + /** + * 录入人部门 + */ + @TableField(value = "xt_lrrbm") + private String xtLrrbm; + + /** + * 录入人部门id + */ + @TableField(value = "xt_lrrbmid") + private String xtLrrbmid; + + /** + * 录入人部门id + */ + @TableField(value = "xt_lrip") + private String xtLrip; + + /** + * 最后修改时间 + */ + @TableField(value = "xt_zhxgsj") + private Date xtZhxgsj; + + /** + * 最后修改人姓名 + */ + @TableField(value = "xt_zhxgrxm") + private String xtZhxgrxm; + + /** + * 最后修改人id + */ + @TableField(value = "xt_zhxgid") + private Long xtZhxgid; + + /** + * 最后修改人部门 + */ + @TableField(value = "xt_zhxgrbm") + private String xtZhxgrbm; + + /** + * 最后修改人部门id + */ + @TableField(value = "xt_zhxgrbmid") + private Long xtZhxgrbmid; + + /** + * 最后修改人ip + */ + @TableField(value = "xt_zhxgrip") + private String xtZhxgrip; + + /** + * 子部门集合 + */ + @ApiModelProperty(value = "子部门集合") + @TableField(exist = false) + private List childDeptList; + + /** + * 是否包含下级 + */ + @ApiModelProperty(value = "是否包含下级") + @TableField(exist = false) + private boolean hasChildren; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SysDept other = (SysDept) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getOrgCode() == null ? other.getOrgCode() == null : this.getOrgCode().equals(other.getOrgCode())) + && (this.getOrgName() == null ? other.getOrgName() == null : this.getOrgName().equals(other.getOrgName())) + && (this.getOrgType() == null ? other.getOrgType() == null : this.getOrgType().equals(other.getOrgType())) + && (this.getOrgLevel() == null ? other.getOrgLevel() == null : this.getOrgLevel().equals(other.getOrgLevel())) + && (this.getOrgBizType() == null ? other.getOrgBizType() == null : this.getOrgBizType().equals(other.getOrgBizType())) + && (this.getOrgNo() == null ? other.getOrgNo() == null : this.getOrgNo().equals(other.getOrgNo())) + && (this.getParentId() == null ? other.getParentId() == null : this.getParentId().equals(other.getParentId())) + && (this.getBmpyszm() == null ? other.getBmpyszm() == null : this.getBmpyszm().equals(other.getBmpyszm())) + && (this.getOrgJc() == null ? other.getOrgJc() == null : this.getOrgJc().equals(other.getOrgJc())) + && (this.getOrgQc() == null ? other.getOrgQc() == null : this.getOrgQc().equals(other.getOrgQc())) + && (this.getAddress() == null ? other.getAddress() == null : this.getAddress().equals(other.getAddress())) + && (this.getLinkTel() == null ? other.getLinkTel() == null : this.getLinkTel().equals(other.getLinkTel())) + && (this.getLinkMan() == null ? other.getLinkMan() == null : this.getLinkMan().equals(other.getLinkMan())) + && (this.getLinkManTel() == null ? other.getLinkManTel() == null : this.getLinkManTel().equals(other.getLinkManTel())) + && (this.getWebUrl() == null ? other.getWebUrl() == null : this.getWebUrl().equals(other.getWebUrl())) + && (this.getEmail() == null ? other.getEmail() == null : this.getEmail().equals(other.getEmail())) + && (this.getXzqh() == null ? other.getXzqh() == null : this.getXzqh().equals(other.getXzqh())) + && (this.getBz() == null ? other.getBz() == null : this.getBz().equals(other.getBz())) + && (this.getXtZxbz() == null ? other.getXtZxbz() == null : this.getXtZxbz().equals(other.getXtZxbz())) + && (this.getXtZxyy() == null ? other.getXtZxyy() == null : this.getXtZxyy().equals(other.getXtZxyy())) + && (this.getXtCjsj() == null ? other.getXtCjsj() == null : this.getXtCjsj().equals(other.getXtCjsj())) + && (this.getXtLrsj() == null ? other.getXtLrsj() == null : this.getXtLrsj().equals(other.getXtLrsj())) + && (this.getXtLrrxm() == null ? other.getXtLrrxm() == null : this.getXtLrrxm().equals(other.getXtLrrxm())) + && (this.getXtLrrid() == null ? other.getXtLrrid() == null : this.getXtLrrid().equals(other.getXtLrrid())) + && (this.getXtLrrbm() == null ? other.getXtLrrbm() == null : this.getXtLrrbm().equals(other.getXtLrrbm())) + && (this.getXtLrrbmid() == null ? other.getXtLrrbmid() == null : this.getXtLrrbmid().equals(other.getXtLrrbmid())) + && (this.getXtLrip() == null ? other.getXtLrip() == null : this.getXtLrip().equals(other.getXtLrip())) + && (this.getXtZhxgsj() == null ? other.getXtZhxgsj() == null : this.getXtZhxgsj().equals(other.getXtZhxgsj())) + && (this.getXtZhxgrxm() == null ? other.getXtZhxgrxm() == null : this.getXtZhxgrxm().equals(other.getXtZhxgrxm())) + && (this.getXtZhxgid() == null ? other.getXtZhxgid() == null : this.getXtZhxgid().equals(other.getXtZhxgid())) + && (this.getXtZhxgrbm() == null ? other.getXtZhxgrbm() == null : this.getXtZhxgrbm().equals(other.getXtZhxgrbm())) + && (this.getXtZhxgrbmid() == null ? other.getXtZhxgrbmid() == null : this.getXtZhxgrbmid().equals(other.getXtZhxgrbmid())) + && (this.getXtZhxgrip() == null ? other.getXtZhxgrip() == null : this.getXtZhxgrip().equals(other.getXtZhxgrip())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getOrgCode() == null) ? 0 : getOrgCode().hashCode()); + result = prime * result + ((getOrgName() == null) ? 0 : getOrgName().hashCode()); + result = prime * result + ((getOrgType() == null) ? 0 : getOrgType().hashCode()); + result = prime * result + ((getOrgLevel() == null) ? 0 : getOrgLevel().hashCode()); + result = prime * result + ((getOrgBizType() == null) ? 0 : getOrgBizType().hashCode()); + result = prime * result + ((getOrgNo() == null) ? 0 : getOrgNo().hashCode()); + result = prime * result + ((getParentId() == null) ? 0 : getParentId().hashCode()); + result = prime * result + ((getBmpyszm() == null) ? 0 : getBmpyszm().hashCode()); + result = prime * result + ((getOrgJc() == null) ? 0 : getOrgJc().hashCode()); + result = prime * result + ((getOrgQc() == null) ? 0 : getOrgQc().hashCode()); + result = prime * result + ((getAddress() == null) ? 0 : getAddress().hashCode()); + result = prime * result + ((getLinkTel() == null) ? 0 : getLinkTel().hashCode()); + result = prime * result + ((getLinkMan() == null) ? 0 : getLinkMan().hashCode()); + result = prime * result + ((getLinkManTel() == null) ? 0 : getLinkManTel().hashCode()); + result = prime * result + ((getWebUrl() == null) ? 0 : getWebUrl().hashCode()); + result = prime * result + ((getEmail() == null) ? 0 : getEmail().hashCode()); + result = prime * result + ((getXzqh() == null) ? 0 : getXzqh().hashCode()); + result = prime * result + ((getBz() == null) ? 0 : getBz().hashCode()); + result = prime * result + ((getXtZxbz() == null) ? 0 : getXtZxbz().hashCode()); + result = prime * result + ((getXtZxyy() == null) ? 0 : getXtZxyy().hashCode()); + result = prime * result + ((getXtCjsj() == null) ? 0 : getXtCjsj().hashCode()); + result = prime * result + ((getXtLrsj() == null) ? 0 : getXtLrsj().hashCode()); + result = prime * result + ((getXtLrrxm() == null) ? 0 : getXtLrrxm().hashCode()); + result = prime * result + ((getXtLrrid() == null) ? 0 : getXtLrrid().hashCode()); + result = prime * result + ((getXtLrrbm() == null) ? 0 : getXtLrrbm().hashCode()); + result = prime * result + ((getXtLrrbmid() == null) ? 0 : getXtLrrbmid().hashCode()); + result = prime * result + ((getXtLrip() == null) ? 0 : getXtLrip().hashCode()); + result = prime * result + ((getXtZhxgsj() == null) ? 0 : getXtZhxgsj().hashCode()); + result = prime * result + ((getXtZhxgrxm() == null) ? 0 : getXtZhxgrxm().hashCode()); + result = prime * result + ((getXtZhxgid() == null) ? 0 : getXtZhxgid().hashCode()); + result = prime * result + ((getXtZhxgrbm() == null) ? 0 : getXtZhxgrbm().hashCode()); + result = prime * result + ((getXtZhxgrbmid() == null) ? 0 : getXtZhxgrbmid().hashCode()); + result = prime * result + ((getXtZhxgrip() == null) ? 0 : getXtZhxgrip().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", orgCode=").append(orgCode); + sb.append(", orgName=").append(orgName); + sb.append(", orgType=").append(orgType); + sb.append(", orgLevel=").append(orgLevel); + sb.append(", orgBizType=").append(orgBizType); + sb.append(", orgNo=").append(orgNo); + sb.append(", parentId=").append(parentId); + sb.append(", bmpyszm=").append(bmpyszm); + sb.append(", orgJc=").append(orgJc); + sb.append(", orgQc=").append(orgQc); + sb.append(", address=").append(address); + sb.append(", linkTel=").append(linkTel); + sb.append(", linkMan=").append(linkMan); + sb.append(", linkManTel=").append(linkManTel); + sb.append(", webUrl=").append(webUrl); + sb.append(", email=").append(email); + sb.append(", xzqh=").append(xzqh); + sb.append(", bz=").append(bz); + sb.append(", xtZxbz=").append(xtZxbz); + sb.append(", xtZxyy=").append(xtZxyy); + sb.append(", xtCjsj=").append(xtCjsj); + sb.append(", xtLrsj=").append(xtLrsj); + sb.append(", xtLrrxm=").append(xtLrrxm); + sb.append(", xtLrrid=").append(xtLrrid); + sb.append(", xtLrrbm=").append(xtLrrbm); + sb.append(", xtLrrbmid=").append(xtLrrbmid); + sb.append(", xtLrip=").append(xtLrip); + sb.append(", xtZhxgsj=").append(xtZhxgsj); + sb.append(", xtZhxgrxm=").append(xtZhxgrxm); + sb.append(", xtZhxgid=").append(xtZhxgid); + sb.append(", xtZhxgrbm=").append(xtZhxgrbm); + sb.append(", xtZhxgrbmid=").append(xtZhxgrbmid); + sb.append(", xtZhxgrip=").append(xtZhxgrip); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysLogininfor.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysLogininfor.java new file mode 100644 index 0000000..ac421d3 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysLogininfor.java @@ -0,0 +1,110 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mosty.common.base.entity.log.Excel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiOperation; +import lombok.Data; +import org.apache.poi.ss.usermodel.IndexedColors; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@TableName(value = "mosty_base.sys_logininfor") +@Data +public class SysLogininfor implements Serializable { + + private static final long serialVersionUID = 1L; + + @TableId(value = "info_id", type = IdType.AUTO) + @ApiModelProperty("访问ID") + private Long infoId; + + @TableField(value = "user_id") + @ApiModelProperty("人员ID") + private String userId; + + @TableField(value = "sfzh") + @ApiModelProperty("身份证号") + @Excel(name = "身份证号") + private String sfzh; + + @TableField(value = "user_name") + @ApiModelProperty("用户账号") + @Excel(name = "用户账号") + private String userName; + + @TableField(value = "ipaddr") + @ApiModelProperty("登录IP地址") + @Excel(name = "用户账号") + private String ipaddr; + + @TableField(value = "type") + @ApiModelProperty("登录方式 01.app登录 02.pc端登录") + private String type; + + @TableField(value = "status") + @ApiModelProperty("登录状态(0成功 1失败)") + private String status; + + @TableField(value = "msg") + @ApiModelProperty("提示信息") + @Excel(name = "登录状态") + private String msg; + + @TableField(value = "browser") + @ApiModelProperty("浏览器类型") + @Excel(name = "浏览器类型") + private String browser; + + @TableField(value = "os") + @ApiModelProperty("操作系统") + @Excel(name = "操作系统") + private String os; + + @TableField(value = "access_time") + @ApiModelProperty("访问时间") + @Excel(name = "访问时间") + private LocalDateTime accessTime; + + @ApiModelProperty(value = "所属部门id") + @TableField(value = "ssbmid") + private String ssbmid; + + @ApiModelProperty(value = "所属部门") + @TableField(value = "ssbm") + @Excel(name = "所属部门") + private String ssbm; + + @ApiModelProperty(value = "所属部门代码") + @TableField(value = "ssbmdm") + @Excel(name = "所属部门代码") + private String ssbmdm; + + @ApiModelProperty(value = "所属县公安局") + @TableField(value = "ssxgaj") + private String ssxgaj; + + @ApiModelProperty(value = "所属县公安局id") + @TableField(value = "ssxgajid") + private String ssxgajid; + + @ApiModelProperty(value = "所属县公安局代码") + @TableField(value = "ssxgajdm") + private String ssxgajdm; + + @ApiModelProperty(value = "所属市公安局id") + @TableField(value = "sssgajid") + private String sssgajid; + + @ApiModelProperty(value = "所属市公安局") + @TableField(value = "sssgaj") + private String sssgaj; + + @ApiModelProperty(value = "所属市公安局代码") + @TableField(value = "sssgajdm") + private String sssgajdm; +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysMenu.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysMenu.java new file mode 100644 index 0000000..1c53296 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysMenu.java @@ -0,0 +1,114 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + *

+ * 菜单表 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("mosty_base.sys_menu") +@ApiModel(value="SysMenu对象", description="菜单表") +public class SysMenu implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "父菜单id") + private Long parentId; + + @ApiModelProperty(value = "父菜单路径,使用逗号间隔") + private String parentPath; + + @ApiModelProperty(value = "菜单名称") + private String menuName; + + @ApiModelProperty(value = "菜单编码") + private String menuCode; + + @ApiModelProperty(value = "菜单地址") + private String menuUrl; + + @ApiModelProperty(value = "菜单类型:1、菜单 2、资源") + private Integer menuType; + + @ApiModelProperty(value = "排序号") + private Integer orderNo; + + @ApiModelProperty(value = "是否展示:1、展示 2、不展示") + private Integer showMode; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + @ApiModelProperty(value = "子菜单集合") + @TableField(exist = false) + private List sysMenuList; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysOss.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysOss.java new file mode 100644 index 0000000..04edc01 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysOss.java @@ -0,0 +1,114 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * OSS云存储表 + *

+ * + * @author zengbo + * @since 2022-08-31 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("mosty_base.sys_oss") +@ApiModel(value="SysOss对象", description="OSS云存储表") +public class SysOss implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "云存储主键") + @TableId(value = "id", type = IdType.ASSIGN_ID) + private String id; + + private String md5; + + @ApiModelProperty(value = "文件名") + private String fileName; + + @ApiModelProperty(value = "原名") + private String originalName; + + @ApiModelProperty(value = "文件后缀名") + private String fileSuffix; + + @ApiModelProperty(value = "URL地址") + private String url; + + @ApiModelProperty(value = "数据来源(业务表名)") + private String sjlybm; + + @ApiModelProperty(value = "业务ID") + private String ywid; + + @ApiModelProperty(value = "添加顺序") + private Integer tjsx; + + @ApiModelProperty(value = "图片类型:0-缩略图,1-大图") + private String tplx; + + @ApiModelProperty(value = "服务商") + private String service; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private String xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysPosition.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysPosition.java new file mode 100644 index 0000000..c9c9ffa --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysPosition.java @@ -0,0 +1,94 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 岗位表 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("mosty_base.sys_position") +@ApiModel(value="SysPosition对象", description="岗位表") +public class SysPosition implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "岗位编码") + private String postCode; + + @ApiModelProperty(value = "岗位名称") + private String postName; + + @ApiModelProperty(value = "岗位描述") + private String postDesc; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRole.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRole.java new file mode 100644 index 0000000..1a70106 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRole.java @@ -0,0 +1,269 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 角色表 + * @TableName sys_role + */ +@TableName(value ="mosty_base.sys_role") +@Data +public class SysRole implements Serializable { + /** + * 主键id + */ + @ApiModelProperty(value = "角色ID") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 角色名称 + */ + @ApiModelProperty(value = "角色名称") + @TableField(value = "role_name") + private String roleName; + + /** + * 角色编码 + */ + @ApiModelProperty(value = "角色编码") + @TableField(value = "role_code") + private String roleCode; + + /** + * 角色描述 + */ + @ApiModelProperty(value = "角色描述") + @TableField(value = "role_desc") + private String roleDesc; + + /** + * 排序号 + */ + @ApiModelProperty(value = "排序号") + @TableField(value = "order_no") + private Integer orderNo; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + @TableField(value = "bz") + private String bz; + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间") + @TableField(value = "xt_cjsj") + private Date xtCjsj; + + /** + * 录入时间 + */ + @ApiModelProperty(value = "录入时间") + @TableField(value = "xt_lrsj") + private Date xtLrsj; + + /** + * 录入人姓名 + */ + @ApiModelProperty(value = "录入人姓名") + @TableField(value = "xt_lrrxm") + private String xtLrrxm; + + /** + * 录入人ID + */ + @ApiModelProperty(value = "录入人ID") + @TableField(value = "xt_lrrid") + private String xtLrrid; + + /** + * 录入人部门 + */ + @ApiModelProperty(value = "录入人部门") + @TableField(value = "xt_lrrbm") + private String xtLrrbm; + + /** + * 录入人部门ID + */ + @ApiModelProperty(value = "录入人部门ID") + @TableField(value = "xt_lrrbmid") + private String xtLrrbmid; + + /** + * 录入IP + */ + @ApiModelProperty(value = "录入IP") + @TableField(value = "xt_lrip") + private String xtLrip; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + @TableField(value = "xt_zhxgsj") + private Date xtZhxgsj; + + /** + * 最后修改人姓名 + */ + @ApiModelProperty(value = "最后修改人姓名") + @TableField(value = "xt_zhxgrxm") + private String xtZhxgrxm; + + /** + * 最后修改人ID + */ + @ApiModelProperty(value = "最后修改人ID") + @TableField(value = "xt_zhxgrid") + private String xtZhxgrid; + + /** + * 最后修改人部门 + */ + @ApiModelProperty(value = "最后修改人部门") + @TableField(value = "xt_zhxgrbm") + private String xtZhxgrbm; + + /** + * 最后修改人部门ID + */ + @ApiModelProperty(value = "最后修改人部门ID") + @TableField(value = "xt_zhxgrbmid") + private String xtZhxgrbmid; + + /** + * 最后修改IP + */ + @ApiModelProperty(value = "最后修改IP") + @TableField(value = "xt_zhxgip") + private String xtZhxgip; + + /** + * 注销标志0正常 1.注销 + */ + @ApiModelProperty(value = "注销标志0正常 1.注销") + @TableField(value = "xt_zxbz") + private Integer xtZxbz; + + /** + * 注销原因 + */ + @ApiModelProperty(value = "注销原因") + @TableField(value = "xt_zxyy") + private String xtZxyy; + + + /** + * 数据权限等级 + */ + @ApiModelProperty(value = "数据权限等级") + @TableField(value = "data_permission_level") + private String dataPermissionLevel; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SysRole other = (SysRole) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getRoleName() == null ? other.getRoleName() == null : this.getRoleName().equals(other.getRoleName())) + && (this.getRoleDesc() == null ? other.getRoleDesc() == null : this.getRoleDesc().equals(other.getRoleDesc())) + && (this.getOrderNo() == null ? other.getOrderNo() == null : this.getOrderNo().equals(other.getOrderNo())) + && (this.getBz() == null ? other.getBz() == null : this.getBz().equals(other.getBz())) + && (this.getXtCjsj() == null ? other.getXtCjsj() == null : this.getXtCjsj().equals(other.getXtCjsj())) + && (this.getXtLrsj() == null ? other.getXtLrsj() == null : this.getXtLrsj().equals(other.getXtLrsj())) + && (this.getXtLrrxm() == null ? other.getXtLrrxm() == null : this.getXtLrrxm().equals(other.getXtLrrxm())) + && (this.getXtLrrid() == null ? other.getXtLrrid() == null : this.getXtLrrid().equals(other.getXtLrrid())) + && (this.getXtLrrbm() == null ? other.getXtLrrbm() == null : this.getXtLrrbm().equals(other.getXtLrrbm())) + && (this.getXtLrrbmid() == null ? other.getXtLrrbmid() == null : this.getXtLrrbmid().equals(other.getXtLrrbmid())) + && (this.getXtLrip() == null ? other.getXtLrip() == null : this.getXtLrip().equals(other.getXtLrip())) + && (this.getXtZhxgsj() == null ? other.getXtZhxgsj() == null : this.getXtZhxgsj().equals(other.getXtZhxgsj())) + && (this.getXtZhxgrxm() == null ? other.getXtZhxgrxm() == null : this.getXtZhxgrxm().equals(other.getXtZhxgrxm())) + && (this.getXtZhxgrid() == null ? other.getXtZhxgrid() == null : this.getXtZhxgrid().equals(other.getXtZhxgrid())) + && (this.getXtZhxgrbm() == null ? other.getXtZhxgrbm() == null : this.getXtZhxgrbm().equals(other.getXtZhxgrbm())) + && (this.getXtZhxgrbmid() == null ? other.getXtZhxgrbmid() == null : this.getXtZhxgrbmid().equals(other.getXtZhxgrbmid())) + && (this.getXtZhxgip() == null ? other.getXtZhxgip() == null : this.getXtZhxgip().equals(other.getXtZhxgip())) + && (this.getXtZxbz() == null ? other.getXtZxbz() == null : this.getXtZxbz().equals(other.getXtZxbz())) + && (this.getXtZxyy() == null ? other.getXtZxyy() == null : this.getXtZxyy().equals(other.getXtZxyy())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getRoleName() == null) ? 0 : getRoleName().hashCode()); + result = prime * result + ((getRoleDesc() == null) ? 0 : getRoleDesc().hashCode()); + result = prime * result + ((getOrderNo() == null) ? 0 : getOrderNo().hashCode()); + result = prime * result + ((getBz() == null) ? 0 : getBz().hashCode()); + result = prime * result + ((getXtCjsj() == null) ? 0 : getXtCjsj().hashCode()); + result = prime * result + ((getXtLrsj() == null) ? 0 : getXtLrsj().hashCode()); + result = prime * result + ((getXtLrrxm() == null) ? 0 : getXtLrrxm().hashCode()); + result = prime * result + ((getXtLrrid() == null) ? 0 : getXtLrrid().hashCode()); + result = prime * result + ((getXtLrrbm() == null) ? 0 : getXtLrrbm().hashCode()); + result = prime * result + ((getXtLrrbmid() == null) ? 0 : getXtLrrbmid().hashCode()); + result = prime * result + ((getXtLrip() == null) ? 0 : getXtLrip().hashCode()); + result = prime * result + ((getXtZhxgsj() == null) ? 0 : getXtZhxgsj().hashCode()); + result = prime * result + ((getXtZhxgrxm() == null) ? 0 : getXtZhxgrxm().hashCode()); + result = prime * result + ((getXtZhxgrid() == null) ? 0 : getXtZhxgrid().hashCode()); + result = prime * result + ((getXtZhxgrbm() == null) ? 0 : getXtZhxgrbm().hashCode()); + result = prime * result + ((getXtZhxgrbmid() == null) ? 0 : getXtZhxgrbmid().hashCode()); + result = prime * result + ((getXtZhxgip() == null) ? 0 : getXtZhxgip().hashCode()); + result = prime * result + ((getXtZxbz() == null) ? 0 : getXtZxbz().hashCode()); + result = prime * result + ((getXtZxyy() == null) ? 0 : getXtZxyy().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", roleName=").append(roleName); + sb.append(", roleDesc=").append(roleDesc); + sb.append(", orderNo=").append(orderNo); + sb.append(", bz=").append(bz); + sb.append(", xtCjsj=").append(xtCjsj); + sb.append(", xtLrsj=").append(xtLrsj); + sb.append(", xtLrrxm=").append(xtLrrxm); + sb.append(", xtLrrid=").append(xtLrrid); + sb.append(", xtLrrbm=").append(xtLrrbm); + sb.append(", xtLrrbmid=").append(xtLrrbmid); + sb.append(", xtLrip=").append(xtLrip); + sb.append(", xtZhxgsj=").append(xtZhxgsj); + sb.append(", xtZhxgrxm=").append(xtZhxgrxm); + sb.append(", xtZhxgrid=").append(xtZhxgrid); + sb.append(", xtZhxgrbm=").append(xtZhxgrbm); + sb.append(", xtZhxgrbmid=").append(xtZhxgrbmid); + sb.append(", xtZhxgip=").append(xtZhxgip); + sb.append(", xtZxbz=").append(xtZxbz); + sb.append(", xtZxyy=").append(xtZxyy); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRoleDept.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRoleDept.java new file mode 100644 index 0000000..1f683a3 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRoleDept.java @@ -0,0 +1,79 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * 角色和部门关联表 + * @TableName sys_role_dept + */ +@TableName(value ="mosty_base.sys_role_dept") +@Data +public class SysRoleDept implements Serializable { + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 角色ID + */ + @TableField(value = "role_id") + private Long roleId; + + /** + * 部门ID + */ + @TableField(value = "dept_id") + private Long deptId; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SysRoleDept other = (SysRoleDept) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getRoleId() == null ? other.getRoleId() == null : this.getRoleId().equals(other.getRoleId())) + && (this.getDeptId() == null ? other.getDeptId() == null : this.getDeptId().equals(other.getDeptId())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getRoleId() == null) ? 0 : getRoleId().hashCode()); + result = prime * result + ((getDeptId() == null) ? 0 : getDeptId().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", roleId=").append(roleId); + sb.append(", deptId=").append(deptId); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRoleMenu.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRoleMenu.java new file mode 100644 index 0000000..97fc74c --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysRoleMenu.java @@ -0,0 +1,79 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; + +import java.io.Serializable; + +/** + * 角色和菜单关联表 + * @TableName sys_role_menu + */ +@TableName(value ="mosty_base.sys_role_menu") +@Data +public class SysRoleMenu implements Serializable { + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 角色ID + */ + @TableField(value = "role_id") + private Long roleId; + + /** + * 菜单ID + */ + @TableField(value = "menu_id") + private Long menuId; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SysRoleMenu other = (SysRoleMenu) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getRoleId() == null ? other.getRoleId() == null : this.getRoleId().equals(other.getRoleId())) + && (this.getMenuId() == null ? other.getMenuId() == null : this.getMenuId().equals(other.getMenuId())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getRoleId() == null) ? 0 : getRoleId().hashCode()); + result = prime * result + ((getMenuId() == null) ? 0 : getMenuId().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", roleId=").append(roleId); + sb.append(", menuId=").append(menuId); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUser.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUser.java new file mode 100644 index 0000000..b67268f --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUser.java @@ -0,0 +1,332 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户信息表 + * @TableName sys_user + */ +@Data +@TableName(value ="mosty_base.sys_user") +public class SysUser implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "用户ID") + private Long id; + + @TableField(value = "manager_org_id") + @ApiModelProperty(value = "管理部门ID") + private Long managerOrgId; + + @TableField(value = "manager_org_name") + @ApiModelProperty(value = "管理部门名称") + private String managerOrgName; + + @TableField(value = "position_id") + @ApiModelProperty(value = "岗位ID") + private Long positionId; + + @TableField(value = "position_name") + @ApiModelProperty(value = "岗位名称") + private String positionName; + + @TableField(value = "is_virtual_user") + @ApiModelProperty(value = "是否虚拟用户:1、是 2、不是") + private String isVirtualUser; + + @TableField(value = "login_name") + @ApiModelProperty(value = "登录账号") + private String loginName; + + @TableField(value = "password") + @ApiModelProperty(value = "密码") + private String password; + + @TableField(value = "user_name") + @ApiModelProperty(value = "用户昵称") + private String userName; + + @TableField(value = "user_type") + @ApiModelProperty(value = "用户类型(00系统用户 01注册用户)") + private String userType; + + @TableField(value = "email") + @ApiModelProperty(value = "用户邮箱") + private String email; + + @TableField(value = "mobile") + @ApiModelProperty(value = "移动电话") + private String mobile; + + @TableField(value = "tele_phone") + @ApiModelProperty(value = "电话号码") + private String telePhone; + + @TableField(value = "id_entity_card") + @ApiModelProperty(value = "身份证号") + private String idEntityCard; + + @TableField(value = "in_dust_rial_id") + @ApiModelProperty(value = "行业号码(如:警号)") + private String inDustRialId; + + @TableField(value = "sex") + @ApiModelProperty(value = "用户性别(0男 1女 2未知)") + private String sex; + + @TableField(value = "nation") + @ApiModelProperty(value = "民族") + private String nation; + + @TableField(value = "politic") + @ApiModelProperty(value = "政治面貌") + private String politic; + + @TableField(value = "marital") + @ApiModelProperty(value = "婚姻状态") + private String marital; + + @TableField(value = "type") + @ApiModelProperty(value = "人员类别") + private String type; + + @TableField(value = "type_name") + @ApiModelProperty(value = "人员类别中文") + private String typeName; + + @TableField(value = "whcd") + @ApiModelProperty(value = "文化程度") + private String whcd; + + @TableField(value = "bz") + @ApiModelProperty(value = "备注") + private String bz; + + @TableField(value = "birthday") + @ApiModelProperty(value = "出生日期") + private String birthday; + + @TableField(value = "begin_time") + @ApiModelProperty(value = " 用户有效开始时间,默认为当前日期(用户可改)") + private Date beginTime; + + @TableField(value = "end_time") + @ApiModelProperty(value = " 用户有效结束时间,默认空") + private Date endTime; + + @TableField(value = "salt") + @ApiModelProperty(value = "盐加密") + private String salt; + + @TableField(value = "xzcs") + @ApiModelProperty(value = "选择次数") + private Integer xzcs; + + @TableField(value = "xt_zxbz") + private Integer xtZxbz; + + @TableField(value = "xt_zxyz") + private String xtZxyz; + + @TableField(value = "xt_cjsj") + private Date xtCjsj; + + @TableField(value = "xt_lrsj") + private Date xtLrsj; + + @TableField(value = "xt_lrrxm") + private String xtLrrxm; + + @TableField(value = "xt_lrrid") + private Long xtLrrid; + + @TableField(value = "xt_lrrbm") + private String xtLrrbm; + + @TableField(value = "xt_lrrbmid") + private String xtLrrbmid; + + @TableField(value = "xt_lrip") + private String xtLrip; + + @TableField(value = "xt_zhxgsj") + private Date xtZhxgsj; + + @TableField(value = "xt_zhxgrxm") + private String xtZhxgrxm; + + @TableField(value = "xt_zhxgid") + private Long xtZhxgid; + + @TableField(value = "xt_zhxgrbm") + private String xtZhxgrbm; + + @TableField(value = "xt_zhxgrbmid") + private Long xtZhxgrbmid; + + @TableField(value = "xt_zhxgrip") + private String xtZhxgrip; + + @TableField(value = "sfrh") + private String sfrh; + + @TableField(value = "mk") + private String mk; + + /** 用户头像 */ + @TableField(value = "avatar") + @ApiModelProperty(value = "头像") + private String avatar; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SysUser other = (SysUser) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getManagerOrgId() == null ? other.getManagerOrgId() == null : this.getManagerOrgId().equals(other.getManagerOrgId())) + && (this.getManagerOrgName() == null ? other.getManagerOrgName() == null : this.getManagerOrgName().equals(other.getManagerOrgName())) + && (this.getPositionId() == null ? other.getPositionId() == null : this.getPositionId().equals(other.getPositionId())) + && (this.getPositionName() == null ? other.getPositionName() == null : this.getPositionName().equals(other.getPositionName())) + && (this.getLoginName() == null ? other.getLoginName() == null : this.getLoginName().equals(other.getLoginName())) + && (this.getPassword() == null ? other.getPassword() == null : this.getPassword().equals(other.getPassword())) + && (this.getUserName() == null ? other.getUserName() == null : this.getUserName().equals(other.getUserName())) + && (this.getUserType() == null ? other.getUserType() == null : this.getUserType().equals(other.getUserType())) + && (this.getEmail() == null ? other.getEmail() == null : this.getEmail().equals(other.getEmail())) + && (this.getMobile() == null ? other.getMobile() == null : this.getMobile().equals(other.getMobile())) + && (this.getTelePhone() == null ? other.getTelePhone() == null : this.getTelePhone().equals(other.getTelePhone())) + && (this.getIdEntityCard() == null ? other.getIdEntityCard() == null : this.getIdEntityCard().equals(other.getIdEntityCard())) + && (this.getInDustRialId() == null ? other.getInDustRialId() == null : this.getInDustRialId().equals(other.getInDustRialId())) + && (this.getSex() == null ? other.getSex() == null : this.getSex().equals(other.getSex())) + && (this.getNation() == null ? other.getNation() == null : this.getNation().equals(other.getNation())) + && (this.getWhcd() == null ? other.getWhcd() == null : this.getWhcd().equals(other.getWhcd())) + && (this.getBz() == null ? other.getBz() == null : this.getBz().equals(other.getBz())) + && (this.getBirthday() == null ? other.getBirthday() == null : this.getBirthday().equals(other.getBirthday())) + && (this.getBeginTime() == null ? other.getBeginTime() == null : this.getBeginTime().equals(other.getBeginTime())) + && (this.getEndTime() == null ? other.getEndTime() == null : this.getEndTime().equals(other.getEndTime())) + && (this.getSalt() == null ? other.getSalt() == null : this.getSalt().equals(other.getSalt())) + && (this.getXtZxbz() == null ? other.getXtZxbz() == null : this.getXtZxbz().equals(other.getXtZxbz())) + && (this.getXtZxyz() == null ? other.getXtZxyz() == null : this.getXtZxyz().equals(other.getXtZxyz())) + && (this.getXtCjsj() == null ? other.getXtCjsj() == null : this.getXtCjsj().equals(other.getXtCjsj())) + && (this.getXtLrsj() == null ? other.getXtLrsj() == null : this.getXtLrsj().equals(other.getXtLrsj())) + && (this.getXtLrrxm() == null ? other.getXtLrrxm() == null : this.getXtLrrxm().equals(other.getXtLrrxm())) + && (this.getXtLrrid() == null ? other.getXtLrrid() == null : this.getXtLrrid().equals(other.getXtLrrid())) + && (this.getXtLrrbm() == null ? other.getXtLrrbm() == null : this.getXtLrrbm().equals(other.getXtLrrbm())) + && (this.getXtLrrbmid() == null ? other.getXtLrrbmid() == null : this.getXtLrrbmid().equals(other.getXtLrrbmid())) + && (this.getXtLrip() == null ? other.getXtLrip() == null : this.getXtLrip().equals(other.getXtLrip())) + && (this.getXtZhxgsj() == null ? other.getXtZhxgsj() == null : this.getXtZhxgsj().equals(other.getXtZhxgsj())) + && (this.getXtZhxgrxm() == null ? other.getXtZhxgrxm() == null : this.getXtZhxgrxm().equals(other.getXtZhxgrxm())) + && (this.getXtZhxgid() == null ? other.getXtZhxgid() == null : this.getXtZhxgid().equals(other.getXtZhxgid())) + && (this.getXtZhxgrbm() == null ? other.getXtZhxgrbm() == null : this.getXtZhxgrbm().equals(other.getXtZhxgrbm())) + && (this.getXtZhxgrbmid() == null ? other.getXtZhxgrbmid() == null : this.getXtZhxgrbmid().equals(other.getXtZhxgrbmid())) + && (this.getXtZhxgrip() == null ? other.getXtZhxgrip() == null : this.getXtZhxgrip().equals(other.getXtZhxgrip())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getManagerOrgId() == null) ? 0 : getManagerOrgId().hashCode()); + result = prime * result + ((getManagerOrgName() == null) ? 0 : getManagerOrgName().hashCode()); + result = prime * result + ((getPositionId() == null) ? 0 : getPositionId().hashCode()); + result = prime * result + ((getPositionName() == null) ? 0 : getPositionName().hashCode()); + result = prime * result + ((getLoginName() == null) ? 0 : getLoginName().hashCode()); + result = prime * result + ((getPassword() == null) ? 0 : getPassword().hashCode()); + result = prime * result + ((getUserName() == null) ? 0 : getUserName().hashCode()); + result = prime * result + ((getUserType() == null) ? 0 : getUserType().hashCode()); + result = prime * result + ((getEmail() == null) ? 0 : getEmail().hashCode()); + result = prime * result + ((getMobile() == null) ? 0 : getMobile().hashCode()); + result = prime * result + ((getTelePhone() == null) ? 0 : getTelePhone().hashCode()); + result = prime * result + ((getIdEntityCard() == null) ? 0 : getIdEntityCard().hashCode()); + result = prime * result + ((getInDustRialId() == null) ? 0 : getInDustRialId().hashCode()); + result = prime * result + ((getSex() == null) ? 0 : getSex().hashCode()); + result = prime * result + ((getNation() == null) ? 0 : getNation().hashCode()); + result = prime * result + ((getWhcd() == null) ? 0 : getWhcd().hashCode()); + result = prime * result + ((getBz() == null) ? 0 : getBz().hashCode()); + result = prime * result + ((getBirthday() == null) ? 0 : getBirthday().hashCode()); + result = prime * result + ((getBeginTime() == null) ? 0 : getBeginTime().hashCode()); + result = prime * result + ((getEndTime() == null) ? 0 : getEndTime().hashCode()); + result = prime * result + ((getSalt() == null) ? 0 : getSalt().hashCode()); + result = prime * result + ((getXtZxbz() == null) ? 0 : getXtZxbz().hashCode()); + result = prime * result + ((getXtZxyz() == null) ? 0 : getXtZxyz().hashCode()); + result = prime * result + ((getXtCjsj() == null) ? 0 : getXtCjsj().hashCode()); + result = prime * result + ((getXtLrsj() == null) ? 0 : getXtLrsj().hashCode()); + result = prime * result + ((getXtLrrxm() == null) ? 0 : getXtLrrxm().hashCode()); + result = prime * result + ((getXtLrrid() == null) ? 0 : getXtLrrid().hashCode()); + result = prime * result + ((getXtLrrbm() == null) ? 0 : getXtLrrbm().hashCode()); + result = prime * result + ((getXtLrrbmid() == null) ? 0 : getXtLrrbmid().hashCode()); + result = prime * result + ((getXtLrip() == null) ? 0 : getXtLrip().hashCode()); + result = prime * result + ((getXtZhxgsj() == null) ? 0 : getXtZhxgsj().hashCode()); + result = prime * result + ((getXtZhxgrxm() == null) ? 0 : getXtZhxgrxm().hashCode()); + result = prime * result + ((getXtZhxgid() == null) ? 0 : getXtZhxgid().hashCode()); + result = prime * result + ((getXtZhxgrbm() == null) ? 0 : getXtZhxgrbm().hashCode()); + result = prime * result + ((getXtZhxgrbmid() == null) ? 0 : getXtZhxgrbmid().hashCode()); + result = prime * result + ((getXtZhxgrip() == null) ? 0 : getXtZhxgrip().hashCode()); + return result; + } + + @Override + public String toString() { + return getClass().getSimpleName() + + " [" + + "Hash = " + hashCode() + + ", id=" + id + + ", managerOrgId=" + managerOrgId + + ", managerOrgName=" + managerOrgName + + ", positionId=" + positionId + + ", positionName=" + positionName + + ", loginName=" + loginName + + ", password=" + password + + ", userName=" + userName + + ", userType=" + userType + + ", email=" + email + + ", mobile=" + mobile + + ", telePhone=" + telePhone + + ", idEntityCard=" + idEntityCard + + ", inDustRialId=" + inDustRialId + + ", sex=" + sex + + ", nation=" + nation + + ", whcd=" + whcd + + ", bz=" + bz + + ", birthday=" + birthday + + ", beginTime=" + beginTime + + ", endTime=" + endTime + + ", salt=" + salt + + ", xtZxbz=" + xtZxbz + + ", xtZxyz=" + xtZxyz + + ", xtCjsj=" + xtCjsj + + ", xtLrsj=" + xtLrsj + + ", xtLrrxm=" + xtLrrxm + + ", xtLrrid=" + xtLrrid + + ", xtLrrbm=" + xtLrrbm + + ", xtLrrbmid=" + xtLrrbmid + + ", xtLrip=" + xtLrip + + ", xtZhxgsj=" + xtZhxgsj + + ", xtZhxgrxm=" + xtZhxgrxm + + ", xtZhxgid=" + xtZhxgid + + ", xtZhxgrbm=" + xtZhxgrbm + + ", xtZhxgrbmid=" + xtZhxgrbmid + + ", xtZhxgrip=" + xtZhxgrip + + ", serialVersionUID=" + serialVersionUID + + "]"; + } +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfig.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfig.java new file mode 100644 index 0000000..2823a06 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfig.java @@ -0,0 +1,109 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 用户app首页配置表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("mosty_base.sys_user_app_homeconfig") +@ApiModel(value="SysUserAppHomeconfig对象", description="用户app首页配置表") +public class SysUserAppHomeconfig implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "首页id") + private Long homeid; + + @ApiModelProperty(value = "首页名称") + private String homename; + + @ApiModelProperty(value = "用户id") + private Long userId; + + @ApiModelProperty(value = "用户身份证号") + private String userSfzh; + + @ApiModelProperty(value = "用户姓名") + private String userXm; + + @ApiModelProperty(value = "配置时间") + private Date pzsj; + + @ApiModelProperty(value = "配置板块数") + private Integer pzbks; + + @ApiModelProperty(value = "色调01-蓝色,02-白色") + private String sd; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlate.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlate.java new file mode 100644 index 0000000..ac82d06 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlate.java @@ -0,0 +1,103 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 用户app首页配置-板块表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("mosty_base.sys_user_app_homeconfig_plate") +@ApiModel(value="SysUserAppHomeconfigPlate对象", description="用户app首页配置-板块表") +public class SysUserAppHomeconfigPlate implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "配置id") + private Long pzId; + + @ApiModelProperty(value = "板块id") + private Long plateId; + + @ApiModelProperty(value = "板块类型(00-置顶按钮,01-五情板块,02-工作任务板块,03-概况板块,04-风险板块)") + private String bklx; + + @ApiModelProperty(value = "板块名称") + private String bkmc; + + @ApiModelProperty(value = "板块内容数") + private Integer bknrs; + + @ApiModelProperty(value = "板块顺序") + private Integer bksx; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlateList.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlateList.java new file mode 100644 index 0000000..5c4ca1b --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlateList.java @@ -0,0 +1,103 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 用户app首页配置-板块内容表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("mosty_base.sys_user_app_homeconfig_plate_list") +@ApiModel(value="SysUserAppHomeconfigPlateList对象", description="用户app首页配置-板块内容表") +public class SysUserAppHomeconfigPlateList implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "配置id") + private Long pzId; + + @ApiModelProperty(value = "配置板块ID") + private Long pzPlateId; + + @ApiModelProperty(value = "内容ID") + private Long plateListId; + + @ApiModelProperty(value = "内容名称") + private String nrmc; + + @ApiModelProperty(value = "板块顺序") + private Integer bksx; + + @ApiModelProperty(value = "路由跳转地址") + private String tzdz; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserDept.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserDept.java new file mode 100644 index 0000000..5cddf9f --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserDept.java @@ -0,0 +1,90 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 用户和部门关联表 + * @TableName sys_user_dept + */ +@Data +@TableName(value ="mosty_base.sys_user_dept") +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +public class SysUserDept implements Serializable { + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + @TableField(value = "user_id") + private Long userId; + + /** + * 部门id + */ + @TableField(value = "dept_id") + private Long deptId; + + public SysUserDept(Long userId, Long deptId) { + this.userId = userId; + this.deptId = deptId; + } + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SysUserDept other = (SysUserDept) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId())) + && (this.getDeptId() == null ? other.getDeptId() == null : this.getDeptId().equals(other.getDeptId())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode()); + result = prime * result + ((getDeptId() == null) ? 0 : getDeptId().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", userId=").append(userId); + sb.append(", deptId=").append(deptId); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserRole.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserRole.java new file mode 100644 index 0000000..ae6d20a --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/SysUserRole.java @@ -0,0 +1,88 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; + +/** + * 用户和角色关联表 + * @TableName sys_user_role + */ +@TableName(value ="mosty_base.sys_user_role") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class SysUserRole implements Serializable { + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + @TableField(value = "user_id") + private Long userId; + + /** + * 角色ID + */ + @TableField(value = "role_id") + private Long roleId; + + public SysUserRole(Long userId, Long roleId) { + this.userId = userId; + this.roleId = roleId; + } + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + @Override + public boolean equals(Object that) { + if (this == that) { + return true; + } + if (that == null) { + return false; + } + if (getClass() != that.getClass()) { + return false; + } + SysUserRole other = (SysUserRole) that; + return (this.getId() == null ? other.getId() == null : this.getId().equals(other.getId())) + && (this.getUserId() == null ? other.getUserId() == null : this.getUserId().equals(other.getUserId())) + && (this.getRoleId() == null ? other.getRoleId() == null : this.getRoleId().equals(other.getRoleId())); + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getId() == null) ? 0 : getId().hashCode()); + result = prime * result + ((getUserId() == null) ? 0 : getUserId().hashCode()); + result = prime * result + ((getRoleId() == null) ? 0 : getRoleId().hashCode()); + return result; + } + + @Override + public String toString() { + StringBuilder sb = new StringBuilder(); + sb.append(getClass().getSimpleName()); + sb.append(" ["); + sb.append("Hash = ").append(hashCode()); + sb.append(", id=").append(id); + sb.append(", userId=").append(userId); + sb.append(", roleId=").append(roleId); + sb.append(", serialVersionUID=").append(serialVersionUID); + sb.append("]"); + return sb.toString(); + } +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/TbJcglXfll.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/TbJcglXfll.java new file mode 100644 index 0000000..132a49d --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/TbJcglXfll.java @@ -0,0 +1,183 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.*; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.Date; + +/** + * 巡防力量表; + * + * @author : Lhh + * @date : 2022-6-4 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@Accessors(chain = true) +@ApiModel(value = "巡防力量表", description = "") +@TableName("mosty_base.tb_jcgl_xfll") +public class TbJcglXfll implements Serializable, Cloneable { + + private static final long serialVersionUID = 6556387960466677177L; + + @ApiModelProperty(name = "警员管理表标识ID", notes = "", hidden = true) + @TableId(type = IdType.ASSIGN_UUID) + private String id; + + @ApiModelProperty(value = "人员ID(民警对应sys_user表中的ID,辅警为null)", notes = "") + private String ryid; + + @ApiModelProperty(name = "警员分类", notes = "01、民警,02、辅警") + private String fl; + + @ApiModelProperty(name = "警员类型", notes = "01、社区民警,02、治安民警,03、刑侦民警,04、内勤民警,05、巡逻民警") + private String lx; + + @ApiModelProperty(name = "姓名", notes = "") + private String xm; + + @ApiModelProperty(name = "性别代码", notes = "") + private String xbdm; + + @ApiModelProperty(name = "身份证号", notes = "") + private String sfzh; + + @ApiModelProperty(name = "警号", notes = "") + private String jh; + + @ApiModelProperty(name = "警衔", notes = "") + private String jx; + + @ApiModelProperty(name = "政治面貌", notes = "") + private String zzmm; + + @ApiModelProperty(name = "婚姻状况", notes = "0、未婚,1、已婚,2、离异") + private String hyzk; + + @ApiModelProperty(name = "入职时间", notes = "") + private Date rzsj; + + @ApiModelProperty(name = "出生日期", notes = "") + private Date csrq; + + @ApiModelProperty(name = "民族编码", notes = "") + private String mzdm; + + @ApiModelProperty(name = "文化程度", notes = "") + private String whcddm; + + @ApiModelProperty(name = "籍贯", notes = "") + private String jgdm; + + @ApiModelProperty(name = "家庭住址", notes = "") + private String jtzz; + + @ApiModelProperty(name = "联系电话", notes = "") + private String lxdh; + + @ApiModelProperty(name = "电子邮箱", notes = "") + private String dzyx; + + @ApiModelProperty(name = "巡防力量图片") + private String tp; + + @ApiModelProperty(value = "所属部门id") + private String ssbmid; + + @ApiModelProperty(value = "所属部门") + private String ssbm; + + @ApiModelProperty(value = "所属部门代码") + private String ssbmdm; + + @ApiModelProperty(value = "所属县公安局") + private String ssxgaj; + + @ApiModelProperty(value = "所属县公安局id") + private String ssxgajid; + + @ApiModelProperty(value = "所属县公安局代码") + private String ssxgajdm; + + @ApiModelProperty(value = "所属市公安局id") + private String sssgajid; + + @ApiModelProperty(value = "所属市公安局") + private String sssgaj; + + @ApiModelProperty(value = "所属市公安局代码") + private String sssgajdm; + @ApiModelProperty(value = "数据来源:1、PC,2、手机端",name = "xtSjly") + private String xtSjly; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "数据状态:0、注销,1、正常,-1、封存",name = "xtSjzt") + private String xtSjzt; + + @TableLogic + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "删除标识:0、未删除,1、已删除",name = "xtScbz") + private String xtScbz; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建IP",name = "xtCjip") + private String xtCjip; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建时间",name = "xtCjsj") + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") + private Timestamp xtCjsj; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建人ID",name = "xtCjrId") + private String xtCjrId; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建人名称",name = "xtCjr") + private String xtCjr; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建部门代码",name = "xtCjbmdm") + private String xtCjbmdm; + + @TableField(fill = FieldFill.INSERT) + @ApiModelProperty(value = "创建部门名称",name = "xtCjbmmc") + private String xtCjbmmc; + + @TableField(fill = FieldFill.UPDATE) + @ApiModelProperty(value = "最后更新IP",name = "xtZhgxip") + private String xtZhgxip; + + @TableField(fill = FieldFill.UPDATE) + @ApiModelProperty(value = "最后更新时间",name = "xtZhgxsj") + private Timestamp xtZhgxsj; + + @TableField(fill = FieldFill.UPDATE) + @ApiModelProperty(value = "最后更新人ID",name = "xtZhgxrid") + private String xtZhgxrid; + + @TableField(fill = FieldFill.UPDATE) + @ApiModelProperty(value = "最后更新人名称",name = "xtZhgxr") + private String xtZhgxr; + + @TableField(fill = FieldFill.UPDATE) + @ApiModelProperty(value = "最后更新部门代码",name = "xtZhgxbmdm") + private String xtZhgxbmdm; + + @TableField(fill = FieldFill.UPDATE) + @ApiModelProperty(value = "最后更新部门名称",name = "xtZhgxbm") + private String xtZhgxbm; + + @ApiModelProperty(value = "备注",name = "bz") + private String bz; +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/Ybmj.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/Ybmj.java new file mode 100644 index 0000000..b006af6 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/Ybmj.java @@ -0,0 +1,51 @@ +package com.mosty.common.core.business.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +/** + * 用户信息表 + * + * @TableName sys_user + */ +@Data +@TableName(value = "mosty_base.ybmj") +public class Ybmj implements Serializable { + + @TableId(value = "id", type = IdType.AUTO) + @ApiModelProperty(value = "用户ID") + private String id; + + @TableField(value = "xm") + @ApiModelProperty(value = "姓名") + private String xm; + + @TableField(value = "jh") + @ApiModelProperty(value = "警号") + private String jh; + + @TableField(value = "dh") + @ApiModelProperty(value = "电话") + private String dh; + + @TableField(value = "ssbmdm") + @ApiModelProperty(value = "所属部门代码") + private String ssbmdm; + + @TableField(value = "ssbm") + @ApiModelProperty(value = "所属部门") + private String ssbm; + + @TableField(value = "sfzh") + @ApiModelProperty(value = "身份证") + private String sfzh; + + +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/LoginLogPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/LoginLogPage.java new file mode 100644 index 0000000..89769a9 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/LoginLogPage.java @@ -0,0 +1,20 @@ +package com.mosty.common.core.business.entity.request; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class LoginLogPage extends Page { + + @ApiModelProperty(value = "登录账号") + private String userName; + + @ApiModelProperty(value = "登录状态") + private Integer status; +} + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPage.java new file mode 100644 index 0000000..bf280bd --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPage.java @@ -0,0 +1,34 @@ +package com.mosty.common.core.business.entity.request; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + *

+ * app首页表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@Accessors(chain = true) +@ApiModel(value="SysAppHomeconfig对象", description="app首页表") +public class SysAppHomeconfigPage extends Page { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "首页ID") + private Long id; + + @ApiModelProperty(value = "首页名称,如:领导端") + private String homename; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlateListPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlateListPage.java new file mode 100644 index 0000000..e370d82 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlateListPage.java @@ -0,0 +1,37 @@ +package com.mosty.common.core.business.entity.request; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * app首页配置-板块内容表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@Accessors(chain = true) +@ApiModel(value="app首页配置-板块内容", description="app首页配置-板块内容") +public class SysAppHomeconfigPlateListPage extends Page { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "板块ID") + private Long plateId; + + @ApiModelProperty(value = "内容名称") + private String nrmc; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlatePage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlatePage.java new file mode 100644 index 0000000..b9cf64e --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlatePage.java @@ -0,0 +1,42 @@ +package com.mosty.common.core.business.entity.request; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * app首页-板块表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sys_app_homeconfig_plate") +@ApiModel(value="SysAppHomeconfigPlate对象", description="app首页-板块表") +public class SysAppHomeconfigPlatePage extends Page { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "首页ID") + private Long homeid; + + @ApiModelProperty(value = "板块类型(00-置顶按钮,01-五情板块,02-工作任务板块,03-概况板块,04-风险板块)") + private String bklx; + + @ApiModelProperty(value = "板块名称") + private String bkmc; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigQuery.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigQuery.java new file mode 100644 index 0000000..00d0cae --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysAppHomeconfigQuery.java @@ -0,0 +1,30 @@ +package com.mosty.common.core.business.entity.request; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + *

+ * app首页表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@Accessors(chain = true) +@ApiModel(value="SysAppHomeconfigQuery对象", description="app首页表") +public class SysAppHomeconfigQuery { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "首页ID") + private Long id; + + @ApiModelProperty(value = "首页名称,如:领导端") + private String homename; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPage.java new file mode 100644 index 0000000..dffbd1b --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPage.java @@ -0,0 +1,36 @@ +package com.mosty.common.core.business.entity.request; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + *

+ * app首页表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@Accessors(chain = true) +@ApiModel(value="SysUserAppHomeconfig对象", description="用户app首页配置表") +public class SysUserAppHomeconfigPage extends Page { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "首页id") + private Long homeid; + + @ApiModelProperty(value = "首页名称") + private String homename; + + @ApiModelProperty(value = "用户id") + private Long userId; + + @ApiModelProperty(value = "用户身份证号") + private String userSfzh; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlateListPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlateListPage.java new file mode 100644 index 0000000..4c5396a --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlateListPage.java @@ -0,0 +1,36 @@ +package com.mosty.common.core.business.entity.request; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + *

+ * app首页配置-板块内容表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@Accessors(chain = true) +@ApiModel(value="app首页配置-板块内容", description="app首页配置-板块内容") +public class SysUserAppHomeconfigPlateListPage extends Page { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "配置id") + private Long pzId; + + @ApiModelProperty(value = "配置板块ID") + private Long pzPlateId; + + @ApiModelProperty(value = "内容ID") + private Long plateListId; + + @ApiModelProperty(value = "内容名称") + private String nrmc; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlatePage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlatePage.java new file mode 100644 index 0000000..29930f5 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlatePage.java @@ -0,0 +1,39 @@ +package com.mosty.common.core.business.entity.request; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + *

+ * app首页-板块表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="SysAppHomeconfigPlate对象", description="app首页-板块表") +public class SysUserAppHomeconfigPlatePage extends Page { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "配置id") + private Long pzId; + + @ApiModelProperty(value = "板块id") + private Long plateId; + + @ApiModelProperty(value = "板块类型(00-置顶按钮,01-五情板块,02-工作任务板块,03-概况板块,04-风险板块)") + private String bklx; + + @ApiModelProperty(value = "板块名称") + private String bkmc; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigQuery.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigQuery.java new file mode 100644 index 0000000..f39e140 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigQuery.java @@ -0,0 +1,36 @@ +package com.mosty.common.core.business.entity.request; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + *

+ * app首页表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@Accessors(chain = true) +@ApiModel(value="SysUserAppHomeconfig对象", description="用户app首页配置表") +public class SysUserAppHomeconfigQuery { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "首页id") + private Long homeid; + + @ApiModelProperty(value = "首页名称") + private String homename; + + @ApiModelProperty(value = "用户id") + private Long userId; + + @ApiModelProperty(value = "用户身份证号") + private String userSfzh; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserEditPasswordRequest.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserEditPasswordRequest.java new file mode 100644 index 0000000..b5cb20f --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/request/SysUserEditPasswordRequest.java @@ -0,0 +1,20 @@ +package com.mosty.common.core.business.entity.request; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author liyan + */ +@Data +public class SysUserEditPasswordRequest { + + @ApiModelProperty(value = "用户ID") + private Long id; + + @ApiModelProperty(value = "旧密码") + private String oldPassword; + + @ApiModelProperty(value = "新密码") + private String password; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddDeptVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddDeptVO.java new file mode 100644 index 0000000..7c23be0 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddDeptVO.java @@ -0,0 +1,81 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@Accessors(chain = true) +public class AddDeptVO { + + @ApiModelProperty("部门id") + private Long id; + + @ApiModelProperty("部门代码") + @NotBlank(message = "部门代码不能为空!") + private String orgCode; + + @ApiModelProperty("部门名称") + @NotBlank(message = "部门名称不能为空!") + private String orgName; + + @ApiModelProperty("部门类型") + @NotNull(message = "部门类型不能为空!") + private String orgType; + + @ApiModelProperty("部门等级") + @NotNull(message = "部门等级不能为空!") + private String orgLevel; + + @ApiModelProperty("部门业务类型") + @NotNull(message = "部门业务类型不能为空!") + private String orgBizType; + + @ApiModelProperty("部门顺序号") + private String orgNo; + + @ApiModelProperty("上级部门主键") + private Long parentId; + + @ApiModelProperty("部门名称拼音首字母") + private String bmpyszm; + + @ApiModelProperty("部门简称") + private String orgJc; + + @ApiModelProperty("部门全称") + @NotBlank(message = "部门全称不能为空!") + private String orgQc; + + @ApiModelProperty("部门地址") + @NotBlank(message = "部门地址不能为空!") + private String address; + + @ApiModelProperty("部门电话") + @NotBlank(message = "部门电话不能为空!") + private String linkTel; + + @ApiModelProperty("部门联系人") + private String linkMan; + + @ApiModelProperty("部门联系人电话") + private String linkManTel; + + @ApiModelProperty("部门主页") + private String webUrl; + + @ApiModelProperty("部门邮箱") + private String email; + + @ApiModelProperty("部门所属行政区划") + private String xzqh; + + @ApiModelProperty("备注") + private String bz; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleDataPartitionVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleDataPartitionVO.java new file mode 100644 index 0000000..ab62ac8 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleDataPartitionVO.java @@ -0,0 +1,36 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 添加 部门 用户关联关系 + * @author liyan + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class AddRoleDataPartitionVO extends Page { + + /** + * 角色id + */ + @ApiModelProperty("角色id") + private Long id; + /** + * 数据权限等级 + */ + @ApiModelProperty("数据权限等级") + private String dataPermissionLevel; + + + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleDeptVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleDeptVO.java new file mode 100644 index 0000000..974d9c1 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleDeptVO.java @@ -0,0 +1,37 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 添加 部门 用户关联关系 + * @author liyan + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class AddRoleDeptVO { + + /** + * 部门id + */ + @NotNull(message = "部门id不能为空") + @ApiModelProperty("部门id") + private Long deptId; + + /** + * 角色ids + */ + @NotEmpty(message = "角色集合不能为空") + @ApiModelProperty("角色ids") + private List roleIds; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleMenuVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleMenuVO.java new file mode 100644 index 0000000..54f8fe0 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleMenuVO.java @@ -0,0 +1,29 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.List; + +/** + * 添加 部门 用户关联关系 + * @author liyan + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class AddRoleMenuVO { + + @ApiModelProperty("角色id") + @NotNull(message = "角色id不能为空") + private Long roleId; + + @ApiModelProperty("菜单ids, 菜单可以为空表示解绑,才能删除角色") + private List menuIds; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleVO.java new file mode 100644 index 0000000..6a86727 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddRoleVO.java @@ -0,0 +1,60 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 新增角色对象 + * @author kevin + * @date 2022/2/18 10:40 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class AddRoleVO { + + + /** + * 角色名称 + */ + @NotEmpty(message = "角色名称不能为空") + @ApiModelProperty("角色名称") + private String roleName; + + /** + * 角色编码 + */ + @NotEmpty(message = "角色编码不能为空") + @ApiModelProperty("角色编码") + private String roleCode; + + /** + * 角色描述 + */ + @ApiModelProperty("角色描述") + private String roleDesc; + + /** + * 排序号 + */ + @NotNull(message = "排序号不能为空") + @ApiModelProperty("排序号") + private Integer orderNo; + + /** + * 备注 + */ + @ApiModelProperty("备注") + private String bz; + + /** + * 数据权限等级 + */ + @ApiModelProperty("数据权限等级") + private String dataPermissionLevel; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddSysMenuVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddSysMenuVO.java new file mode 100644 index 0000000..d628887 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddSysMenuVO.java @@ -0,0 +1,55 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 添加系统菜单 + * @author kevin + * @date 2022/2/22 12:51 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class AddSysMenuVO { + + @ApiModelProperty(value = "父菜单id") + private Long parentId; + + @NotEmpty(message = "菜单名称不能为空") + @ApiModelProperty(value = "菜单名称") + private String menuName; + + @NotEmpty(message = "菜单编码不能为空") + @ApiModelProperty(value = "菜单编码") + private String menuCode; + + @ApiModelProperty(value = "菜单地址") + private String menuUrl; + + /** + * 菜单类型 + * @see com.mosty.common.base.constant.enums.MenuTypeEnum + */ + @NotNull(message = "菜单类型不能为空") + @ApiModelProperty(value = "菜单类型:1、菜单组 2、菜单 3、页面 4、资源") + private Integer menuType; + + @NotNull(message = "排序号不能为空") + @ApiModelProperty(value = "排序号") + private Integer orderNo; + + @ApiModelProperty(value = "是否展示:1、展示 2、不展示") + private Integer showMode; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "按钮标识") + private String buttonResource; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddSysUserVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddSysUserVO.java new file mode 100644 index 0000000..c194090 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddSysUserVO.java @@ -0,0 +1,278 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + * 添加用户信息请求对象 + * @author kevin + * @date 2022/2/16 10:11 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class AddSysUserVO implements Serializable { + + /** + * 序列化标识 + */ + private static final long serialVersionUID = 5407773316739763410L; + + /** + * 部门ids + */ +// @NotEmpty(message = "部门ids不能为空!") +// @ApiModelProperty(value = "部门ids") +// private List deptIds; + + @ApiModelProperty(value = "所属部门代码") + private String ssbmdm; + + /** + * 管理部门ID + */ + @ApiModelProperty(value = "管理部门ID") + private Long managerOrgId; + + /** + * 管理部门名称 + */ + @ApiModelProperty(value = "管理部门名称") + private String managerOrgName; + + /** + * 岗位ID + */ +// @NotNull(message = "岗位id不能为空!") + @ApiModelProperty(value = "岗位ID") + private Long positionId; + + /** + * 岗位名称 + */ + @ApiModelProperty(value = "岗位名称") + private String positionName; + + /** + * 登录账号 + */ + @ApiModelProperty(value = "登录账号") +// @NotEmpty(message ="登录账号不能为空") + private String loginName; + + /** + * 密码 + */ + @ApiModelProperty(value = "密码") +// @NotEmpty(message = "密码不能为空") + private String password; + + /** + * 用户昵称 + */ + @ApiModelProperty(value = "用户昵称") + private String userName; + + /** + * 用户类型(00系统用户 01注册用户) + */ + @ApiModelProperty(value = "用户类型(00系统用户默认 01注册用户)") + private String userType; + + /** + * 用户邮箱 + */ + @ApiModelProperty(value = "用户邮箱") + private String email; + + /** + * 移动电话 + */ + @ApiModelProperty(value = "移动电话") + private String mobile; + + /** + * 电话号码 + */ + @ApiModelProperty(value = "电话号码") + private String telePhone; + + /** + * 身份证号 + */ + @ApiModelProperty(value = "id_entity_card") + private String idEntityCard; + + /** + * 行业号码(如:警号) + */ + @ApiModelProperty(value = "行业号码(如:警号)") + private String inDustRialId; + + /** + * 用户性别(0男 1女 2未知) + */ + @ApiModelProperty(value = "用户性别(0男 1女 2未知)") + private String sex; + + /** + * 民族 + */ + @ApiModelProperty(value = "民族") + private String nation; + + /** + * 政治面貌 + */ + @ApiModelProperty(value = "政治面貌") + private String politic; + + /** + * 婚姻状态 + */ + @ApiModelProperty(value = "婚姻状态") + private String marital; + + /** + * 人员类别 + */ + @ApiModelProperty(value = "人员类别") + private String type; + + /** + * 文化程度 + */ + @ApiModelProperty(value = "文化程度") + private String whcd; + + /** + * 备注 + */ + @ApiModelProperty(value = "备注") + private String bz; + + /** + * 出生日期 + */ + @ApiModelProperty(value = "出生日期") + private String birthday; + + /** + * 用户有效开始时间,默认为当前日期(用户可改) + */ + @ApiModelProperty(value = " 用户有效开始时间,默认为当前日期(用户可改)") + private Date beginTime; + + /** + * 用户有效结束时间,默认空 + */ + @ApiModelProperty(value = " 用户有效结束时间,默认空") + private Date endTime; + + /** + * 是否虚拟用户:1、是 2、不是 + */ + @ApiModelProperty(value = "是否虚拟用户:1、是 2、不是") + private String isVirtualUser; + + + /** + * 采集时间 + */ + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + /** + * 录入时间 + */ + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + /** + * 录入人姓名 + */ + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + /** + * 录入人id + */ + @ApiModelProperty(value = "录入人id") + private Long xtLrrid; + + /** + * 录入人部门 + */ + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + /** + * 录入人部门id + */ + @ApiModelProperty(value = "录入人部门id") + private String xtLrrbmid; + + /** + * 录入人部门id + */ + @ApiModelProperty(value = "录入人部门id") + private String xtLrip; + + /** + * 最后修改时间 + */ + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + /** + * 最后修改人姓名 + */ + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + /** + * 最后修改人id + */ + @ApiModelProperty(value = "最后修改人id") + private Long xtZhxgid; + + /** + * 最后修改人部门 + */ + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + /** + * 最后修改人部门id + */ + @ApiModelProperty(value = "最后修改人部门id") + private Long xtZhxgrbmid; + + /** + * 最后修改人ip + */ + @ApiModelProperty(value = "最后修改人ip") + private String xtZhxgrip; + + /** + * token登陆 + */ + @ApiModelProperty(value = "token登陆") + private String token; + + + @ApiModelProperty(value = "是否融合 0否 1是") + private String sfrh; + + @ApiModelProperty(value = "模块") + private String mk; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddUserDeptVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddUserDeptVO.java new file mode 100644 index 0000000..8732262 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/AddUserDeptVO.java @@ -0,0 +1,33 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 添加 部门 用户关联关系 + * @author liyan + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class AddUserDeptVO extends Page { + + /** + * 部门id + */ + @ApiModelProperty("部门id") + private Long deptId; + + /** + * 用户id + */ + @ApiModelProperty("用户id") + private Long userId; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/Base64Str.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/Base64Str.java new file mode 100644 index 0000000..ccfc100 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/Base64Str.java @@ -0,0 +1,18 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +@Data +@Accessors(chain = true) +public class Base64Str { + + @ApiModelProperty(value = "base64字符串") + private String base64; + + @ApiModelProperty(value = "文件后缀 png mp4") + private String suffix; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DataPermissionVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DataPermissionVO.java new file mode 100644 index 0000000..b8d14db --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DataPermissionVO.java @@ -0,0 +1,18 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@Accessors(chain = true) +public class DataPermissionVO { + @ApiModelProperty(value = "数据权限等级") + private String permissionLevel; + + @ApiModelProperty(value = "数据权限对应得部门ids") + private List deptIds; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteDeptVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteDeptVO.java new file mode 100644 index 0000000..67406e8 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteDeptVO.java @@ -0,0 +1,23 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@Accessors(chain = true) +public class DeleteDeptVO { + /** + * 部门id + */ + @ApiModelProperty("部门id") + @NotNull(message = "部门id不能为空") + private Long id; + + @ApiModelProperty("注销原因") + @NotBlank(message = "注销原因不能为空") + private String xtZxyy; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteListVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteListVO.java new file mode 100644 index 0000000..bf18915 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteListVO.java @@ -0,0 +1,19 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="DeleteListVO", description="DeleteList批量") +public class DeleteListVO { + /** + * ID集合 + */ + private List ids; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteRoleDeptVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteRoleDeptVO.java new file mode 100644 index 0000000..31c31ba --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteRoleDeptVO.java @@ -0,0 +1,33 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 添加 部门 用户关联关系 + * @author liyan + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class DeleteRoleDeptVO extends Page { + + /** + * 部门id + */ + @ApiModelProperty("部门id") + private Long deptId; + + /** + * 角色ids + */ + @ApiModelProperty("角色ids") + private String roleIds; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteUserDeptVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteUserDeptVO.java new file mode 100644 index 0000000..52ba553 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeleteUserDeptVO.java @@ -0,0 +1,33 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 添加 部门 用户关联关系 + * @author liyan + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class DeleteUserDeptVO extends Page { + + /** + * 部门id + */ + @ApiModelProperty("部门id") + private Long deptId; + + /** + * 用户id + */ + @ApiModelProperty("用户id") + private String userIds; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptPage.java new file mode 100644 index 0000000..2aae970 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptPage.java @@ -0,0 +1,32 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mosty.common.core.business.entity.SysDept; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 分页查询部门信息 + * + * @author kevin + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class DeptPage extends Page { + + // 部门名称 + private String deptName; + + // 部门编码 + private String orgCode; + + // 部门编码ids + private String ids; + + // 是否需要权限 1.不需要权限 + private String isAll; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptQuery.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptQuery.java new file mode 100644 index 0000000..2b632e3 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptQuery.java @@ -0,0 +1,25 @@ +package com.mosty.common.core.business.entity.vo; + +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 分页查询部门信息 + * + * @author kevin + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class DeptQuery { + + // 部门名称 + private String deptname; + + // 部门编码 + private String deptcode; + + // 部门父级编码 + private Integer parentid; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptTreeVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptTreeVO.java new file mode 100644 index 0000000..112bdf4 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptTreeVO.java @@ -0,0 +1,20 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +/** + * 组织结构树搜索请求 + * @author kevin + * @date 2022/3/27 11:44 AM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class DeptTreeVO { + + @ApiModelProperty("搜索关键词") + private String keyword; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptVo.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptVo.java new file mode 100644 index 0000000..a027702 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/DeptVo.java @@ -0,0 +1,56 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * @author dw + * @since 2022/8/1 + * 返回的组织机构对象,包含所属部门 所属分县局 所属地市州 + **/ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "DeptVo 对象", description = "返回的组织机构对象,包含所属部门 所属分县局 所属地市州") +public class DeptVo implements Serializable, Cloneable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("所属部门ID") + private String deptid; + + @ApiModelProperty("所属部门代码") + private String deptcode; + + @ApiModelProperty("所属部门名称") + private String deptname; + + @ApiModelProperty("部门类型") + private String orgType; + + @ApiModelProperty("部门等级") + private String orgLevel; + + @ApiModelProperty("所属分县局id") + private String fxjid; + + @ApiModelProperty("所属分县局代码") + private String fxjcode; + + @ApiModelProperty("所属分现局名称") + private String fxjname; + + @ApiModelProperty("所属地市州id") + private String dszid; + + @ApiModelProperty("所属地市州代码") + private String dszcode; + + @ApiModelProperty("所属地市州名称") + private String dszname; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/EditSysMenuVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/EditSysMenuVO.java new file mode 100644 index 0000000..a09f9b7 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/EditSysMenuVO.java @@ -0,0 +1,48 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 修改系统菜单 + * @author kevin + * @date 2022/2/22 12:51 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class EditSysMenuVO { + + @NotNull(message = "菜单id不能为空") + @ApiModelProperty(value = "菜单id") + private Long id; + + @NotEmpty(message = "菜单名称不能为空") + @ApiModelProperty(value = "菜单名称") + private String menuName; + + @NotEmpty(message = "菜单编码不能为空") + @ApiModelProperty(value = "菜单编码") + private String menuCode; + + @ApiModelProperty(value = "菜单地址") + private String menuUrl; + + @NotNull(message = "排序号不能为空") + @ApiModelProperty(value = "排序号") + private Integer orderNo; + + @ApiModelProperty(value = "是否展示:1、展示 2、不展示") + private Integer showMode; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "按钮标识") + private String buttonResource; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/GetUserPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/GetUserPage.java new file mode 100644 index 0000000..84a5984 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/GetUserPage.java @@ -0,0 +1,24 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 用户分页展示 + * @author dw + * @date 2022/2/17 10:04 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class GetUserPage { + + @ApiModelProperty("查询方式 1.本部门 2.所有部门") + private String type; + + @ApiModelProperty("搜索关键字") + private String keyword; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/GetUserRoleListVo.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/GetUserRoleListVo.java new file mode 100644 index 0000000..4028ec2 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/GetUserRoleListVo.java @@ -0,0 +1,24 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +@Data +@Accessors(chain = true) +public class GetUserRoleListVo implements Serializable { + + @ApiModelProperty("角色id") + @NotNull(message = "角色id不能为空") + private Long roleId; + + @ApiModelProperty("菜单ids") + private String userName; + + @ApiModelProperty("手机号") + private String phone; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/LoginResponseVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/LoginResponseVO.java new file mode 100644 index 0000000..5c76d7d --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/LoginResponseVO.java @@ -0,0 +1,23 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 登陆返回信息 + * @author kevin + * @date 2022/5/25 4:19 下午 + * @since 1.0.0 + */ +@Data +@Api(tags = "登陆返回body和cookie") +public class LoginResponseVO { + + @ApiModelProperty("登陆返回的body") + private String loginResponseBody; + + @ApiModelProperty("登陆返回的Set-Cookie键值对") + private String loginResponseCookie; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/MenuPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/MenuPage.java new file mode 100644 index 0000000..d5d1fce --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/MenuPage.java @@ -0,0 +1,29 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 分页查询菜单信息 + * @author kevin + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class MenuPage extends Page { + + /** + * 菜单名称 + */ + private String menuName; + +// /** +// * 岗位状态 :-1:全部、0:正常 2、删除(弃用) +// */ +// private Integer positionStatus; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/MenuQuery.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/MenuQuery.java new file mode 100644 index 0000000..6bfd8f8 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/MenuQuery.java @@ -0,0 +1,28 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 分页查询菜单信息 + * @author kevin + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class MenuQuery { + + /** + * 菜单名称 + */ + private String menuName; + +// /** +// * 岗位状态 :-1:全部、0:正常 2、删除(弃用) +// */ +// private Integer positionStatus; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/PositionPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/PositionPage.java new file mode 100644 index 0000000..4d8128e --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/PositionPage.java @@ -0,0 +1,34 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 分页查询岗位信息 + * @author kevin + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class PositionPage extends Page { + + /** + * 岗位编码 + */ + private String positionCode; + + /** + * 岗位名称 + */ + private String positionName; + +// /** +// * 岗位状态 :-1:全部、0:正常 2、删除(弃用) +// */ +// private Integer positionStatus; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleByDeptPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleByDeptPage.java new file mode 100644 index 0000000..0fc8707 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleByDeptPage.java @@ -0,0 +1,33 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 分页查询部门信息 + * @author kevin + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class RoleByDeptPage extends Page { + + /** + * 部门名称 + */ + @ApiModelProperty(value = "部门id") + private Long deptId; + + + /** + * 角色id + */ + @ApiModelProperty(value = "角色id") + private Long roleId; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleDeptVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleDeptVO.java new file mode 100644 index 0000000..aa79d0a --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleDeptVO.java @@ -0,0 +1,64 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 添加 部门 用户关联关系 + * @author liyan + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class RoleDeptVO implements Serializable { + + + /** + * 部门id + */ + @ApiModelProperty("关联关系id") + private Long id; + + + /** + * 部门id + */ + @ApiModelProperty("部门id") + private Long deptId; + + /** + * 用户id + */ + @ApiModelProperty("角色id") + private Long roleId; + + /** + * 角色名称 + */ + @ApiModelProperty("角色名称") + private String roleName; + + /** + * 角色描述 + */ + @ApiModelProperty("角色描述") + private String roleDesc; + + @ApiModelProperty("注销标志") + private Integer xtZxbz; + + /** + * 录入时间 + */ + @ApiModelProperty("录入时间") + private Date xtLrsj; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RolePage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RolePage.java new file mode 100644 index 0000000..27c94a4 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RolePage.java @@ -0,0 +1,29 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 分页查询角色信息 + * @author kevin + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class RolePage extends Page { + + /** + * 角色名称 + */ + private String roleName; + + /** + * 用户id + */ + private String userId; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleUserPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleUserPage.java new file mode 100644 index 0000000..ef27296 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleUserPage.java @@ -0,0 +1,38 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 角色关联的用户信息分页查询请求 + * @author kevin + * @date 2022/2/20 11:24 AM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class RoleUserPage extends Page { + + /** + * 登陆名称 + */ + @ApiModelProperty("登陆名称") + private String loginName; + + /** + * 手机号码 + */ + @ApiModelProperty("手机号码") + private String phone; + + /** + * 角色id + */ + @ApiModelProperty("角色id") + private Long roleId; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleUserVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleUserVO.java new file mode 100644 index 0000000..6f7be59 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/RoleUserVO.java @@ -0,0 +1,31 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 用户和角色关联关系 + */ +@Data +@Accessors(chain = true) +public class RoleUserVO implements Serializable { + + + private static final long serialVersionUID = 3289683012945300862L; + + @NotEmpty(message = "角色id不能为空") + @NotNull(message = "用户id不能为空") + @ApiModelProperty(value = "用户ID") + private List userIds; + + @NotEmpty(message = "角色id不能为空") + @ApiModelProperty(value = "用户IDS") + private Long roleId; + +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigPlateVo.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigPlateVo.java new file mode 100644 index 0000000..a219dcb --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigPlateVo.java @@ -0,0 +1,108 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlateList; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import io.swagger.models.auth.In; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + *

+ * app首页-板块表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sys_app_homeconfig_plate") +@ApiModel(value="SysAppHomeconfigPlate对象", description="app首页-板块表") +public class SysAppHomeconfigPlateVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "首页ID") + private Long homeid; + + @ApiModelProperty(value = "板块类型(00-置顶按钮,01-五情板块,02-工作任务板块,03-概况板块,04-风险板块)") + private String bklx; + + @ApiModelProperty(value = "板块名称") + private String bkmc; + + @ApiModelProperty(value = "板块样式") + private String dyys; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "板块顺序") + private Integer bksx; + + @ApiModelProperty(value = "跳转地址") + private String tzdz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + @ApiModelProperty(value = "板块内容集合") + List plateList; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigRsVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigRsVO.java new file mode 100644 index 0000000..6c04e72 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigRsVO.java @@ -0,0 +1,92 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlateList; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + *

+ * app首页表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sys_app_homeconfig") +@ApiModel(value="SysAppHomeconfig对象", description="app首页表") +public class SysAppHomeconfigRsVO implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "首页名称,如:领导端") + private String homename; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + @ApiModelProperty(value = "板块集合") + List plateList; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigVO.java new file mode 100644 index 0000000..cb90f1b --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysAppHomeconfigVO.java @@ -0,0 +1,88 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * app首页表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sys_app_homeconfig") +@ApiModel(value="SysAppHomeconfig对象", description="app首页表") +public class SysAppHomeconfigVO implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "首页名称,如:领导端") + private String homename; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysDeptVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysDeptVO.java new file mode 100644 index 0000000..917434e --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysDeptVO.java @@ -0,0 +1,176 @@ +package com.mosty.common.core.business.entity.vo; + +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; +import java.util.Objects; + +/** + * 部门信息 + * @author kevin + * @date 2022/2/17 8:48 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class SysDeptVO { + + /** + * 子部门集合 + */ + @ApiModelProperty(value = "子部门集合") + private List childDeptList; + /** + * 部门id + */ + @ApiModelProperty("部门id") + private Long id; + + /** + * 部门代码 + */ + @ApiModelProperty("部门代码") + @NotBlank(message = "部门代码不能为空!") + private String orgCode; + + /** + * 部门名称 + */ + @ApiModelProperty("部门名称") + @NotBlank(message = "部门名称不能为空!") + private String orgName; + + + /** + * 部门类型 + */ + @ApiModelProperty("部门类型") + @NotNull(message = "部门类型不能为空!") + private String orgType; + + /** + * 部门等级 + */ + @ApiModelProperty("部门等级") + @NotNull(message = "部门等级不能为空!") + private String orgLevel; + + /** + * 部门业务类型 + */ + @ApiModelProperty("部门业务类型") + @NotNull(message = "部门业务类型不能为空!") + private String orgBizType; + + /** + * 部门顺序号 + */ + @ApiModelProperty("部门顺序号") + @NotNull(message = "部门顺序号不能为空!") + private String orgNo; + + /** + * 上级部门主键 + */ + @ApiModelProperty("上级部门主键") +// @NotNull(message = "上级部门主键不能为空!") + private Long parentId; + + /** + * 部门名称拼音首字母 + */ + @ApiModelProperty("部门名称拼音首字母") + private String bmpyszm; + + /** + * 部门简称 + */ + @ApiModelProperty("部门简称") + @NotBlank(message = "部门简称不能为空!") + private String orgJc; + + /** + * 部门全称 + */ + @ApiModelProperty("部门全称") + @NotBlank(message = "部门全称不能为空!") + private String orgQc; + + /** + * 部门地址 + */ + @ApiModelProperty("部门地址") + @NotBlank(message = "部门地址不能为空!") + private String address; + + /** + * 部门电话 + */ + @ApiModelProperty("部门电话") + @NotBlank(message = "部门电话不能为空!") + private String linkTel; + + /** + * 部门联系人 + */ + @ApiModelProperty("部门联系人") + @NotBlank(message = "部门联系人不能为空!") + private String linkMan; + + /** + * 部门联系人电话 + */ + @ApiModelProperty("部门联系人电话") + @NotBlank(message = "部门联系人电话不能为空!") + private String linkManTel; + + /** + * 部门主页 + */ + @ApiModelProperty("部门主页") + private String webUrl; + + /** + * 部门邮箱 + */ + @ApiModelProperty("部门邮箱") + private String email; + + /** + * 部门所属行政区划 + */ + @ApiModelProperty("部门所属行政区划") + @NotBlank(message = "部门所属行政区划电话不能为空!") + private String xzqh; + + + /** + * 备注 + */ + @ApiModelProperty("备注") + private String bz; + + /** + * 根目录地址 + */ + @JsonInclude + private String rootPath; + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + SysDeptVO sysDeptVO = (SysDeptVO) o; + return Objects.equals(childDeptList, sysDeptVO.childDeptList) && Objects.equals(id, sysDeptVO.id) && Objects.equals(orgCode, sysDeptVO.orgCode) && Objects.equals(orgName, sysDeptVO.orgName) && Objects.equals(orgLevel, sysDeptVO.orgLevel) && Objects.equals(parentId, sysDeptVO.parentId) && Objects.equals(bmpyszm, sysDeptVO.bmpyszm) && Objects.equals(rootPath, sysDeptVO.rootPath); + } + + @Override + public int hashCode() { + return Objects.hash(childDeptList, id, orgCode, orgName, orgLevel, parentId, bmpyszm, rootPath); + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysRoleVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysRoleVO.java new file mode 100644 index 0000000..b44b16a --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysRoleVO.java @@ -0,0 +1,62 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import java.io.Serializable; + +/** + * 角色列表 + * @author kevin + * @date 2022/2/18 9:41 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class SysRoleVO implements Serializable { + /** + * 主键id + */ + @ApiModelProperty("角色id") + private Long id; + + /** + * 角色名称 + */ + @ApiModelProperty("角色名称") + private String roleName; + + /** + * 角色编码 + */ + @NotEmpty(message = "角色编码不能为空") + @ApiModelProperty("角色编码") + private String roleCode; + + /** + * 角色描述 + */ + @ApiModelProperty("角色描述") + private String roleDesc; + + /** + * 排序号 + */ + @ApiModelProperty("排序号") + private Integer orderNo; + + /** + * 备注 + */ + @ApiModelProperty("备注") + private String bz; + + /** + * 数据权限等级 + */ + @ApiModelProperty("数据权限等级") + private String dataPermissionLevel; + +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserAppHomeconfigPlateVo.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserAppHomeconfigPlateVo.java new file mode 100644 index 0000000..12c504e --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserAppHomeconfigPlateVo.java @@ -0,0 +1,107 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.mosty.common.core.business.entity.SysUserAppHomeconfigPlateList; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + *

+ * 用户app首页配置-板块表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sys_user_app_homeconfig_plate") +@ApiModel(value="SysUserAppHomeconfigPlate对象", description="用户app首页配置-板块表") +public class SysUserAppHomeconfigPlateVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "配置id") + private Long pzId; + + @ApiModelProperty(value = "板块id") + private Long plateId; + + @ApiModelProperty(value = "板块类型(00-置顶按钮,01-五情板块,02-工作任务板块,03-概况板块,04-风险板块)") + private String bklx; + + @ApiModelProperty(value = "板块名称") + private String bkmc; + + @ApiModelProperty(value = "板块内容数") + private Integer bknrs; + + @ApiModelProperty(value = "板块顺序") + private Integer bksx; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + @ApiModelProperty(value = "用户板块内容集合") + List plateList; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserAppHomeconfigVo.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserAppHomeconfigVo.java new file mode 100644 index 0000000..5d64054 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserAppHomeconfigVo.java @@ -0,0 +1,112 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; +import java.util.List; + +/** + *

+ * 用户app首页配置表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sys_user_app_homeconfig") +@ApiModel(value="SysUserAppHomeconfig对象", description="用户app首页配置表") +public class SysUserAppHomeconfigVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "主键id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @ApiModelProperty(value = "首页id") + private Long homeid; + + @ApiModelProperty(value = "首页名称") + private String homename; + + @ApiModelProperty(value = "用户id") + private Long userId; + + @ApiModelProperty(value = "用户身份证号") + private String userSfzh; + + @ApiModelProperty(value = "用户姓名") + private String userXm; + + @ApiModelProperty(value = "配置时间") + private Date pzsj; + + @ApiModelProperty(value = "配置板块数") + private Integer pzbks; + + @ApiModelProperty(value = "色调01-蓝色,02-白色") + private String sd; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人ID") + private String xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门ID") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入IP") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人ID") + private String xtZhxgrid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门ID") + private String xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改IP") + private String xtZhxgip; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyy; + + @ApiModelProperty(value = "用户板块集合") + List plates; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserDeptVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserDeptVO.java new file mode 100644 index 0000000..cfb7e91 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserDeptVO.java @@ -0,0 +1,90 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 用户信息视图 + * + * @author kevin + * @date 2022/2/17 10:08 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class SysUserDeptVO { + + @ApiModelProperty(value = "用户ID") + private Long id; + + @ApiModelProperty(value = "岗位ID") + private Long positionId; + + @ApiModelProperty(value = "岗位名称") + private String positionName; + + @ApiModelProperty(value = "登录账号") + private String loginName; + + @ApiModelProperty(value = "用户昵称") + private String userName; + + @ApiModelProperty(value = "移动电话") + private String mobile; + + @ApiModelProperty(value = "电话号码") + private String telePhone; + + @ApiModelProperty(value = "用户性别(0男 1女 2未知)") + private String sex; + + @ApiModelProperty(value = "民族") + private String nation; + + @ApiModelProperty(value = "政治面貌") + private String politic; + + @ApiModelProperty(value = "婚姻状态") + private String marital; + + @ApiModelProperty(value = "人员类别") + private String type; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "部门id") + private Long deptId; + + @ApiModelProperty(value = "部门名称") + private String deptName; + + @ApiModelProperty(value = "证件号码") + private String idEntityCard; + + @ApiModelProperty(value = "文化程度") + private String whcd; + + @ApiModelProperty(value = "文化程度") + private String hylb; + + @ApiModelProperty(value = "行业号") + private String inDustRialId; + + @ApiModelProperty(value = "是否虚拟用户") + private String isVirtualUser; + + @ApiModelProperty(value = "是否在线 SYS_SF 0.否 1.是") + private boolean sfzx; + + @ApiModelProperty(value = "是否融合") + private String sfrh; + + @ApiModelProperty(value = "是否融合") + private String mk; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserEditVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserEditVO.java new file mode 100644 index 0000000..7c42565 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserEditVO.java @@ -0,0 +1,97 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Date; +import java.util.List; + +@Data +@Accessors(chain = true) +public class SysUserEditVO { + + @NotEmpty(message = "用户绑定的部门不能为空") + @ApiModelProperty(value = "用户绑定的部门id集合") + private List deptIds; + + @ApiModelProperty(value = "所属部门代码") + private String ssbmdm; + + @NotNull(message = "用户id不能为空") + @ApiModelProperty(value = "用户ID") + private Long id; + +// @NotNull(message = "岗位id不能为空") + @ApiModelProperty(value = "岗位ID") + private Long positionId; + + @ApiModelProperty(value = "登录账号") + private String loginName; + + @ApiModelProperty(value = "岗位名称") + private String positionName; + + @ApiModelProperty(value = "用户昵称") + private String userName; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "移动电话") + private String mobile; + + @ApiModelProperty(value = "行业号码(如:警号)") + private String inDustRialId; + + @ApiModelProperty(value = "用户类型(00系统用户 01注册用户)") + private String userType; + + @ApiModelProperty(value = "电话号码") + private String telePhone; + + @ApiModelProperty(value = "是否虚拟用户:1、是 2、不是") + private String isVirtualUser; + + @ApiModelProperty(value = "用户性别(0男 1女 2未知)") + private String sex; + + @ApiModelProperty(value = "民族") + private String nation; + + @ApiModelProperty(value = "政治面貌") + private String politic; + + @ApiModelProperty(value = "婚姻状态") + private String marital; + + @ApiModelProperty(value = "人员类别") + private String type; + + @ApiModelProperty(value = "文化程度") + private String whcd; + + @ApiModelProperty(value = "身份证号") + private String idEntityCard; + + @ApiModelProperty(value = "出生日期") + private String birthday; + + @ApiModelProperty(value = "用户有效开始时间,默认为当前日期(用户可改)") + private Date beginTime; + + @ApiModelProperty(value = "用户有效结束时间,默认空") + private Date endTime; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "是否融合 0否 1是") + private String sfrh; + + @ApiModelProperty(value = "模块") + private String mk; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserHomeconfigVo.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserHomeconfigVo.java new file mode 100644 index 0000000..46ca383 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserHomeconfigVo.java @@ -0,0 +1,50 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + *

+ * 用户app首页配置表 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@TableName("sys_user_app_homeconfig") +@ApiModel(value="SysUserAppHomeconfig对象", description="用户app首页配置表") +public class SysUserHomeconfigVo implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "首页id") + private Long homeid; + + @ApiModelProperty(value = "首页名称") + private String homename; + + @ApiModelProperty(value = "用户id") + private Long userId; + + @ApiModelProperty(value = "用户身份证号") + private String userSfzh; + + @ApiModelProperty(value = "用户姓名") + private String userXm; + + @ApiModelProperty(value = "色调01-蓝色,02-白色") + private String sd; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserInfoVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserInfoVO.java new file mode 100644 index 0000000..15c12d9 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserInfoVO.java @@ -0,0 +1,158 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.mosty.common.base.autoconfig.Desensitization; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; +import java.util.List; + +/** + * 用户信息视图 + * @author kevin + * @date 2022/2/17 10:08 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class SysUserInfoVO { + + @ApiModelProperty(value = "用户ID") + private Long id; + + @ApiModelProperty(value = "部门Ids") + private List deptIds; + + @ApiModelProperty(value = "所属部门代码") + private String ssbmdm; + + @ApiModelProperty(value = "所属部门") + private String ssbm; + + @ApiModelProperty(value = "管理部门ID") + private Long managerOrgId; + + @ApiModelProperty(value = "管理部门名称") + private String managerOrgName; + + @ApiModelProperty(value = "岗位ID") + private Long positionId; + + @ApiModelProperty(value = "岗位名称") + private String positionName; + + @ApiModelProperty(value = "是否虚拟用户:1、是 2、不是") + private String isVirtualUser; + + @ApiModelProperty(value = "登录账号") + private String loginName; + + @ApiModelProperty(value = "用户昵称") + private String userName; + + @ApiModelProperty(value = "用户类型(00系统用户 01注册用户)") + private String userType; + + @ApiModelProperty(value = "用户邮箱") + private String email; + + @ApiModelProperty(value = "移动电话") + private String mobile; + + @ApiModelProperty(value = "电话号码") + private String telePhone; + + @ApiModelProperty(value = "身份证号") + private String idEntityCard; + + @ApiModelProperty(value = "行业号码(如:警号)") + private String inDustRialId; + + @ApiModelProperty(value = "用户性别(0男 1女 2未知)") + private String sex; + + @ApiModelProperty(value = "民族") + private String nation; + + @ApiModelProperty(value = "政治面貌") + private String politic; + + @ApiModelProperty(value = "婚姻状态") + private String marital; + + @ApiModelProperty(value = "人员类别") + private String type; + + @ApiModelProperty(value = "文化程度") + private String whcd; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "出生日期") + private String birthday; + + @ApiModelProperty(value = "用户有效开始时间,默认为当前日期(用户可改)") + private Date beginTime; + + @ApiModelProperty(value = "用户有效结束时间,默认空") + private Date endTime; + + @ApiModelProperty(value = "注销标志0正常 1.注销") + private Integer xtZxbz; + + @ApiModelProperty(value = "注销原因") + private String xtZxyz; + + @ApiModelProperty(value = "采集时间") + private Date xtCjsj; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "录入人姓名") + private String xtLrrxm; + + @ApiModelProperty(value = "录入人id") + private Long xtLrrid; + + @ApiModelProperty(value = "录入人部门") + private String xtLrrbm; + + @ApiModelProperty(value = "录入人部门id") + private String xtLrrbmid; + + @ApiModelProperty(value = "录入人部门id") + private String xtLrip; + + @ApiModelProperty(value = "最后修改时间") + private Date xtZhxgsj; + + @ApiModelProperty(value = "最后修改人姓名") + private String xtZhxgrxm; + + @ApiModelProperty(value = "最后修改人id") + private Long xtZhxgid; + + @ApiModelProperty(value = "最后修改人部门") + private String xtZhxgrbm; + + @ApiModelProperty(value = "最后修改人部门id") + private Long xtZhxgrbmid; + + @ApiModelProperty(value = "最后修改人ip") + private String xtZhxgrip; + + @ApiModelProperty(value = "是否融合") + private String sfrh; + + @ApiModelProperty(value = "模块") + private String mk; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserVO.java new file mode 100644 index 0000000..608a30a --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/SysUserVO.java @@ -0,0 +1,74 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.mosty.common.base.autoconfig.Desensitization; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.util.Date; + +/** + * 用户信息视图 + * @author kevin + * @date 2022/2/17 10:08 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class SysUserVO { + + + @ApiModelProperty(value = "用户ID") + private Long id; + + @ApiModelProperty(value = "岗位ID") + private Long positionId; + + @ApiModelProperty(value = "岗位名称") + private String positionName; + + @ApiModelProperty(value = "登录账号") + private String loginName; + + @ApiModelProperty(value = "用户昵称") + private String userName; + + @ApiModelProperty(value = "移动电话") + private String mobile; + + @ApiModelProperty(value = "电话号码") + private String telePhone; + + @ApiModelProperty(value = "用户性别(0男 1女 2未知)") + private String sex; + + @ApiModelProperty(value = "录入时间") + private Date xtLrsj; + + @ApiModelProperty(value = "行业类别") + private String inDustRialId; + + @ApiModelProperty(value = "身份证号") + private String idEntityCard; + + @ApiModelProperty(value = "部门id") + private Long deptId; + + @ApiModelProperty(value = "部门编码") + private String deptCode; + + @ApiModelProperty(value = "部门名称") + private String deptName; + + @ApiModelProperty(value = "部门简称称") + private String deptJc; + + @ApiModelProperty(value = "是否融合") + private String sfrh; + + @ApiModelProperty(value = "是否融合") + private String mk; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UnboundUserRoleVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UnboundUserRoleVO.java new file mode 100644 index 0000000..882b994 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UnboundUserRoleVO.java @@ -0,0 +1,26 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 用户和角色关联关系 + */ +@Data +@Accessors(chain = true) +public class UnboundUserRoleVO implements Serializable { + + private static final long serialVersionUID = 3289683012945300862L; + + @NotEmpty(message = "关联关系ids") + @ApiModelProperty(value = "关联关系ids") + private List ids; + + +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserByDeptPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserByDeptPage.java new file mode 100644 index 0000000..28ac756 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserByDeptPage.java @@ -0,0 +1,33 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 分页查询部门信息 + * @author kevin + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class UserByDeptPage extends Page { + + /** + * 部门名称 + */ + @ApiModelProperty(value = "部门id") + private Long deptId; + + + /** + * 用户id + */ + @ApiModelProperty(value = "用户id") + private Long userId; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserDeptPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserDeptPage.java new file mode 100644 index 0000000..bc48d4e --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserDeptPage.java @@ -0,0 +1,43 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +/** + * 用户部门分页展示 + * @author kevin + * @date 2022/6/5 2:36 下午 + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class UserDeptPage extends Page { + + @ApiModelProperty("登陆名称") + private String loginName; + + @ApiModelProperty("电话号码") + private String phone; + + @ApiModelProperty("部门名称") + private String deptName; + + @ApiModelProperty("部门Id") + private String deptId; + + @ApiModelProperty("orgcode") + private String orgcode; + + @ApiModelProperty("ssbmdm") + private String ssbmdm; + + @ApiModelProperty("部门id集合") + private List deptList; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserDeptVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserDeptVO.java new file mode 100644 index 0000000..33e6d66 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserDeptVO.java @@ -0,0 +1,61 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.Date; + +/** + * 添加 部门 用户关联关系 + * @author liyan + * @date 2022/2/9 8:53 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class UserDeptVO implements Serializable { + + + /** + * 部门id + */ + @ApiModelProperty("关联关系id") + private Long id; + + + /** + * 部门id + */ + @ApiModelProperty("部门id") + private Long deptId; + + /** + * 用户id + */ + @ApiModelProperty("用户id") + private Long userId; + + /** + * 用户昵称 + */ + @ApiModelProperty("用户昵称") + private String userName; + + /** + * 登录账号 + */ + @ApiModelProperty("登录账号") + private String loginName; + + @ApiModelProperty("注销标志") + private Integer xtZxbz; + + /** + * 录入时间 + */ + @ApiModelProperty("录入时间") + private Date xtLrsj; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserPage.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserPage.java new file mode 100644 index 0000000..b86ab4e --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserPage.java @@ -0,0 +1,44 @@ +package com.mosty.common.core.business.entity.vo; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mosty.common.core.business.entity.SysUser; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +/** + * 用户分页展示 + * @author kevin + * @date 2022/2/17 10:04 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class UserPage extends Page { + + @ApiModelProperty("部门id:左边组织机构树选中的部门id") + private String deptId; + + @ApiModelProperty("登陆名称") + private String loginName; + + @ApiModelProperty("电话号码") + private String phone; + + @ApiModelProperty("角色id") + private Long roleId; + + @ApiModelProperty("orgcode") + private String orgcode; + + @ApiModelProperty("是否包含下级") + private String isChild; + + @ApiModelProperty("身份证") + private String idEntityCard; + + @ApiModelProperty("行业号码(如:警号)") + private String inDustRialId; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserRoleVO.java b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserRoleVO.java new file mode 100644 index 0000000..d8958a0 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/entity/vo/UserRoleVO.java @@ -0,0 +1,31 @@ +package com.mosty.common.core.business.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.util.List; + +/** + * 用户和角色关联关系 + */ +@Data +@Accessors(chain = true) +public class UserRoleVO implements Serializable { + + + private static final long serialVersionUID = 3289683012945300862L; + + + @NotNull(message = "用户id不能为空") + @ApiModelProperty(value = "用户ID") + private Long userId; + + @NotEmpty(message = "角色id不能为空") + @ApiModelProperty(value = "用户IDS") + private List roleIds; + +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigMapper.java new file mode 100644 index 0000000..a483609 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigMapper.java @@ -0,0 +1,19 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysAppHomeconfig; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + *

+ * app首页表 Mapper 接口 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysAppHomeconfigMapper extends BaseMapper { + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateListMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateListMapper.java new file mode 100644 index 0000000..37b996a --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateListMapper.java @@ -0,0 +1,23 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlateList; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * app首页配置-板块内容表 Mapper 接口 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysAppHomeconfigPlateListMapper extends BaseMapper { + + /** + * 根据首页ID删除 + * @param plateId + */ + void deleteByPlateId(@Param("plateId") Long plateId); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateMapper.java new file mode 100644 index 0000000..125a3f6 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateMapper.java @@ -0,0 +1,23 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlate; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * app首页-板块表 Mapper 接口 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysAppHomeconfigPlateMapper extends BaseMapper { + + /** + * 根据首页ID删除 + * @param homeid + */ + void deleteByHomeid(@Param("homeid") Long homeid); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysDeptMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysDeptMapper.java new file mode 100644 index 0000000..aa32201 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysDeptMapper.java @@ -0,0 +1,47 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.core.business.entity.SysDept; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysRole; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.entity.vo.RoleByDeptPage; +import com.mosty.common.core.business.entity.vo.RoleDeptVO; +import com.mosty.common.core.business.entity.vo.UserByDeptPage; +import com.mosty.common.core.business.entity.vo.UserDeptVO; +import com.mosty.common.core.login.dto.DeptDTO; +import io.swagger.annotations.ApiOperation; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** +* @author li +* @description 针对表【sys_dept(部门表)】的数据库操作Mapper +* @createDate 2022-02-12 16:52:58 +* @Entity generator.domain.SysDept +*/ +public interface SysDeptMapper extends BaseMapper { + + @ApiOperation("查询用户关联的部门id集合") + List selectUserDeptList(@Param("userId") Long userId); + + @ApiOperation("分页查询部门下用户信息") + IPage selectUserPageByDept(@Param("param") UserByDeptPage userByDeptPage); + + @ApiOperation("分页查询部门下角色信息") + IPage selectRolePageByDept(@Param("param") RoleByDeptPage roleByDeptPage); + + @ApiOperation("查询用户的所属部门") + SysDept getDeptByUserId(Long id); + + @ApiOperation("查询下级部门") + List getDeptListByParentId(@Param("parentid") Integer parentid, @Param("deptname") String deptname); + + @ApiOperation("查询下级部门") + List getDeptListByOrgcode(@Param("deptCode") String deptCode, @Param("deptname") String deptname); +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysLogininforMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysLogininforMapper.java new file mode 100644 index 0000000..ad1953b --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysLogininforMapper.java @@ -0,0 +1,26 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysLogininfor; + +/** +* @author li +* @description 针对表【sys_logininfor(系统访问记录)】的数据库操作Mapper +* @createDate 2022-03-20 15:01:16 +*/ +public interface SysLogininforMapper extends BaseMapper { + /** + * 删除日志 + * @param toStrArray + */ + void deleteOperLogByIds(String[] toStrArray); + + /** + * 清空日志 + */ + void cleanOperLog(); +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysMenuMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysMenuMapper.java new file mode 100644 index 0000000..94673b6 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysMenuMapper.java @@ -0,0 +1,16 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysMenu; + +/** + *

+ * 菜单表 Mapper 接口 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +public interface SysMenuMapper extends BaseMapper { + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysOssMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysOssMapper.java new file mode 100644 index 0000000..6daed58 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysOssMapper.java @@ -0,0 +1,16 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysOss; + +/** + *

+ * OSS云存储表 Mapper 接口 + *

+ * + * @author zengbo + * @since 2022-08-31 + */ +public interface SysOssMapper extends BaseMapper { + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysPositionMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysPositionMapper.java new file mode 100644 index 0000000..c348474 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysPositionMapper.java @@ -0,0 +1,16 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysPosition; + +/** + *

+ * 岗位表 Mapper 接口 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +public interface SysPositionMapper extends BaseMapper { + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleDeptMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleDeptMapper.java new file mode 100644 index 0000000..8f3e7a6 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleDeptMapper.java @@ -0,0 +1,18 @@ +package com.mosty.common.core.business.mapper; + +import com.mosty.common.core.business.entity.SysRoleDept; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author li +* @description 针对表【sys_role_dept(角色和部门关联表)】的数据库操作Mapper +* @createDate 2022-02-12 16:53:15 +* @Entity generator.domain.SysRoleDept +*/ +public interface SysRoleDeptMapper extends BaseMapper { + +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleMapper.java new file mode 100644 index 0000000..434033d --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleMapper.java @@ -0,0 +1,18 @@ +package com.mosty.common.core.business.mapper; + +import com.mosty.common.core.business.entity.SysRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author li +* @description 针对表【sys_role(角色表)】的数据库操作Mapper +* @createDate 2022-02-12 16:53:11 +* @Entity generator.domain.SysRole +*/ +public interface SysRoleMapper extends BaseMapper { + +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleMenuMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleMenuMapper.java new file mode 100644 index 0000000..0929216 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysRoleMenuMapper.java @@ -0,0 +1,18 @@ +package com.mosty.common.core.business.mapper; + +import com.mosty.common.core.business.entity.SysRoleMenu; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author li +* @description 针对表【sys_role_menu(角色和菜单关联表)】的数据库操作Mapper +* @createDate 2022-02-12 16:53:18 +* @Entity generator.domain.SysRoleMenu +*/ +public interface SysRoleMenuMapper extends BaseMapper { + +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigMapper.java new file mode 100644 index 0000000..859f777 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigMapper.java @@ -0,0 +1,23 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysUserAppHomeconfig; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 用户app首页配置表 Mapper 接口 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysUserAppHomeconfigMapper extends BaseMapper { + + /** + * 根据身份证号删除 + * @param sfzh + */ + void deleteBySfzh(@Param("sfzh") String sfzh); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateListMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateListMapper.java new file mode 100644 index 0000000..ce0d377 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateListMapper.java @@ -0,0 +1,36 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysUserAppHomeconfigPlateList; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 用户app首页配置-板块内容表 Mapper 接口 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysUserAppHomeconfigPlateListMapper extends BaseMapper { + + /** + * 根据配置ID删除 + * @param pzId + */ + void deleteByPzId(@Param("pzId") Long pzId, @Param("pzPlateId") Long pzPlateId); + + /** + * 根据配置ID删除 + * @param pzId + */ + void delByPzId(@Param("pzId") Long pzId); + + /** + * 修改配置内容 + * @param pzId + */ + void updateById(@Param("pzId") Long pzId, @Param("pzPlateId") Long pzPlateId, @Param("plateListId") Long plateListId, @Param( + "zxbz") Integer zxbz); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateMapper.java new file mode 100644 index 0000000..729f63b --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateMapper.java @@ -0,0 +1,30 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.SysUserAppHomeconfigPlate; +import org.apache.ibatis.annotations.Param; + +/** + *

+ * 用户app首页配置-板块表 Mapper 接口 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysUserAppHomeconfigPlateMapper extends BaseMapper { + + /** + * 根据首页ID删除 + * @param pzId + */ + void deleteByPzid(@Param("pzId") Long pzId); + + /** + * 根据首页ID删除 + * @param id + */ + void updateById(@Param("id") Long id, @Param("zxbz") Integer zxbz); + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserDeptMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserDeptMapper.java new file mode 100644 index 0000000..9334b78 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserDeptMapper.java @@ -0,0 +1,19 @@ +package com.mosty.common.core.business.mapper; + +import com.mosty.common.core.business.entity.SysUserDept; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import io.swagger.annotations.ApiOperation; + +/** +* @author li +* @description 针对表【sys_user_dept(用户和部门关联表)】的数据库操作Mapper +* @createDate 2022-02-12 16:53:21 +* @Entity generator.domain.SysUserDept +*/ +public interface SysUserDeptMapper extends BaseMapper { + +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserMapper.java new file mode 100644 index 0000000..4f72c7b --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserMapper.java @@ -0,0 +1,46 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.entity.vo.SysUserDeptVO; +import com.mosty.common.core.business.entity.vo.SysUserVO; +import com.mosty.common.core.business.entity.vo.UserDeptPage; +import com.mosty.common.core.business.entity.vo.UserPage; +import io.swagger.annotations.ApiOperation; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 用户服务dao层 + * @author kevin + * @date 2022/2/12 10:10 PM + * @since 1.0.0 + */ +public interface SysUserMapper extends BaseMapper { + + @ApiOperation("分页查询用户信息") + List selectByPage(@Param("userPage") UserPage userPage); + + @ApiOperation("查询用户部门分页") + IPage selectUserDeptPage(@Param("userDeptPage") UserDeptPage userDeptPage); + + @ApiOperation("获取部门下的所有的人员数据(包含子部门)") + List getUserListByDeptId(@Param("deptIds") List deptIds, + @Param("keyword") String keyword); + + @ApiOperation("获取部门下的所有人员") + List getUserListByDeptIdOne(Long id); + + @ApiOperation("查询用户数量") + int selectByCount(@Param("userPage") UserPage userPage); + + + @ApiOperation("删除用户信息") + void delById(Long id); +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserRoleMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserRoleMapper.java new file mode 100644 index 0000000..ce61b75 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/SysUserRoleMapper.java @@ -0,0 +1,38 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.core.business.entity.SysUserRole; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.vo.GetUserRoleListVo; +import com.mosty.common.core.business.entity.vo.RoleUserPage; +import com.mosty.common.core.business.entity.vo.SysUserVO; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** +* @author li +* @description 针对表【sys_user_role(用户和角色关联表)】的数据库操作Mapper +* @createDate 2022-02-12 16:53:24 +* @Entity generator.domain.SysUserRole +*/ +public interface SysUserRoleMapper extends BaseMapper { + + /** + * 查询用户可以查看的,当前角色绑定的用户列表 + * @param rootPath 当前用户的组织机构前缀 + * @param roleUserPage 查询请求 + * @return 绑定的用户信息 + */ + List roleUserList(@Param("rootPath") String rootPath, @Param("roleUserPage") RoleUserPage roleUserPage); + + /** + * 分页查询角色下用户 + * @return + */ + List getRoleUserList(GetUserRoleListVo vo); +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/YbmjMapper.java b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/YbmjMapper.java new file mode 100644 index 0000000..9dcbf99 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/mapper/YbmjMapper.java @@ -0,0 +1,13 @@ +package com.mosty.common.core.business.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.core.business.entity.Ybmj; + + +public interface YbmjMapper extends BaseMapper { + +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/LoginService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/LoginService.java new file mode 100644 index 0000000..4f3a6ca --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/LoginService.java @@ -0,0 +1,15 @@ +package com.mosty.common.core.business.service; + +import com.mosty.common.core.business.entity.SysMenu; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.login.LoginResponseVO; +import com.mosty.common.core.login.dto.DeptDTO; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +public interface LoginService { + + @ApiOperation("获取用户菜单信息") + List getMenus(DeptDTO currentLoginDept, SysUser sysUser, LoginResponseVO loginResponseVO); +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigPlateListService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigPlateListService.java new file mode 100644 index 0000000..6f5a3a5 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigPlateListService.java @@ -0,0 +1,60 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlateList; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPlateListPage; +import com.mosty.common.token.UserInfo; + +import java.util.List; + +/** + *

+ * app首页配置-板块内容表 服务类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysAppHomeconfigPlateListService extends IService { + + /** + * 新增板块内容 + * @param plate + */ + Long saveInfo(SysAppHomeconfigPlateList plate, String ipAddress); + + /** + * 新增板块内容 + * @param plates + */ + boolean saveInfoBatch(List plates, String ipAddress); + + /** + * 修改首板块内容 + * @param plate + * @param ipAddress + */ + void updateInfo(SysAppHomeconfigPlateList plate, String ipAddress); + + /** + * 修改板块内容 + * @param plates + * @param ipAddress + */ + void updateInfoBatch(List plates, String ipAddress); + + /** + * 删除板块内容 + * @param list + */ + void delete(List list, String ipAddress, UserInfo userInfo); + + /** + * 查询应用 + * @param cofigPage + * @return + */ + IPage selectByPage(SysAppHomeconfigPlateListPage cofigPage); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigPlateService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigPlateService.java new file mode 100644 index 0000000..553e0c0 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigPlateService.java @@ -0,0 +1,60 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlate; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPlatePage; +import com.mosty.common.token.UserInfo; + +import java.util.List; + +/** + *

+ * app首页-板块表 服务类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysAppHomeconfigPlateService extends IService { + + /** + * 新增板块 + * @param plate + */ + Long saveInfo(SysAppHomeconfigPlate plate, String ipAddress); + + /** + * 新增板块 + * @param plates + */ + boolean saveInfoBatch(List plates, String ipAddress); + + /** + * 修改板块 + * @param plate + * @param ipAddress + */ + void updateInfo(SysAppHomeconfigPlate plate, String ipAddress); + + /** + * 修改板块 + * @param plates + * @param ipAddress + */ + void updateInfoBatch(List plates, String ipAddress); + + /** + * 删除板块 + * @param list + */ + void delete(List list, String ipAddress, UserInfo userInfo); + + /** + * 查询板块 + * @param platePage + * @return + */ + IPage selectByPage(SysAppHomeconfigPlatePage platePage); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigService.java new file mode 100644 index 0000000..23499f2 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysAppHomeconfigService.java @@ -0,0 +1,56 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.SysAppHomeconfig; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPage; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigQuery; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.token.UserInfo; + +import java.util.List; + +/** + *

+ * app首页表 服务类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysAppHomeconfigService extends IService { + + /** + * 新增首页应用 + * @param configVO + */ + Long saveInfo(SysAppHomeconfigVO configVO, String ipAddress); + + /** + * 修改首页应用 + * @param configVO + * @param ipAddress + */ + void updateInfo(SysAppHomeconfigVO configVO, String ipAddress); + + /** + * 删除首页应用 + * @param list + */ + void delete(List list, String ipAddress, UserInfo userInfo); + + /** + * 查询应用 + * @param cofigPage + * @return + */ + IPage selectByPage(SysAppHomeconfigPage cofigPage); + + /** + * 根据首页id查询模块及内容数据 + * @param configQuery + * @return + */ + SysAppHomeconfigRsVO queryConfig(SysAppHomeconfigQuery configQuery); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysDeptService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysDeptService.java new file mode 100644 index 0000000..9a43416 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysDeptService.java @@ -0,0 +1,84 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.core.business.entity.SysDept; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.SysRole; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.core.login.dto.DeptAllVo; +import com.mosty.common.core.login.dto.DeptDTO; +import com.mosty.common.token.UserInfo; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +/** + * @author li + * @description 针对表【sys_dept(部门表)】的数据库操作Service + * @createDate 2022-02-12 16:52:58 + */ +public interface SysDeptService extends IService { + + // 分页查询部门信息 + IPage selectByPage(DeptPage deptPage); + + + // 分页查询下级部门信息 + List selectDept(DeptQuery dto); + + + // 查询用户关联的部门 + List selectUserDeptList(Long id); + + // 查询子部门集合 + List getChildDeptList(Long deptId); + + // 查询该部门下的所有部门结合 + SysDeptVO getAllChildDeptList(SysDept sysDept, DeptTreeVO deptTreeVO); + + // 新增部门 + Long saveInfo(AddDeptVO addDeptVO, String ipAddress); + + // 修改部门 + void updateInfo(SysDeptVO sysDept, String ipAddress); + + // 删除部门 + void delete(DeleteDeptVO deleteDeptV, String ipAddress, UserInfo userInfo); + + // 根据部门查询部门下用户 + IPage selectUserPageByDept(UserByDeptPage userByDeptPage); + + // 根据部门查询部门下角色 + IPage selectRolePageByDept(RoleByDeptPage roleByDeptPage); + + // 保存部门角色关联关系 + void saveRoleDeptInfo(AddRoleDeptVO roleDeptVO); + + // 添加用户部门关联关系 + void saveUserDeptInfo(AddUserDeptVO addUserDeptVO); + + // 删除用户部门关联关系 + void deleteUserDeptInfo(DeleteUserDeptVO deleteUserDeptVO); + + // 根据部门id 获取部门及以下部门id + List getAllChildDeptIds(Long deptId); + + // 根据组织机构编码查询部门信息 + SysDept getDeptByOrgCode(String orgCode); + + // 部门数据同步 + Boolean deptSys(); + + //根据部门编码分页查询当前及下级部门信息--第三方接口 + IPage getDeptList(DeptPage deptPage); + + // 查询部门下的所有子部门信息 + List getChildDept(String deptid); + + // 查询部门下的所有子部门信息 + List getChildDeptByOrgCode(String orgcode); + + // 查询所属部门、地市州、分县局 + DeptAllVo getOrgByDeptId(String deptId); +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysLogininforService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysLogininforService.java new file mode 100644 index 0000000..ab362a6 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysLogininforService.java @@ -0,0 +1,31 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.SysLogininfor; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.entity.request.LoginLogPage; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * @author li + * @description 针对表【sys_logininfor(系统访问记录)】的数据库操作Service + * @createDate 2022-03-20 15:01:16 + */ +public interface SysLogininforService extends IService { + + // 记录登录日志 + void recordLogininfor(SysUser user, String loginFail, String message, + HttpServletRequest httpServletRequest, String type); + + // 删除 + void deleteOperLogByIds(List ids); + + // 清空 + void cleanOperLog(); + + // 分页查询 + IPage selectByPage(LoginLogPage loginLogPage); +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysMenuService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysMenuService.java new file mode 100644 index 0000000..4badc61 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysMenuService.java @@ -0,0 +1,40 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.base.constant.enums.MenuTypeEnum; +import com.mosty.common.core.business.entity.SysMenu; +import com.mosty.common.core.business.entity.vo.AddSysMenuVO; +import com.mosty.common.core.business.entity.vo.MenuPage; +import com.mosty.common.core.business.entity.vo.MenuQuery; +import com.mosty.common.core.login.LoginResponseVO; +import io.swagger.annotations.ApiOperation; + +import java.util.List; +import java.util.Set; + +/** + *

+ * 菜单表 服务类 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +public interface SysMenuService extends IService { + + @ApiOperation("分页查询菜单信息") + IPage selectByPage(MenuPage menuPage); + + @ApiOperation("添加菜单信息") + void addSysMenuInfo(AddSysMenuVO addSysMenuVo, SysMenu parentMenu); + + @ApiOperation("登录返回权限") + List listByType(Set menuIds, MenuTypeEnum menuGroup, LoginResponseVO loginResponseVO); + + @ApiOperation("根据菜单id查询子集") + SysMenu getMenuChild(Long menuId); + + @ApiOperation("查询树形结构") + List selectList(MenuQuery menuQuery); +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysOssService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysOssService.java new file mode 100644 index 0000000..3df068d --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysOssService.java @@ -0,0 +1,23 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.SysOss; +import com.mosty.common.core.business.entity.vo.AddRoleMenuVO; + +/** + *

+ * OSS云存储表 服务类 + *

+ * + * @author zengbo + * @since 2022-08-31 + */ +public interface SysOssService extends IService { + + /** + * 添加存储 + * @param sysOss + */ + void saveSysOss(SysOss sysOss); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysPositionService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysPositionService.java new file mode 100644 index 0000000..c77ee45 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysPositionService.java @@ -0,0 +1,32 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.config.entity.vo.EditPositionVO; +import com.mosty.common.core.business.entity.SysPosition; +import com.mosty.common.core.business.entity.vo.PositionPage; + +/** + *

+ * 岗位表 服务类 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +public interface SysPositionService extends IService { + + /** + * 分页查询岗位信息 + * @param positionPage 分页请求 + * @return 岗位分页 + */ + IPage selectByPage(PositionPage positionPage); + + /** + * 修改岗位信息 + * @param oldSysPosition 原岗位信息 + * @param editPositionVO 修改岗位信息请求 + */ + void updateSysPost(SysPosition oldSysPosition, EditPositionVO editPositionVO); +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleDeptService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleDeptService.java new file mode 100644 index 0000000..1c82737 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleDeptService.java @@ -0,0 +1,28 @@ +package com.mosty.common.core.business.service; + +import com.mosty.common.core.business.entity.SysRoleDept; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** +* @author li +* @description 针对表【sys_role_dept(角色和部门关联表)】的数据库操作Service +* @createDate 2022-02-12 16:53:15 +*/ +public interface SysRoleDeptService extends IService { + /** + * 部门id + * @param deptId + * @return + */ + List listByDeptId(Long deptId); + + /** + * + * @param deptId + * @param roleId + * @return + */ + SysRoleDept getByDeptIdAndRoleId(Long deptId, Long roleId); +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleMenuService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleMenuService.java new file mode 100644 index 0000000..3913198 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleMenuService.java @@ -0,0 +1,28 @@ +package com.mosty.common.core.business.service; + +import com.mosty.common.core.business.entity.SysRoleMenu; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; +import java.util.Set; + +/** +* @author li +* @description 针对表【sys_role_menu(角色和菜单关联表)】的数据库操作Service +* @createDate 2022-02-12 16:53:18 +*/ +public interface SysRoleMenuService extends IService { + /** + * 根据角色ids查询菜单 + * @param rolesSet + * @return + */ + List listByRoleIds(Set rolesSet); + + /** + * g根据菜单id查询角色 + * @param id + * @return + */ + Set listByMenuId(Long id); +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleService.java new file mode 100644 index 0000000..1b2abb3 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysRoleService.java @@ -0,0 +1,49 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.SysRole; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.token.DeptInfo; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +/** +* @author li +* @description 针对表【sys_role(角色表)】的数据库操作Service +* @createDate 2022-02-12 16:53:11 +*/ +public interface SysRoleService extends IService { + + @ApiOperation("查询角色分页信息") + IPage selectByPage(RolePage rolePage); + + @ApiOperation("查询用户角色列表") + List getUserRoleList(Long userId); + + @ApiOperation("添加角色信息") + void insertRole(AddRoleVO addRoleVo, String ipAddress); + + @ApiOperation("添加角色和菜单关联关系") + void saveRoleMenuInfo(AddRoleMenuVO roleMenuVO); + + @ApiOperation("分配数据权限") + void saveDataPermission(AddRoleDataPartitionVO addRoleDataPartitionVO,String ipAddress); + + @ApiOperation("根据菜单标识获取数据权限") + DataPermissionVO getDataPermission(String menuUrl); + + @ApiOperation("分页查询未绑定当前用户的角色") + IPage selectUnAccreditPage(RolePage rolePage); + + @ApiOperation("分页查询当前角色下用户") + IPage getRoleUserList(GetUserRoleListVo vo); + + @ApiOperation("查询用户绑定的菜单ids") + List getRoleMenuIds(Long roleId); + + @ApiOperation("获取部门最高角色等级权限") + DeptInfo getSysDeptLevel(String orgCode); +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateListService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateListService.java new file mode 100644 index 0000000..fa7690a --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateListService.java @@ -0,0 +1,63 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlateList; +import com.mosty.common.core.business.entity.SysUserAppHomeconfigPlateList; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPlateListPage; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigPlateListPage; +import com.mosty.common.token.UserInfo; + +import java.util.List; + +/** + *

+ * 用户app首页配置-板块内容表 服务类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysUserAppHomeconfigPlateListService extends IService { + + /** + * 新增板块内容 + * @param plate + */ + Long saveInfo(SysUserAppHomeconfigPlateList plate, String ipAddress); + + /** + * 新增板块内容 + * @param plates + */ + boolean saveInfoBatch(List plates, String ipAddress); + + /** + * 修改首板块内容 + * @param plate + * @param ipAddress + */ + void updateInfo(SysUserAppHomeconfigPlateList plate, String ipAddress); + + /** + * 修改板块内容 + * @param plates + * @param ipAddress + */ + void updateInfoBatch(List plates, String ipAddress); + + /** + * 删除板块内容 + * @param list + */ + void delete(List list, String ipAddress, UserInfo userInfo); + + /** + * 查询应用 + * @param cofigPage + * @return + */ + IPage selectByPage(SysUserAppHomeconfigPlateListPage cofigPage); + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateService.java new file mode 100644 index 0000000..72d18b0 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateService.java @@ -0,0 +1,62 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlate; +import com.mosty.common.core.business.entity.SysUserAppHomeconfigPlate; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPlatePage; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigPlatePage; +import com.mosty.common.token.UserInfo; + +import java.util.List; + +/** + *

+ * 用户app首页配置-板块表 服务类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysUserAppHomeconfigPlateService extends IService { + + /** + * 新增板块 + * @param plate + */ + Long saveInfo(SysUserAppHomeconfigPlate plate, String ipAddress); + + /** + * 新增板块 + * @param plates + */ + boolean saveInfoBatch(List plates, String ipAddress); + + /** + * 修改板块 + * @param plate + * @param ipAddress + */ + void updateInfo(SysUserAppHomeconfigPlate plate, String ipAddress); + + /** + * 修改板块 + * @param plates + * @param ipAddress + */ + void updateInfoBatch(List plates, String ipAddress); + + /** + * 删除板块 + * @param list + */ + void delete(List list, String ipAddress, UserInfo userInfo); + + /** + * 查询板块 + * @param platePage + * @return + */ + IPage selectByPage(SysUserAppHomeconfigPlatePage platePage); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigService.java new file mode 100644 index 0000000..052d9f4 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserAppHomeconfigService.java @@ -0,0 +1,77 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.SysUserAppHomeconfig; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigPage; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigQuery; +import com.mosty.common.core.business.entity.vo.SysUserAppHomeconfigVo; +import com.mosty.common.core.business.entity.vo.SysUserHomeconfigVo; +import com.mosty.common.token.UserInfo; + +import java.util.List; + +/** + *

+ * 用户app首页配置表 服务类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +public interface SysUserAppHomeconfigService extends IService { + + /** + * 新增用户首页应用 + * @param config + */ + Long saveInfo(SysUserAppHomeconfig config, String ipAddress); + + /** + * 新增用户首页应用 + * @param config + */ + void saveInfoBatch(List config, String ipAddress); + + /** + * 修改首页应用 + * @param config + * @param ipAddress + */ + void updateInfo(SysUserAppHomeconfig config, String ipAddress); + + + /** + * 修改首页应用 + * @param config + * @param ipAddress + */ + void updateInfoBatch(List config, String ipAddress); + + /** + * 删除首页应用 + * @param list + */ + void delete(List list, String ipAddress, UserInfo userInfo); + + /** + * 查询用户应用 + * @param cofigPage + * @return + */ + IPage selectByPage(SysUserAppHomeconfigPage cofigPage); + + /** + * 查询用户配置 + * @param cofigQuery + * @return + */ + List queryUserConfig(SysUserAppHomeconfigQuery cofigQuery); + + /** + * 新增用户首页应用 + * @param config + */ + Long saveDefaultConfig(SysUserHomeconfigVo config, String ipAddress); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserDeptService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserDeptService.java new file mode 100644 index 0000000..ea0669c --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserDeptService.java @@ -0,0 +1,42 @@ +package com.mosty.common.core.business.service; + +import com.mosty.common.core.business.entity.SysUserDept; +import com.baomidou.mybatisplus.extension.service.IService; + +import java.util.List; + +/** +* @author li +* @description 针对表【sys_user_dept(用户和部门关联表)】的数据库操作Service +* @createDate 2022-02-12 16:53:21 +*/ +public interface SysUserDeptService extends IService { + /** + * + * @param id + * @return + */ + List listByDeptId(Long id); + + /** + * 根据部门id,用户id查询关联关系 + * @param deptId + * @param userId + * @return + */ + SysUserDept getByDeptIdAndUserId(Long deptId, Long userId); + + /** + * 根据userId获取相关部门 + * @param id + * @return + */ + List listByUserId(Long id); + + /** + * 根据部门ID集合查询用户 + * @param ids + * @return + */ + List listByDeptIds(List ids); +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserRoleService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserRoleService.java new file mode 100644 index 0000000..5e0cb31 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserRoleService.java @@ -0,0 +1,34 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.core.business.entity.SysUserRole; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.vo.RoleUserPage; +import com.mosty.common.core.business.entity.vo.RoleUserVO; +import com.mosty.common.core.business.entity.vo.SysUserVO; +import com.mosty.common.core.business.entity.vo.UserRoleVO; +import io.swagger.annotations.ApiOperation; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** +* @author li +* @description 针对表【sys_user_role(用户和角色关联表)】的数据库操作Service +* @createDate 2022-02-12 16:53:24 +*/ +public interface SysUserRoleService extends IService { + + @ApiOperation("查询角色关联的用户信息") + IPage roleUserList(String rootPath, RoleUserPage roleUserPage); + + @ApiOperation("跟根据用户id查询角色列表") + List listByUserId(Long id); + + @ApiOperation("为用户授权角色") + boolean grantRoleToUser(UserRoleVO userRoleVo); + + @ApiOperation("为角色授予用户") + boolean grantUserToRole(RoleUserVO roleUserVO); + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserService.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserService.java new file mode 100644 index 0000000..74ee957 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/SysUserService.java @@ -0,0 +1,49 @@ +package com.mosty.common.core.business.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.entity.request.SysUserEditPasswordRequest; +import com.mosty.common.core.business.entity.vo.*; +import io.swagger.annotations.ApiOperation; + +import java.util.List; + +public interface SysUserService extends IService { + + @ApiOperation("添加用户信息") + void saveInfo(AddSysUserVO sysUser); + + @ApiOperation("编辑用户信息") + void editInfo(SysUserEditVO sysUserEditVo, SysUser sysUser); + + @ApiOperation("编辑密码") + void editPassword(SysUserEditPasswordRequest sysUserEditPasswordRequest); + + @ApiOperation("查询用户信息") + SysUser getUserInfo(Long id); + + @ApiOperation("查询用户信息") + SysUser checkUserInfo(SysUser user); + + @ApiOperation("分页查询用户信息") + IPage selectByPage(UserPage userPage); + + @ApiOperation("重置密码") + void resetPassword(SysUser user); + + @ApiOperation("查询未绑定当前角色的用户") + IPage selectUnAccreditPage(UserPage userPage); + + @ApiOperation("查询用户部门信息") + IPage selectUserDeptPage(UserDeptPage userDeptPage); + + @ApiOperation("用户数据同步") + Boolean userSys(); + + @ApiOperation("根据条件查询用户信息") + List getUserList(GetUserPage dto); + + @ApiOperation("删除用户信息") + void delById(Long id); +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/LoginServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/LoginServiceImpl.java new file mode 100644 index 0000000..f794c5a --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/LoginServiceImpl.java @@ -0,0 +1,67 @@ +package com.mosty.common.core.business.service.impl; + +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.mosty.common.base.constant.enums.MenuTypeEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.core.business.entity.*; +import com.mosty.common.core.business.service.*; +import com.mosty.common.core.login.LoginResponseVO; +import com.mosty.common.core.login.UserPermissionsInfo; +import com.mosty.common.core.login.dto.DeptDTO; +import lombok.AllArgsConstructor; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + + +@Service +@AllArgsConstructor +public class LoginServiceImpl implements LoginService { + + + private final SysRoleDeptService sysRoleDeptService; + private final SysUserRoleService sysUserRoleService; + private final SysRoleMenuService sysRoleMenuService; + private final SysMenuService sysMenuService; + + @Override + public List getMenus(DeptDTO currentLoginDept, SysUser sysUser, LoginResponseVO loginResponseVO) { + if (!sysUser.getLoginName().contains("admin")) { + List roleDepts = sysRoleDeptService.listByDeptId(currentLoginDept.getDeptId()); + List userRoles = sysUserRoleService.listByUserId(sysUser.getId()); + List roleIds = new ArrayList<>(); + if (!roleDepts.isEmpty()) { + List deptRoleIds = roleDepts.stream().map(SysRoleDept::getRoleId).collect(Collectors.toList()); + roleIds.addAll(deptRoleIds); + } + if (!userRoles.isEmpty()) { + List userRoleIds = userRoles.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); + roleIds.addAll(userRoleIds); + } + // 如果没有权限 ,添加默认权限 + if (CollectionUtils.isEmpty(roleIds)) { + SysUserRole role = new SysUserRole(); + role.setUserId(sysUser.getId()); + role.setRoleId(136L); + this.sysUserRoleService.save(role); + roleIds.add(136L); + } + Set rolesSet = new HashSet<>(roleIds); + List roleMenus = sysRoleMenuService.listByRoleIds(rolesSet); + if (roleMenus.isEmpty()) { + return new ArrayList<>(); + } + Set menuIds = roleMenus.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toSet()); + //查询一级菜单组 递归 + return sysMenuService.listByType(menuIds, MenuTypeEnum.MENU_GROUP, loginResponseVO); + } else { + return sysMenuService.listByType(null, MenuTypeEnum.MENU_GROUP, loginResponseVO); + } + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigPlateListServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigPlateListServiceImpl.java new file mode 100644 index 0000000..4c1b7ed --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigPlateListServiceImpl.java @@ -0,0 +1,127 @@ +package com.mosty.common.core.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlateList; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPlateListPage; +import com.mosty.common.core.business.mapper.SysAppHomeconfigPlateListMapper; +import com.mosty.common.core.business.service.SysAppHomeconfigPlateListService; +import com.mosty.common.token.UserInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + *

+ * app首页配置-板块内容表 服务实现类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Service +public class SysAppHomeconfigPlateListServiceImpl extends ServiceImpl implements SysAppHomeconfigPlateListService { + + @Resource + private SysAppHomeconfigPlateListMapper sysAppHomeconfigPlateListMapper; + + @Override + public Long saveInfo(SysAppHomeconfigPlateList plate, String ipAddress) { + plate.setXtZhxgsj(new Date()); + plate.setXtCjsj(new Date()); + plate.setXtLrip(ipAddress); + plate.setXtLrsj(new Date()); + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + sysAppHomeconfigPlateListMapper.insert(plate); + return plate.getId(); + } + + @Override + public boolean saveInfoBatch(List plates, String ipAddress) { + if(!CollectionUtils.isEmpty(plates)) { + for(SysAppHomeconfigPlateList plate : plates) { + plate.setXtZhxgsj(new Date()); + plate.setXtCjsj(new Date()); + plate.setXtLrip(ipAddress); + plate.setXtLrsj(new Date()); + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + sysAppHomeconfigPlateListMapper.insert(plate); + } + } + return true; + } + + @Override + public void updateInfo(SysAppHomeconfigPlateList plate, String ipAddress) { + SysAppHomeconfigPlateList oldConfig = sysAppHomeconfigPlateListMapper.selectById(plate.getId()); + Asserts.check(oldConfig == null, "主键为 %s 的信息不存在", plate.getId()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + plate.setXtZhxgsj(new Date()); + plate.setXtLrip(ipAddress); + sysAppHomeconfigPlateListMapper.updateById(plate); + } + + @Override + public void updateInfoBatch(List plates, String ipAddress) { + if(!CollectionUtils.isEmpty(plates)) { + Long plateId = plates.get(0).getPlateId(); + sysAppHomeconfigPlateListMapper.deleteByPlateId(plateId); + for(SysAppHomeconfigPlateList plate : plates) { + plate.setXtZhxgsj(new Date()); + plate.setXtCjsj(new Date()); + plate.setXtLrip(ipAddress); + plate.setXtLrsj(new Date()); + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + sysAppHomeconfigPlateListMapper.insert(plate); + } + } + } + + @Override + public void delete(List list, String ipAddress, UserInfo userInfo) { + if(!CollectionUtils.isEmpty(list)) { + for(Long id : list) { + SysAppHomeconfigPlateList plate = sysAppHomeconfigPlateListMapper.selectById(id); + if(plate != null) { + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.DELETED.code); + plate.setXtZhxgsj(new Date()); + plate.setXtZhxgip(ipAddress); + if(userInfo != null) { + plate.setXtZhxgrxm(userInfo.getUserName()); + plate.setXtZhxgrbmid(userInfo.getDeptId() + ""); + plate.setXtZhxgrbm(userInfo.getDeptName()); + } + sysAppHomeconfigPlateListMapper.updateById(plate); + } + } + } + } + + @Override + public IPage selectByPage(SysAppHomeconfigPlateListPage platePage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(platePage.getNrmc())) { + queryWrapper.and(wrapper -> wrapper.like("nrmc", platePage.getNrmc())); + } + if(platePage.getPlateId() != null) { + queryWrapper.and(wrapper -> wrapper.eq("pz_id", platePage.getPlateId())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + List orderBy = Lists.newArrayList(OrderItem.asc("id")); + platePage.setOrders(orderBy); + return sysAppHomeconfigPlateListMapper.selectPage(platePage, queryWrapper); + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigPlateServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigPlateServiceImpl.java new file mode 100644 index 0000000..5177975 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigPlateServiceImpl.java @@ -0,0 +1,135 @@ +package com.mosty.common.core.business.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.core.business.entity.SysAppHomeconfig; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlate; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPlatePage; +import com.mosty.common.core.business.mapper.SysAppHomeconfigPlateMapper; +import com.mosty.common.core.business.service.SysAppHomeconfigPlateService; +import com.mosty.common.token.UserInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + *

+ * app首页-板块表 服务实现类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Service + + +public class SysAppHomeconfigPlateServiceImpl extends ServiceImpl implements SysAppHomeconfigPlateService { + + @Resource + private SysAppHomeconfigPlateMapper sysAppHomeconfigPlateMapper; + + @Override + public Long saveInfo(SysAppHomeconfigPlate plate, String ipAddress) { + plate.setXtZhxgsj(new Date()); + plate.setXtCjsj(new Date()); + plate.setXtLrip(ipAddress); + plate.setXtLrsj(new Date()); + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + sysAppHomeconfigPlateMapper.insert(plate); + return plate.getId(); + } + + @Override + public boolean saveInfoBatch(List plates, String ipAddress) { + if(!CollectionUtils.isEmpty(plates)) { + for(SysAppHomeconfigPlate plate : plates) { + plate.setXtZhxgsj(new Date()); + plate.setXtCjsj(new Date()); + plate.setXtLrip(ipAddress); + plate.setXtLrsj(new Date()); + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + sysAppHomeconfigPlateMapper.insert(plate); + } + } + return true; + } + + @Override + public void updateInfo(SysAppHomeconfigPlate plate, String ipAddress) { + SysAppHomeconfigPlate oldConfig = sysAppHomeconfigPlateMapper.selectById(plate.getId()); + Asserts.check(oldConfig == null, "主键为 %s 的信息不存在", plate.getId()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + plate.setXtZhxgsj(new Date()); + plate.setXtLrip(ipAddress); + sysAppHomeconfigPlateMapper.updateById(plate); + } + + @Override + public void updateInfoBatch(List plates, String ipAddress) { + if(!CollectionUtils.isEmpty(plates)) { + Long homeId = plates.get(0).getHomeid(); + sysAppHomeconfigPlateMapper.deleteByHomeid(homeId); + for(SysAppHomeconfigPlate plate : plates) { + plate.setXtZhxgsj(new Date()); + plate.setXtCjsj(new Date()); + plate.setXtLrip(ipAddress); + plate.setXtLrsj(new Date()); + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + sysAppHomeconfigPlateMapper.insert(plate); + } + } + } + + @Override + public void delete(List list, String ipAddress, UserInfo userInfo) { + if(!CollectionUtils.isEmpty(list)) { + for(Long id : list) { + SysAppHomeconfigPlate plate = sysAppHomeconfigPlateMapper.selectById(id); + if(plate != null) { + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.DELETED.code); + plate.setXtZhxgsj(new Date()); + plate.setXtZhxgip(ipAddress); + if(userInfo != null) { + plate.setXtZhxgrxm(userInfo.getUserName()); + plate.setXtZhxgrbmid(userInfo.getDeptId() + ""); + plate.setXtZhxgrbm(userInfo.getDeptName()); + } + sysAppHomeconfigPlateMapper.updateById(plate); + } + } + } + } + + @Override + public IPage selectByPage(SysAppHomeconfigPlatePage platePage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(platePage.getBkmc())) { + queryWrapper.and(wrapper -> wrapper.like("bkmc", platePage.getBkmc())); + } + if(StringUtils.isNotBlank(platePage.getBklx())) { + queryWrapper.and(wrapper -> wrapper.eq("bklx", platePage.getBklx())); + } + if(platePage.getHomeid() != null) { + queryWrapper.and(wrapper -> wrapper.eq("homeid", platePage.getHomeid())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + List orderBy = Lists.newArrayList(OrderItem.asc("id")); + platePage.setOrders(orderBy); + return sysAppHomeconfigPlateMapper.selectPage(platePage, queryWrapper); + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigServiceImpl.java new file mode 100644 index 0000000..c1a955e --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysAppHomeconfigServiceImpl.java @@ -0,0 +1,152 @@ +package com.mosty.common.core.business.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.core.business.entity.SysAppHomeconfig; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlate; +import com.mosty.common.core.business.entity.SysAppHomeconfigPlateList; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPage; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigQuery; +import com.mosty.common.core.business.entity.vo.SysAppHomeconfigPlateVo; +import com.mosty.common.core.business.entity.vo.SysAppHomeconfigRsVO; +import com.mosty.common.core.business.entity.vo.SysAppHomeconfigVO; +import com.mosty.common.core.business.mapper.SysAppHomeconfigMapper; +import com.mosty.common.core.business.mapper.SysAppHomeconfigPlateListMapper; +import com.mosty.common.core.business.mapper.SysAppHomeconfigPlateMapper; +import com.mosty.common.core.business.service.SysAppHomeconfigService; +import com.mosty.common.token.UserInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * app首页表 服务实现类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Service +public class SysAppHomeconfigServiceImpl extends ServiceImpl implements SysAppHomeconfigService { + + @Resource + private SysAppHomeconfigMapper sysAppHomeconfigMapper; + + @Resource + private SysAppHomeconfigPlateMapper sysAppHomeconfigPlateMapper; + + @Resource + private SysAppHomeconfigPlateListMapper sysAppHomeconfigPlateListMapper; + + @Override + public Long saveInfo(SysAppHomeconfigVO configVO, String ipAddress) { + SysAppHomeconfig config = new SysAppHomeconfig(); + BeanUtils.copyProperties(configVO, config); + config.setXtZhxgsj(new Date()); + config.setXtCjsj(new Date()); + config.setXtLrip(ipAddress); + config.setBz(configVO.getBz()); + config.setXtLrsj(new Date()); + config.setXtZhxgsj(new Date()); + config.setXtZxbz(DeletedEnum.NATURE.code); + sysAppHomeconfigMapper.insert(config); + return config.getId(); + } + + @Override + public void updateInfo(SysAppHomeconfigVO configVO, String ipAddress) { + SysAppHomeconfig oldConfig = this.getBaseMapper().selectById(configVO.getId()); + Asserts.check(oldConfig == null, "主键为 %s 的应用信息不存在", configVO.getId()); + SysAppHomeconfig config = BeanUtil.copyProperties(configVO, SysAppHomeconfig.class); + config.setXtZxbz(DeletedEnum.NATURE.code); + config.setXtZhxgsj(new Date()); + config.setXtLrip(ipAddress); + sysAppHomeconfigMapper.updateById(config); + } + + @Override + public void delete(List list, String ipAddress, UserInfo userInfo) { + if(!CollectionUtils.isEmpty(list)) { + for(Long id : list) { + SysAppHomeconfig config = getBaseMapper().selectById(id); + if(config != null) { + config.setXtZhxgsj(new Date()); + config.setXtZxbz(DeletedEnum.DELETED.code); + config.setXtZhxgsj(new Date()); + config.setXtZhxgip(ipAddress); + if(userInfo != null) { + config.setXtZhxgrxm(userInfo.getUserName()); + config.setXtZhxgrbmid(userInfo.getDeptId() + ""); + config.setXtZhxgrbm(userInfo.getDeptName()); + } + sysAppHomeconfigMapper.updateById(config); + } + } + } + } + + @Override + public IPage selectByPage(SysAppHomeconfigPage cofigPage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(cofigPage.getHomename())) { + queryWrapper.and(wrapper -> wrapper.like("homename", cofigPage.getHomename())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + List orderBy = Lists.newArrayList(OrderItem.asc("id")); + cofigPage.setOrders(orderBy); + return sysAppHomeconfigMapper.selectPage(cofigPage, queryWrapper); + } + + @Override + public SysAppHomeconfigRsVO queryConfig(SysAppHomeconfigQuery configQuery) { + List plateList = new ArrayList<>(); + SysAppHomeconfigRsVO vo = new SysAppHomeconfigRsVO(); + if (configQuery.getId() == null) { + return vo; + } + SysAppHomeconfig config = sysAppHomeconfigMapper.selectById(configQuery.getId()); + BeanUtils.copyProperties(config, vo); + QueryWrapper plateWrapper = new QueryWrapper<>(); + plateWrapper.lambda().eq(SysAppHomeconfigPlate::getHomeid, config.getId()); + plateWrapper.lambda().eq(SysAppHomeconfigPlate::getXtZxbz, DeletedEnum.NATURE.code); + plateWrapper.orderByAsc("bksx"); + List plates = sysAppHomeconfigPlateMapper.selectList(plateWrapper); + if(!CollectionUtils.isEmpty(plates)) { + List plateIds = plates.stream().map(item->item.getId()).collect(Collectors.toList()); + if(!CollectionUtils.isEmpty(plateIds)) { + QueryWrapper plateListWrapper = new QueryWrapper<>(); + plateListWrapper.lambda().in(SysAppHomeconfigPlateList::getPlateId, plateIds); + plateListWrapper.lambda().eq(SysAppHomeconfigPlateList::getXtZxbz, DeletedEnum.NATURE.code); + plateListWrapper.orderByAsc("nrsx"); + plateList = sysAppHomeconfigPlateListMapper.selectList(plateListWrapper); + } + List plateVos = new ArrayList<>(); + for(SysAppHomeconfigPlate plate : plates) { + SysAppHomeconfigPlateVo plateVo = new SysAppHomeconfigPlateVo(); + BeanUtils.copyProperties(plate, plateVo); + if(!CollectionUtils.isEmpty(plateList)) { + List list = + plateList.parallelStream().filter(item->item.getPlateId().longValue()== plate.getId().longValue()).collect(Collectors.toList()); + plateVo.setPlateList(list); + } + plateVos.add(plateVo); + } + vo.setPlateList(plateVos); + } + return vo; + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysDeptServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysDeptServiceImpl.java new file mode 100644 index 0000000..0f04127 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysDeptServiceImpl.java @@ -0,0 +1,592 @@ +package com.mosty.common.core.business.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.google.common.collect.Sets; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.base.exception.BusinessException; +import com.mosty.common.base.util.ChineseCharacterUtil; +import com.mosty.common.base.util.DateUtils; +import com.mosty.common.core.business.entity.*; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.core.business.mapper.SysDeptMapper; +import com.mosty.common.core.business.service.*; +import com.mosty.common.core.constant.DataPermissionConstant; +import com.mosty.common.core.login.dto.DeptAllVo; +import com.mosty.common.core.login.dto.DeptDTO; +import com.mosty.common.core.util.http.HttpUtils; +import com.mosty.common.token.JwtSysUser; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class SysDeptServiceImpl extends ServiceImpl + implements SysDeptService { + @Resource + private SysDeptMapper sysDeptMapper; + @Resource + private SysUserDeptService sysUserDeptService; + @Resource + private SysRoleDeptService sysRoleDeptService; + @Resource + private SysRoleService sysRoleService; + @Resource + private SysUserService sysUserService; + + public static String DEPT_URL = "http://80.149.27.78:8001/no-auth-api/system/jurisdictions/all"; + + @Value("${config.orgCode}") + private String orgCode; + + + @Override + public IPage selectByPage(DeptPage deptPage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(deptPage.getDeptName())) { + queryWrapper.and(wrapper -> wrapper.like("org_name", deptPage.getDeptName())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + queryWrapper.and(wrapper -> wrapper.eq("parent_id", DeletedEnum.NATURE.code)); +// queryWrapper.and(wrapper -> wrapper.isNull("parent_id")); + List orderBy = Lists.newArrayList(OrderItem.asc("id")); + deptPage.setOrders(orderBy); + IPage iPage = this.baseMapper.selectPage(deptPage, queryWrapper); + if (CollectionUtils.isNotEmpty(iPage.getRecords())) { + List records = iPage.getRecords(); + records.forEach(this::wrapChildList); + iPage.setRecords(records); + } + return iPage; + } + + @Override + public List selectDept(DeptQuery dto) { + if (dto.getParentid() != null) { + return this.baseMapper.getDeptListByParentId(dto.getParentid(), dto.getDeptname()); + } + UserInfo user = UserInfoManager.get(); + String ssbm = getSsbm(user); + return this.baseMapper.getDeptListByOrgcode(ssbm, dto.getDeptname()); + } + + // 获取用户的查询条件 + public String getSsbm(UserInfo user) { + // 查询用户权限 + SysRoleVO role = null; + List userRoles = sysRoleService.getUserRoleList(user.getUserId()); + if (!CollectionUtils.isEmpty(userRoles)) { + int level = Integer.parseInt(userRoles.get(0).getDataPermissionLevel()); + role = userRoles.get(0); + for (SysRoleVO item : userRoles) { + if (level > Integer.parseInt(item.getDataPermissionLevel())) { + level = Integer.parseInt(item.getDataPermissionLevel()); + role = item; + } + } + } + if (role != null) { + String level = role.getDataPermissionLevel(); + if ("1".equals(level) || "2".equals(level)) { + return orgCode; + } else if ("3".equals(level)) { + return user.getDszDeptCode(); + } else if ("4".equals(level)) { + return user.getFxjDeptCode(); + } else { + return user.getDeptCode(); + } + } + return user.getDeptCode(); + } + + + private void wrapChildList1(SysDept item, List allList) { +// List list = this.list( +// new LambdaQueryWrapper() +// .eq(SysDept::getParentId, item.getId()) +// .eq(SysDept::getXtZxbz, DeletedEnum.NATURE.code) +// ); + List list = allList.stream().filter(it -> + !Objects.isNull(it.getParentId()) && it.getParentId().equals(item.getId())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(list)) { + item.setChildDeptList(list); + list.forEach(it -> this.wrapChildList1(it, allList)); + } + } + + private void wrapChildList(SysDept item) { + List list = this.list( + new LambdaQueryWrapper() + .eq(SysDept::getParentId, item.getId()) + .eq(SysDept::getXtZxbz, DeletedEnum.NATURE.code) + ); + if (CollectionUtils.isNotEmpty(list)) { + item.setChildDeptList(list); + list.forEach(this::wrapChildList); + } + } + + // 获取部门 + public IPage getDept(DeptPage deptPage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + if (StringUtils.isBlank(deptPage.getDeptName())) { + if (StringUtils.isNotBlank(deptPage.getOrgCode())) { + queryWrapper.and(wrapper -> wrapper.eq("org_code", deptPage.getOrgCode())); + } else { + queryWrapper.and(wrapper -> wrapper.isNull("parent_id")); + } + } + if (StringUtils.isNotBlank(deptPage.getIds())) { + List list = Arrays.asList(deptPage.getIds().split(",")); + queryWrapper.in("id", list); + } + queryWrapper.like(StringUtils.isNotBlank(deptPage.getDeptName()), "org_name", deptPage.getDeptName()); + List orderBy = Lists.newArrayList(OrderItem.asc("id")); + deptPage.setOrders(orderBy); + return getBaseMapper().selectPage(deptPage, queryWrapper); + } + + @Override + public List selectUserDeptList(Long userId) { + return sysDeptMapper.selectUserDeptList(userId); + } + + @Override + public List getChildDeptList(Long deptId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.and(wrapper -> wrapper.eq("parent_id", deptId)); + return getBaseMapper().selectList(queryWrapper); + } + + @Override + public SysDeptVO getAllChildDeptList(SysDept sysDept, DeptTreeVO deptTreeVO) { + SysDeptVO sysDeptVO = BeanUtil.copyProperties(sysDept, SysDeptVO.class); + + String keyword = StringUtils.isEmpty(deptTreeVO.getKeyword()) ? null : deptTreeVO.getKeyword(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + UserInfo userInfo = UserInfoManager.get(); + //获取最大权限角色 + String level = userInfo.getLevel(); + if (DataPermissionConstant.DATA_SCOPE_COUNTY.equals(level) || DataPermissionConstant.DATA_SCOPE_DEPT_AND_CHILD.equals(level) || DataPermissionConstant.DATA_SCOPE_DEPT.equals(level) || DataPermissionConstant.DATA_SCOPE_SELF.equals(level)) { + queryWrapper.and(wrapper -> wrapper.like("root_path", sysDept.getRootPath() + "%")); + } + //部门查询 + List allDept = getBaseMapper().selectList(queryWrapper); + if (CollectionUtils.isEmpty(allDept)) { + return sysDeptVO; + } + List natureList = allDept.stream().filter(dept -> DeletedEnum.NATURE.code.equals(dept.getXtZxbz())) + .map(dept -> BeanUtil.copyProperties(dept, SysDeptVO.class)).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(natureList)) { + return sysDeptVO; + } + + if (keyword != null) { + Map idMap = natureList.stream().collect(Collectors.toMap(SysDeptVO::getId, vo -> vo)); + Set containSet = Sets.newHashSet(); + natureList.stream().filter(dept -> dept.getOrgName().contains(keyword) || dept.getBmpyszm().toLowerCase().contains(keyword)) + .forEach(dept -> { + try { + for (String id : dept.getRootPath().split("_")) { + SysDeptVO sysDeptVO1 = idMap.get(Long.parseLong(id)); + if (sysDeptVO1 != null) { + containSet.add(sysDeptVO1); + } + } + } catch (Exception e) { + log.error("解析跟目录地址异常:dept={}" + JSON.toJSONString(dept)); + } + }); + natureList = Lists.newArrayList(containSet); + } + // 递归组织组织机构树 + wrapChildList(sysDeptVO, natureList); + + return sysDeptVO; + } + + @Override + @JwtSysUser + public Long saveInfo(AddDeptVO addDeptVO, String ipAddress) { + SysDept sysDept = BeanUtil.copyProperties(addDeptVO, SysDept.class); + String lowerCase = ChineseCharacterUtil.getLowerCase(addDeptVO.getOrgName(), false); + sysDept.setBmpyszm(lowerCase); + UserInfo userInfo = UserInfoManager.get(); + sysDept.setXtZxbz(DeletedEnum.NATURE.code); + String rootPath; + sysDept.setXtZhxgsj(new Date()); + sysDept.setXtCjsj(new Date()); + sysDept.setXtLrip(ipAddress); + sysDept.setXtZhxgid(userInfo.getUserId()); + sysDept.setXtZhxgrxm(userInfo.getUserName()); + sysDept.setXtZhxgrbmid(userInfo.getDeptId()); + sysDept.setXtZhxgrbm(userInfo.getDeptName()); + sysDept.setBz(addDeptVO.getBz()); + sysDept.setXtLrsj(new Date()); + sysDept.setXtLrrid(userInfo.getUserId()); + sysDept.setXtLrrxm(userInfo.getUserName()); + sysDept.setXtLrrbmid(userInfo.getDeptId().toString()); + sysDept.setXtLrrbm(userInfo.getDeptName()); + this.save(sysDept); + if (Objects.nonNull(sysDept.getParentId())) { + SysDept dept = this.getById(addDeptVO.getParentId()); + Asserts.check(dept == null, "传入的父id对应的部门信息不存在"); + rootPath = dept.getRootPath().endsWith("_") ? + (dept.getRootPath() + sysDept.getId()) : (dept.getRootPath() + "_" + sysDept.getId()); + } else { + rootPath = sysDept.getId() + "_"; + } + sysDept.setRootPath(rootPath); + sysDeptMapper.updateById(sysDept); + return sysDept.getId(); + + } + + @Override + @JwtSysUser + public void updateInfo(SysDeptVO sysDept, String ipAddress) { + SysDept oldSysDept = this.getBaseMapper().selectById(sysDept.getId()); + Asserts.check(oldSysDept == null, "主键为 %s 的部门信息不存在", sysDept.getId()); + SysDept sysDeptEntity = BeanUtil.copyProperties(sysDept, SysDept.class); + String lowerCase = ChineseCharacterUtil.getLowerCase(sysDept.getOrgName(), false); + sysDeptEntity.setBmpyszm(lowerCase); + UserInfo userInfo = UserInfoManager.get(); + sysDeptEntity.setXtZxbz(DeletedEnum.NATURE.code); + sysDeptEntity.setXtZhxgsj(new Date()); + sysDeptEntity.setXtLrip(ipAddress); + sysDeptEntity.setXtZhxgid(userInfo.getUserId()); + sysDeptEntity.setXtZhxgrxm(userInfo.getUserName()); + sysDeptEntity.setXtZhxgrbmid(userInfo.getDeptId()); + sysDeptEntity.setXtZhxgrbm(userInfo.getDeptName()); + this.updateById(sysDeptEntity); + + } + + @Override + @JwtSysUser + public void delete(DeleteDeptVO deleteDeptVO, String ipAddress, UserInfo userInfo) { + SysDept oldSysDept = this.getBaseMapper().selectById(deleteDeptVO.getId()); + Asserts.check(oldSysDept == null, "主键为 %s 的部门信息不存在", deleteDeptVO.getId()); + //判断部门角色表 + List userDepts = sysUserDeptService.listByDeptId(deleteDeptVO.getId()); + Asserts.check(!CollectionUtils.isEmpty(userDepts), "主键为 %s 的部门含有关联角色,请解绑", deleteDeptVO.getId()); + //判断部门用户表 + List roleDepts = sysRoleDeptService.listByDeptId(deleteDeptVO.getId()); + Asserts.check(!CollectionUtils.isEmpty(roleDepts), "主键为 %s 的部门含有关联用户,请解绑", deleteDeptVO.getId()); + oldSysDept.setXtZxbz(DeletedEnum.NATURE.code); + oldSysDept.setXtZhxgsj(new Date()); + oldSysDept.setXtLrip(ipAddress); + oldSysDept.setXtZhxgid(userInfo.getUserId()); + oldSysDept.setXtZhxgrxm(userInfo.getUserName()); + oldSysDept.setXtZhxgrbmid(userInfo.getDeptId()); + oldSysDept.setXtZhxgrbm(userInfo.getDeptName()); + oldSysDept.setXtZxbz(1); + oldSysDept.setXtZxyy(deleteDeptVO.getXtZxyy()); + this.updateById(oldSysDept); + } + + @Override + public IPage selectUserPageByDept(UserByDeptPage userByDeptPage) { + return sysDeptMapper.selectUserPageByDept(userByDeptPage); + } + + @Override + public IPage selectRolePageByDept(RoleByDeptPage roleByDeptPage) { + return sysDeptMapper.selectRolePageByDept(roleByDeptPage); + } + + @Override + public void saveRoleDeptInfo(AddRoleDeptVO roleDeptVO) { + SysDept dept = this.getById(roleDeptVO.getDeptId()); + Asserts.check(dept == null, "主键为 %s 的部门信息不存在", roleDeptVO.getDeptId()); + List sysRoleDeptList = new ArrayList<>(); + List roleIds = roleDeptVO.getRoleIds(); + roleIds.forEach(roleId -> { + SysRole role = sysRoleService.getById(roleId); + Asserts.check(role == null, "主键为 %s 的角色信息不存在", roleDeptVO.getDeptId()); + SysRoleDept sysRoleDept = new SysRoleDept(); + sysRoleDept.setDeptId(roleDeptVO.getDeptId()); + sysRoleDept.setRoleId(roleId); + sysRoleDeptList.add(sysRoleDept); + }); + sysRoleDeptService.remove(new LambdaQueryWrapper().eq(SysRoleDept::getDeptId, roleDeptVO.getDeptId())); + sysRoleDeptService.saveBatch(sysRoleDeptList); + } + + @Override + public void saveUserDeptInfo(AddUserDeptVO addUserDeptVO) { + SysUser user = sysUserService.getById(addUserDeptVO.getUserId()); + Asserts.check(user == null, "主键为 %s 的用户信息不存在", addUserDeptVO.getUserId()); + SysDept dept = this.getById(addUserDeptVO.getDeptId()); + Asserts.check(dept == null, "主键为 %s 的部门信息不存在", addUserDeptVO.getDeptId()); + SysUserDept userDept = sysUserDeptService.getByDeptIdAndUserId(addUserDeptVO.getDeptId(), addUserDeptVO.getUserId()); + Asserts.check(userDept != null, "该部门已经含有当前用户"); + SysUserDept sysUserDept = BeanUtil.copyProperties(addUserDeptVO, SysUserDept.class); + sysUserDeptService.save(sysUserDept); + } + + @Override + public void deleteUserDeptInfo(DeleteUserDeptVO deleteUserDeptVO) { + sysUserDeptService.remove(new LambdaQueryWrapper().eq(SysUserDept::getDeptId, deleteUserDeptVO.getDeptId()) + .in(SysUserDept::getUserId, deleteUserDeptVO.getUserIds())); + } + + @Override + public List getAllChildDeptIds(Long deptId) { + List ids = new ArrayList<>(); + wrapChildIdList(deptId, ids); + return ids; + } + + + private void wrapChildIdList(Long id, List ids) { + List list = this.list(new LambdaQueryWrapper().eq(SysDept::getParentId, id).eq(SysDept::getXtZxbz, DeletedEnum.NATURE.code)); + + if (CollectionUtils.isNotEmpty(list)) { + List deptIds = list.stream().map(SysDept::getId).collect(Collectors.toList()); + ids.addAll(deptIds); + list.forEach(dept -> wrapChildIdList(dept.getId(), ids)); + } + } + + /** + * 递归查询子部门集合 + * + * @param sysDeptVO 当前部门信息 + * @param natureList 所有部门信息 + */ + private void wrapChildList(SysDeptVO sysDeptVO, List natureList) { + Long rootId = sysDeptVO.getId(); + List collect = natureList.stream().filter(dept -> rootId.equals(dept.getParentId())).collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(collect)) { + sysDeptVO.setChildDeptList(collect); + } + if (CollectionUtils.isNotEmpty(collect)) { + collect.forEach(dept -> wrapChildList(dept, natureList)); + } + } + + @Override + public SysDept getDeptByOrgCode(String orgCode) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); + lambdaQueryWrapper.eq(SysDept::getOrgCode, orgCode).eq(SysDept::getXtZxbz, DeletedEnum.NATURE.code); + return sysDeptMapper.selectOne(lambdaQueryWrapper); + } + + @Override + public Boolean deptSys() { + Map params = new HashMap<>(); + String rs = HttpUtils.executeGet(DEPT_URL, params); + JSONObject json = JSONObject.parseObject(rs); + if (json.getBoolean("success")) { + JSONArray array = json.getJSONArray("data"); + if (CollectionUtils.isNotEmpty(array)) { + for (int i = 0; i < array.size(); i++) { + JSONObject deptJson = array.getJSONObject(i); + String orgCode = deptJson.getString("jurisdictionCode"); + if (orgCode.startsWith("511421")) { + String xtLrsj = deptJson.getString("createTime"); + xtLrsj = xtLrsj.replace("T", " "); + String xtZhxgsj = deptJson.getString("lastModifiedTime"); + xtZhxgsj = xtZhxgsj.replace("T", " "); + Integer xtZxbz = DeletedEnum.NATURE.code; + if (!"1".equals(deptJson.getString("zt"))) { + xtZxbz = DeletedEnum.DELETED.code; + } + SysDept sysDept = getDeptByOrgCode(orgCode); + if (sysDept == null) { + sysDept = new SysDept(); + } + sysDept.setOrgCode(deptJson.getString("jurisdictionCode")); + sysDept.setOrgName(deptJson.getString("jurisdictionName")); +// String orgJc = deptJson.getString("jurisdictionName").replace("四川省眉山市", ""); +// sysDept.setOrgJc(orgJc); + sysDept.setXtCjsj(new Date()); + sysDept.setXtLrsj(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, xtLrsj)); + sysDept.setXtZhxgsj(DateUtils.dateTime(DateUtils.YYYY_MM_DD_HH_MM_SS, xtZhxgsj)); + sysDept.setXzqh("511421"); + sysDept.setXtZxbz(xtZxbz); + if (sysDept.getId() == null) { + String rootPath = ""; + String lowerCase = ChineseCharacterUtil.getLowerCase(sysDept.getOrgName(), false); + sysDept.setBmpyszm(lowerCase); + this.save(sysDept); + JSONObject parent = deptJson.getJSONObject("parent"); + if (Objects.nonNull(parent)) { + String parentOrgCode = parent.getString("jurisdictionCode"); + if (parentOrgCode.startsWith("511421")) { + SysDept dept = getDeptByOrgCode(parentOrgCode); + Asserts.check(dept == null, "传入的父CODE对应的部门信息不存在"); + rootPath = dept.getRootPath().endsWith("_") ? + (dept.getRootPath() + sysDept.getId()) : (dept.getRootPath() + "_" + sysDept.getId()); + } + } else { + rootPath = sysDept.getId() + "_"; + } + sysDept.setRootPath(rootPath); + sysDeptMapper.updateById(sysDept); + } else { + sysDept.setXtZxbz(DeletedEnum.NATURE.code); + sysDeptMapper.updateById(sysDept); + } + } + } + } + } + return true; + } + + @Override + public IPage getDeptList(DeptPage deptPage) { + if (StringUtils.isBlank(deptPage.getOrgCode())) { + throw new BusinessException("orgCode不能为null"); + } + deptPage.setOrgCode(deptPage.getOrgCode()); + IPage iPage = getDept(deptPage); + if (CollectionUtils.isNotEmpty(iPage.getRecords())) { + List records = iPage.getRecords(); + records.forEach(this::wrapChildList); + iPage.setRecords(records); + } + return iPage; + } + + @Override + public List getChildDept(String deptid) { + SysDept dept = this.baseMapper.selectById(deptid); + List deptIds = new ArrayList<>(); + this.getChildList(dept, deptIds); + return deptIds; + } + + @Override + public List getChildDeptByOrgCode(String orgcode) { + SysDept dept = this.baseMapper.selectOne( + new LambdaQueryWrapper() + .eq(SysDept::getXtZxbz, "0") + .eq(SysDept::getOrgCode, orgcode) + ); + List orgcodes = new ArrayList<>(); + this.getChildListByOrgcode(dept, orgcodes); + return orgcodes; + } + + @Override + public DeptAllVo getOrgByDeptId(String deptid) { + DeptAllVo vo = new DeptAllVo(); + SysDept dept = this.baseMapper.selectById(deptid); + if (dept != null) { + vo.setOrgType(dept.getOrgType()); + vo.setOrgLevel(dept.getOrgLevel()); + vo.setOrgBizType(dept.getOrgBizType()); + String rootPath = dept.getRootPath(); + // 省厅 + if (dept.getParentId() == 0) { + this.setDept(vo, dept); + return vo; + } + if (rootPath != null) { + String[] paths = rootPath.split("_"); + this.setDept(vo, dept); + SysDept dept1 = this.baseMapper.selectById(paths[1]); + this.setDsz(vo, dept1); + if (paths.length == 2 || paths.length == 3) { + this.setFxj(vo, dept); + } else if (paths.length >= 4) { + SysDept dept2 = this.baseMapper.selectById(paths[2]); + this.setFxj(vo, dept2); + } + } + } + return vo; + } + + + // 设置分县局 + private void setFxj(DeptAllVo vo, SysDept dept) { + if (dept != null) { + vo.setFxjid(dept.getId()); + vo.setFxjcode(dept.getOrgCode()); + vo.setFxjname(dept.getOrgName()); + } + } + + // 设置地市州 + private void setDsz(DeptAllVo vo, SysDept dept) { + if (dept != null) { + vo.setDszid(dept.getId()); + vo.setDszcode(dept.getOrgCode()); + vo.setDszname(dept.getOrgName()); + } + } + + // 设置所属单位 + private void setDept(DeptAllVo vo, SysDept dept) { + if (dept != null) { + vo.setDeptid(dept.getId()); + vo.setDeptcode(dept.getOrgCode()); + vo.setDeptname(dept.getOrgName()); + } + } + + private void getChildListByOrgcode(SysDept dept, List orgcodes) { + orgcodes.add(String.valueOf(dept.getOrgCode())); + List tempList1 = this.baseMapper.selectList( + new LambdaQueryWrapper() + .eq(SysDept::getParentId, dept.getId()) + ); + if (tempList1.size() > 0) { + orgcodes.addAll(tempList1.stream().map(SysDept::getOrgCode).collect(Collectors.toList())); + tempList1.forEach(item -> this.getChildListByOrgcode(item, orgcodes)); + } + } + + private void getChildList(SysDept dept, List deptIds) { + deptIds.add(String.valueOf(dept.getId())); + List tempList1 = this.baseMapper.selectList( + new LambdaQueryWrapper() + .eq(SysDept::getParentId, dept.getId()) + ); + if (tempList1.size() > 0) { + deptIds.addAll(tempList1.stream().map(item -> String.valueOf(item.getId())).collect(Collectors.toList())); + tempList1.forEach(item -> this.getChildList(item, deptIds)); + } + } + + public List getDeptUser(Long deptId) { + List userIds = new ArrayList<>(); + List childDepts = getChildDept(String.valueOf(deptId)); + System.out.println("childDepts--->" + JSONArray.toJSONString(childDepts)); + List deptUsers = sysUserDeptService.listByDeptIds(childDepts); + System.out.println("deptUsers---->" + JSONArray.toJSONString(deptUsers)); + if (CollectionUtils.isNotEmpty(deptUsers)) { + deptUsers.forEach(item -> { + userIds.add(item.getUserId()); + }); + } + return userIds; + } + +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysLogininforServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysLogininforServiceImpl.java new file mode 100644 index 0000000..60e30f3 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysLogininforServiceImpl.java @@ -0,0 +1,191 @@ +package com.mosty.common.core.business.service.impl; + +import cn.hutool.core.convert.Convert; +import cn.hutool.http.useragent.UserAgent; +import cn.hutool.http.useragent.UserAgentUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.base.constant.Constants; +import com.mosty.common.base.entity.log.SysOperLog; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.base.util.StringUtils; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.SysLogininfor; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.entity.SysUserDept; +import com.mosty.common.core.business.entity.request.LoginLogPage; +import com.mosty.common.core.business.entity.vo.DeptVo; +import com.mosty.common.core.business.mapper.SysDeptMapper; +import com.mosty.common.core.business.mapper.SysLogininforMapper; +import com.mosty.common.core.business.mapper.SysUserDeptMapper; +import com.mosty.common.core.business.service.SysLogininforService; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import com.mosty.common.util.PermissionsUtil; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; +import java.util.Objects; + +/** + * @author li + * @description 针对表【sys_logininfor(系统访问记录)】的数据库操作Service实现 + * @createDate 2022-03-20 15:01:16 + */ +@Service +public class SysLogininforServiceImpl extends ServiceImpl + implements SysLogininforService { + @Resource + private SysLogininforMapper sysLogininforMapper; + @Resource + private SysDeptMapper sysDeptMapper; + @Resource + private SysUserDeptMapper sysUserDeptMapper; + + @Override + public void recordLogininfor(SysUser user, String status, String message, HttpServletRequest request, String type) { + UserAgent userAgent = UserAgentUtil.parse(request.getHeader("User-Agent")); + + // 获取客户端操作系统 + String os = userAgent.getOs().getName() == null ? "未知" : userAgent.getOs().getName(); + // 获取客户端浏览器 + String browser = userAgent.getBrowser().getName() == null ? "未知" : userAgent.getBrowser().getName(); + // 封装对象 + SysLogininfor logininfor = new SysLogininfor(); + try { + String ipAddress = IpUtil.getIpAddress(request); + logininfor.setIpaddr(ipAddress); + }catch (Exception e){ + log.error("IP获取异常"+e.getMessage()); + } + logininfor.setUserName(user.getUserName()); + logininfor.setBrowser(browser); + logininfor.setOs(os); + logininfor.setMsg(message); + logininfor.setType(type); + logininfor.setAccessTime(LocalDateTime.now()); + logininfor.setUserId(String.valueOf(user.getId())); + logininfor.setSfzh(user.getIdEntityCard()); + // 日志状态 + if (StringUtils.equalsAny(status, Constants.LOGIN_SUCCESS, Constants.LOGOUT, Constants.REGISTER)) { + logininfor.setStatus(Constants.SUCCESS); + } else if (Constants.LOGIN_FAIL.equals(status)) { + logininfor.setStatus(Constants.FAIL); + } + DeptVo dept = this.getDeptInfoByUserId(String.valueOf(user.getId())); + logininfor.setSsbm(dept.getDeptname()); + logininfor.setSsbmid(dept.getDeptid()); + logininfor.setSsbmdm(dept.getDeptcode()); + logininfor.setSsxgajdm(dept.getFxjcode()); + logininfor.setSsxgajid(dept.getFxjid()); + logininfor.setSsxgaj(dept.getFxjname()); + logininfor.setSssgaj(dept.getDszname()); + logininfor.setSssgajdm(dept.getDszcode()); + logininfor.setSssgajid(dept.getDszid()); + + // 插入数据 + this.save(logininfor); + } + + public DeptVo getDeptInfoByUserId(String userId) { + SysUserDept sysUserDept = this.sysUserDeptMapper.selectOne( + new QueryWrapper() + .eq("user_id", String.valueOf(userId)) + .last(" limit 1") + ); + if (sysUserDept != null) { + SysDept sysDept = this.sysDeptMapper.selectById(sysUserDept.getDeptId()); + if (sysDept != null) { + return this.getOrgByDeptId(String.valueOf(sysDept.getId())); + } + } + return null; + } + + public DeptVo getOrgByDeptId(String deptid) { + DeptVo vo = new DeptVo(); + SysDept dept = this.sysDeptMapper.selectById(deptid); + if (dept != null) { + vo.setOrgType(dept.getOrgType()); + vo.setOrgLevel(dept.getOrgLevel()); + String rootPath = dept.getRootPath(); + if (rootPath != null) { + String[] paths = rootPath.split("_"); + if (paths.length == 2) { + this.setDept(vo, dept); + this.setDsz(vo, dept); + } else if (paths.length == 3) { + this.setDept(vo, dept); + this.setFxj(vo, dept); + SysDept dsz = this.sysDeptMapper.selectById(paths[1]); + this.setDsz(vo, dsz); + } else if (paths.length >= 4) { + this.setDept(vo, dept); + SysDept fxj = this.sysDeptMapper.selectById(paths[2]); + this.setFxj(vo, fxj); + SysDept dsz = this.sysDeptMapper.selectById(paths[1]); + this.setDsz(vo, dsz); + } + } + } + return vo; + } + + // 设置所属单位 + private void setDept(DeptVo vo, SysDept dept) { + if (dept != null) { + vo.setDeptid(String.valueOf(dept.getId())); + vo.setDeptcode(dept.getOrgCode()); + vo.setDeptname(dept.getOrgName()); + } + } + + // 设置分县局 + private void setFxj(DeptVo vo, SysDept dept) { + if (dept != null) { + vo.setFxjid(String.valueOf(dept.getId())); + vo.setFxjcode(dept.getOrgCode()); + vo.setFxjname(dept.getOrgName()); + } + } + + // 设置地市州 + private void setDsz(DeptVo vo, SysDept dept) { + if (dept != null) { + vo.setDszid(String.valueOf(dept.getId())); + vo.setDszcode(dept.getOrgCode()); + vo.setDszname(dept.getOrgName()); + } + } + + @Override + public void deleteOperLogByIds(List ids) { + sysLogininforMapper.delete(new LambdaQueryWrapper().in(SysLogininfor::getInfoId, ids)); + } + + @Override + public void cleanOperLog() { + sysLogininforMapper.cleanOperLog(); + } + + @Override + public IPage selectByPage(LoginLogPage dto) { + QueryWrapper qw = new QueryWrapper<>(); + UserInfo user = UserInfoManager.get(); + PermissionsUtil.queryWrapperUtil(qw, user); + qw.lambda().like(StringUtils.isNotBlank(dto.getUserName()), SysLogininfor::getUserName, dto.getUserName()) + .eq(Objects.nonNull(dto.getStatus()), SysLogininfor::getStatus, dto.getStatus()); + qw.lambda().orderByDesc(SysLogininfor::getInfoId); + return this.page(dto, qw); + } +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysMenuServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysMenuServiceImpl.java new file mode 100644 index 0000000..bf34adb --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysMenuServiceImpl.java @@ -0,0 +1,208 @@ +package com.mosty.common.core.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Sets; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.constant.enums.MenuTypeEnum; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.core.business.entity.SysMenu; +import com.mosty.common.core.business.entity.vo.AddSysMenuVO; +import com.mosty.common.core.business.entity.vo.MenuPage; +import com.mosty.common.core.business.entity.vo.MenuQuery; +import com.mosty.common.core.business.mapper.SysMenuMapper; +import com.mosty.common.core.business.service.SysMenuService; +import com.mosty.common.core.login.LoginResponseVO; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import lombok.AllArgsConstructor; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; +import java.util.List; +import java.util.Set; + +/** + *

+ * 菜单表 服务实现类 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +@Service +@AllArgsConstructor +public class SysMenuServiceImpl extends ServiceImpl implements SysMenuService { + + private final SysMenuMapper sysMenuMapper; + + @Override + public IPage selectByPage(MenuPage menuPage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(menuPage.getMenuName())) { + queryWrapper.and(wrapper -> wrapper.like("menu_name", menuPage.getMenuName())); + } else { + queryWrapper.and(wrapper -> wrapper.eq("menu_type", MenuTypeEnum.MENU_GROUP.code)); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + IPage iPage = getBaseMapper().selectPage(menuPage, queryWrapper); + List records = iPage.getRecords(); + if (StringUtils.isBlank(menuPage.getMenuName())) { + records.forEach(item -> { + wrapChildList(null, item, null); + }); + } + iPage.setRecords(records); + return iPage; + } + + @Override + public List selectList(MenuQuery menuQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + queryWrapper.and(wrapper -> wrapper.eq("menu_type", MenuTypeEnum.MENU_GROUP.code)); + List list = getBaseMapper().selectList(queryWrapper); + list.forEach(item -> { + wrapChildList(null, item, null); + }); + return list; + } + + private void wrapChildList(Set menuIds, SysMenu item, Set menuCodeSet) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(SysMenu::getParentId, item.getId()).eq(SysMenu::getXtZxbz, DeletedEnum.NATURE.code); + if (CollectionUtils.isNotEmpty(menuIds)) { + lambdaQueryWrapper.in(SysMenu::getId, menuIds); + } + List list = this.list(lambdaQueryWrapper); + if (CollectionUtils.isNotEmpty(list)) { + item.setSysMenuList(list); + list.forEach(menu -> { + if (menuCodeSet != null) { + menuCodeSet.add(menu.getMenuCode()); + } + wrapChildList(menuIds, menu, menuCodeSet); + }); + } + } + + private void wrapChildListByType(Set menuIds, SysMenu item, MenuTypeEnum menuTypeEnum) { + wrapChildListByType(menuIds, item, menuTypeEnum, null); + } + + private void wrapChildListByType(Set menuIds, SysMenu item, MenuTypeEnum menuTypeEnum, Set menuCodeSet) { + LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper() + .eq(SysMenu::getParentId, item.getId()) + .eq(SysMenu::getXtZxbz, DeletedEnum.NATURE.code) + .eq(SysMenu::getMenuType, menuTypeEnum.code); + if (CollectionUtils.isNotEmpty(menuIds)) { + lambdaQueryWrapper.in(SysMenu::getId, menuIds); + } + List list = this.list(lambdaQueryWrapper); + + if (CollectionUtils.isNotEmpty(list)) { + item.setSysMenuList(list); + list.forEach(menu -> { + if (menuCodeSet != null) { + menuCodeSet.add(menu.getMenuCode()); + } + wrapChildList(menuIds, menu, menuCodeSet); + }); + } + } + + + @Override + @Transactional(rollbackFor = Exception.class) + public void addSysMenuInfo(AddSysMenuVO addSysMenuVo, SysMenu parentMenu) { + // 初始化菜单信息 + SysMenu sysMenu = initMenuInfo(addSysMenuVo); + + // 添加菜单信息 + sysMenuMapper.insert(sysMenu); + + SysMenu sysMenuForUpdate = new SysMenu(); + Long id = sysMenu.getId(); + if (parentMenu == null) { + sysMenuForUpdate.setParentPath(id.toString()); + } else { + sysMenuForUpdate.setParentPath(parentMenu.getParentPath() + "_" + id); + } + sysMenuMapper.updateById(sysMenuForUpdate); + } + + @Override + public List listByType(Set menuIds, MenuTypeEnum menuGroup, LoginResponseVO loginResponseVO) { + Set menuCodeSet = Sets.newHashSet(); + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(SysMenu::getMenuType, menuGroup.code) + .eq(SysMenu::getXtZxbz, DeletedEnum.NATURE.code); + if (CollectionUtils.isNotEmpty(menuIds)) { + queryWrapper.in(SysMenu::getId, menuIds); + } + List list = this.list(queryWrapper); + list.forEach(item -> { + menuCodeSet.add(item.getMenuCode()); + wrapChildListByType(menuIds, item, MenuTypeEnum.MENU, menuCodeSet); + }); + loginResponseVO.setMenuCodeSet(menuCodeSet); + return list; + } + + @Override + public SysMenu getMenuChild(Long menuId) { + SysMenu sysMenu = this.getOne(new LambdaQueryWrapper() + .eq(SysMenu::getId, menuId) + .eq(SysMenu::getXtZxbz, DeletedEnum.NATURE.code)); + wrapChildListByType(null, sysMenu, MenuTypeEnum.MENU); + return sysMenu; + } + + + /** + * 初始化菜单信息 + * + * @param addSysMenuVo 添加菜单请求 + * @return 菜单信息 + */ + private SysMenu initMenuInfo(AddSysMenuVO addSysMenuVo) { + SysMenu sysMenu = new SysMenu(); + sysMenu.setParentId(addSysMenuVo.getParentId()); + sysMenu.setMenuName(addSysMenuVo.getMenuName()); + sysMenu.setMenuCode(addSysMenuVo.getMenuCode()); + sysMenu.setMenuUrl(addSysMenuVo.getMenuUrl()); + sysMenu.setMenuType(addSysMenuVo.getMenuType()); + + sysMenu.setOrderNo(addSysMenuVo.getOrderNo()); + sysMenu.setShowMode(addSysMenuVo.getShowMode()); + sysMenu.setBz(addSysMenuVo.getBz()); + + UserInfo userInfo = UserInfoManager.get(); + sysMenu.setXtZxbz(DeletedEnum.NATURE.code); + + sysMenu.setXtCjsj(new Date()); + sysMenu.setXtZhxgsj(new Date()); + sysMenu.setXtZhxgrid(userInfo.getUserId().toString()); + sysMenu.setXtZhxgrxm(userInfo.getUserName()); + sysMenu.setXtZhxgrbmid(userInfo.getDeptId().toString()); + sysMenu.setXtZhxgrbm(userInfo.getDeptName()); + + sysMenu.setXtLrsj(new Date()); + sysMenu.setXtLrrid(userInfo.getUserId().toString()); + sysMenu.setXtLrrxm(userInfo.getUserName()); + sysMenu.setXtLrrbmid(userInfo.getDeptId().toString()); + sysMenu.setXtLrrbm(userInfo.getDeptName()); + + // 获取ip地址 + String ipAddress = IpUtil.getIpAddress(); + sysMenu.setXtLrip(ipAddress); + sysMenu.setXtZhxgip(ipAddress); + return sysMenu; + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysOssServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysOssServiceImpl.java new file mode 100644 index 0000000..b70bf25 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysOssServiceImpl.java @@ -0,0 +1,29 @@ +package com.mosty.common.core.business.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.core.business.entity.SysOss; +import com.mosty.common.core.business.mapper.SysOssMapper; +import com.mosty.common.core.business.mapper.SysPositionMapper; +import com.mosty.common.core.business.service.SysOssService; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +/** + *

+ * OSS云存储表 服务实现类 + *

+ * + * @author zengbo + * @since 2022-08-31 + */ +@Service +@AllArgsConstructor +public class SysOssServiceImpl extends ServiceImpl implements SysOssService { + + private final SysOssMapper sysOssMapper; + + @Override + public void saveSysOss(SysOss sysOss) { + sysOssMapper.insert(sysOss); + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysPositionServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysPositionServiceImpl.java new file mode 100644 index 0000000..a853b0a --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysPositionServiceImpl.java @@ -0,0 +1,83 @@ +package com.mosty.common.core.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.config.entity.vo.EditPositionVO; +import com.mosty.common.core.business.entity.SysPosition; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.entity.vo.PositionPage; +import com.mosty.common.core.business.mapper.SysPositionMapper; +import com.mosty.common.core.business.mapper.SysUserMapper; +import com.mosty.common.core.business.service.SysPositionService; +import com.mosty.common.core.business.service.SysUserService; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.Date; + +/** + *

+ * 岗位表 服务实现类 + *

+ * + * @author kevin + * @since 2022-02-12 + */ +@Slf4j +@Service +@AllArgsConstructor +public class SysPositionServiceImpl extends ServiceImpl implements SysPositionService { + + private final SysUserService sysUserService; + private final SysPositionMapper sysPositionMapper; + + @Override + public IPage selectByPage(PositionPage page) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(page.getPositionName())) { + queryWrapper.and(wrapper -> wrapper.like("post_name", page.getPositionName())); + } + if (StringUtils.isNotBlank(page.getPositionCode())) { + queryWrapper.and(wrapper -> wrapper.eq("post_code", page.getPositionCode())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + queryWrapper.orderByDesc("xt_zhxgsj"); + return getBaseMapper().selectPage(page, queryWrapper); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateSysPost(SysPosition oldSysPosition, EditPositionVO editPositionVO) { + // 当岗位名称变更,去修改用户表中的岗位名称 + if (!oldSysPosition.getPostName().equals(editPositionVO.getPostName())) { + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("position_id", oldSysPosition.getId()) + .set("position_name", editPositionVO.getPostName()); + boolean update = sysUserService.update(updateWrapper); + log.info("岗位名称发送变更后,修改了用户表的{}条岗位名称数据", update); + } + oldSysPosition.setBz(editPositionVO.getBz()); + oldSysPosition.setPostCode(editPositionVO.getPostCode()); + oldSysPosition.setPostName(editPositionVO.getPostName()); + oldSysPosition.setPostDesc(editPositionVO.getPostDesc()); + + UserInfo userInfo = UserInfoManager.get(); + + oldSysPosition.setXtZhxgsj(new Date()); + oldSysPosition.setXtZhxgrid(userInfo.getUserId().toString()); + oldSysPosition.setXtZhxgrxm(userInfo.getUserName()); + oldSysPosition.setXtZhxgrbmid(userInfo.getDeptId().toString()); + oldSysPosition.setXtZhxgrbm(userInfo.getDeptName()); + + sysPositionMapper.updateById(oldSysPosition); + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleDeptServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleDeptServiceImpl.java new file mode 100644 index 0000000..434d374 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleDeptServiceImpl.java @@ -0,0 +1,38 @@ +package com.mosty.common.core.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.core.business.entity.SysRoleDept; +import com.mosty.common.core.business.service.SysRoleDeptService; +import com.mosty.common.core.business.mapper.SysRoleDeptMapper; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** +* @author li +* @description 针对表【sys_role_dept(角色和部门关联表)】的数据库操作Service实现 +* @createDate 2022-02-12 16:53:15 +*/ +@Service +public class SysRoleDeptServiceImpl extends ServiceImpl + implements SysRoleDeptService { + + @Override + public List listByDeptId(Long deptId) { + List list = this.list(new LambdaQueryWrapper() + .eq(SysRoleDept::getDeptId, deptId)); + return list; + } + + @Override + public SysRoleDept getByDeptIdAndRoleId(Long deptId, Long roleId) { + SysRoleDept one = this.getOne(new LambdaQueryWrapper() + .eq(SysRoleDept::getDeptId, deptId).eq(SysRoleDept::getRoleId, roleId)); + return one; + } +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleMenuServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleMenuServiceImpl.java new file mode 100644 index 0000000..502e8ca --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleMenuServiceImpl.java @@ -0,0 +1,42 @@ +package com.mosty.common.core.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.core.business.entity.SysRoleMenu; +import com.mosty.common.core.business.service.SysRoleMenuService; +import com.mosty.common.core.business.mapper.SysRoleMenuMapper; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** +* @author li +* @description 针对表【sys_role_menu(角色和菜单关联表)】的数据库操作Service实现 +* @createDate 2022-02-12 16:53:18 +*/ +@Service +@AllArgsConstructor +public class SysRoleMenuServiceImpl extends ServiceImpl implements SysRoleMenuService { + + @Override + public List listByRoleIds(Set rolesSet) { + List list = this.list(new LambdaQueryWrapper().in(SysRoleMenu::getRoleId, rolesSet)); + return list; + } + + @Override + public Set listByMenuId(Long menuId) { + List list = this.list(new LambdaQueryWrapper().in(SysRoleMenu::getMenuId, menuId)); + if (!list.isEmpty()){ + return list.stream().map(SysRoleMenu::getRoleId).collect(Collectors.toSet()); + } + return null; + } +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..f0a655c --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,292 @@ +package com.mosty.common.core.business.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.constant.enums.PermissionLevelEnum; +import com.mosty.common.core.business.entity.*; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.core.business.mapper.SysDeptMapper; +import com.mosty.common.core.business.mapper.SysRoleDeptMapper; +import com.mosty.common.core.business.mapper.SysRoleMapper; +import com.mosty.common.core.business.mapper.SysUserRoleMapper; +import com.mosty.common.core.business.service.*; +import com.mosty.common.token.DeptInfo; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author li + * @description 针对表【sys_role(角色表)】的数据库操作Service实现 + * @createDate 2022-02-12 16:53:11 + */ +@Service +public class SysRoleServiceImpl extends ServiceImpl implements SysRoleService { + @Resource + private SysUserRoleService sysUserRoleService; + @Resource + private SysRoleMenuService sysRoleMenuService; + @Resource + private SysMenuService sysMenuService; + @Resource + private SysUserRoleMapper sysUserRoleMapper; + @Resource + private SysRoleDeptMapper sysRoleDeptMapper; + @Resource + private SysDeptMapper sysDeptMapper; + @Resource + private SysDeptService sysDeptService; + + + @Override + public DeptInfo getSysDeptLevel(String orgCode) { + DeptInfo deptInfo = new DeptInfo(); + SysDept sysDept = sysDeptMapper.selectOne(new QueryWrapper().eq("org_code", orgCode).eq("xt_zxbz", 0)); + if (sysDept != null) { + deptInfo.setSsbmid(sysDept.getId()); + deptInfo.setSsbmdm(sysDept.getOrgCode()); + deptInfo.setSsbm(sysDept.getOrgName()); + //获取地市州 + SysDept dszDept = getDszDept(sysDept); + if (dszDept != null) { + deptInfo.setSssgajid(dszDept.getId()); + deptInfo.setSssgajdm(dszDept.getOrgCode()); + deptInfo.setSssgaj(dszDept.getOrgName()); + } + //获取分县局 + SysDept fxjDept = getFxjDept(sysDept); + if (fxjDept != null) { + deptInfo.setSsxgajid(fxjDept.getId()); + deptInfo.setSsxgajdm(fxjDept.getOrgCode()); + deptInfo.setSsxgaj(fxjDept.getOrgName()); + } + + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("dept_id", sysDept.getId()); + List list = sysRoleDeptMapper.selectList(queryWrapper); + if (CollectionUtil.isEmpty(list)) { + return deptInfo; + } + List roleList = list.stream().map(SysRoleDept::getRoleId).collect(Collectors.toList()); + Collection sysRoles = super.listByIds(roleList); + List collect = sysRoles.stream().filter(role -> DeletedEnum.NATURE.code.equals(role.getXtZxbz())) + .map(role -> BeanUtil.copyProperties(role, SysRoleVO.class)) + .sorted(Comparator.comparing(SysRoleVO::getDataPermissionLevel)) + .collect(Collectors.toList()); + if (CollectionUtils.isNotEmpty(collect)) { + deptInfo.setPermissionsLevel(collect.get(0).getDataPermissionLevel()); + if (deptInfo.getPermissionsLevel().equals("5")) { + // 本部门以及下级部门权限 + // 查询下级部门 + List childDeptIds = sysDeptService.getAllChildDeptIds(sysDept.getId()); + List collect1 = childDeptIds.stream().map(String::valueOf).collect(Collectors.toList()); + collect1.add(String.valueOf(sysDept.getId())); + deptInfo.setIds(String.join(",", collect1)); + } + } + } + return deptInfo; + } + + + // 根据当前地市州 + public SysDept getDszDept(SysDept sysDept) { + if (sysDept == null) { + return null; + } + long id; + String path = sysDept.getRootPath(); + if (path.contains("_")) { + String[] paths = path.split("_"); + id = Long.parseLong(paths[1]); + } else { + id = Long.parseLong(path); + } + return sysDeptService.getById(id); + } + + // 根据当前部门获取分县局部门 + public SysDept getFxjDept(SysDept sysDept) { + if (sysDept == null) { + return null; + } + Long id = null; + String path = sysDept.getRootPath(); + if (path.contains("_")) { + String[] paths = path.split("_"); + if (paths.length == 2) { + id = Long.valueOf(paths[1]); + } else if (paths.length == 3) { + id = Long.valueOf(paths[2]); + } else if (paths.length >= 4) { + id = Long.valueOf(paths[2]); + } + } else { + id = Long.valueOf(path); + } + return sysDeptService.getById(id); + } + + @Override + public IPage selectByPage(RolePage rolePage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(rolePage.getRoleName())) { + queryWrapper.and(wrapper -> wrapper.like("role_name", rolePage.getRoleName())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + return getBaseMapper().selectPage(rolePage, queryWrapper); + } + + @Override + public List getUserRoleList(Long userId) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("user_id", String.valueOf(userId)); + List list = sysUserRoleService.list(queryWrapper); + if (CollectionUtil.isEmpty(list)) { + return Lists.newArrayList(); + } + + List roleList = list.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); + Collection sysRoles = super.listByIds(roleList); + + return sysRoles.stream().filter(role -> DeletedEnum.NATURE.code.equals(role.getXtZxbz())) + .map(role -> BeanUtil.copyProperties(role, SysRoleVO.class)) + .collect(Collectors.toList()); + } + + @Override + public void insertRole(AddRoleVO addRoleVo, String ipAddress) { + SysRole sysRole = BeanUtil.copyProperties(addRoleVo, SysRole.class); + + UserInfo userInfo = UserInfoManager.get(); + sysRole.setXtZxbz(DeletedEnum.NATURE.code); + + sysRole.setXtCjsj(new Date()); + sysRole.setXtZhxgsj(new Date()); + sysRole.setXtZhxgrid(userInfo.getUserId().toString()); + sysRole.setXtZhxgrxm(userInfo.getUserName()); + sysRole.setXtZhxgrbmid(userInfo.getDeptId().toString()); + sysRole.setXtZhxgrbm(userInfo.getDeptName()); + + sysRole.setXtLrsj(new Date()); + sysRole.setXtLrrid(userInfo.getUserId().toString()); + sysRole.setXtLrrxm(userInfo.getUserName()); + sysRole.setXtLrrbmid(userInfo.getDeptId().toString()); + sysRole.setXtLrrbm(userInfo.getDeptName()); + + sysRole.setXtZhxgip(ipAddress); + sysRole.setXtLrip(ipAddress); + + this.save(sysRole); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveRoleMenuInfo(AddRoleMenuVO roleMenuVO) { + // 先删除已绑定的菜单 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("role_id", roleMenuVO.getRoleId()); + sysRoleMenuService.remove(queryWrapper); + + List list = new ArrayList<>(); + List menuIds = roleMenuVO.getMenuIds(); + menuIds.forEach(item -> { + SysRoleMenu sysRoleMenu = new SysRoleMenu(); + sysRoleMenu.setRoleId(roleMenuVO.getRoleId()); + sysRoleMenu.setMenuId(item); + list.add(sysRoleMenu); + }); + sysRoleMenuService.saveBatch(list); + } + + @Override + public void saveDataPermission(AddRoleDataPartitionVO addRoleDataPartitionVO, String ipAddress) { + UserInfo userInfo = UserInfoManager.get(); + SysRole sysRole = new SysRole(); + sysRole.setId(addRoleDataPartitionVO.getId()); + sysRole.setDataPermissionLevel(addRoleDataPartitionVO.getDataPermissionLevel()); + sysRole.setXtZhxgsj(new Date()); + sysRole.setXtZhxgrid(userInfo.getUserId().toString()); + sysRole.setXtZhxgrxm(userInfo.getUserName()); + sysRole.setXtZhxgrbmid(userInfo.getDeptId().toString()); + sysRole.setXtZhxgrbm(userInfo.getDeptName()); + sysRole.setXtZhxgip(ipAddress); + sysRole.setXtLrip(ipAddress); + + this.updateById(sysRole); + } + + @Override + public DataPermissionVO getDataPermission(String menuUrl) { + UserInfo userInfo = UserInfoManager.get(); + DataPermissionVO vo = new DataPermissionVO(); + SysMenu menu = sysMenuService.getOne(new LambdaQueryWrapper() + .eq(SysMenu::getMenuUrl, menuUrl).eq(SysMenu::getXtZxbz, DeletedEnum.NATURE.code)); + Set roleIds = sysRoleMenuService.listByMenuId(menu.getId()); + if (CollectionUtils.isNotEmpty(roleIds)) { + SysRole sysRole = this.list(new LambdaQueryWrapper() + .in(SysRole::getId, roleIds).orderByAsc(SysRole::getDataPermissionLevel)).get(0); + vo.setPermissionLevel(sysRole.getDataPermissionLevel()); + if (PermissionLevelEnum.DEPT_AND_CHILD.level.equals(sysRole.getDataPermissionLevel())) { + List deptIds = sysDeptService.getAllChildDeptIds(userInfo.getDeptId()); + vo.setDeptIds(deptIds); + } + } else { + vo.setPermissionLevel(PermissionLevelEnum.ALL.level.toString()); + } + + return vo; + } + + @Override + public IPage selectUnAccreditPage(RolePage rolePage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(rolePage.getRoleName())) { + queryWrapper.and(wrapper -> wrapper.like("role_name", rolePage.getRoleName())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + QueryWrapper sysUserRoleQueryWrapper = new QueryWrapper<>(); + sysUserRoleQueryWrapper.and(wrapper -> wrapper.eq("user_id", rolePage.getUserId())); + List list = sysUserRoleService.list(sysUserRoleQueryWrapper); + if (CollectionUtil.isNotEmpty(list)) { + List roleList = list.stream().map(SysUserRole::getRoleId).collect(Collectors.toList()); + queryWrapper.and(wrapper -> wrapper.notIn("id", roleList)); + } + return getBaseMapper().selectPage(rolePage, queryWrapper); + } + + @Override + public IPage getRoleUserList(GetUserRoleListVo vo) { + List roleUserList = sysUserRoleMapper.getRoleUserList(vo); + Page page = BeanUtil.copyProperties(roleUserList, Page.class); + page.setRecords(roleUserList); + page.setTotal(roleUserList.size()); + return page; + } + + @Override + public List getRoleMenuIds(Long roleId) { + List list = sysRoleMenuService.list(new LambdaQueryWrapper().eq(SysRoleMenu::getRoleId, roleId)); + return list.stream().map(SysRoleMenu::getMenuId).collect(Collectors.toList()); + } + + +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateListServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateListServiceImpl.java new file mode 100644 index 0000000..8971b24 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateListServiceImpl.java @@ -0,0 +1,175 @@ +package com.mosty.common.core.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.core.business.entity.SysUserAppHomeconfigPlate; +import com.mosty.common.core.business.entity.SysUserAppHomeconfigPlateList; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigPlateListPage; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigPlateListPage; +import com.mosty.common.core.business.mapper.SysUserAppHomeconfigPlateListMapper; +import com.mosty.common.core.business.service.SysUserAppHomeconfigPlateListService; +import com.mosty.common.token.UserInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + *

+ * 用户app首页配置-板块内容表 服务实现类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Service +public class SysUserAppHomeconfigPlateListServiceImpl extends ServiceImpl implements SysUserAppHomeconfigPlateListService { + + @Resource + private SysUserAppHomeconfigPlateListMapper sysUserAppHomeconfigPlateListMapper; + + @Override + public Long saveInfo(SysUserAppHomeconfigPlateList plate, String ipAddress) { + plate.setXtCjsj(new Date()); + plate.setXtLrip(ipAddress); + plate.setXtLrsj(new Date()); + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + sysUserAppHomeconfigPlateListMapper.insert(plate); + return plate.getId(); + } + + @Override + public boolean saveInfoBatch(List plates, String ipAddress) { + if(!CollectionUtils.isEmpty(plates)) { + Long pzId = plates.get(0).getPzId(); + Long pzPlateId = plates.get(0).getPzPlateId(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.and(wrapper -> wrapper.eq("pz_id", pzId)); + queryWrapper.and(wrapper -> wrapper.eq("pz_plate_id", pzPlateId)); + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + List list = sysUserAppHomeconfigPlateListMapper.selectList(queryWrapper); + for(SysUserAppHomeconfigPlateList plate : plates) { + boolean bool = isExist(list, plate.getPzId(), plate.getPzPlateId(), plate.getPlateListId()); + if(!bool) { + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.and(wrapper -> wrapper.eq("pz_id", plate.getPzId())); + queryWrapper1.and(wrapper -> wrapper.eq("pz_plate_id", plate.getPzPlateId())); + queryWrapper1.and(wrapper -> wrapper.eq("plate_list_id", plate.getPlateListId())); + SysUserAppHomeconfigPlateList plateList = + sysUserAppHomeconfigPlateListMapper.selectOne(queryWrapper1); + if(plateList != null) { + sysUserAppHomeconfigPlateListMapper.updateById(plateList.getPzId(), plateList.getPzPlateId(), + plateList.getPlateListId(), DeletedEnum.NATURE.code); + } + } + if(!CollectionUtils.isEmpty(list)) { + // list 库中 plateList 参数, + for(SysUserAppHomeconfigPlateList plateList : list) { + boolean bools = isExist(plates, plateList.getPzId(), plateList.getPzPlateId(), + plateList.getPlateListId()); + if(!bools) { + sysUserAppHomeconfigPlateListMapper.updateById(plate.getPzId(), plate.getPzPlateId(), + plate.getPlateListId(), DeletedEnum.DELETED.code); + } + } + } + } + } + return true; + } + + /** + * 判断用户配置板块是否存在 + * @param list + * @param pzid + * @param pzPlateId + * @return + */ + public boolean isExist(List list, Long pzid, Long pzPlateId, Long plateListId) { + if(CollectionUtils.isEmpty(list)) { + return false; + } + for(SysUserAppHomeconfigPlateList plate : list) { + if(plate.getPzId().longValue() == pzid.longValue() && plate.getPzPlateId().longValue() == pzPlateId.longValue() && plate.getPlateListId().longValue() == plateListId.longValue()) { + return true; + } + } + return false; + } + + @Override + public void updateInfo(SysUserAppHomeconfigPlateList plate, String ipAddress) { + SysUserAppHomeconfigPlateList oldConfig = sysUserAppHomeconfigPlateListMapper.selectById(plate.getId()); + Asserts.check(oldConfig == null, "主键为 %s 的信息不存在", oldConfig.getId()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + plate.setXtZhxgsj(new Date()); + plate.setXtLrip(ipAddress); + sysUserAppHomeconfigPlateListMapper.updateById(plate); + } + + @Override + public void updateInfoBatch(List plates, String ipAddress) { + if(!CollectionUtils.isEmpty(plates)) { + sysUserAppHomeconfigPlateListMapper.deleteByPzId(plates.get(0).getPzId(), plates.get(0).getPzPlateId()); + for(SysUserAppHomeconfigPlateList plate : plates) { + plate.setXtCjsj(new Date()); + plate.setXtLrip(ipAddress); + plate.setXtLrsj(new Date()); + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + sysUserAppHomeconfigPlateListMapper.insert(plate); + } + } + } + + @Override + public void delete(List list, String ipAddress, UserInfo userInfo) { + if(!CollectionUtils.isEmpty(list)) { + for(Long id : list) { + SysUserAppHomeconfigPlateList plate = sysUserAppHomeconfigPlateListMapper.selectById(id); + if(plate != null) { + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.DELETED.code); + plate.setXtZhxgsj(new Date()); + plate.setXtZhxgip(ipAddress); + if(userInfo != null) { + plate.setXtZhxgrxm(userInfo.getUserName()); + plate.setXtZhxgrbmid(userInfo.getDeptId() + ""); + plate.setXtZhxgrbm(userInfo.getDeptName()); + } + sysUserAppHomeconfigPlateListMapper.updateById(plate); + } + } + } + } + + @Override + public IPage selectByPage(SysUserAppHomeconfigPlateListPage cofigPage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (cofigPage.getPzId() != null) { + queryWrapper.and(wrapper -> wrapper.eq("pz_id", cofigPage.getPzId())); + } + if (cofigPage.getPzPlateId() != null) { + queryWrapper.and(wrapper -> wrapper.eq("pz_plate_id", cofigPage.getPzPlateId())); + } + if (cofigPage.getPlateListId() != null) { + queryWrapper.and(wrapper -> wrapper.eq("plate_list_id", cofigPage.getPlateListId())); + } + if (StringUtils.isNotBlank(cofigPage.getNrmc())) { + queryWrapper.and(wrapper -> wrapper.like("nrmc", cofigPage.getNrmc())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + List orderBy = Lists.newArrayList(OrderItem.asc("id")); + cofigPage.setOrders(orderBy); + return sysUserAppHomeconfigPlateListMapper.selectPage(cofigPage, queryWrapper); + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateServiceImpl.java new file mode 100644 index 0000000..469fde1 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateServiceImpl.java @@ -0,0 +1,176 @@ +package com.mosty.common.core.business.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.core.business.entity.SysUserAppHomeconfig; +import com.mosty.common.core.business.entity.SysUserAppHomeconfigPlate; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigPlatePage; +import com.mosty.common.core.business.mapper.SysUserAppHomeconfigPlateMapper; +import com.mosty.common.core.business.service.SysUserAppHomeconfigPlateService; +import com.mosty.common.token.UserInfo; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + *

+ * 用户app首页配置-板块表 服务实现类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Service +public class SysUserAppHomeconfigPlateServiceImpl extends ServiceImpl implements SysUserAppHomeconfigPlateService { + + @Resource + private SysUserAppHomeconfigPlateMapper sysUserAppHomeconfigPlateMapper; + + @Override + public Long saveInfo(SysUserAppHomeconfigPlate plate, String ipAddress) { + plate.setXtCjsj(new Date()); + plate.setXtLrip(ipAddress); + plate.setXtLrsj(new Date()); + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + sysUserAppHomeconfigPlateMapper.insert(plate); + return plate.getId(); + } + + @Override + public boolean saveInfoBatch(List plates, String ipAddress) { + if(!CollectionUtils.isEmpty(plates)) { + Long pzId = plates.get(0).getPzId(); +// sysUserAppHomeconfigPlateMapper.deleteByPzid(pzId); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.and(wrapper -> wrapper.eq("pz_id", pzId)); + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + List list = sysUserAppHomeconfigPlateMapper.selectList(queryWrapper); + for(SysUserAppHomeconfigPlate plate : plates) { + boolean bool = isExist(list, plate.getPzId(), plate.getPlateId()); + + if(!bool) { + QueryWrapper queryWrapper1 = new QueryWrapper<>(); + queryWrapper1.and(wrapper -> wrapper.eq("pz_id", plate.getPzId())); + queryWrapper1.and(wrapper -> wrapper.eq("plate_id", plate.getPlateId())); + SysUserAppHomeconfigPlate userPlate = + sysUserAppHomeconfigPlateMapper.selectOne(queryWrapper1); +// plate.setXtCjsj(new Date()); +// plate.setXtLrip(ipAddress); +// plate.setXtLrsj(new Date()); +// plate.setXtZhxgsj(new Date()); +// plate.setXtZxbz(DeletedEnum.NATURE.code); +// sysUserAppHomeconfigPlateMapper.insert(plate); + sysUserAppHomeconfigPlateMapper.updateById(userPlate.getId(), 0); + } + } + if(!CollectionUtils.isEmpty(list)) { + for(SysUserAppHomeconfigPlate plate : list) { + boolean bool = isExist(plates, plate.getPzId(), plate.getPlateId()); + if(!bool) { + sysUserAppHomeconfigPlateMapper.updateById(plate.getId(), 1); + } + } + } + + } + return true; + } + + @Override + public void updateInfo(SysUserAppHomeconfigPlate plate, String ipAddress) { + SysUserAppHomeconfigPlate oldConfig = sysUserAppHomeconfigPlateMapper.selectById(plate.getId()); + Asserts.check(oldConfig == null, "主键为 %s 的信息不存在", oldConfig.getId()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + plate.setXtZhxgsj(new Date()); + plate.setXtLrip(ipAddress); + sysUserAppHomeconfigPlateMapper.updateById(plate); + } + + @Override + public void updateInfoBatch(List plates, String ipAddress) { + if(!CollectionUtils.isEmpty(plates)) { + Long pzid = plates.get(0).getPzId(); + sysUserAppHomeconfigPlateMapper.deleteByPzid(pzid); + for(SysUserAppHomeconfigPlate plate : plates) { + plate.setXtCjsj(new Date()); + plate.setXtLrip(ipAddress); + plate.setXtLrsj(new Date()); + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.NATURE.code); + sysUserAppHomeconfigPlateMapper.insert(plate); + } + } + } + + @Override + public void delete(List list, String ipAddress, UserInfo userInfo) { + if(!CollectionUtils.isEmpty(list)) { + for(Long id : list) { + SysUserAppHomeconfigPlate plate = sysUserAppHomeconfigPlateMapper.selectById(id); + if(plate != null) { + plate.setXtZhxgsj(new Date()); + plate.setXtZxbz(DeletedEnum.DELETED.code); + plate.setXtZhxgsj(new Date()); + plate.setXtZhxgip(ipAddress); + if(userInfo != null) { + plate.setXtZhxgrxm(userInfo.getUserName()); + plate.setXtZhxgrbmid(userInfo.getDeptId() + ""); + plate.setXtZhxgrbm(userInfo.getDeptName()); + } + sysUserAppHomeconfigPlateMapper.updateById(plate); + } + } + } + } + + @Override + public IPage selectByPage(SysUserAppHomeconfigPlatePage platePage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (platePage.getPzId() != null) { + queryWrapper.and(wrapper -> wrapper.eq("pz_id", platePage.getPzId())); + } + if (platePage.getPlateId() != null) { + queryWrapper.and(wrapper -> wrapper.eq("plate_id", platePage.getPlateId())); + } + if (StringUtils.isNotBlank(platePage.getBklx())) { + queryWrapper.and(wrapper -> wrapper.eq("bklx", platePage.getBklx())); + } + if (StringUtils.isNotBlank(platePage.getBkmc())) { + queryWrapper.and(wrapper -> wrapper.like("bkmc", platePage.getBkmc())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + List orderBy = Lists.newArrayList(OrderItem.asc("id")); + platePage.setOrders(orderBy); + return sysUserAppHomeconfigPlateMapper.selectPage(platePage, queryWrapper); + } + + /** + * 判断用户配置板块是否存在 + * @param list + * @param pzid + * @param plateId + * @return + */ + public boolean isExist(List list, Long pzid, Long plateId) { + if(CollectionUtils.isEmpty(list)) { + return false; + } + for(SysUserAppHomeconfigPlate plate : list) { + if(plate.getPzId().longValue() == pzid.longValue() && plate.getPlateId().longValue() == plateId.longValue()) { + return true; + } + } + return false; + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigServiceImpl.java new file mode 100644 index 0000000..dac460e --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigServiceImpl.java @@ -0,0 +1,343 @@ +package com.mosty.common.core.business.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.core.business.entity.*; +import com.mosty.common.core.business.entity.request.SysAppHomeconfigQuery; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigPage; +import com.mosty.common.core.business.entity.request.SysUserAppHomeconfigQuery; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.core.business.mapper.*; +import com.mosty.common.core.business.service.SysAppHomeconfigService; +import com.mosty.common.core.business.service.SysUserAppHomeconfigPlateListService; +import com.mosty.common.core.business.service.SysUserAppHomeconfigPlateService; +import com.mosty.common.core.business.service.SysUserAppHomeconfigService; +import com.mosty.common.token.UserInfo; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.lang3.StringUtils; +import org.checkerframework.checker.units.qual.A; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.CollectionUtils; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.stream.Collectors; + +/** + *

+ * 用户app首页配置表 服务实现类 + *

+ * + * @author zengbo + * @since 2022-08-18 + */ +@Service +public class SysUserAppHomeconfigServiceImpl extends ServiceImpl implements SysUserAppHomeconfigService { + + private static final Logger log = LoggerFactory.getLogger(SysUserAppHomeconfigServiceImpl.class); + + @Resource + private SysUserAppHomeconfigMapper sysUserAppHomeconfigMapper; + + @Resource + private SysUserAppHomeconfigPlateMapper sysUserAppHomeconfigPlateMapper; + + @Resource + private SysUserAppHomeconfigPlateListMapper sysUserAppHomeconfigPlateListMapper; + + @Resource + private SysAppHomeconfigService sysAppHomeconfigService; + + @Resource + private SysUserAppHomeconfigPlateService sysUserAppHomeconfigPlateService; + + @Resource + private SysUserAppHomeconfigPlateListService sysUserAppHomeconfigPlateListService; + + + @Override + public Long saveInfo(SysUserAppHomeconfig config, String ipAddress) { + config.setXtCjsj(new Date()); + config.setXtLrip(ipAddress); + config.setXtLrsj(new Date()); + config.setXtZhxgsj(new Date()); + config.setXtZxbz(DeletedEnum.NATURE.code); + sysUserAppHomeconfigMapper.insert(config); + return config.getId(); + } + + @Override + public void saveInfoBatch(List configs, String ipAddress) { + if (!CollectionUtils.isEmpty(configs)) { + for (SysUserAppHomeconfig config : configs) { + config.setXtCjsj(new Date()); + config.setXtLrip(ipAddress); + config.setXtLrsj(new Date()); + config.setXtZhxgsj(new Date()); + config.setXtZxbz(DeletedEnum.NATURE.code); + sysUserAppHomeconfigMapper.insert(config); + } + } + } + + @Override + public void updateInfo(SysUserAppHomeconfig config, String ipAddress) { + SysUserAppHomeconfig oldConfig = sysUserAppHomeconfigMapper.selectById(config.getId()); + Asserts.check(oldConfig == null, "主键为 %s 的信息不存在", config.getId()); + config.setXtZxbz(DeletedEnum.NATURE.code); + config.setXtZhxgsj(new Date()); + config.setXtLrip(ipAddress); + sysUserAppHomeconfigMapper.updateById(config); + } + + @Override + public void updateInfoBatch(List configs, String ipAddress) { + if (!CollectionUtils.isEmpty(configs)) { + String sfzh = configs.get(0).getUserSfzh(); + sysUserAppHomeconfigMapper.deleteBySfzh(sfzh); + for (SysUserAppHomeconfig config : configs) { + config.setXtZhxgsj(new Date()); + config.setXtCjsj(new Date()); + config.setXtLrip(ipAddress); + config.setXtLrsj(new Date()); + config.setXtZhxgsj(new Date()); + config.setXtZxbz(DeletedEnum.NATURE.code); + sysUserAppHomeconfigMapper.insert(config); + } + } + } + + @Override + public void delete(List list, String ipAddress, UserInfo userInfo) { + if (!CollectionUtils.isEmpty(list)) { + for (Long id : list) { + SysUserAppHomeconfig config = sysUserAppHomeconfigMapper.selectById(id); + if (config != null) { + config.setXtZhxgsj(new Date()); + config.setXtZxbz(DeletedEnum.DELETED.code); + config.setXtZhxgsj(new Date()); + config.setXtZhxgip(ipAddress); + if (userInfo != null) { + config.setXtZhxgrxm(userInfo.getUserName()); + config.setXtZhxgrbmid(userInfo.getDeptId() + ""); + config.setXtZhxgrbm(userInfo.getDeptName()); + } + sysUserAppHomeconfigMapper.updateById(config); + } + } + } + } + + @Override + public IPage selectByPage(SysUserAppHomeconfigPage cofigPage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(cofigPage.getHomename())) { + queryWrapper.and(wrapper -> wrapper.like("homename", cofigPage.getHomename())); + } + if (cofigPage.getHomeid() != null) { + queryWrapper.and(wrapper -> wrapper.eq("homeid", cofigPage.getHomeid())); + } + if (cofigPage.getUserId() != null) { + queryWrapper.and(wrapper -> wrapper.eq("user_id", cofigPage.getUserId())); + } + if (StringUtils.isNotBlank(cofigPage.getUserSfzh())) { + queryWrapper.and(wrapper -> wrapper.eq("user_sfzh", cofigPage.getUserSfzh())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + List orderBy = Lists.newArrayList(OrderItem.asc("id")); + cofigPage.setOrders(orderBy); + return sysUserAppHomeconfigMapper.selectPage(cofigPage, queryWrapper); + } + + @Override + public List queryUserConfig(SysUserAppHomeconfigQuery cofigQuery) { + List homeconfigVos = new ArrayList<>(); + List configs = getConfigs(cofigQuery); + List plates = getPlates(configs); + List plateList = getPlateList(plates); + if (!CollectionUtils.isEmpty(configs)) { + for (SysUserAppHomeconfig config : configs) { + SysUserAppHomeconfigVo vo = new SysUserAppHomeconfigVo(); + BeanUtils.copyProperties(config, vo); + if (!CollectionUtils.isEmpty(plates)) { + List list = + plates.parallelStream().filter(item -> item.getPzId().longValue() == config.getId().longValue()).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(list)) { + List voList = new ArrayList<>(); + for (SysUserAppHomeconfigPlate plate : list) { + SysUserAppHomeconfigPlateVo plateVo = new SysUserAppHomeconfigPlateVo(); + BeanUtils.copyProperties(plate, plateVo); + if (!CollectionUtils.isEmpty(plateList)) { + List platesArray = getList(plateList, plate.getId()); + plateVo.setPlateList(platesArray); + } + voList.add(plateVo); + } + vo.setPlates(voList); + } + } + homeconfigVos.add(vo); + } + } + return homeconfigVos; + } + + @Override + public Long saveDefaultConfig(SysUserHomeconfigVo configVo, String ipAddress) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.and(wrapper -> wrapper.eq("user_id", configVo.getUserId())); + queryWrapper.and(wrapper -> wrapper.eq("homeid", configVo.getHomeid())); + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + List configs = sysUserAppHomeconfigMapper.selectList(queryWrapper); + System.out.println(configs); + if (configs != null && configs.size() > 0 && + configs.get(0).getPzbks() != null && configs.get(0).getPzbks() != 0) { + System.out.println("configs------->" + configs.size()); + log.info(JSONObject.toJSONString(configs)); + return configs.get(0).getId(); + } + SysAppHomeconfigQuery query = new SysAppHomeconfigQuery(); + query.setId(configVo.getHomeid()); + SysAppHomeconfigRsVO vo = sysAppHomeconfigService.queryConfig(query); + //用户首页配置ID + SysUserAppHomeconfig config = new SysUserAppHomeconfig(); + config.setHomeid(configVo.getHomeid()); + config.setHomename(vo.getHomename()); + config.setUserId(configVo.getUserId()); + config.setUserXm(configVo.getUserXm()); + config.setUserSfzh(configVo.getUserSfzh()); + if (!CollectionUtils.isEmpty(vo.getPlateList())) { + config.setPzbks(vo.getPlateList().size()); + } + config.setPzsj(new Date()); + config.setSd(configVo.getSd()); + Long homeConfigId = saveInfo(config, ipAddress); + if (!CollectionUtils.isEmpty(vo.getPlateList())) { + //用户默认板块内容 + int i = 0; + for (SysAppHomeconfigPlateVo plate : vo.getPlateList()) { + i++; + SysUserAppHomeconfigPlate userPlate = new SysUserAppHomeconfigPlate(); + userPlate.setPzId(homeConfigId); + userPlate.setPlateId(plate.getId()); + userPlate.setBklx(plate.getBklx()); + userPlate.setBkmc(plate.getBkmc()); + userPlate.setBksx(i); + Long userPlateId = sysUserAppHomeconfigPlateService.saveInfo(userPlate, ipAddress); + if (!CollectionUtils.isEmpty(vo.getPlateList())) { + userPlate.setBknrs(vo.getPlateList().size()); + int j = 0; + for (SysAppHomeconfigPlateList plateVo : plate.getPlateList()) { + j++; + SysUserAppHomeconfigPlateList userList = new SysUserAppHomeconfigPlateList(); + userList.setPzId(homeConfigId); + userList.setPzPlateId(userPlateId); + userList.setPlateListId(plateVo.getId()); + userList.setNrmc(plateVo.getNrmc()); + userList.setBksx(j); + userList.setTzdz(plateVo.getTzdz()); + userList.setBz(plateVo.getBz()); + sysUserAppHomeconfigPlateListService.saveInfo(userList, ipAddress); + } + } + } + } + return homeConfigId; + } + + public List getList(List platesArray, Long id) { + List array = new ArrayList<>(); + if (CollectionUtils.isEmpty(platesArray)) { + return array; + } + log.info("platesArray:" + platesArray.size() + ",id:" + id); + for (SysUserAppHomeconfigPlateList plate : platesArray) { + if (plate.getPzPlateId().longValue() == id.longValue()) { + array.add(plate); + } + } + return array; + } + + /** + * 获取用户配置首页 + * + * @param cofigQuery + * @return + */ + public List getConfigs(SysUserAppHomeconfigQuery cofigQuery) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(cofigQuery.getHomename())) { + queryWrapper.and(wrapper -> wrapper.like("homename", cofigQuery.getHomename())); + } + if (cofigQuery.getHomeid() != null) { + queryWrapper.and(wrapper -> wrapper.eq("homeid", cofigQuery.getHomeid())); + } + if (cofigQuery.getUserId() != null) { + queryWrapper.and(wrapper -> wrapper.eq("user_id", cofigQuery.getUserId())); + } + if (StringUtils.isNotBlank(cofigQuery.getUserSfzh())) { + queryWrapper.and(wrapper -> wrapper.eq("user_sfzh", cofigQuery.getUserSfzh())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + queryWrapper.orderByAsc("ID"); + return sysUserAppHomeconfigMapper.selectList(queryWrapper); + } + + + /** + * 获取用户配置板块 + * + * @param configs + * @return + */ + public List getPlates(List configs) { + List plates = new ArrayList<>(); + if (!CollectionUtils.isEmpty(configs)) { + List configIds = configs.stream().map(item -> item.getId()).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(configIds)) { + QueryWrapper plateListWrapper = new QueryWrapper<>(); + plateListWrapper.lambda().in(SysUserAppHomeconfigPlate::getPzId, configIds); + plateListWrapper.lambda().eq(SysUserAppHomeconfigPlate::getXtZxbz, DeletedEnum.NATURE.code); + plateListWrapper.orderByAsc("bksx"); + plates = sysUserAppHomeconfigPlateMapper.selectList(plateListWrapper); + } + } + return plates; + } + + + /** + * 获取用户配置板块内容 + * + * @param plates + * @return + */ + public List getPlateList(List plates) { + List plateList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(plates)) { + List configIds = plates.stream().map(item -> item.getId()).collect(Collectors.toList()); + if (!CollectionUtils.isEmpty(configIds)) { + QueryWrapper plateListWrapper = new QueryWrapper<>(); + plateListWrapper.lambda().in(SysUserAppHomeconfigPlateList::getPzPlateId, configIds); + plateListWrapper.lambda().eq(SysUserAppHomeconfigPlateList::getXtZxbz, DeletedEnum.NATURE.code); + plateListWrapper.orderByAsc("bksx"); + plateList = sysUserAppHomeconfigPlateListMapper.selectList(plateListWrapper); + } + } + return plateList; + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserDeptServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserDeptServiceImpl.java new file mode 100644 index 0000000..30f3c71 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserDeptServiceImpl.java @@ -0,0 +1,64 @@ +package com.mosty.common.core.business.service.impl; + +import cn.hutool.core.stream.CollectorUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.core.business.entity.SysUserDept; +import com.mosty.common.core.business.service.SysUserDeptService; +import com.mosty.common.core.business.mapper.SysUserDeptMapper; +import org.apache.shiro.util.CollectionUtils; +import org.springframework.data.redis.connection.ConnectionUtils; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author li + * @description 针对表【sys_user_dept(用户和部门关联表)】的数据库操作Service实现 + * @createDate 2022-02-12 16:53:21 + */ +@Service +public class SysUserDeptServiceImpl extends ServiceImpl + implements SysUserDeptService { + + @Override + public List listByDeptId(Long deptId) { + List list = this.list(new LambdaQueryWrapper() + .eq(SysUserDept::getDeptId, deptId)); + return list; + } + + @Override + public SysUserDept getByDeptIdAndUserId(Long deptId, Long userId) { + SysUserDept one = this.getOne(new LambdaQueryWrapper() + .eq(SysUserDept::getDeptId, deptId).eq(SysUserDept::getUserId, userId)); + return one; + } + + @Override + public List listByUserId(Long userId) { + List list = this.list(new LambdaQueryWrapper() + .eq(SysUserDept::getUserId, userId)); + if (!CollectionUtils.isEmpty(list)) { + return list.stream().map(SysUserDept::getDeptId).collect(Collectors.toList()); + } else { + return new ArrayList<>(); + } + } + + @Override + public List listByDeptIds(List ids) { + if (!CollectionUtils.isEmpty(ids)) { + List list = this.list(new LambdaQueryWrapper() + .in(SysUserDept::getDeptId, ids)); + return list; + } + return new ArrayList<>(); + } +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserRoleServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserRoleServiceImpl.java new file mode 100644 index 0000000..98dfca5 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserRoleServiceImpl.java @@ -0,0 +1,112 @@ +package com.mosty.common.core.business.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.core.business.entity.SysRole; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.entity.SysUserRole; +import com.mosty.common.core.business.entity.vo.RoleUserPage; +import com.mosty.common.core.business.entity.vo.RoleUserVO; +import com.mosty.common.core.business.entity.vo.SysUserVO; +import com.mosty.common.core.business.entity.vo.UserRoleVO; +import com.mosty.common.core.business.mapper.SysUserRoleMapper; +import com.mosty.common.core.business.service.LoginService; +import com.mosty.common.core.business.service.SysRoleService; +import com.mosty.common.core.business.service.SysUserRoleService; +import com.mosty.common.core.business.service.SysUserService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.List; + +/** + * @author li + * @description 针对表【sys_user_role(用户和角色关联表)】的数据库操作Service实现 + * @createDate 2022-02-12 16:53:24 + */ +@Slf4j +@Service +public class SysUserRoleServiceImpl extends ServiceImpl implements SysUserRoleService { + + @Resource + private SysUserRoleMapper sysUserRoleMapper; + + @Resource + private SysUserService sysUserService; + + @Resource + private SysRoleService sysRoleService; + + @Resource + private LoginService loginService; + + @Override + public IPage roleUserList(String rootPath, RoleUserPage roleUserPage) { + + List dataList = sysUserRoleMapper.roleUserList(rootPath, roleUserPage); + Page page = BeanUtil.copyProperties(dataList, Page.class); + page.setRecords(dataList); + return page; + } + + @Override + public List listByUserId(Long id) { + return this.list(new LambdaQueryWrapper() + .eq(SysUserRole::getUserId, id)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public boolean grantRoleToUser(UserRoleVO userRoleVo) { + // 先删除所有的权限信息 + this.sysUserRoleMapper.delete( + new LambdaQueryWrapper() + .eq(SysUserRole::getUserId, userRoleVo.getUserId()) + ); + SysUser sysUser = sysUserService.getById(userRoleVo.getUserId()); + Asserts.check(sysUser == null || DeletedEnum.DELETED.code.equals(sysUser.getXtZxbz()), "用户不存在或已删除"); + List sysUserRoles = new ArrayList<>(); + List roleIds = userRoleVo.getRoleIds(); + roleIds.forEach(roleId -> { + SysRole sysRole = sysRoleService.getById(roleId); + Asserts.check(sysRole == null || DeletedEnum.DELETED.code.equals(sysRole.getXtZxbz()), "角色不存在或已删除"); + SysUserRole sysUserRole = new SysUserRole(); + sysUserRole.setRoleId(roleId); + sysUserRole.setUserId(userRoleVo.getUserId()); + sysUserRoles.add(sysUserRole); + }); + // 修改redis中用户缓存的信息 + return this.saveBatch(sysUserRoles); + } + + @Override + public boolean grantUserToRole(RoleUserVO roleUserVO) { + SysRole role = sysRoleService.getById(roleUserVO.getRoleId()); + Asserts.check(role == null || DeletedEnum.DELETED.code.equals(role.getXtZxbz()), "角色不存在或已删除"); + List sysUserRoles = new ArrayList<>(); + List userIds = roleUserVO.getUserIds(); + userIds.forEach(userId -> { + SysUser user = sysUserService.getById(userId); + Asserts.check(user == null || DeletedEnum.DELETED.code.equals(user.getXtZxbz()), "用户不存在或已删除"); + SysUserRole sysUserRole = new SysUserRole(); + sysUserRole.setRoleId(role.getId()); + sysUserRole.setUserId(userId); + sysUserRoles.add(sysUserRole); + }); + return this.saveBatch(sysUserRoles); + } + + +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserServiceImpl.java b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserServiceImpl.java new file mode 100644 index 0000000..0b9f0f6 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/service/impl/SysUserServiceImpl.java @@ -0,0 +1,551 @@ +package com.mosty.common.core.business.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.base.constant.UserConstants; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.base.exception.BusinessException; +import com.mosty.common.base.util.PasswordUtil; +import com.mosty.common.base.util.RandomUtil; +import com.mosty.common.config.config.SystemConfig; +import com.mosty.common.core.business.entity.*; +import com.mosty.common.core.business.entity.request.SysUserEditPasswordRequest; +import com.mosty.common.core.business.entity.vo.*; +import com.mosty.common.core.business.mapper.SysDeptMapper; +import com.mosty.common.core.business.mapper.SysUserDeptMapper; +import com.mosty.common.core.business.mapper.SysUserMapper; +import com.mosty.common.core.business.service.*; +import com.mosty.common.core.config.DefaultRoleConfig; +import com.mosty.common.core.util.BeanUtils; +import com.mosty.common.core.util.http.HttpUtils; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; + +@Slf4j +@Service +public class SysUserServiceImpl extends ServiceImpl implements SysUserService { + + @Resource + private SysUserMapper sysUserMapper; + @Resource + private SysUserDeptService sysUserDeptService; + @Resource + private DefaultRoleConfig defaultRoleConfig; + @Resource + private SysUserRoleService sysUserRoleService; + @Resource + private SystemConfig systemConfig; + @Resource + private SysDeptService sysDeptService; + @Resource + private SysPositionService sysPositionService; + @Resource + private SysDeptMapper sysDeptMapper; + @Resource + private SysUserDeptMapper sysUserDeptMapper; + @Resource + private SysRoleService sysRoleService; + @Resource + private LoginService loginService; + public static String USER_URL = "http://80.149.27.78:8001/no-auth-api/coreUsersList"; + + @Override + public void saveInfo(AddSysUserVO sysUserVo) { + if (StringUtils.isBlank(sysUserVo.getSsbmdm())) return; + // 保存用户信息 + Long userId = saveUserInfo(sysUserVo); + // 保存用户部门关联关系 + // 验证部门并设置部门名称 +// List deptIds = sysUserVo.getDeptIds(); + List sysUserDeptList = new ArrayList<>(); +// deptIds.forEach(deptId -> { +// SysDept sysDept = sysDeptService.getById(deptId); +// Asserts.check(sysDept == null || sysDept.getXtZxbz() != 0, "部门 %s 不存在!", deptId); +// SysUserDept sysUserDept = new SysUserDept().setUserId(userId).setDeptId(deptId); +// sysUserDeptList.add(sysUserDept); +// }); + SysDept sysDept = sysDeptService.getDeptByOrgCode(sysUserVo.getSsbmdm()); + Asserts.check(sysDept == null || sysDept.getXtZxbz() != 0, "部门 %s 不存在!", sysUserVo.getSsbmdm()); + SysUserDept sysUserDept = new SysUserDept().setUserId(userId).setDeptId(sysDept.getId()); + sysUserDeptList.add(sysUserDept); + + sysUserDeptService.saveBatch(sysUserDeptList); + // 保存默认用户角色 + List defaultRoleList = defaultRoleConfig.getDefaultRoleList(); + if (CollectionUtils.isNotEmpty(defaultRoleList)) { + List collect = defaultRoleList.stream() + .map(roleId -> new SysUserRole(userId, roleId)).collect(Collectors.toList()); + sysUserRoleService.saveBatch(collect); + } + } + + // 保存用户信息 + private Long saveUserInfo(AddSysUserVO sysUserVo) { + SysUser sysUser = BeanUtil.copyProperties(sysUserVo, SysUser.class); + + // 初始化用户密码 + String salt = RandomUtil.generateString(8); + if (StringUtils.isNotBlank(sysUserVo.getPassword())) { + String encodePassword = PasswordUtil.encode(sysUserVo.getPassword(), salt); + sysUser.setPassword(encodePassword); + } else { + String passwordPzz = getDefaultPassword(salt); + sysUser.setPassword(passwordPzz); + } + sysUser.setSalt(salt); + UserInfo userInfo = UserInfoManager.get(); + sysUser.setXtZxbz(DeletedEnum.NATURE.code); + + sysUser.setXtCjsj(new Date()); + sysUser.setXtZhxgsj(new Date()); + sysUser.setXtZhxgid(userInfo.getUserId()); + sysUser.setXtZhxgrxm(userInfo.getUserName()); + sysUser.setXtZhxgrbmid(userInfo.getDeptId()); + sysUser.setXtZhxgrbm(userInfo.getDeptName()); + + sysUser.setXtLrsj(new Date()); + sysUser.setXtLrrid(userInfo.getUserId()); + sysUser.setXtLrrxm(userInfo.getUserName()); + sysUser.setXtLrrbmid(userInfo.getDeptId().toString()); + sysUser.setXtLrrbm(userInfo.getDeptName()); + + this.save(sysUser); + + return sysUser.getId(); + } + + // 获取默认的初始化密码 + private String getDefaultPassword(String salt) { + String passwordPzz = systemConfig.getDefaultPassword(); + return PasswordUtil.encode(passwordPzz, salt); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void editInfo(SysUserEditVO sysUserEditVo, SysUser userInfo) { + + if (StringUtils.isBlank(sysUserEditVo.getSsbmdm())) return; + + // 先删除用户id,再添加 + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("user_id", userInfo.getId()); + + sysUserDeptService.remove(wrapper); + +// List saveRelation = sysUserEditVo.getDeptIds().stream().map(deptId -> +// new SysUserDept(userInfo.getId(), deptId)).collect(Collectors.toList()); + List sysUserDeptList = new ArrayList<>(); + SysDept sysDept = sysDeptService.getDeptByOrgCode(sysUserEditVo.getSsbmdm()); + Asserts.check(sysDept == null || sysDept.getXtZxbz() != 0, "部门 %s 不存在!", sysUserEditVo.getSsbmdm()); + SysUserDept sysUserDept = new SysUserDept().setUserId(sysUserEditVo.getId()).setDeptId(sysDept.getId()); + sysUserDeptList.add(sysUserDept); + sysUserDeptService.saveBatch(sysUserDeptList); + + SysPosition position = sysPositionService.getById(sysUserEditVo.getPositionId()); +// Asserts.check(position == null, "岗位信息不存在,请登陆"); + // 更改需要保存的字段 + userInfo.setPositionId(sysUserEditVo.getPositionId()); + userInfo.setPositionName(position != null ? position.getPostName() : ""); + userInfo.setUserName(sysUserEditVo.getUserName()); + userInfo.setEmail(sysUserEditVo.getEmail()); + userInfo.setMobile(sysUserEditVo.getMobile()); + userInfo.setTelePhone(sysUserEditVo.getTelePhone()); + userInfo.setPolitic(sysUserEditVo.getPolitic()); + userInfo.setMarital(sysUserEditVo.getMarital()); + userInfo.setType(sysUserEditVo.getType()); + userInfo.setBz(sysUserEditVo.getBz()); + userInfo.setIsVirtualUser(sysUserEditVo.getIsVirtualUser()); + userInfo.setSex(sysUserEditVo.getSex()); + userInfo.setUserType(sysUserEditVo.getUserType()); + userInfo.setInDustRialId(sysUserEditVo.getInDustRialId()); + userInfo.setBeginTime(sysUserEditVo.getBeginTime()); + userInfo.setEndTime(sysUserEditVo.getEndTime()); + userInfo.setBirthday(sysUserEditVo.getBirthday()); + userInfo.setIdEntityCard(sysUserEditVo.getIdEntityCard()); + userInfo.setWhcd(sysUserEditVo.getWhcd()); + userInfo.setNation(sysUserEditVo.getNation()); + userInfo.setLoginName(sysUserEditVo.getLoginName()); + userInfo.setSfrh(sysUserEditVo.getSfrh()); + userInfo.setMk(sysUserEditVo.getMk()); + super.updateById(userInfo); + } + + @Override + public void editPassword(SysUserEditPasswordRequest sysUserEditPasswordRequest) { + UserInfo userInfo = UserInfoManager.get(); + SysUser sysUser = this.getById(userInfo.getUserId()); + boolean match = PasswordUtil.match(sysUserEditPasswordRequest.getOldPassword(), sysUser.getPassword()); + Asserts.check(!match, "账号 %s 的密码错误", sysUser.getLoginName()); + String salt = RandomUtil.generateString(8); + String password = PasswordUtil.encode(sysUserEditPasswordRequest.getPassword(), salt); + sysUser.setPassword(password); + sysUser.setSalt(salt); + this.updateById(sysUser); + } + + @Override + public SysUser getUserInfo(Long id) { + return this.getById(id); + } + + @Override + public SysUser checkUserInfo(SysUser user) { + SysUser sysUser = this.getOne(new LambdaQueryWrapper().eq(SysUser::getLoginName, user.getLoginName()).eq(SysUser::getXtZxbz, UserConstants.NORMAL)); + Asserts.check(sysUser == null, "账号 %s 的用户不存在", user.getLoginName()); + boolean match = PasswordUtil.match(sysUser.getPassword(), sysUser.getPassword()); + Asserts.check(match, "账号 %s 的密码错误", sysUser.getLoginName()); + return sysUser; + } + + @Override + public IPage selectByPage(UserPage userPage) { + if (StringUtils.isBlank(userPage.getDeptId())) { + userPage.setOrgcode(this.getSsbm("", userPage.getIsChild())); + List list = sysUserMapper.selectByPage(userPage); + Page page = BeanUtil.copyProperties(userPage, Page.class); + page.setRecords(list); + return page; + } else { + SysDept dept = this.sysDeptMapper.selectById(userPage.getDeptId()); + if (dept != null) { + userPage.setOrgcode(this.getSsbm(dept.getOrgCode(), userPage.getIsChild())); + List list = sysUserMapper.selectByPage(userPage); + Page page = BeanUtil.copyProperties(userPage, Page.class); + page.setRecords(list); + return page; + } + return null; + } + } + + @Override + public void resetPassword(SysUser user) { + String defaultPassword = getDefaultPassword(user.getSalt()); + user.setPassword(defaultPassword); + sysUserMapper.updateById(user); + } + + @Override + public IPage selectUnAccreditPage(UserPage userPage) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + if (StringUtils.isNotBlank(userPage.getLoginName())) { + queryWrapper.and(wrapper -> wrapper.like("login_name", userPage.getLoginName())); + } + if (StringUtils.isNotBlank(userPage.getPhone())) { + queryWrapper.and(wrapper -> wrapper.like("mobile", userPage.getPhone())); + } + queryWrapper.and(wrapper -> wrapper.eq("xt_zxbz", DeletedEnum.NATURE.code)); + QueryWrapper sysUserRoleQueryWrapper = new QueryWrapper<>(); + sysUserRoleQueryWrapper.and(wrapper -> wrapper.eq("role_id", userPage.getRoleId())); + List list = sysUserRoleService.list(sysUserRoleQueryWrapper); + if (CollectionUtil.isNotEmpty(list)) { + List userList = list.stream().map(SysUserRole::getUserId).collect(Collectors.toList()); + queryWrapper.and(wrapper -> wrapper.notIn("id", userList)); + } + UserPage page = this.baseMapper.selectPage(userPage, queryWrapper); + IPage resPage = new Page<>(userPage.getCurrent(), userPage.getSize()); + List voList = new ArrayList<>(); + if (!CollectionUtils.isEmpty(page.getRecords())) { + page.getRecords().forEach(item -> { + SysUserVO userVO = new SysUserVO(); + BeanUtils.copyProperties(item, userVO); + voList.add(userVO); + }); + } + resPage.setRecords(voList); + resPage.setTotal(page.getTotal()); + return resPage; + } + + @Override + public IPage selectUserDeptPage(UserDeptPage userDeptPage) { + UserInfo user = UserInfoManager.get(); + if (StringUtils.isEmpty(userDeptPage.getSsbmdm())) { + userDeptPage.setSsbmdm(String.valueOf(user.getDeptCode())); + } +// else { +// userDeptPage.setOrgcode(userDeptPage.getDeptId()); +// } + userDeptPage.setOrgcode(userDeptPage.getSsbmdm().replaceAll("(00)+$", "")); + return sysUserMapper.selectUserDeptPage(userDeptPage); + } + + @Override + public Boolean userSys() { + Map params = new HashMap<>(); + String rs = HttpUtils.executeGet(USER_URL, params); + JSONObject json = JSONObject.parseObject(rs); + if (json.getBoolean("success")) { + JSONArray array = json.getJSONArray("data"); + if (CollectionUtils.isNotEmpty(array)) { + for (int i = 0; i < array.size(); i++) { + JSONObject userJson = array.getJSONObject(i); + String orgCode = userJson.getString("jurisdictionCode"); + SysDept sysDept = sysDeptService.getDeptByOrgCode(orgCode); + Asserts.check(sysDept == null, "用户code对应的部门信息不存在"); + String idNum = userJson.getString("idNum"); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id_entity_card", idNum); + SysUser sysUser = sysUserMapper.selectOne(queryWrapper); + if (sysUser == null) { + sysUser = new SysUser(); + } + sysUser.setInDustRialId(userJson.getString("username")); + sysUser.setLoginName(userJson.getString("nickName")); + sysUser.setUserName(userJson.getString("nickName")); + sysUser.setMobile(userJson.getString("mobilePhone")); + sysUser.setIdEntityCard(userJson.getString("idNum")); + sysUser.setManagerOrgId(sysDept.getId()); + sysUser.setManagerOrgName(sysDept.getOrgJc()); + sysUser.setXtZxbz(DeletedEnum.NATURE.code); + sysUser.setXtCjsj(new Date()); + sysUser.setXtZhxgsj(new Date()); + if (sysUser.getId() == null) { + sysUser.setXtLrsj(new Date()); + this.save(sysUser); + SysUserDept userDept = new SysUserDept(); + userDept.setUserId(sysUser.getId()); + userDept.setDeptId(sysDept.getId()); + sysUserDeptService.save(userDept); + } else { + this.updateById(sysUser); + SysUserDept oldUserDept = sysUserDeptService.getByDeptIdAndUserId(sysDept.getId(), + sysUser.getId()); + if (oldUserDept == null) { + sysUserDeptService.remove(new LambdaQueryWrapper().eq(SysUserDept::getUserId, + sysUser.getId())); + SysUserDept userDept = new SysUserDept(); + userDept.setUserId(sysUser.getId()); + userDept.setDeptId(sysDept.getId()); + sysUserDeptService.save(userDept); + } + } + } + } + } + return true; + } + + + @Override + public void delById(Long id) { + this.baseMapper.delById(id); + } + + + @Override + public List getUserList(GetUserPage dto) { + UserInfo user = UserInfoManager.get(); + if ("1".equals(dto.getType())) { + return this.getUserListByDept(dto.getKeyword(), String.valueOf(user.getDeptId())); + } else { + return this.getUserListByAll(dto.getKeyword()); + } + } + + private List getUserListByAll(String keyword) { + List userVOList = new ArrayList<>(); + if (StringUtils.isNotBlank(keyword)) { + List list = this.sysDeptMapper.selectList( + new LambdaQueryWrapper() + .like(SysDept::getOrgName, keyword) + .eq(SysDept::getXtZxbz, "0") + ); + + if (list != null && list.size() > 0) { + List deptIds = list.stream().map(d -> String.valueOf(d.getId())).collect(Collectors.toList()); + List userList = this.baseMapper.getUserListByDeptId(deptIds, null); + userList.forEach(user -> { + SysUserVO userVO = new SysUserVO(); + BeanUtils.copyProperties(user, userVO); + SysDept dept = this.sysDeptMapper.getDeptByUserId(user.getId()); + userVO.setDeptId(dept.getId()); + userVO.setDeptCode(dept.getOrgCode()); + userVO.setDeptJc(dept.getOrgJc()); + userVO.setDeptName(dept.getOrgName()); + userVOList.add(userVO); + }); + } + } + List userList = this.baseMapper.selectList( + new LambdaQueryWrapper() + .eq(SysUser::getIsVirtualUser, "02") + .eq(SysUser::getXtZxbz, "0") + .and(StringUtils.isNotBlank(keyword), it -> it.like(SysUser::getLoginName, keyword) + .or() + .like(SysUser::getUserName, keyword)) + ); + userList.forEach(item -> { + SysUserVO userVO = new SysUserVO(); + BeanUtils.copyProperties(item, userVO); + SysUserDept sysUserDept = this.sysUserDeptMapper.selectOne( + new QueryWrapper() + .eq("user_id", String.valueOf(item.getId())) + .last(" limit 1") + ); + if (sysUserDept != null) { + SysDept sysDept = this.sysDeptMapper.selectById(sysUserDept.getDeptId()); + userVO.setDeptId(sysDept.getId()); + userVO.setDeptCode(sysDept.getOrgCode()); + userVO.setDeptJc(sysDept.getOrgJc()); + userVO.setDeptName(sysDept.getOrgName()); + } + userVOList.add(userVO); + }); + return userVOList; + } + + // 获取本部门下的所有的人员信息 + private List getUserListByDept(String keyword, String deptid) { + SysDept dept = this.sysDeptMapper.selectById(deptid); + List deptIds = new ArrayList<>(); + this.getChildList(dept, deptIds); + List userList = this.baseMapper.getUserListByDeptId(deptIds, keyword); + List userVOList = new ArrayList<>(); + userList.forEach(item -> { + SysUserVO userVO = new SysUserVO(); + BeanUtils.copyProperties(item, userVO); + userVO.setDeptId(dept.getId()); + userVO.setDeptCode(dept.getOrgCode()); + userVO.setDeptJc(dept.getOrgJc()); + userVO.setDeptName(dept.getOrgName()); + userVOList.add(userVO); + }); + return userVOList; + } + + private void getChildList(SysDept dept, List deptIds) { + deptIds.add(String.valueOf(dept.getId())); + List tempList1 = this.sysDeptMapper.selectList( + new LambdaQueryWrapper() + .eq(SysDept::getParentId, dept.getId()) + ); + if (tempList1.size() > 0) { + deptIds.addAll(tempList1.stream().map(item -> String.valueOf(item.getId())).collect(Collectors.toList())); + tempList1.forEach(item -> this.getChildList(item, deptIds)); + } + } + + public String getSsbm(String ssbmdm, String isChild) { + isChild = StringUtils.isNotBlank(isChild) ? isChild : "1"; + UserInfo user = UserInfoManager.getUser(); + // 如果用户信息存在,先查询用户权限 + SysRoleVO role = null; + if (StringUtils.isBlank(ssbmdm)) { + if (user != null) { + ssbmdm = user.getDeptCode(); + // 查询用户权限 + List userRoles = sysRoleService.getUserRoleList(user.getUserId()); + if (!org.springframework.util.CollectionUtils.isEmpty(userRoles)) { + int level = Integer.parseInt(userRoles.get(0).getDataPermissionLevel()); + role = userRoles.get(0); + for (SysRoleVO item : userRoles) { + if (level > Integer.parseInt(item.getDataPermissionLevel())) { + level = Integer.parseInt(item.getDataPermissionLevel()); + role = item; + } + } + } + } + if (role != null && !"5".equals(role.getDataPermissionLevel())) { + String level = role.getDataPermissionLevel(); + if ("1".equals(level) || "2".equals(level)) { + return "1".equals(isChild) ? ssbmdm.substring(0, 2) : ssbmdm; + } else if ("3".equals(level)) { + return "1".equals(isChild) ? ssbmdm.substring(0, 4) : ssbmdm; + } else if ("4".equals(level)) { + return "1".equals(isChild) ? ssbmdm.substring(0, 6) : ssbmdm; + } else if ("6".equals(level)) { + return ssbmdm; + } + } else { + if ("1".equals(isChild)) { + SysDept dept = this.sysDeptMapper.selectOne( + new LambdaQueryWrapper() + .eq(SysDept::getXtZxbz, "0") + .eq(SysDept::getOrgCode, ssbmdm) + ); + if (dept == null) { + throw new BusinessException("部门信息不存在!"); + } + if (StringUtils.isBlank(dept.getOrgLevel())) { + return ssbmdm; + } + switch (dept.getOrgLevel()) { + case "10": + case "11": + return ssbmdm.substring(0, 2); + case "21": + case "31": + return ssbmdm.substring(0, 8); + case "12": + case "32": + case "22": + return ssbmdm.substring(0, 10); + case "20": + return ssbmdm.substring(0, 4); + case "30": + return ssbmdm.substring(0, 6); + default: + return ssbmdm; + } + } + } + } else { + if ("1".equals(isChild)) { + SysDept dept = this.sysDeptMapper.selectOne( + new LambdaQueryWrapper() + .eq(SysDept::getXtZxbz, "0") + .eq(SysDept::getOrgCode, ssbmdm) + ); + if (dept == null) { + throw new BusinessException("部门信息不存在!"); + } + if (StringUtils.isBlank(dept.getOrgLevel())) { + return ssbmdm; + } + switch (dept.getOrgLevel()) { + case "10": + case "11": + return ssbmdm.substring(0, 2); + case "21": + case "31": + return ssbmdm.substring(0, 8); + case "12": + case "32": + case "22": + return ssbmdm.substring(0, 10); + case "20": + return ssbmdm.substring(0, 4); + case "30": + return ssbmdm.substring(0, 6); + default: + return ssbmdm; + } + } + } + return ssbmdm; + } + +} + + + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/business/timer/DeptUserSys.java b/common-core-starter/src/main/java/com/mosty/common/core/business/timer/DeptUserSys.java new file mode 100644 index 0000000..79e2053 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/business/timer/DeptUserSys.java @@ -0,0 +1,34 @@ +package com.mosty.common.core.business.timer; + +import com.mosty.common.core.business.service.SysDeptService; +import com.mosty.common.core.business.service.SysUserService; +import lombok.AllArgsConstructor; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.Transactional; + +/** + * 用户部门数据同步 + * @title: DeptUserSys + * @projectName mosty-common + * @description: TODO + * @date 2022/8/27 16:52 + */ +@Component +@AllArgsConstructor +public class DeptUserSys { + + private SysDeptService sysDeptService; + + private SysUserService sysUserService; + +// @Scheduled(cron = "0 0 1 * * ?") + @Transactional + public void run() { + //同步部门数据 + sysDeptService.deptSys(); + //同步用户数据 + sysUserService.userSys(); + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/config/CaptchaConfig.java b/common-core-starter/src/main/java/com/mosty/common/core/config/CaptchaConfig.java new file mode 100644 index 0000000..41a0bc3 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/config/CaptchaConfig.java @@ -0,0 +1,72 @@ +package com.mosty.common.core.config; + +import com.google.code.kaptcha.impl.DefaultKaptcha; +import com.google.code.kaptcha.util.Config; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Properties; + +/** + * 验证码配置 + * + * @author xingsong + */ +@Data +@Slf4j +@Configuration +public class CaptchaConfig implements InitializingBean { + + /** 默认角色列表 多个使用逗号间隔 */ + @Value("${login.check.kaptcha:false}") + private Boolean loginCheckKaptcha; + + @Bean(name = "captchaProducerMath") + public DefaultKaptcha getKaptchaBeanMath() { + + DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); + Properties properties = new Properties(); + // 是否有边框 默认为true 我们可以自己设置yes,no + 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.key", "kaptchaCodeMath"); + // 验证码文本字符间距 默认为2 + properties.setProperty("kaptcha.textproducer.char.space", "3"); + // 验证码文本字符长度 默认为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"); + // 验证码噪点颜色 默认为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; + } + + @Override + public void afterPropertiesSet() { + log.info("login check captcha is {}", loginCheckKaptcha); + } +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/config/DefaultRoleConfig.java b/common-core-starter/src/main/java/com/mosty/common/core/config/DefaultRoleConfig.java new file mode 100644 index 0000000..3874596 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/config/DefaultRoleConfig.java @@ -0,0 +1,43 @@ +package com.mosty.common.core.config; + +import com.google.common.collect.Lists; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +/** + * 默认角色配置 + * @author kevin + * @date 2022/2/21 1:12 PM + * @since 1.0.0 + */ +@Configuration +@Data +@Slf4j +public class DefaultRoleConfig { + + /** 默认角色列表 多个使用逗号间隔 */ + @Value("${default.role:12345}") + private String defaultRole; + + public List getDefaultRoleList() { + List defaultRoleList = Lists.newArrayList(); + if (StringUtils.isEmpty(defaultRole)) { + return defaultRoleList; + } + String[] split = defaultRole.split(","); + for (String roleId : split) { + try { + defaultRoleList.add(Long.parseLong(roleId)); + } catch (Exception e) { + log.error("解析角色id异常", e); + } + } + return defaultRoleList; + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/config/MinIoClientConfig.java b/common-core-starter/src/main/java/com/mosty/common/core/config/MinIoClientConfig.java new file mode 100644 index 0000000..d3d08bc --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/config/MinIoClientConfig.java @@ -0,0 +1,46 @@ +package com.mosty.common.core.config; + +import io.minio.MinioClient; +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * minio配置 + * @author kevin + * @date 2022/3/7 10:41 AM + * @since 1.0.0 + */ +@Data +@Configuration +public class MinIoClientConfig { + + @Value("${minio.endpoint:http://123.60.67.142:8001}") + private String endpoint; + @Value("${minio.downloadEndpoint:http://123.60.67.142:8000}") + private String downloadEndpoint; + @Value("${minio.accessKey:root}") + private String accessKey; + @Value("${minio.secretKey:sczy@2022}") + private String secretKey; + /** 图片桶名称 */ + @Value("${minio.bucket.image:image}") + private String imageBucket; + /** 文件桶名称 */ + @Value("${minio.bucket.file:file}") + private String fileBucket; + + + /** + * 注入minio 客户端 + * @return + */ + @Bean + public MinioClient minioClient() { + return MinioClient.builder() + .endpoint(endpoint) + .credentials(accessKey, secretKey) + .build(); + } +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/constant/DataPermissionConstant.java b/common-core-starter/src/main/java/com/mosty/common/core/constant/DataPermissionConstant.java new file mode 100644 index 0000000..b70e657 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/constant/DataPermissionConstant.java @@ -0,0 +1,44 @@ +package com.mosty.common.core.constant; + +import lombok.AllArgsConstructor; + +/** + * 菜单类型枚举 + * @author kevin + * @date 2022/2/22 12:53 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public class DataPermissionConstant { + + /** + * 全部数据权限 + */ + public static final String DATA_SCOPE_ALL = "1"; + + /** + * 市级数据权限 + */ + public static final String DATA_SCOPE_CITY = "2"; + + /** + * 县级数据权限 + */ + public static final String DATA_SCOPE_COUNTY = "3"; + + + /** + * 部门及以下数据权限 + */ + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + /** + * 部门数据权限 + */ + public static final String DATA_SCOPE_DEPT = "5"; + + /** + * 仅本人数据权限 + */ + public static final String DATA_SCOPE_SELF = "99"; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/IdCardLoginRequest.java b/common-core-starter/src/main/java/com/mosty/common/core/login/IdCardLoginRequest.java new file mode 100644 index 0000000..4b3cf70 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/IdCardLoginRequest.java @@ -0,0 +1,28 @@ +package com.mosty.common.core.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; + +/** + * pki登陆(身份证号登陆) + * @author kevin + * @date 2022/4/23 2:28 下午 + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@ApiModel("身份证号登陆请求") +public class IdCardLoginRequest { + + /** + * 身份证号 + */ + @NotEmpty(message = "身份证号不能为空") + @ApiModelProperty("身份证号") + private String idCardNo; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/ImageController.java b/common-core-starter/src/main/java/com/mosty/common/core/login/ImageController.java new file mode 100644 index 0000000..4e3eb20 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/ImageController.java @@ -0,0 +1,74 @@ +package com.mosty.common.core.login; + +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.login.dto.ImageRequest; +import com.mosty.common.core.util.Base64Util; +import com.mosty.common.util.ImageUtils; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletRequest; +import javax.swing.*; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLDecoder; + +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("/image") +@Api(tags = "图片功能服务") +public class ImageController { + + @GetMapping("/base64") + @ApiOperation(value = "根据URL获取base64图片", httpMethod = "GET", response = SysDept.class) + public ResponseResult selectPage(ImageRequest imageRequest) { + try { + String base = ""; + if (imageRequest.getUrl().startsWith("https://")) { + base = ImageUtils.encodeImageToBase64Https(imageRequest.getUrl()); + } else { + base = ImageUtils.encodeImageToBase64(imageRequest.getUrl()); + } + return ResponseResult.success(base); + } catch (Exception e) { + return ResponseResult.fail("图片下载失败"); + } + } + + // 下载图片(返回二进制) + @RequestMapping(value = "/image", method = RequestMethod.GET) + public HttpEntity downloadFile(String url, HttpServletRequest request) throws Exception{ + byte[] obsBytes = null; + if (StringUtils.isNotBlank(url)) { + url= URLDecoder.decode(url,"UTF-8"); + if (url.startsWith("https://")) { + obsBytes = ImageUtils.encodeImageToByteHttps(url); + } else { + obsBytes = ImageUtils.encodeImageTobyte(url); + } + } + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.IMAGE_JPEG); + headers.setContentLength(obsBytes.length); + return new HttpEntity(obsBytes, headers); + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/JwtTokenGenerator.java b/common-core-starter/src/main/java/com/mosty/common/core/login/JwtTokenGenerator.java new file mode 100644 index 0000000..9f5f0ec --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/JwtTokenGenerator.java @@ -0,0 +1,236 @@ +package com.mosty.common.core.login; + +import cn.hutool.json.JSONUtil; +import com.alibaba.fastjson.JSONObject; +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.interfaces.Claim; +import com.auth0.jwt.interfaces.DecodedJWT; +import com.auth0.jwt.interfaces.JWTVerifier; +import com.mosty.common.base.exception.BusinessException; +import com.mosty.common.base.util.DateUtils; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.entity.vo.SysRoleVO; +import com.mosty.common.core.login.dto.DeptAllVo; +import com.mosty.common.core.login.dto.DeptDTO; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +import static com.mosty.common.base.constant.SystemConfigConstants.TOKEN_ISSUER; +import static com.mosty.common.base.constant.SystemConfigConstants.TOKEN_KEY; + +/** + * jwt token工具类 + * + * @author kevin + * @date 2022/2/15 10:32 PM + * @since 1.0.0 + */ +@Slf4j +@Component +public class JwtTokenGenerator { + + /** + * 配置文件中过期时间,单位秒 + */ + @Value("${jwt.expiration:864000}") + private Long expiration; + + /** + * 配置文件中的jwt秘钥 + */ + @Value("${jwt.secret:RVvjAORWxgmDyvGP8RkD7HuaYEuekN7rXyaDaLn2jbk6OJvFupTXzicR883pFUmI}") + private String secret; + + @Value("${jwt.issuer:mosty-admin}") + private String issuer; + + /** + * 获取当前登陆的token + *

+ * private String id;//人员主键 userId + * private String identitycard;//人员账号 + * private String identitycard;//身份证号码 + * private String identitycard;//行业号码 + * private String username;//人员姓名 + * private String orgname;//所在部门名称 + * private String orgcode;//所在部门代码 + * private String orgid;//所在部门ID + * private String org_level;//所在部门等级代码 [部门等级] + * private String orgid;//所在部门业务类型代码 org_biz_type + * private String position;//登陆时间 + * + * @param sysUser 用户信息 + * @param dept 当前登陆用户部门 + * @return token信息 + */ + public String generateToken(SysUser sysUser, DeptAllVo dept) { + try { + long currentMills = System.currentTimeMillis(); + Algorithm algorithm = Algorithm.HMAC256(secret); + + Date expireDate = DateUtils.parseDate("2099-12-31 00:00:00"); + return JWT.create() + .withIssuer(issuer) + .withIssuedAt(new Date(currentMills)) + .withClaim("userId", sysUser.getId()) + .withClaim("userName", sysUser.getUserName()) + .withClaim("userType", sysUser.getUserType()) + .withClaim("userLoginName", sysUser.getLoginName()) + .withClaim("inDustRialId", sysUser.getInDustRialId()) + .withClaim("idEntityCard", sysUser.getIdEntityCard()) + .withClaim("phone", sysUser.getMobile()) + .withClaim("isVirtualUser", sysUser.getIsVirtualUser()) + .withClaim("deptId", dept.getDeptid()) + .withClaim("deptCode", dept.getDeptcode()) + .withClaim("deptName", dept.getDeptname()) + .withClaim("deptLevel", dept.getOrgLevel()) + .withClaim("deptBizType", dept.getOrgType()) + .withClaim("fxjDeptId", dept.getFxjid()) + .withClaim("fxjDeptName", dept.getFxjname()) + .withClaim("fxjDeptCode", dept.getFxjcode()) + .withClaim("dszDeptId", dept.getDszid()) + .withClaim("dszDeptName", dept.getDszname()) + .withClaim("dszDeptCode", dept.getDszcode()) + .withIssuedAt(new Date()) + .withSubject("admin") + //设置时间长一点,永不过期 +// .withExpiresAt(new Date(currentMills + expiration * 1000)) + .withExpiresAt(expireDate) + .sign(algorithm); + } catch (Exception e) { + log.error("生产token异常", e); + return null; + } + } + + public String generatePromotionToken(Long promotionId, String promotionMobile, Integer promotionType, String pageUrl) { + try { +// Long expiration = 7200L; + long currentMills = System.currentTimeMillis(); + Algorithm algorithm = Algorithm.HMAC256(secret); + /*DecodedJWT verify = verify(token, secret, issuer); + Claim promotionMobile1 = verify.getClaims().get("promotionId");*/ + return JWT.create() + .withIssuer(issuer) + .withIssuedAt(new Date(currentMills)) + .withClaim("promotionId", promotionId) + .withClaim("promotionMobile", promotionMobile) + .withClaim("promotionType", promotionType) + .withClaim("pageUrl", pageUrl) + .withSubject("promotion") + //设置过期时间为2小时 + .withExpiresAt(new Date(currentMills + expiration * 1000)) + .sign(algorithm); + + } catch (Exception e) { + log.error("生产token异常:{}", e); + return null; + } + } + + public Map getPromotionFromToken(String token) { + try { + DecodedJWT decodedJWT = verify(token, secret, issuer); + return decodedJWT.getClaims(); + } catch (Exception e) { + throw new BusinessException("获取用户身份异常,请退出重新登录"); + } + } + + public static DecodedJWT verify(String token, String secret, String issuer) { + DecodedJWT result = null; + try { + Algorithm algorithm = Algorithm.HMAC256(secret); + JWTVerifier verifier = JWT.require(algorithm) + .withIssuer(issuer) + .build(); + DecodedJWT decodedJWT = verifier.verify(token); + Date expiresAt = decodedJWT.getExpiresAt(); + result = expiresAt.after(new Date()) ? decodedJWT : null; + } finally { + return result; + } + } + + public static void main(String[] args) { +// String token = generatePromotionToken(32232L, "13212120222", 1); +// System.out.println(token); +// String s = new JwtTokenUtil().generateToken(123); +// System.out.println(s); +// + DecodedJWT result = null; + try { +// String tokenStr = StrUtil.sub(token, 9, token.length()); + String secret = TOKEN_KEY, issuer = TOKEN_ISSUER; + Algorithm algorithm = Algorithm.HMAC256(secret); + JWTVerifier verifier = JWT.require(algorithm) + .withIssuer(issuer) + .build(); + String s = "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzcyI6Inprai1mcG0tc3RvcmVhZG1pbiIsImV4cCI6MTYwNjc3MjQwNywiaWF0IjoxNjA2NzI5MjA3LCJ1c2VySWQiOjEyM30.VLFq7RZ8a_e6d2AXI0hS31mAbFj1T-OrZ9Ol7KNIUA8"; + DecodedJWT decodedJWT = verifier.verify(s); + Date expiresAt = decodedJWT.getExpiresAt(); + result = expiresAt.after(new Date()) ? decodedJWT : null; + System.out.println(result.getId()); + Map claims = result.getClaims(); +// Long promotionId = claims.get("promotionId").asLong(); +// String promotionMobile = claims.get("promotionMobile").asString(); +// Integer promotionType = claims.get("promotionType").asInt(); +// System.out.println(promotionId + "_" + promotionMobile + "_" + promotionType); + } catch (Exception e) { + } + } + + /** + * 获取jwt的属性值 + * + * @param token token信息 + * @param pwtKey jwt的属性 + * @return jwt属性对应的值 + */ + public Integer getPropertyFromToken(String token, String pwtKey) { + Algorithm algorithm = Algorithm.HMAC256(secret); + return JWT.require(algorithm).build() + .verify(token) + .getClaim(pwtKey) + .asInt(); + } + + public void removeToken(SysUser sysUser, DeptAllVo sysDept) { + long currentMills = System.currentTimeMillis(); + Algorithm algorithm = Algorithm.HMAC256(secret); + JWT.create() + .withIssuer(issuer) + .withIssuedAt(new Date(currentMills)) + .withClaim("userId", sysUser.getId()) + .withClaim("userName", sysUser.getUserName()) + .withClaim("userType", sysUser.getUserType()) + .withClaim("userLoginName", sysUser.getLoginName()) + .withClaim("inDustRialId", sysUser.getInDustRialId()) + .withClaim("idEntityCard", sysUser.getIdEntityCard()) + .withClaim("isVirtualUser", sysUser.getIsVirtualUser()) + .withClaim("phone", sysUser.getMobile()) + .withClaim("deptId", sysDept.getDeptid()) + .withClaim("deptCode", sysDept.getDeptcode()) + .withClaim("deptName", sysDept.getDeptname()) + .withClaim("deptLevel", sysDept.getOrgLevel()) + .withClaim("deptBizType", sysDept.getOrgBizType()) + .withClaim("fxjDeptId", sysDept.getFxjid()) + .withClaim("fxjDeptName", sysDept.getFxjname()) + .withClaim("fxjDeptCode", sysDept.getFxjcode()) + .withClaim("dszDeptId", sysDept.getDszid()) + .withClaim("dszDeptName", sysDept.getDszname()) + .withClaim("dszDeptCode", sysDept.getDszcode()) + .withIssuedAt(new Date()) + .withSubject("admin") + //设置立马过期 + .withExpiresAt(new Date()) + .sign(algorithm); + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/LoginEntity.java b/common-core-starter/src/main/java/com/mosty/common/core/login/LoginEntity.java new file mode 100644 index 0000000..82e11d4 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/LoginEntity.java @@ -0,0 +1,32 @@ +package com.mosty.common.core.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; + +/** + * 登陆服务 + * @author kevin + * @date 2022/2/15 8:26 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@ApiModel("用户登陆请求") +public class LoginEntity { + + @NotEmpty(message = "用户名不能为空!") + @ApiModelProperty(value = "用户名", required = true) + private String userName; + + @NotEmpty(message = "密码不能为空!") + @ApiModelProperty(value = "密码(密码需要进行base64 加密)", required = true) + private String password; + + @ApiModelProperty(value = "加密token", required = true) + private String token; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/LoginRequest.java b/common-core-starter/src/main/java/com/mosty/common/core/login/LoginRequest.java new file mode 100644 index 0000000..51dd6cf --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/LoginRequest.java @@ -0,0 +1,35 @@ +package com.mosty.common.core.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; + +/** + * 登陆服务 + * @author kevin + * @date 2022/2/15 8:26 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@ApiModel("用户登陆请求") +public class LoginRequest { + + @NotEmpty(message = "用户名不能为空!") + @ApiModelProperty(value = "用户名", required = true) + private String userName; + + @NotEmpty(message = "密码不能为空!") + @ApiModelProperty(value = "密码(密码需要进行base64 加密)", required = true) + private String password; + + @ApiModelProperty(value = "验证码", allowEmptyValue = true) + private String kaptcha; + +// @ApiModelProperty("是否组装vue路由") +// private Boolean wrapRouter = Boolean.TRUE; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/LoginResponseVO.java b/common-core-starter/src/main/java/com/mosty/common/core/login/LoginResponseVO.java new file mode 100644 index 0000000..c65a816 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/LoginResponseVO.java @@ -0,0 +1,108 @@ +package com.mosty.common.core.login; + +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.SysMenu; +import com.mosty.common.core.login.dto.DeptDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; +import java.util.Set; + +/** + * 登陆返回信息 + * + * @author kevin + * @date 2022/2/15 10:24 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +public class LoginResponseVO { +// +// @ApiModelProperty("jwt token信息") +// private String jwtToken; +// +// @ApiModelProperty("用户id") +// private Long userId; +// +// @ApiModelProperty("用户名称") +// private String userName; +// +// @ApiModelProperty("权限信息") +// private UserPermissionsInfo permissionsInfo; +// +// @ApiModelProperty("用户挂的部门集合") +// private List deptList; +// +// @ApiModelProperty("用户挂一级菜单和菜单组") +// private List menuList; +// +// @ApiModelProperty("菜单唯一编码集合") +// private Set menuCodeSet; +// +// @ApiModelProperty("分县局") +// private SysDept fxjDept; +// +// @ApiModelProperty("地市州") +// private SysDept dszDept; +// +// @ApiModelProperty(value = "身份证号") +// private String idEntityCard; + + + @ApiModelProperty("jwt token信息") + private String jwtToken; + + @ApiModelProperty("用户id") + private Long userId; + + @ApiModelProperty("用户名称") + private String userName; + + @ApiModelProperty("用户部门") + private List deptList; + + @ApiModelProperty("用户挂一级菜单和菜单组") + private List menuList; + + @ApiModelProperty("菜单唯一编码集合") + private Set menuCodeSet; + + @ApiModelProperty(value = "身份证号") + private String idEntityCard; + + @ApiModelProperty(value = "是否融合") + private String sfrh; + + @ApiModelProperty(value = "模块") + private String mk; + + + public LoginResponseVO(String jwtToken, Long userId, String userName, List deptList, String idEntityCard, String sfrh, String mk) { + this.jwtToken = jwtToken; + this.userId = userId; + this.userName = userName; + this.deptList = deptList; + this.idEntityCard = idEntityCard; + this.sfrh = sfrh; + this.mk = mk; + } + + public LoginResponseVO(Long userId, String userName, List deptList, + SysDept fxjDept, SysDept dszDept, String idEntityCard, String sfrh, String mk) { + this.userId = userId; + this.userName = userName; + this.deptList = deptList; +// this.fxjDept = fxjDept; +// this.dszDept = dszDept; + this.idEntityCard = idEntityCard; + this.sfrh = sfrh; + this.mk = mk; + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/LoginServiceController.java b/common-core-starter/src/main/java/com/mosty/common/core/login/LoginServiceController.java new file mode 100644 index 0000000..690025f --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/LoginServiceController.java @@ -0,0 +1,331 @@ +package com.mosty.common.core.login; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.google.code.kaptcha.Producer; +import com.mosty.common.base.constant.Constants; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.exception.BusinessException; +import com.mosty.common.base.util.Base64Util; +import com.mosty.common.base.util.PasswordUtil; +import com.mosty.common.base.util.StringUtils; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.entity.vo.SysUserVO; +import com.mosty.common.core.business.service.*; +import com.mosty.common.core.config.CaptchaConfig; +import com.mosty.common.core.login.dto.DeptAllVo; +import com.mosty.common.core.login.dto.DeptDTO; +import com.mosty.common.redis.service.RedisService; +import com.mosty.common.token.JwtSysUser; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.nio.charset.StandardCharsets; +import java.util.List; + +import static com.mosty.common.base.constant.Constants.LOGOUT; +import static com.mosty.common.base.constant.SystemConfigConstants.TOKEN_PREFIX; + +/** + * 登陆服务 + *

+ * jwt: + * secret: "" # 验签的key + * # expiration: 432000 # 配置文件中过期时间,单位秒 + * issuer: "" + * + * @author kevin + * @date 2022/2/15 8:25 PM + * @since 1.0.0 + */ +@Slf4j +@RestController +@AllArgsConstructor +@RequestMapping("/") +@Api(tags = "登陆服务") +public class LoginServiceController { + + private final SysUserService sysUserService; + private final SysDeptService sysDeptService; + private final Producer captchaProducer; + private final RedisService redisService; + private final JwtTokenGenerator jwtTokenGenerator; + private final SysUserRoleService sysUserRoleService; + private final SysRoleService sysRoleService; + private final SysLogininforService sysLogininforService; + private final CaptchaConfig captchaConfig; + private final LoginService loginService; + + @PostMapping("/login") + @ApiOperation(value = "根据账号和密码登录", httpMethod = "POST", response = LoginResponseVO.class) + public ResponseResult login(@Valid @RequestBody LoginRequest dto, HttpServletRequest httpServletRequest) throws Exception { + String status = ""; + String message = ""; + // 验证用户信息 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id_entity_card", dto.getUserName()); + queryWrapper.eq("xt_zxbz", "0"); + queryWrapper.or().eq("in_dust_rial_id", dto.getUserName()); + SysUser sysUser = sysUserService.getBaseMapper().selectOne(queryWrapper); + if (sysUser == null) return ResponseResult.fail(String.format("用户名或密码错误!")); + try { + // 验证密码 + String password = new String(Base64Util.decryptBASE64(dto.getPassword().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); + boolean match = PasswordUtil.match(password, sysUser.getPassword()); + if (!match) return ResponseResult.fail("用户名或密码错误!"); + // 查询用户关联的部门 + List deptList = sysDeptService.selectUserDeptList(sysUser.getId()); + DeptDTO dept = CollectionUtils.isNotEmpty(deptList) ? deptList.get(0) : null; + if (dept == null) throw new BusinessException("用户未绑定任何部门!"); + //创建JWTToken + DeptAllVo allVo = this.sysDeptService.getOrgByDeptId(String.valueOf(dept.getDeptId())); + String jwtToken = jwtTokenGenerator.generateToken(sysUser, allVo); + LoginResponseVO loginResponseVO = new LoginResponseVO(jwtToken, sysUser.getId(), + sysUser.getUserName(), deptList, sysUser.getIdEntityCard() + , sysUser.getSfrh(), sysUser.getMk()); + this.loginService.getMenus(dept, sysUser, loginResponseVO); + // 在数据库中排序,获取第一个作为当前登陆的用户部门 + status = Constants.LOGIN_SUCCESS; + message = "登录成功"; + loginResponseVO.setUserName(sysUser.getUserName()); + redisService.setCacheObject(TOKEN_PREFIX + dept.getDeptId() + ":" + sysUser.getId(), System.currentTimeMillis()); + return ResponseResult.success(loginResponseVO); + } catch (Exception e) { + e.printStackTrace(); + status = Constants.LOGIN_FAIL; + message = "登录失败" + e.getMessage(); + throw new Exception(e.getMessage()); + } finally { + try { + sysLogininforService.recordLogininfor(sysUser, status, message, httpServletRequest, "02"); + } catch (Exception e) { + log.warn("记录日志失败,message={}", e.getMessage()); + e.printStackTrace(); + } + } + } + + + @PostMapping("/loginOauth") + @ApiOperation(value = "根据账号和密码登录(无需权限信息和token)", httpMethod = "POST", response = SysUserVO.class) + public ResponseResult loginOauth(@Valid @RequestBody LoginEntity loginEntity, HttpServletRequest request) throws Exception { + String status = "", message = ""; + // 验证用户信息 + SysUserVO userVO = new SysUserVO(); + SysUser sysUser = sysUserService.getBaseMapper().selectOne( + new LambdaQueryWrapper() + .eq(SysUser::getXtZxbz, "0") + .and( + it -> it.eq(SysUser::getInDustRialId, loginEntity.getUserName()) + .or() + .eq(SysUser::getIdEntityCard, loginEntity.getUserName()) + ) + .last(" limit 1") + ); + if (sysUser == null) return ResponseResult.fail("用户名或密码错误"); + + try { + // 验证密码 + String password = new String(Base64Util.decryptBASE64(loginEntity.getPassword().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); + boolean match = PasswordUtil.match(password, sysUser.getPassword()); + if (!match) return ResponseResult.fail("用户名或密码错误!"); + // 查询用户关联的部门 + List deptList = sysDeptService.selectUserDeptList(sysUser.getId()); + DeptDTO dept = CollectionUtils.isNotEmpty(deptList) ? deptList.get(0) : null; + if (dept == null) throw new BusinessException("用户未绑定任何部门!"); + //创建JWTToken + DeptAllVo allVo = this.sysDeptService.getOrgByDeptId(String.valueOf(dept.getDeptId())); + String jwtToken = jwtTokenGenerator.generateToken(sysUser, allVo); + LoginResponseVO loginResponseVO = new LoginResponseVO(jwtToken, sysUser.getId(), + sysUser.getUserName(), deptList, sysUser.getIdEntityCard(), sysUser.getSfrh(), sysUser.getMk()); + this.loginService.getMenus(dept, sysUser, loginResponseVO); + // 在数据库中排序,获取第一个作为当前登陆的用户部门 + status = Constants.LOGIN_SUCCESS; + message = "登录成功"; + loginResponseVO.setUserName(sysUser.getUserName()); + redisService.setCacheObject(TOKEN_PREFIX + dept.getDeptId() + ":" + sysUser.getId(), System.currentTimeMillis()); + return ResponseResult.success(loginResponseVO); + } catch (BusinessException e) { + throw e; + } catch (Exception e) { + e.printStackTrace(); + status = Constants.LOGIN_FAIL; + message = "登录失败" + e.getMessage(); + throw new Exception(e.getMessage()); + } finally { + try { + sysLogininforService.recordLogininfor(sysUser, status, message, request, "02"); + } catch (Exception e) { + log.warn("记录日志失败,message={}", e.getMessage()); + e.printStackTrace(); + } + } + } + + // 根据当前部门获取分县局部门 + public SysDept getFxjDept(DeptDTO currentDept) { + if (currentDept == null) { + return null; + } + Long id = null; + String path = currentDept.getPath(); + if (path.contains("_")) { + String[] paths = path.split("_"); + log.info("paths length--->" + paths.length); + if (paths.length == 2) { + id = Long.valueOf(paths[1]); + } else if (paths.length == 3) { + id = Long.valueOf(paths[2]); + } else if (paths.length >= 4) { + id = Long.valueOf(paths[2]); + } + } else { + id = Long.valueOf(path); + } + return sysDeptService.getById(id); + } + + // 根据当前地市州 + public SysDept getDszDept(DeptDTO currentDept) { + if (currentDept == null) return null; + long id; + String path = currentDept.getPath(); + if (path.contains("_")) { + String[] paths = path.split("_"); + id = Long.parseLong(paths[1]); + } else { + id = Long.parseLong(path); + } + return sysDeptService.getById(id); + } + + @PostMapping("/idCardNoLogin") + @ApiOperation(value = "APP--身份证号登陆", httpMethod = "POST", response = LoginResponseVO.class) + public ResponseResult idCardNoLogin(@Valid @RequestBody IdCardLoginRequest idCardLoginRequest, + HttpServletRequest httpServletRequest) throws Exception { + String status = ""; + String message = ""; + SysUser sysUser = null; + try { + // 验证用户信息 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id_entity_card", idCardLoginRequest.getIdCardNo()); + sysUser = sysUserService.getBaseMapper().selectOne(queryWrapper); + if (sysUser == null) return ResponseResult.fail("用户不存在!!"); + + // 查询用户关联的部门 + List deptList = sysDeptService.selectUserDeptList(sysUser.getId()); + DeptDTO dept = CollectionUtils.isNotEmpty(deptList) ? deptList.get(0) : null; + //除非用户是超级管理员,否则部门为空不允许登陆 + if (dept == null) return ResponseResult.fail("用户未分配任何部门!!"); + //创建JWTToken + DeptAllVo allVo = this.sysDeptService.getOrgByDeptId(String.valueOf(dept.getDeptId())); + String jwtToken = jwtTokenGenerator.generateToken(sysUser, allVo); + LoginResponseVO loginResponseVO = new LoginResponseVO(jwtToken, sysUser.getId(), sysUser.getUserName(), deptList, + sysUser.getIdEntityCard(), sysUser.getSfrh(), sysUser.getMk()); + // 在数据库中排序,获取第一个作为当前登陆的用户部门 + status = Constants.LOGIN_SUCCESS; + message = "登录成功"; + redisService.setCacheObject(TOKEN_PREFIX + dept.getDeptId() + ":" + sysUser.getId(), System.currentTimeMillis()); + return ResponseResult.success(loginResponseVO); + } catch (Exception e) { + e.printStackTrace(); + status = Constants.LOGIN_FAIL; + message = "登录失败" + e.getMessage(); + throw new Exception(e.getMessage()); + } finally { + if (sysUser != null) { + try { + sysLogininforService.recordLogininfor(sysUser, status, message, httpServletRequest, "01"); + } catch (Exception e) { + log.warn("记录日志失败,message={}", e.getMessage()); + } + } + } + } + + @PostMapping("/ssoLogin") + @ApiOperation(value = "APP--身份证号登陆", httpMethod = "POST", response = LoginResponseVO.class) + public ResponseResult ssoLogin(@RequestBody LoginEntity loginEntity, + HttpServletRequest httpServletRequest) throws Exception { + if (StringUtils.isBlank(loginEntity.getToken())) { + return ResponseResult.fail("用户名不能为空"); + } + String status = "", message = "", userName; + SysUser sysUser = null; + userName = new String(Base64Util.decryptBASE64(loginEntity.getToken().getBytes(StandardCharsets.UTF_8)), StandardCharsets.UTF_8); + + try { + // 验证用户信息 + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id_entity_card", userName); + sysUser = sysUserService.getBaseMapper().selectOne(queryWrapper); + if (sysUser == null) return ResponseResult.fail("用户不存在!!"); + // 查询用户关联的部门 + List deptList = sysDeptService.selectUserDeptList(sysUser.getId()); + DeptDTO dept = CollectionUtils.isNotEmpty(deptList) ? deptList.get(0) : null; + if (dept == null) throw new BusinessException("用户未绑定任何部门!"); + //创建JWTToken + DeptAllVo allVo = this.sysDeptService.getOrgByDeptId(String.valueOf(dept.getDeptId())); + String jwtToken = jwtTokenGenerator.generateToken(sysUser, allVo); + LoginResponseVO loginResponseVO = new LoginResponseVO(jwtToken, sysUser.getId(), + sysUser.getUserName(), deptList, sysUser.getIdEntityCard(), sysUser.getSfrh(), sysUser.getMk()); + this.loginService.getMenus(dept, sysUser, loginResponseVO); + // 在数据库中排序,获取第一个作为当前登陆的用户部门 + status = Constants.LOGIN_SUCCESS; + message = "登录成功"; + loginResponseVO.setUserName(sysUser.getUserName()); + redisService.setCacheObject(TOKEN_PREFIX + dept.getDeptId() + ":" + sysUser.getId(), System.currentTimeMillis()); + return ResponseResult.success(loginResponseVO); + } catch (Exception e) { + e.printStackTrace(); + status = Constants.LOGIN_FAIL; + message = "登录失败" + e.getMessage(); + throw new Exception(e.getMessage()); + } finally { + if (sysUser != null) { + try { + sysLogininforService.recordLogininfor(sysUser, status, message, httpServletRequest, "01"); + } catch (Exception e) { + log.warn("记录日志失败,message={}", e.getMessage()); + } + } + } + } + + + @JwtSysUser + @PostMapping("/loginOut") + @ApiOperation(value = "登出", httpMethod = "POST", response = LoginResponseVO.class) + public ResponseResult loginOut(HttpServletRequest httpServletRequest) throws Exception { + try { + UserInfo userInfo = UserInfoManager.getUser(); + if (userInfo != null) { + SysUser sysUser = sysUserService.getUserInfo(userInfo.getUserId()); + // 查询用户关联的部门 + SysDept sysDept = sysDeptService.getById(userInfo.getDeptId()); + DeptAllVo allVo = this.sysDeptService.getOrgByDeptId(String.valueOf(sysDept.getId())); + // 在数据库中排序,获取第一个作为当前登陆的用户部门 + jwtTokenGenerator.removeToken(sysUser, allVo); + //清除用户jwtToken + redisService.deleteObject(TOKEN_PREFIX + userInfo.getDeptId() + ":" + sysUser.getId()); + sysLogininforService.recordLogininfor(sysUser, LOGOUT, "用户登出", httpServletRequest, "02"); + } + return ResponseResult.success(Boolean.TRUE); + } catch (Exception e) { + log.error("登出错误:", e); + e.printStackTrace(); + throw new Exception(e.getMessage()); + } + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/TokenRequest.java b/common-core-starter/src/main/java/com/mosty/common/core/login/TokenRequest.java new file mode 100644 index 0000000..b3cb4f7 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/TokenRequest.java @@ -0,0 +1,33 @@ +package com.mosty.common.core.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; + +/** + * 登陆服务 + * @author kevin + * @date 2022/2/15 8:26 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@ApiModel("用户切换部门获取token请求") +public class TokenRequest { + + @NotNull(message = "部门id不能为空!") + @ApiModelProperty("部门id") + private Long deptId; + + @NotEmpty(message = "token!") + @ApiModelProperty("token不能为空") + private String authorization; + + @ApiModelProperty("是否组装vue路由") + private Boolean wrapRouter; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/UnifiedLoginRequest.java b/common-core-starter/src/main/java/com/mosty/common/core/login/UnifiedLoginRequest.java new file mode 100644 index 0000000..bb76457 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/UnifiedLoginRequest.java @@ -0,0 +1,36 @@ +package com.mosty.common.core.login; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; + +/** + * 登陆服务 + * @author + * @date 2022/8/12 8:26 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@ApiModel("用户登陆请求") +public class UnifiedLoginRequest { + + /** + * 登陆token + */ + @NotEmpty(message = "登陆token!") + @ApiModelProperty(value = "登陆token", required = true) + private String token; + + /** + * 密码 + */ + @NotEmpty(message = "系统ID!") + @ApiModelProperty(value = "系统ID", required = false) + private String systemId; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/UserPermissionsInfo.java b/common-core-starter/src/main/java/com/mosty/common/core/login/UserPermissionsInfo.java new file mode 100644 index 0000000..7e7c133 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/UserPermissionsInfo.java @@ -0,0 +1,41 @@ +package com.mosty.common.core.login; + +import com.mosty.common.core.business.entity.SysMenu; +import com.mosty.common.core.login.dto.DeptDTO; +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.util.List; +import java.util.Set; + +/** + * 用户权限信息 + * + * @author Lhh + * @date 2022/06/27 17:24 + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +public class UserPermissionsInfo { + + @ApiModelProperty("权限过滤条件ids") + private String ids; + + @ApiModelProperty("权限过滤条件orgcodes") + private String orgcodes; + + @ApiModelProperty("权限等级(D_ZDY_SJQX)") + private String permissionsLevel; + + @ApiModelProperty("权限SQL(ssbmid)") + private String permissionsSql; + + @ApiModelProperty("权限SQL(ssbmdm)") + private String permissionsSqlCode; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/dto/DeptAllVo.java b/common-core-starter/src/main/java/com/mosty/common/core/login/dto/DeptAllVo.java new file mode 100644 index 0000000..f3c8f5d --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/dto/DeptAllVo.java @@ -0,0 +1,59 @@ +package com.mosty.common.core.login.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * @author dw + * @since 2022/8/1 + * 返回的组织机构对象,包含所属部门 所属分县局 所属地市州 + **/ +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value = "DeptAllVo 对象", description = "返回的组织机构对象,包含所属部门 所属分县局 所属地市州") +public class DeptAllVo implements Serializable, Cloneable { + + private static final long serialVersionUID = 1L; + + @ApiModelProperty("所属部门ID") + private Long deptid; + + @ApiModelProperty("所属部门代码") + private String deptcode; + + @ApiModelProperty("所属部门名称") + private String deptname; + + @ApiModelProperty("部门类型") + private String orgType; + + @ApiModelProperty("部门等级") + private String orgLevel; + + @ApiModelProperty("部门业务等级") + private String orgBizType; + + @ApiModelProperty("所属分县局id") + private Long fxjid; + + @ApiModelProperty("所属分县局代码") + private String fxjcode; + + @ApiModelProperty("所属分现局名称") + private String fxjname; + + @ApiModelProperty("所属地市州id") + private Long dszid; + + @ApiModelProperty("所属地市州代码") + private String dszcode; + + @ApiModelProperty("所属地市州名称") + private String dszname; +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/dto/DeptDTO.java b/common-core-starter/src/main/java/com/mosty/common/core/login/dto/DeptDTO.java new file mode 100644 index 0000000..97db76c --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/dto/DeptDTO.java @@ -0,0 +1,40 @@ +package com.mosty.common.core.login.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 部门信息对象 + * @author kevin + * @date 2022/2/16 9:42 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +public class DeptDTO implements Serializable { + + @ApiModelProperty("部门id") + private Long deptId; + + @ApiModelProperty("部门祖籍列表") + private String path; + + @ApiModelProperty("部门名称") + private String deptName; + + @ApiModelProperty("部门简称") + private String deptJc; + + @ApiModelProperty("部门编码") + private String deptCode; + + @ApiModelProperty("部门等级") + private String deptLevel; + + @ApiModelProperty("所在部门业务类型代码") + private String deptBizType; + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/login/dto/ImageRequest.java b/common-core-starter/src/main/java/com/mosty/common/core/login/dto/ImageRequest.java new file mode 100644 index 0000000..605b0a1 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/login/dto/ImageRequest.java @@ -0,0 +1,29 @@ +package com.mosty.common.core.login.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotEmpty; + +/** + * 图片请求参数 + * @author + * @date 2022/2/15 8:26 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@ApiModel("图片请求参数") +public class ImageRequest { + + /** + * 图片地址 + */ + @NotEmpty(message = "图片地址不能为空!") + @ApiModelProperty(value = "图片地址", required = true) + private String url; + + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/minio/UploadController.java b/common-core-starter/src/main/java/com/mosty/common/core/minio/UploadController.java new file mode 100644 index 0000000..100ee65 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/minio/UploadController.java @@ -0,0 +1,292 @@ +package com.mosty.common.core.minio; + +import com.alibaba.fastjson.annotation.JSONField; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.base.exception.BusinessException; +import com.mosty.common.base.util.DateUtils; +import com.mosty.common.config.entity.SysConfig; +import com.mosty.common.config.mapper.SysConfigMapper; +import com.mosty.common.core.business.entity.SysOss; +import com.mosty.common.core.business.entity.vo.Base64Str; +import com.mosty.common.core.business.service.SysOssService; +import com.mosty.common.core.config.MinIoClientConfig; +import com.mosty.common.core.util.BASE64DecodedMultipartFile; +import com.mosty.common.util.ImageUtils; +import com.mosty.common.util.UUIDGenerator; +import io.minio.*; +import io.minio.errors.*; +import io.minio.http.Method; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jetbrains.annotations.NotNull; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.util.ObjectUtils; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import javax.servlet.http.HttpServletRequest; +import java.io.*; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.util.*; + +@Slf4j +@RestController +@RequestMapping("/minio") +@AllArgsConstructor +@Api(tags = "图片上传服务") +@SuppressWarnings("unused") +public class UploadController { + + private final MinioClient minioClient; + private final MinIoClientConfig minIoClientConfig; + private final SysOssService sysOssService; + private final SysConfigMapper sysConfigMapper; + + + @GetMapping("/image/downloadBaes64/{id}") + @ApiOperation(value = "获取图片Base64", httpMethod = "GET", response = String.class) + public ResponseResult downloadBaes64(@PathVariable("id") String id) { + try { + if (StringUtils.isEmpty(id)) { + return ResponseResult.success(); + } + SysOss oss = sysOssService.getById(id); + if (!ObjectUtils.isEmpty(oss)) { + byte[] data = ImageUtils.encodeImageToByte(this.getMonioUrl() + oss.getUrl()); + BASE64Encoder encoder = new BASE64Encoder(); + String base64 = encoder.encode(data).replaceAll("[\\s*\t\n\r]", ""); + return ResponseResult.success(base64); + } + return ResponseResult.success(); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } + + + @PostMapping("/file/upload") + @ApiOperation(value = "前端上传组件使用:上传文件(返回文件的访问地址)", httpMethod = "POST", response = String.class) + public ResponseResult uploadFile(@JSONField(serialize = false) @RequestParam("file") MultipartFile file) + throws Exception { + if (file.getSize() > 0) { + return uploadOssWithBucket(file, minIoClientConfig.getFileBucket()); + } + return ResponseResult.fail("未选择任何文件,上传失败"); + } + + @PostMapping("/{bucketName}/upload") + @ApiOperation(value = "指定桶上传文件(返回文件的访问地址)", httpMethod = "POST", response = String.class) + public ResponseResult upload(@JSONField(serialize = false) @RequestParam("file") MultipartFile file, + @PathVariable("bucketName") String bucketName) throws Exception { + Asserts.check(StringUtils.isEmpty(bucketName), "桶名称不能为空!"); + boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + Asserts.check(!bucketExists, "桶%s不存在!", bucketName); + if (file.getSize() > 0) { + return uploadOssWithBucket(file, bucketName); + } + return ResponseResult.fail("未选择任何文件,上传失败"); + } + + @PostMapping("/image/upload/id") + @ApiOperation(value = "前端上传组件使用:上传图片(返回图片ID)", httpMethod = "POST", response = String.class) + public ResponseResult uploadImageId(@JSONField(serialize = false) @RequestParam("file") MultipartFile file) + throws Exception { + if (file.getSize() > 0) { + return uploadOssWithBucketById(file, minIoClientConfig.getImageBucket()); + } + return ResponseResult.fail("文件为空,或文件无内容!!"); + } + + @GetMapping("/image/download/{id}") + @ApiOperation(value = "根据ID下载图片(返回二进制文件)", httpMethod = "GET", response = String.class) + public ResponseEntity downloadImageId(@PathVariable("id") String id, HttpServletRequest request) { + try { + if (StringUtils.isEmpty(id)) { + return ResponseEntity.ok(null); + } + return downloadFile(id, request); + } catch (Exception e) { + throw new RuntimeException(e.getMessage()); + } + } + + @GetMapping("/file/download/{id}") + @ApiOperation(value = "根据ID查询文件的访问地址", httpMethod = "GET", response = String.class) + public ResponseResult> downloadFileId(@PathVariable("id") String id) { + if (StringUtils.isEmpty(id)) { + throw new BusinessException("附件ID不能为空"); + } + return downloadFileById(id); + } + + @GetMapping("/file/getFileList") + @ApiOperation(value = "查询文件", httpMethod = "GET", response = String.class) + public ResponseResult>> getFileList(String fileIds) { + List> list = new ArrayList<>(); + List fileList = Arrays.asList(fileIds.split(",")); + fileList.forEach(item -> { + SysOss oss = this.sysOssService.getById(item); + if (oss != null) { + Map map = new HashMap<>(); + map.put("id", oss.getId()); + map.put("url", this.getMonioUrl() + oss.getUrl()); + map.put("name", oss.getFileName()); + map.put("originalName", oss.getOriginalName()); + map.put("suffix", oss.getFileSuffix()); + list.add(map); + } + }); + return ResponseResult.success(list); + } + + // 获取minio的请求地址 + private String getMonioUrl() { + SysConfig config = this.sysConfigMapper.selectOne( + new LambdaQueryWrapper() + .eq(SysConfig::getPzj, "MINIO_URL") + .eq(SysConfig::getXtZxbz, DeletedEnum.NATURE) + ); + if (config != null) { + return config.getPzz(); + } + return "http://80.35.1.150:9009/"; + } + + @NotNull + private ResponseResult uploadOssWithBucket(MultipartFile file, String bucketName) + throws IOException, ServerException, InsufficientDataException, ErrorResponseException, + NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException { + // 原文件名 + String fileName = file.getOriginalFilename(); + if (StringUtils.isEmpty(fileName)) { + return ResponseResult.fail("文件名不能为空!"); + } + // 文件类型 + String suffixName = fileName.substring(fileName.lastIndexOf(".")); + // 生成新文件名,确保唯一性 + String objectName = UUIDGenerator.getUUID(); + // 文件类型 + String fileType = file.getContentType(); + String fileUrl = DateUtils.datePathString() + "/" + objectName + suffixName; + // 使用putObject上传一个文件到存储桶中 + PutObjectArgs build = PutObjectArgs.builder().object(fileUrl) + .bucket(bucketName) + .contentType(file.getContentType()) + .stream(file.getInputStream(), file.getSize(), -1).build(); + + boolean exist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + Asserts.check(!exist, "minio bucket %s 不存在,请联系管理员", bucketName); + minioClient.putObject(build); + // 得到文件 url + String url = bucketName + "/" + fileUrl; + SysOss oss = new SysOss(); + oss.setId(objectName); + oss.setFileName(objectName + suffixName); + oss.setOriginalName(fileName); + oss.setFileSuffix(suffixName); + oss.setUrl(url); + oss.setXtCjsj(new Date()); + oss.setXtLrsj(new Date()); + oss.setXtZhxgsj(new Date()); + oss.setXtZxbz("0"); + sysOssService.save(oss); + return ResponseResult.success(this.getMonioUrl() + url); + } + + @NotNull + private ResponseResult uploadOssWithBucketById(MultipartFile file, String bucketName) throws IOException, + ServerException, InsufficientDataException, ErrorResponseException, NoSuchAlgorithmException, + InvalidKeyException, InvalidResponseException, XmlParserException, InternalException { + // 原文件名 + String fileName = file.getOriginalFilename(); + if (StringUtils.isEmpty(fileName)) { + return ResponseResult.fail("文件名不能为空!"); + } + // 文件类型 + String suffixName = fileName.substring(fileName.lastIndexOf(".")); + // 生成新文件名,确保唯一性 + String objectName = UUIDGenerator.getUUID(); + // 文件类型 + String fileType = file.getContentType(); + String fileUrl = DateUtils.datePathString() + "/" + objectName + suffixName; + // 使用putObject上传一个文件到存储桶中 + PutObjectArgs build = PutObjectArgs.builder().object(fileUrl) + .bucket(bucketName) + .contentType(file.getContentType()) + .stream(file.getInputStream(), file.getSize(), -1).build(); + boolean exist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build()); + Asserts.check(!exist, "minio bucket %s 不存在,请联系管理员", bucketName); + minioClient.putObject(build); + // 得到文件 url + String url = bucketName + "/" + fileUrl; + SysOss oss = new SysOss(); + oss.setId(objectName); + oss.setFileName(objectName + suffixName); + oss.setOriginalName(fileName); + oss.setFileSuffix(suffixName); + oss.setUrl(url); + oss.setXtCjsj(new Date()); + oss.setXtLrsj(new Date()); + oss.setXtZhxgsj(new Date()); + oss.setXtZxbz("0"); + sysOssService.save(oss); + return ResponseResult.success(objectName); + } + + // 下载图片(返回文件的URL) + public ResponseResult> downloadFileById(String id) { + try { + SysOss oss = sysOssService.getById(id); + Map map = new HashMap<>(); + map.put("id", oss.getId()); + map.put("url", this.getMonioUrl() + oss.getUrl()); + map.put("name", oss.getFileName()); + map.put("originalName", oss.getOriginalName()); + map.put("suffix", oss.getFileSuffix()); + return ResponseResult.success(map); + } catch (Exception e) { + log.error("Minio-Obs下载对象失败:", e); + throw new BusinessException("获取附件下载地址失败!!"); + } + } + + // 下载图片(返回二进制) + public ResponseEntity downloadFile(String id, HttpServletRequest request) { + try { + + SysOss oss = sysOssService.getById(id); + byte[] obsBytes = ImageUtils.encodeImageToByte(this.getMonioUrl() + oss.getUrl()); + HttpHeaders headers = new HttpHeaders(); + headers.setContentDispositionFormData("attachment", oss.getFileName()); + headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); + return new ResponseEntity<>(obsBytes, headers, HttpStatus.CREATED); + } catch (Exception e) { + log.error("Minio-Obs下载对象失败:", e); + throw new BusinessException("下载对象失败"); + } + } + + // inputStream转换成byte数组 + private byte[] inputStreamTobyte(InputStream inputStream) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + byte[] buff = new byte[100]; + int rc; + while ((rc = inputStream.read(buff, 0, 100)) > 0) { + byteArrayOutputStream.write(buff, 0, rc); + } + return byteArrayOutputStream.toByteArray(); + } + +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/BASE64DecodedMultipartFile.java b/common-core-starter/src/main/java/com/mosty/common/core/util/BASE64DecodedMultipartFile.java new file mode 100644 index 0000000..1ccd367 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/BASE64DecodedMultipartFile.java @@ -0,0 +1,59 @@ +package com.mosty.common.core.util; +import org.springframework.web.multipart.MultipartFile; + +import java.io.*; +public class BASE64DecodedMultipartFile implements MultipartFile { + + + private final byte[] imgContent; + private final String header; + + public BASE64DecodedMultipartFile(byte[] imgContent, String header) { + this.imgContent = imgContent; +// this.header = header.split(";")[0]; + this.header = header.split(";")[0]; + } + + @Override + public String getName() { + // TODO - implementation depends on your requirements + return System.currentTimeMillis() + Math.random() + "." + header.split("/")[1]; + } + + @Override + public String getOriginalFilename() { + // TODO - implementation depends on your requirements + return System.currentTimeMillis() + (int)Math.random() * 10000 + "." + header.split("/")[1]; + } + + @Override + public String getContentType() { + // TODO - implementation depends on your requirements + return header.split(":")[1]; + } + + @Override + public boolean isEmpty() { + return imgContent == null || imgContent.length == 0; + } + + @Override + public long getSize() { + return imgContent.length; + } + + @Override + public byte[] getBytes() throws IOException { + return imgContent; + } + + @Override + public InputStream getInputStream() throws IOException { + return new ByteArrayInputStream(imgContent); + } + + @Override + public void transferTo(File dest) throws IOException, IllegalStateException { + new FileOutputStream(dest).write(imgContent); + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/Base64Util.java b/common-core-starter/src/main/java/com/mosty/common/core/util/Base64Util.java new file mode 100644 index 0000000..634f7ff --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/Base64Util.java @@ -0,0 +1,83 @@ +package com.mosty.common.core.util; + + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import javax.imageio.stream.FileImageInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class Base64Util { + /** + * 字符串转图片 + * @param base64Str + * @return + */ + public static byte[] decode(String base64Str){ + byte[] b = null; + BASE64Decoder decoder = new BASE64Decoder(); + try { + b = decoder.decodeBuffer(replaceEnter(base64Str)); + } catch (IOException e) { + e.printStackTrace(); + } + return b; + } + + /** + * 图片转字符串 + * @param image + * @return + */ + public static String encode(byte[] image){ + BASE64Encoder decoder = new BASE64Encoder(); + return replaceEnter(decoder.encode(image)); + } + + public static String encode(String uri){ + BASE64Encoder encoder = new BASE64Encoder(); + return replaceEnter(encoder.encode(uri.getBytes())); + } + /** + * + * @path 图片路径 + * @return + */ + + public static byte[] imageTobyte(String path){ + byte[] data = null; + FileImageInputStream input = null; + try { + input = new FileImageInputStream(new File(path)); + ByteArrayOutputStream output = new ByteArrayOutputStream(); + byte[] buf = new byte[1024]; + int numBytesRead = 0; + while((numBytesRead = input.read(buf)) != -1){ + output.write(buf, 0, numBytesRead); + } + data = output.toByteArray(); + output.close(); + input.close(); + + } catch (Exception e) { + e.printStackTrace(); + } + + return data; + } + + + public static String replaceEnter(String str){ + String reg ="[\n-\r]"; + Pattern p = Pattern.compile(reg); + Matcher m = p.matcher(str); + return m.replaceAll(""); + } + + + +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/BeanUtils.java b/common-core-starter/src/main/java/com/mosty/common/core/util/BeanUtils.java new file mode 100644 index 0000000..9101134 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/BeanUtils.java @@ -0,0 +1,104 @@ +package com.mosty.common.core.util; + +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * Bean 工具类 + * + * @author ruoyi + */ +public class BeanUtils extends org.springframework.beans.BeanUtils { + /** + * Bean方法名中属性名开始的下标 + */ + private static final int BEAN_METHOD_PROP_INDEX = 3; + + /** + * 匹配getter方法的正则表达式 + */ + private static final Pattern GET_PATTERN = Pattern.compile("get(\\p{javaUpperCase}\\w*)"); + + /** + * 匹配setter方法的正则表达式 + */ + private static final Pattern SET_PATTERN = Pattern.compile("set(\\p{javaUpperCase}\\w*)"); + + /** + * Bean属性复制工具方法。 + * + * @param dest 目标对象 + * @param src 源对象 + */ + public static void copyBeanProp(Object dest, Object src) { + try { + copyProperties(src, dest); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 获取对象的setter方法。 + * + * @param obj 对象 + * @return 对象的setter方法列表 + */ + public static List getSetterMethods(Object obj) { + // setter方法列表 + List setterMethods = new ArrayList(); + + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + + // 查找setter方法 + + for (Method method : methods) { + Matcher m = SET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 1)) { + setterMethods.add(method); + } + } + // 返回setter方法列表 + return setterMethods; + } + + /** + * 获取对象的getter方法。 + * + * @param obj 对象 + * @return 对象的getter方法列表 + */ + + public static List getGetterMethods(Object obj) { + // getter方法列表 + List getterMethods = new ArrayList(); + // 获取所有方法 + Method[] methods = obj.getClass().getMethods(); + // 查找getter方法 + for (Method method : methods) { + Matcher m = GET_PATTERN.matcher(method.getName()); + if (m.matches() && (method.getParameterTypes().length == 0)) { + getterMethods.add(method); + } + } + // 返回getter方法列表 + return getterMethods; + } + + /** + * 检查Bean方法名中的属性名是否相等。
+ * 如getName()和setName()属性名一样,getName()和setAge()属性名不一样。 + * + * @param m1 方法名1 + * @param m2 方法名2 + * @return 属性名一样返回true,否则返回false + */ + + public static boolean isMethodPropEquals(String m1, String m2) { + return m1.substring(BEAN_METHOD_PROP_INDEX).equals(m2.substring(BEAN_METHOD_PROP_INDEX)); + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/CacheUtils.java b/common-core-starter/src/main/java/com/mosty/common/core/util/CacheUtils.java new file mode 100644 index 0000000..241b869 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/CacheUtils.java @@ -0,0 +1,179 @@ +package com.mosty.common.core.util; + +import com.mosty.common.base.util.SpringIocContext; +import lombok.extern.slf4j.Slf4j; +import org.apache.shiro.cache.Cache; +import org.apache.shiro.cache.CacheManager; +import org.apache.shiro.cache.ehcache.EhCacheManager; + +import java.util.Iterator; +import java.util.Set; + +/** + * Cache工具类 + * + * @author ruoyi + */ +@Slf4j +public class CacheUtils { + + private static CacheManager cacheManager = SpringIocContext.getBean(CacheManager.class); + + private static final String SYS_CACHE = "sys-cache"; + + /** + * 获取SYS_CACHE缓存 + * + * @param key + * @return + */ + public static Object get(String key) { + return get(SYS_CACHE, key); + } + + /** + * 获取SYS_CACHE缓存 + * + * @param key + * @param defaultValue + * @return + */ + public static Object get(String key, Object defaultValue) { + Object value = get(key); + return value != null ? value : defaultValue; + } + + /** + * 写入SYS_CACHE缓存 + * + * @param key + * @return + */ + public static void put(String key, Object value) { + put(SYS_CACHE, key, value); + } + + /** + * 从SYS_CACHE缓存中移除 + * + * @param key + * @return + */ + public static void remove(String key) { + remove(SYS_CACHE, key); + } + + /** + * 获取缓存 + * + * @param cacheName + * @param key + * @return + */ + public static Object get(String cacheName, String key) { + return getCache(cacheName).get(getKey(key)); + } + + /** + * 获取缓存 + * + * @param cacheName + * @param key + * @param defaultValue + * @return + */ + public static Object get(String cacheName, String key, Object defaultValue) { + Object value = get(cacheName, getKey(key)); + return value != null ? value : defaultValue; + } + + /** + * 写入缓存 + * + * @param cacheName + * @param key + * @param value + */ + public static void put(String cacheName, String key, Object value) { + getCache(cacheName).put(getKey(key), value); + } + + /** + * 从缓存中移除 + * + * @param cacheName + * @param key + */ + public static void remove(String cacheName, String key) { + getCache(cacheName).remove(getKey(key)); + } + + /** + * 从缓存中移除所有 + * + * @param cacheName + */ + public static void removeAll(String cacheName) { + Cache cache = getCache(cacheName); + Set keys = cache.keys(); + for (Iterator it = keys.iterator(); it.hasNext(); ) { + cache.remove(it.next()); + } + log.info("清理缓存: {} => {}", cacheName, keys); + } + + /** + * 从缓存中移除指定key + * + * @param keys + */ + public static void removeByKeys(Set keys) { + removeByKeys(SYS_CACHE, keys); + } + + /** + * 从缓存中移除指定key + * + * @param cacheName + * @param keys + */ + public static void removeByKeys(String cacheName, Set keys) { + for (Iterator it = keys.iterator(); it.hasNext(); ) { + remove(it.next()); + } + log.info("清理缓存: {} => {}", cacheName, keys); + } + + /** + * 获取缓存键名 + * + * @param key + * @return + */ + private static String getKey(String key) { + return key; + } + + /** + * 获得一个Cache,没有则显示日志。 + * + * @param cacheName + * @return + */ + public static Cache getCache(String cacheName) { + Cache cache = cacheManager.getCache(cacheName); + if (cache == null) { + throw new RuntimeException("当前系统中没有定义“" + cacheName + "”这个缓存。"); + } + return cache; + } + + /** + * 获取所有缓存 + * + * @return 缓存组 + */ + public static String[] getCacheNames() { + return ((EhCacheManager) cacheManager).getCacheManager().getCacheNames(); + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/HttpClientUtil.java b/common-core-starter/src/main/java/com/mosty/common/core/util/HttpClientUtil.java new file mode 100644 index 0000000..6670c2f --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/HttpClientUtil.java @@ -0,0 +1,129 @@ +package com.mosty.common.core.util; + +import com.alibaba.fastjson.JSON; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpResponse; +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.conn.ssl.NoopHostnameVerifier; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLContexts; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.util.CollectionUtils; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Map; + +/** + * DATE: 18/9/3 + * + * @author: wan + */ +@Slf4j +public class HttpClientUtil { + + private static final String UTF_8 = "UTF-8"; + + private static final int TIME_OUT = 60000; + + /** + * post 参数json字符串,返回String + * + * @param uri 请求uri + * @return 返回结果 + */ + public static HttpResponse postRequest(String uri, Map headerMap) throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException { + log.info("httpclient调用地址为:{},加密后身份证号 :{}", uri); +// String output; + HttpResponse response; + CloseableHttpClient httpClient; + + if (uri.startsWith("https")) { + SSLConnectionSocketFactory scsf = new SSLConnectionSocketFactory( + SSLContexts.custom().loadTrustMaterial(null, new TrustSelfSignedStrategy()).build(), NoopHostnameVerifier.INSTANCE); + httpClient = HttpClients.custom().setSSLSocketFactory(scsf).build(); + } else { + httpClient = HttpClients.createDefault(); + } + try { + HttpPost postRequest = new HttpPost(uri); + //设置超时时间。 + RequestConfig requestConfig = setRequestConfig(); + postRequest.setConfig(requestConfig); + if (!CollectionUtils.isEmpty(headerMap)) { + headerMap.forEach(postRequest::setHeader); + } + + response = httpClient.execute(postRequest); + +// = EntityUtils.toString(response.getEntity(), UTF_8); + } catch (IOException e) { + throw new RuntimeException("POST调用异常", e); + } finally { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return response; + } + + public static void main(String[] args) throws UnsupportedEncodingException { + String uri ="http://10.68.2.210:7001/login/app?key=asdasd+"; + String url = URLEncoder.encode(uri, "UTF-8"); + System.out.println(url); + + } + + /** + * 绕过证书 + * @return + */ + public static CloseableHttpClient wrapHttpsClient() { + try { + SSLContext ctx = SSLContext.getInstance("TLS"); + X509TrustManager tm = new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + public void checkClientTrusted(X509Certificate[] arg0, + String arg1) throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] arg0, + String arg1) throws CertificateException { + } + }; + ctx.init(null, new TrustManager[] { tm }, null); + SSLConnectionSocketFactory ssf = new SSLConnectionSocketFactory( + ctx, NoopHostnameVerifier.INSTANCE); + CloseableHttpClient httpclient = HttpClients.custom() + .setSSLSocketFactory(ssf).build(); + return httpclient; + } catch (Exception e) { + log.error("顺丰HttpClient异常", e); + return HttpClients.createDefault(); + } + } + + private static RequestConfig setRequestConfig(){ + return RequestConfig.custom().setSocketTimeout(TIME_OUT).setConnectTimeout(TIME_OUT).build(); + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/KafkaProducerConfig.java b/common-core-starter/src/main/java/com/mosty/common/core/util/KafkaProducerConfig.java new file mode 100644 index 0000000..a865465 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/KafkaProducerConfig.java @@ -0,0 +1,70 @@ +package com.mosty.common.core.util; + +//import org.apache.kafka.clients.producer.ProducerConfig; +//import org.apache.kafka.common.serialization.StringSerializer; +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.kafka.core.DefaultKafkaProducerFactory; +//import org.springframework.kafka.core.KafkaTemplate; +//import org.springframework.kafka.core.ProducerFactory; +// +//import java.util.HashMap; +//import java.util.Map; +// +//@Configuration +public class KafkaProducerConfig { +//// @Value("${spring.kafka.bootstrap-servers}") +// private static String servers = "82.157.32.48:9092"; +//// @Value("${spring.kafka.producer.retries}") +// private static int retries = 0; +//// @Value("${spring.kafka.producer.acks}") +// private static String acks = "1"; +//// @Value("${spring.kafka.producer.batch-size}") +// private static int batchSize = 16384; +//// @Value("${spring.kafka.producer.properties.linger.ms}") +// private static int linger = 0; +//// @Value("${spring.kafka.producer.buffer-memory}") +// private static int bufferMemory = 33554432; +// +// public static Map producerConfigs() { +// Map props = new HashMap<>(); +// props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, servers); +// props.put(ProducerConfig.RETRIES_CONFIG, retries); +// props.put(ProducerConfig.ACKS_CONFIG, acks); +// props.put(ProducerConfig.BATCH_SIZE_CONFIG, batchSize); +// props.put(ProducerConfig.LINGER_MS_CONFIG, linger); +// props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, bufferMemory); +// props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); +// props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class); +// return props; +// } +// +// public static ProducerFactory producerFactory() { +// return new DefaultKafkaProducerFactory<>(producerConfigs()); +// } +// +//// @Bean +// public static KafkaTemplate kafkaTemplate() { +// KafkaTemplate template = new KafkaTemplate(producerFactory()); +// template.setDefaultTopic("platform-log1"); // 设置默认的 topic +// return template; +// } +// +// public static void main(String[] args) { +// KafkaTemplate template = KafkaProducerConfig.kafkaTemplate(); +// template.setDefaultTopic("2022-09-16---aaaaaaaaaaaaa"); +// template.send("platform-log1", "2022-09-16---bbbbbbbbbbb").addCallback(success -> { +// // 消息发送到的topic +// String topic = success.getRecordMetadata().topic(); +// // 消息发送到的分区 +// int partition = success.getRecordMetadata().partition(); +// // 消息在分区内的offset +// long offset = success.getRecordMetadata().offset(); +// System.out.println("发送消息成功:" + topic + "-" + partition + "-" + offset); +// }, failure -> { +// System.out.println("发送消息失败:" + failure.getMessage()); +// }); +// } + +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/RSAUtil.java b/common-core-starter/src/main/java/com/mosty/common/core/util/RSAUtil.java new file mode 100644 index 0000000..eaf26a7 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/RSAUtil.java @@ -0,0 +1,278 @@ +package com.mosty.common.core.util; + + +import org.apache.tomcat.util.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.security.*; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; + +/** + * RSA加密和解密工具 + */ +public class RSAUtil { + + /** + * 数字签名,密钥算法 + */ + private static final String RSA_KEY_ALGORITHM = "RSA"; + + /** + * 数字签名签名/验证算法 + */ + private static final String SIGNATURE_ALGORITHM = "MD5withRSA"; + + /** + * RSA密钥长度,RSA算法的默认密钥长度是1024密钥长度必须是64的倍数,在512到65536位之间 + */ + private static final int KEY_SIZE = 1024; + + /** + * 生成密钥对 + */ + private static Map initKey() throws Exception { + KeyPairGenerator keygen = KeyPairGenerator.getInstance(RSA_KEY_ALGORITHM); + SecureRandom secrand = new SecureRandom(); + /** + * 初始化随机产生器 + */ + secrand.setSeed("initSeed".getBytes()); + /** + * 初始化密钥生成器 + */ + keygen.initialize(KEY_SIZE, secrand); + KeyPair keys = keygen.genKeyPair(); + + byte[] pub_key = keys.getPublic().getEncoded(); + String publicKeyString = Base64.encodeBase64String(pub_key); + + byte[] pri_key = keys.getPrivate().getEncoded(); + String privateKeyString = Base64.encodeBase64String(pri_key); + + Map keyPairMap = new HashMap<>(); + keyPairMap.put("publicKeyString", publicKeyString); + keyPairMap.put("privateKeyString", privateKeyString); + + return keyPairMap; + } + + /** + * 密钥转成字符串 + * + * @param key + * @return + */ + public static String encodeBase64String(byte[] key) { + return Base64.encodeBase64String(key); + } + + /** + * 密钥转成byte[] + * + * @param key + * @return + */ + public static byte[] decodeBase64(String key) { + return Base64.decodeBase64(key); + } + + /** + * 公钥加密 + * + * @param data 加密前的字符串 + * @param publicKey 公钥 + * @return 加密后的字符串 + * @throws Exception + */ + public static String encryptByPubKey(String data, String publicKey) throws Exception { + byte[] pubKey = RSAUtil.decodeBase64(publicKey); + byte[] enSign = encryptByPubKey(data.getBytes(), pubKey); + return Base64.encodeBase64String(enSign); + } + + /** + * 公钥加密 + * + * @param data 待加密数据 + * @param pubKey 公钥 + * @return + * @throws Exception + */ + public static byte[] encryptByPubKey(byte[] data, byte[] pubKey) throws Exception { + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey); + KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); + PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, publicKey); + return cipher.doFinal(data); + } + + /** + * 私钥加密 + * + * @param data 加密前的字符串 + * @param privateKey 私钥 + * @return 加密后的字符串 + * @throws Exception + */ + public static String encryptByPriKey(String data, String privateKey) throws Exception { + byte[] priKey = RSAUtil.decodeBase64(privateKey); + byte[] enSign = encryptByPriKey(data.getBytes(), priKey); + return Base64.encodeBase64String(enSign); + } + + /** + * 私钥加密 + * + * @param data 待加密的数据 + * @param priKey 私钥 + * @return 加密后的数据 + * @throws Exception + */ + public static byte[] encryptByPriKey(byte[] data, byte[] priKey) throws Exception { + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey); + KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + return cipher.doFinal(data); + } + + /** + * 公钥解密 + * + * @param data 待解密的数据 + * @param pubKey 公钥 + * @return 解密后的数据 + * @throws Exception + */ + public static byte[] decryptByPubKey(byte[] data, byte[] pubKey) throws Exception { + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey); + KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); + PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, publicKey); + return cipher.doFinal(data); + } + + /** + * 公钥解密 + * + * @param data 解密前的字符串 + * @param publicKey 公钥 + * @return 解密后的字符串 + * @throws Exception + */ + public static String decryptByPubKey(String data, String publicKey) throws Exception { + byte[] pubKey = RSAUtil.decodeBase64(publicKey); + byte[] design = decryptByPubKey(Base64.decodeBase64(data), pubKey); + return new String(design); + } + + /** + * 私钥解密 + * + * @param data 待解密的数据 + * @param priKey 私钥 + * @return + * @throws Exception + */ + public static byte[] decryptByPriKey(byte[] data, byte[] priKey) throws Exception { + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey); + KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + return cipher.doFinal(data); + } + + /** + * 私钥解密 + * + * @param data 解密前的字符串 + * @param privateKey 私钥 + * @return 解密后的字符串 + * @throws Exception + */ + public static String decryptByPriKey(String data, String privateKey) throws Exception { + byte[] priKey = RSAUtil.decodeBase64(privateKey); + byte[] design = decryptByPriKey(Base64.decodeBase64(data), priKey); + return new String(design); + } + + /** + * RSA签名 + * + * @param data 待签名数据 + * @param priKey 私钥 + * @return 签名 + * @throws Exception + */ + public static String sign(byte[] data, byte[] priKey) throws Exception { + // 取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(priKey); + KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); + // 生成私钥 + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + // 实例化Signature + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + // 初始化Signature + signature.initSign(privateKey); + // 更新 + signature.update(data); + return Base64.encodeBase64String(signature.sign()); + } + + /** + * RSA校验数字签名 + * + * @param data 待校验数据 + * @param sign 数字签名 + * @param pubKey 公钥 + * @return boolean 校验成功返回true,失败返回false + */ + public boolean verify(byte[] data, byte[] sign, byte[] pubKey) throws Exception { + // 实例化密钥工厂 + KeyFactory keyFactory = KeyFactory.getInstance(RSA_KEY_ALGORITHM); + // 初始化公钥 + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(pubKey); + // 产生公钥 + PublicKey publicKey = keyFactory.generatePublic(x509KeySpec); + // 实例化Signature + Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM); + // 初始化Signature + signature.initVerify(publicKey); + // 更新 + signature.update(data); + // 验证 + return signature.verify(sign); + } + + public static void main(String[] args) { + try { + Map keyMap = initKey(); + String publicKeyString = keyMap.get("publicKeyString"); + String privateKeyString = keyMap.get("privateKeyString"); + System.out.println("公钥:" + publicKeyString); + System.out.println("私钥:" + privateKeyString); + + // 待加密数据 + String data = "admin123"; + // 公钥加密 + String encrypt = RSAUtil.encryptByPubKey(data, publicKeyString); + // 私钥解密 + String decrypt = RSAUtil.decryptByPriKey(encrypt, privateKeyString); + + System.out.println("加密前:" + data); + System.out.println("加密后:" + encrypt); + System.out.println("解密后:" + decrypt); + } catch (Exception e) { + e.printStackTrace(); + } + } +} + + diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/ShiroUtils.java b/common-core-starter/src/main/java/com/mosty/common/core/util/ShiroUtils.java new file mode 100644 index 0000000..839b228 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/ShiroUtils.java @@ -0,0 +1,75 @@ +package com.mosty.common.core.util; + +import com.mosty.common.base.entity.realm.SysUser; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.crypto.SecureRandomNumberGenerator; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.subject.SimplePrincipalCollection; +import org.apache.shiro.subject.Subject; + +import java.util.Objects; + +/** + * shiro 工具类 + * + * @author ruoyi + */ +public class ShiroUtils { + public static Subject getSubject() { + return SecurityUtils.getSubject(); + } + + public static Session getSession() { + return SecurityUtils.getSubject().getSession(); + } + + public static void logout() { + getSubject().logout(); + } + + public static SysUser getSysUser() { + SysUser user = null; + Object obj = getSubject().getPrincipal(); + if (!Objects.isNull(obj)) { + user = new SysUser(); + BeanUtils.copyBeanProp(user, obj); + } + return user; + } + + public static void setSysUser(SysUser user) { + Subject subject = getSubject(); + PrincipalCollection principalCollection = subject.getPrincipals(); + String realmName = principalCollection.getRealmNames().iterator().next(); + PrincipalCollection newPrincipalCollection = new SimplePrincipalCollection(user, realmName); + // 重新加载Principal + subject.runAs(newPrincipalCollection); + } + + public static Long getUserId() { + return getSysUser().getUserId().longValue(); + } + + public static String getLoginName() { + return getSysUser().getLoginName(); + } + + public static String getIp() { + return getSubject().getSession().getHost(); + } + + public static String getSessionId() { + return String.valueOf(getSubject().getSession().getId()); + } + + /** + * 生成随机盐 + */ + public static String randomSalt() { + // 一个Byte占两个字节,此处生成的3字节,字符串长度为6 + SecureRandomNumberGenerator secureRandom = new SecureRandomNumberGenerator(); + String hex = secureRandom.nextBytes(3).toHex(); + return hex; + } +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/http/HttpUtils.java b/common-core-starter/src/main/java/com/mosty/common/core/util/http/HttpUtils.java new file mode 100644 index 0000000..959d38e --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/http/HttpUtils.java @@ -0,0 +1,463 @@ +package com.mosty.common.core.util.http; + +import java.io.*; +import java.net.*; +import java.util.Map; + +public class HttpUtils { + + public static final String POST = "POST"; + + public static final String GET = "GET"; + + public static final int CONNECTTIMEOUT = 10 * 60 * 1000; + + public static final int READTIMEOUT = 10 * 60 * 1000; + + public static final String charset = "utf-8"; + + public static final String DEFAULT_CONTENT_TYPE = "application/x-www-form-urlencoded"; + + public static final String JSON_CONTENT_TYPE = "application/json"; + + public static final String XML_CONTENT_TYPE = "application/xml"; + + public static String executePost(String urlStr, Map params, + Map headerOpitions) { + return executeHttpMethod(POST, urlStr, params, headerOpitions); + } + + /** + * post请求 + * @param urlStr + * @param params + * @return + */ + public static String executePost(String urlStr, Map params) { + return executeHttpMethod(POST, urlStr, params); + } + + /** + * @Title http POST json数据 + * @author lijiaqi + * @description + * @param urlStr + * @param jsonStr + * @return + */ + public static String executeHttpsPostJSON(String urlStr, String jsonStr, Map headerOpitions) { + return executeHttpsPost(urlStr, jsonStr, JSON_CONTENT_TYPE, headerOpitions); + } + + /** + * @Title http POST json数据 + * @author lijiaqi + * @description + * @param urlStr + * @param jsonStr + * @return + */ + public static String executePostJSON(String urlStr, String jsonStr, Map headerOpitions) { + return executePost(urlStr, jsonStr, JSON_CONTENT_TYPE, headerOpitions); + } + + + /** + * + * @Title http post xml数据 + * @author lijiaqi + * @description + * @param urlStr + * @param xmlStr + * @return + */ + public static String executePostXML(String urlStr, String xmlStr, Map headerOpitions) { + return executePost(urlStr, xmlStr, XML_CONTENT_TYPE, headerOpitions); + } + + public static String executePost(String urlStr, String postStr, String contenType, Map headerOptions) { + String result = null; + URL url = null; + HttpURLConnection connection = null; + String method = "POST"; + InputStreamReader in = null; + try { + + url = new URL(urlStr); + connection = (HttpURLConnection) url.openConnection(); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setRequestMethod(method); + connection.setRequestProperty("Content-Type", contenType); + connection.setRequestProperty("Charset", "UTF-8"); + connection.setConnectTimeout(CONNECTTIMEOUT); + connection.setReadTimeout(READTIMEOUT); + if (headerOptions != null && headerOptions.size() > 0) { + for (String key : headerOptions.keySet()) { + connection.setRequestProperty(key, headerOptions.get(key)); + } + } + + if (method.equals(POST)) { + DataOutputStream dop = new DataOutputStream(connection.getOutputStream()); + dop.write(postStr.getBytes("UTF-8")); + dop.flush(); + dop.close(); + } + // 连接 + connection.connect(); + int code = connection.getResponseCode(); + // 如果返回状态码200 + if (200 == code) { + // 读取返回数据 + in = new InputStreamReader(connection.getInputStream()); + BufferedReader bufferedReader = new BufferedReader(in); + StringBuffer strBuffer = new StringBuffer(); + String line = null; + while ((line = bufferedReader.readLine()) != null) { + strBuffer.append(line); + } + result = strBuffer.toString(); + } + if (code > 400) { + System.err.println("请求出错状态码: " + code); + throw new RuntimeException("code " + code); + + } + } catch (MalformedURLException e) { + e.printStackTrace(); + throw new RuntimeException("不合法的http地址", e); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("读取数据失败", e); + } finally { + if (connection != null) { + connection.disconnect(); + } + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("关闭流失败", e); + } + } + } + return result; + + } + + /** + * https请求 + * @param urlStr + * @param postStr + * @param contenType + * @param headerOptions + * @return + */ + public static String executeHttpsPost(String urlStr, String postStr, String contenType, + Map headerOptions) { + String result = null; + URL url = null; + HttpURLConnection connection = null; + String method = "POST"; + InputStreamReader in = null; + try { + + url = new URL(urlStr); + connection = (HttpURLConnection) url.openConnection(); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setRequestMethod(method); + connection.setRequestProperty("Content-Type", contenType); + connection.setRequestProperty("Charset", "UTF-8"); + connection.setConnectTimeout(CONNECTTIMEOUT); + connection.setReadTimeout(READTIMEOUT); + if (headerOptions != null && headerOptions.size() > 0) { + for (String key : headerOptions.keySet()) { + connection.setRequestProperty(key, headerOptions.get(key)); + } + } + + if (method.equals(POST)) { + DataOutputStream dop = new DataOutputStream(connection.getOutputStream()); + dop.write(postStr.getBytes("UTF-8")); + dop.flush(); + dop.close(); + } + // 连接 + connection.connect(); + int code = connection.getResponseCode(); + // 如果返回状态码200 + if (200 == code) { + // 读取返回数据 + in = new InputStreamReader(connection.getInputStream()); + BufferedReader bufferedReader = new BufferedReader(in); + StringBuffer strBuffer = new StringBuffer(); + String line = null; + while ((line = bufferedReader.readLine()) != null) { + strBuffer.append(line); + } + result = strBuffer.toString(); + } + System.err.println("请求出错状态码: " + code); + if (code > 400) { + System.err.println("请求出错状态码: " + code); + throw new RuntimeException("code " + code); + + } + } catch (MalformedURLException e) { + System.out.println("MalformedURLException: " + e.getMessage()); + e.printStackTrace(); + throw new RuntimeException("不合法的http地址", e); + } catch (IOException e) { + e.printStackTrace(); + System.out.println("IOException: " + e.getMessage()); + throw new RuntimeException("读取数据失败", e); + } finally { + if (connection != null) { + connection.disconnect(); + } + if (in != null) { + try { + in.close(); + } catch (IOException e) { + e.printStackTrace(); + throw new RuntimeException("关闭流失败", e); + } + } + } + return result; + + } + + /** + * post请求 + * @param urlStr + * @return + */ + public static String executePost(String urlStr, String postStr, Map headerOptions) { + return executePost(urlStr, postStr, "application/x-www-form-urlencoded", headerOptions); + } + + /** + * get请求 + * @param urlStr + * @param params + * @return + */ + public static String executeGet(String urlStr, Map params) { + return executeHttpMethod(GET, urlStr, params); + } + + /** + * get请求 + * @param urlStr + * @param params + * @return + */ + public static String executeGet(String urlStr, Map params, + Map headerOpitions) { + return executeHttpMethod(GET, urlStr, params, headerOpitions); + } + + public static String executeHttpMethod(String method, String urlStr, + Map params) { + return executeHttpMethod(method, urlStr, params, null); + } + + public static String executeHttpMethod(String method, String urlStr, Map params, + Map headerOptions, String proxyHost, + int proxyPort) { + Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyHost, proxyPort)); + String result = null; + URL url = null; + HttpURLConnection connection = null; + InputStreamReader in = null; + try { + if (method.equals(GET)) { + urlStr = String.format("%s?%s", urlStr, buildParamsString(params)); + } + url = new URL(urlStr); + connection = (HttpURLConnection) url.openConnection(proxy); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setRequestMethod(method); + connection.setRequestProperty("Content-Type", + "application/x-www-form-urlencoded; charset=UTF-8"); + connection.setRequestProperty("Charset", "UTF-8"); + + if (headerOptions != null && headerOptions.size() > 0) { + for (String key : headerOptions.keySet()) { + connection.setRequestProperty(key, headerOptions.get(key)); + } + } + + connection.setConnectTimeout(5000); + connection.setReadTimeout(10000); + if (method.equals(POST)) { + DataOutputStream dop = new DataOutputStream(connection.getOutputStream()); + // 构建传递参数 + String paramStr = buildParamsString(params); + dop.write(paramStr.getBytes()); + dop.flush(); + dop.close(); + } + // 连接 + connection.connect(); + int code = connection.getResponseCode(); + + if (code > 400) { + throw new RuntimeException("code " + code); + } + // 如果返回状态码200 + if (200 == code) { + // 读取返回数据 + in = new InputStreamReader(connection.getInputStream()); + BufferedReader bufferedReader = new BufferedReader(in); + StringBuffer strBuffer = new StringBuffer(); + String line = null; + while ((line = bufferedReader.readLine()) != null) { + strBuffer.append(line); + } + result = strBuffer.toString(); + } + } catch (MalformedURLException e) { + throw new RuntimeException("不合法的http地址", e); + } catch (IOException e) { + throw new RuntimeException("读取数据失败", e); + } finally { + if (connection != null) { + connection.disconnect(); + } + if (in != null) { + try { + in.close(); + } catch (IOException e) { + throw new RuntimeException("关闭流失败", e); + } + } + } + return result; + } + + public static String executeHttpMethod(String method, String urlStr, Map params, + Map headerOptions) { + String result = null; + URL url = null; + HttpURLConnection connection = null; + InputStreamReader in = null; + try { + if (method.equals(GET)) { + urlStr = String.format("%s?%s", urlStr, buildParamsString(params)); + } + url = new URL(urlStr); + connection = (HttpURLConnection) url.openConnection(); + connection.setDoInput(true); + connection.setDoOutput(true); + connection.setConnectTimeout(60000); + connection.setReadTimeout(60000); + connection.setRequestMethod(method); + connection.setRequestProperty("Content-Type", + "application/x-www-form-urlencoded; charset=UTF-8"); + connection.setRequestProperty("Charset", "UTF-8"); + + if (headerOptions != null && headerOptions.size() > 0) { + for (String key : headerOptions.keySet()) { + connection.setRequestProperty(key, headerOptions.get(key)); + } + } + + connection.setConnectTimeout(CONNECTTIMEOUT); + connection.setReadTimeout(READTIMEOUT); + if (method.equals(POST)) { + DataOutputStream dop = new DataOutputStream(connection.getOutputStream()); + // 构建传递参数 + String paramStr = buildParamsString(params); + dop.write(paramStr.getBytes()); + dop.flush(); + dop.close(); + } + // 连接 + connection.connect(); + int code = connection.getResponseCode(); + + if (code > 400) { + throw new RuntimeException("code " + code); + } + // 如果返回状态码200 + if (200 == code) { + // 读取返回数据 + in = new InputStreamReader(connection.getInputStream()); + BufferedReader bufferedReader = new BufferedReader(in); + StringBuffer strBuffer = new StringBuffer(); + String line = null; + while ((line = bufferedReader.readLine()) != null) { + strBuffer.append(line); + } + result = strBuffer.toString(); + } + } catch (MalformedURLException e) { + throw new RuntimeException("不合法的http地址", e); + } catch (IOException e) { + throw new RuntimeException("读取数据失败", e); + } finally { + if (connection != null) { + connection.disconnect(); + } + if (in != null) { + try { + in.close(); + } catch (IOException e) { + throw new RuntimeException("关闭流失败", e); + } + } + } + return result; + } + + /** + * 是否是存在的文件 + * @param ulrStr + * @return + */ + public static boolean isNetFileAvailable(String ulrStr) { + try { + //设置此类是否应该自动执行 HTTP 重定向(响应代码为 3xx 的请求)。 + HttpURLConnection.setFollowRedirects(false); + //到 URL 所引用的远程对象的连接 + HttpURLConnection con = (HttpURLConnection) new URL(ulrStr).openConnection(); + /* 设置 URL 请求的方法, GET POST HEAD OPTIONS PUT DELETE TRACE 以上方法之一是合法的,具体取决于协议的限制。*/ + con.setRequestMethod("HEAD"); + //从 HTTP 响应消息获取状态码 + return (con.getResponseCode() == HttpURLConnection.HTTP_OK); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + } + + /** + * 构建参数字符串 + * + * @param params + * @return + * @throws UnsupportedEncodingException + */ + private static String buildParamsString(Map params) throws UnsupportedEncodingException { + StringBuffer paramsBuffer = new StringBuffer(); + int flag = 0; + if (params != null) { + for (String key : params.keySet()) { + if (flag != 0) { + paramsBuffer.append("&"); + } + String value = URLEncoder.encode(String.valueOf(params.get(key)), "utf-8"); + paramsBuffer.append(key).append("=").append(value); + flag = 1; + } + } + return paramsBuffer.toString(); + } + +} diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/http/HttpsPostUtil.java b/common-core-starter/src/main/java/com/mosty/common/core/util/http/HttpsPostUtil.java new file mode 100644 index 0000000..ef82502 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/http/HttpsPostUtil.java @@ -0,0 +1,259 @@ +package com.mosty.common.core.util.http; + +import org.apache.commons.lang3.StringUtils; + +import javax.net.ssl.*; +import javax.servlet.http.HttpServletRequest; + +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; +import java.security.cert.X509Certificate; +import java.util.HashMap; +import java.util.Map; + +public class HttpsPostUtil { + //添加主机名验证程序类,设置不验证主机 + private final static HostnameVerifier DO_NOT_VERIFY = new HostnameVerifier() { + public boolean verify(String hostname, SSLSession session) { + return true; + } + }; + + //添加信任主机 + private static void trustAllHosts() { + // 创建不验证证书链的信任管理器 这里使用的是x509证书 + TrustManager[] trustAllCerts = new TrustManager[]{new MyX509TrustManager() { + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new java.security.cert.X509Certificate[]{}; + } + + public void checkClientTrusted(X509Certificate[] chain, String authType) { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) { + } + }}; + // 安装所有信任的信任管理器 + try { + SSLContext sc = SSLContext.getInstance("TLS"); + sc.init(null, trustAllCerts, new java.security.SecureRandom()); + //HttpsURLConnection通过SSLSocket来建立与HTTPS的安全连接,SSLSocket对象是由SSLSocketFactory生成的。 + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 发送post 数据 + * @param urls + * @return + */ + public static String heart(String urls, String param, String contentType, String method) { + StringBuffer sb=new StringBuffer(); + DataOutputStream out = null; + BufferedReader responseReader = null; + InputStream in1 = null; + try { + trustAllHosts(); + // 创建url资源 + URL url = new URL(urls); + // 建立http连接 + HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); + conn.setHostnameVerifier(DO_NOT_VERIFY); + // 设置不用缓存 + conn.setUseCaches(false); + // 设置允许输出 + conn.setDoOutput(true); + // 设置允许输入 + conn.setDoInput(true); + // 设置传递方式 + conn.setRequestMethod(method); + //System.out.println(conn.getRequestMethod()); + // 设置维持长连接 + conn.setRequestProperty("Connection", "Keep-Alive"); + // 设置文件字符集: + conn.setRequestProperty("Charset", "UTF-8"); + // 转换为字节数组 +// byte[] data = (param).getBytes(); +// // 设置文件长度 +// conn.setRequestProperty("Content-Length", String.valueOf(data.length)); + // 设置文件类型: + conn.setRequestProperty("Content-Type", contentType); + conn.setRequestProperty("Authorization", param); + // 开始连接请求 + conn.connect(); + out = new DataOutputStream(conn.getOutputStream()); + // 写入请求的字符串 + out.writeBytes(param); + out.flush(); + + //System.out.println(conn.getResponseCode()); + + // 请求返回的状态 + if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) { + System.out.println("连接成功"); + // 请求返回的数据 + in1 = conn.getInputStream(); + String readLine; + responseReader = new BufferedReader(new InputStreamReader(in1)); + while((readLine=responseReader.readLine()) != null){ + sb.append(readLine).append("\n"); + } + } else { + System.out.println("error++"); + } + } catch (Exception e) { + + } finally { + try { + if (null != responseReader) + responseReader.close(); + if (null != in1) + in1.close(); + } catch(Exception e) {} + try { + out.close(); + } catch(Exception e) {} + } + + return sb.toString(); + + } + + /** + * 发送post 数据 + * @param urls + * @return + */ + public static String sendPost(String urls, String param, String contentType, String method, Map headerOptions) { + StringBuffer sb=new StringBuffer(); + DataOutputStream out = null; + BufferedReader responseReader = null; + InputStream in1 = null; + try { + trustAllHosts(); + // 创建url资源 + URL url = new URL(urls); + // 建立http连接 + HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); + conn.setHostnameVerifier(DO_NOT_VERIFY); + // 设置不用缓存 + conn.setUseCaches(false); + // 设置允许输出 + conn.setDoOutput(true); + // 设置允许输入 + conn.setDoInput(true); + // 设置传递方式 + conn.setRequestMethod(method); + //System.out.println(conn.getRequestMethod()); + // 设置维持长连接 + conn.setRequestProperty("Connection", "Keep-Alive"); + // 设置文件字符集: + conn.setRequestProperty("Charset", "UTF-8"); + // 转换为字节数组 +// byte[] data = (param).getBytes(); +// // 设置文件长度 +// conn.setRequestProperty("Content-Length", String.valueOf(data.length)); + // 设置文件类型: + conn.setRequestProperty("Content-Type", contentType); + if (headerOptions != null && headerOptions.size() > 0) { + for (String key : headerOptions.keySet()) { + conn.setRequestProperty(key, headerOptions.get(key)); + } + } + // 开始连接请求 + conn.connect(); + out = new DataOutputStream(conn.getOutputStream()); + // 写入请求的字符串 + if(StringUtils.isNotBlank(param)) { + out.writeBytes(param); + } + out.flush(); + + //System.out.println(conn.getResponseCode()); + + // 请求返回的状态 + if (HttpURLConnection.HTTP_OK == conn.getResponseCode()) { + System.out.println("连接成功"); + // 请求返回的数据 + in1 = conn.getInputStream(); + String readLine; + responseReader = new BufferedReader(new InputStreamReader(in1)); + while((readLine=responseReader.readLine()) != null){ + sb.append(readLine).append("\n"); + } + } else { + System.out.println("error++"); + } + } catch (Exception e) { + + } finally { + try { + if (null != responseReader) + responseReader.close(); + if (null != in1) + in1.close(); + } catch(Exception e) {} + try { + out.close(); + } catch(Exception e) {} + } + return sb.toString(); + } + + /** + * map转url参数 + */ + public static String map2Url(Map paramToMap) { + if (null == paramToMap || paramToMap.isEmpty()) { + return null; + } + StringBuffer url = new StringBuffer(); + boolean isfist = true; + for (Map.Entry entry : paramToMap.entrySet()) { + if (isfist) { + isfist = false; + } else { + url.append("&"); + } + url.append(entry.getKey()).append("="); + String value = entry.getValue(); + if (!StringUtils.isEmpty(value)) { + url.append(value); + } + } + return url.toString(); + } + + public static void main(String[] args) { +// System.out.println("123"); +// Map params = new HashMap(); +// params.put("client_id", "xx.cn"); +// params.put("client_secret", "UY83SNFJWLU32NJSLJIK"); +// params.put("code", "40ce7f41d6562e47dbdc33593ddce1b46444cdb93514b3aaced7be90eb51a16f"); +// params.put("grant_type", "authorization_code"); +// params.put("redirect_uri", "xxn/index.jsp"); + //要发送的POST请求url?Key=Value&Key2=Value2&Key3=Value3的形式 + //application/json;charset=UTF-8 application/x-www-form-urlencoded;charset=UTF-8 +// String sb = sendPost("https://id.pdedu.sh.cn/connect/token",map2Url(params),"application/json;charset=UTF-8", +// "POST"); + //System.out.println(sb); + String token = "NzdlZGU2MzctMWUxNS00YTg0LWFhZTktNDg0NGM2Yzk1YjhlLDssO3sibWVudXMiOltdLCJwZXJtaXNzaW9uIjp7InJlc291cmNlcyI6WyIxMDAwMDAyIiwiMTAwMDAwMSIsIjEwMDAwMDQiLCIxMDAwMDAzIiwiNzA0MmU3MTAtODYxNS00MjM2LWFkNTMtYWQxMjEwZGJmYzViIl19LCJ1c2VyIjp7InVzZXJJZCI6Ijc3ZWRlNjM3LTFlMTUtNGE4NC1hYWU5LTQ4NDRjNmM5NWI4ZSIsInVzZXJuYW1lIjoiemhqbXhmIiwic3RhdHVzIjoiMDEiLCJpZE51bSI6IjUxMzEyNzE5OTQwMjI1MTAxMyIsIm5pY2tOYW1lIjoi5pm65oWn6KGX6Z2i5beh6Ziy5rK75a6J566h5o6nIiwiaXBBZGRyZXNzIjoiMjIzLjg1LjIwMy4xNDUiLCJ1c2VySW1nIjpbXSwibG9naW5UaW1lIjoiMjAyMi0wOC0xNFQxNTozMzoxMi4yNzMiLCJ1c2VyVHlwZXMiOlt7InVzZXJUeXBlSWQiOiJlNzMyYjIyZC01YWE5LTQyOGYtODY2NS1hYjNkYzAzMDFmYjgiLCJ0eXBlQ29kZSI6IkpNWEYiLCJ0eXBlTmFtZSI6Iuihl+mdouW3oemYsiIsInh0cHp4eGJJZCI6IjAwOGM3MTI0LWU0ZTYtNDI2Zi1hODE3LWE0OTc3MWU1MGQ4MCJ9XSwianVyaXNkaWN0aW9ucyI6W3siY3JlYXRlQnkiOiJmNmIyNTEyMy01ZDk2LTQ0M2YtODU5OC0xMzc1ZDE3MTgxZTciLCJjcmVhdGVUaW1lIjoiMjAyMi0wNy0yNlQxNDo0OTowNyIsImxhc3RNb2RpZmllZEJ5IjoiZjZiMjUxMjMtNWQ5Ni00NDNmLTg1OTgtMTM3NWQxNzE4MWU3IiwibGFzdE1vZGlmaWVkVGltZSI6IjIwMjItMDctMjZUMTQ6NTI6NTYiLCJqdXJpc2RpY3Rpb25JZCI6ImJmOWE2NmE3LWRiYjYtNDljMi1hMGUyLWY2ZmY1NzJjNTBmOSIsImp1cmlzZGljdGlvbkNvZGUiOiIxMTExMTEiLCJqdXJpc2RpY3Rpb25OYW1lIjoi5LuB5a+/5Y6/5YWs5a6J5bGAIiwicGFyZW50Ijp7Imp1cmlzZGljdGlvbklkIjoiMCJ9LCJqdXJpc0Z1bGxDb2RlIjoiMDEwMDAwLjExMTExMS4iLCJqdXJpc1NpbXBsZUNvZGUiOiIxMTExMTEifV19fSw7LDsxNjYxMDExMjAwMDAw.b3770a53935980c9f413724f25541590"; + token = token.replace(" ",""); + token = token.replace("\\s*|\r|\n|\t",""); + Map params = new HashMap(); + params.put("Auth-Token", token); + params.put("System-Id", "XLFK_ZHJMXFZAGK"); + String sb = sendPost("https://82.157.32.48:28080/api/user-auth", null,"application/json;charset=UTF-8", + "POST", params); + System.out.println(sb); + + + } + + + +} \ No newline at end of file diff --git a/common-core-starter/src/main/java/com/mosty/common/core/util/http/MyX509TrustManager.java b/common-core-starter/src/main/java/com/mosty/common/core/util/http/MyX509TrustManager.java new file mode 100644 index 0000000..79dd262 --- /dev/null +++ b/common-core-starter/src/main/java/com/mosty/common/core/util/http/MyX509TrustManager.java @@ -0,0 +1,20 @@ +package com.mosty.common.core.util.http; + +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +import javax.net.ssl.X509TrustManager; +public class MyX509TrustManager implements X509TrustManager { + + public void checkClientTrusted(X509Certificate[] chain, String authType) + throws CertificateException { + } + + public void checkServerTrusted(X509Certificate[] chain, String authType) + throws CertificateException { + } + + public X509Certificate[] getAcceptedIssuers() { + return null; + } +} \ No newline at end of file diff --git a/common-core-starter/src/main/resources/META-INF/spring.factories b/common-core-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..0a69e92 --- /dev/null +++ b/common-core-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.core.config.DefaultRoleConfig \ No newline at end of file diff --git a/common-core-starter/src/main/resources/mapper/SysAppHomeconfigMapper.xml b/common-core-starter/src/main/resources/mapper/SysAppHomeconfigMapper.xml new file mode 100644 index 0000000..0c735b1 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysAppHomeconfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-core-starter/src/main/resources/mapper/SysAppHomeconfigPlateListMapper.xml b/common-core-starter/src/main/resources/mapper/SysAppHomeconfigPlateListMapper.xml new file mode 100644 index 0000000..d5566d1 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysAppHomeconfigPlateListMapper.xml @@ -0,0 +1,10 @@ + + + + + + + update sys_app_homeconfig_plate_list set xt_zxbz = 1 where plate_id = #{plateId} + + + diff --git a/common-core-starter/src/main/resources/mapper/SysAppHomeconfigPlateMapper.xml b/common-core-starter/src/main/resources/mapper/SysAppHomeconfigPlateMapper.xml new file mode 100644 index 0000000..dd50971 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysAppHomeconfigPlateMapper.xml @@ -0,0 +1,10 @@ + + + + + + + update sys_app_homeconfig_plate set xt_zxbz = 1 where homeid = #{homeid} + + + diff --git a/common-core-starter/src/main/resources/mapper/SysDeptMapper.xml b/common-core-starter/src/main/resources/mapper/SysDeptMapper.xml new file mode 100644 index 0000000..a591671 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysDeptMapper.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + ,org_code,org_name,root_path, + org_type,org_level,org_biz_type, + org_no,parent_id,bmpyszm, + org_jc,org_qc,address, + link_tel,link_man,link_man_tel, + web_url,email,xzqh, + bz,xt_zxbz,xt_zxyz, + xt_cjsj,xt_lrsj,xt_lrrxm, + xt_lrrid,xt_lrrbm,xt_lrrbmid, + xt_lrip,xt_zhxgsj,xt_zhxgrxm, + xt_zhxgid,xt_zhxgrbm,xt_zhxgrbmid, + xt_zhxgrip + + + + + + + + + + + diff --git a/common-core-starter/src/main/resources/mapper/SysLogininforMapper.xml b/common-core-starter/src/main/resources/mapper/SysLogininforMapper.xml new file mode 100644 index 0000000..ebc94f2 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysLogininforMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + info_id + ,user_name,ipaddr, + status,msg,access_time,browser,os + + + + truncate table sys_oper_log + + + + delete from sys_logininfor where oper_id in + + #{operId} + + + diff --git a/common-core-starter/src/main/resources/mapper/SysMenuMapper.xml b/common-core-starter/src/main/resources/mapper/SysMenuMapper.xml new file mode 100644 index 0000000..2560380 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysMenuMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-core-starter/src/main/resources/mapper/SysOperLogMapper.xml b/common-core-starter/src/main/resources/mapper/SysOperLogMapper.xml new file mode 100644 index 0000000..769696e --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysOperLogMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select * + from sys_oper_log + + + + insert into sys_oper_log(mkmc, title, business_type, method, request_method, operator_type, oper_name, + ssbm, oper_user_id, oper_sfzh, ssbmid, ssbmdm, + oper_url, oper_ip, oper_param, json_result, status, error_msg, + oper_time) + values (#{mkmc}, #{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, + #{ssbm}, #{operUserId}, #{operSfzh}, #{ssbmid}, #{ssbmdm}, + #{operUrl}, #{operIp}, #{operParam}, #{jsonResult}, #{status}, + #{errorMsg}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + + + + + + + + + + \ No newline at end of file diff --git a/common-core-starter/src/main/resources/mapper/SysOssMapper.xml b/common-core-starter/src/main/resources/mapper/SysOssMapper.xml new file mode 100644 index 0000000..7d31bdf --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysOssMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-core-starter/src/main/resources/mapper/SysPositionMapper.xml b/common-core-starter/src/main/resources/mapper/SysPositionMapper.xml new file mode 100644 index 0000000..ea2efcb --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysPositionMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-core-starter/src/main/resources/mapper/SysRoleDeptMapper.xml b/common-core-starter/src/main/resources/mapper/SysRoleDeptMapper.xml new file mode 100644 index 0000000..fac3104 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysRoleDeptMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + id,role_id,dept_id + + diff --git a/common-core-starter/src/main/resources/mapper/SysRoleMapper.xml b/common-core-starter/src/main/resources/mapper/SysRoleMapper.xml new file mode 100644 index 0000000..0ce5679 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysRoleMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,role_name,role_code,role_desc, + order_no,bz,xt_cjsj, + xt_lrsj,xt_lrrxm,xt_lrrid, + xt_lrrbm,xt_lrrbmid,xt_lrip, + xt_zhxgsj,xt_zhxgrxm,xt_zhxgrid, + xt_zhxgrbm,xt_zhxgrbmid,xt_zhxgip, + xt_zxbz,xt_zxyy + + diff --git a/common-core-starter/src/main/resources/mapper/SysRoleMenuMapper.xml b/common-core-starter/src/main/resources/mapper/SysRoleMenuMapper.xml new file mode 100644 index 0000000..85c8092 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysRoleMenuMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + id,role_id,menu_id + + diff --git a/common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigMapper.xml b/common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigMapper.xml new file mode 100644 index 0000000..a436c93 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigMapper.xml @@ -0,0 +1,10 @@ + + + + + + + update sys_user_app_homeconfig set xt_scbz = '1' where user_sfzh = #{sfzh} + + + diff --git a/common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigPlateListMapper.xml b/common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigPlateListMapper.xml new file mode 100644 index 0000000..9e6e7ca --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigPlateListMapper.xml @@ -0,0 +1,22 @@ + + + + + + + update sys_user_app_homeconfig_plate_list set xt_zxbz = 1 + where pz_id = #{pzId} and pz_plate_id = #{pzPlateId} + + + + update sys_user_app_homeconfig_plate_list set xt_zxbz = 1 + where pz_id = #{pzId} + + + + update sys_user_app_homeconfig_plate_list set xt_zxbz = #{zxbz} + where pz_id = #{pzId} and pz_plate_id = #{pzPlateId} and plate_list_id = #{plateListId} + + + + diff --git a/common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigPlateMapper.xml b/common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigPlateMapper.xml new file mode 100644 index 0000000..8366a84 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysUserAppHomeconfigPlateMapper.xml @@ -0,0 +1,15 @@ + + + + + + + update sys_user_app_homeconfig_plate set xt_zxbz = 1 where pz_id = #{pzId} + + + + + update sys_user_app_homeconfig_plate set xt_zxbz = #{zxbz} where id = #{id} + + + diff --git a/common-core-starter/src/main/resources/mapper/SysUserDeptMapper.xml b/common-core-starter/src/main/resources/mapper/SysUserDeptMapper.xml new file mode 100644 index 0000000..b26947a --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysUserDeptMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + id,user_id,dept_id + + diff --git a/common-core-starter/src/main/resources/mapper/SysUserMapper.xml b/common-core-starter/src/main/resources/mapper/SysUserMapper.xml new file mode 100644 index 0000000..4c63b45 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysUserMapper.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,manager_org_id,manager_org_name, + position_id,position_name,is_virtual_user,login_name, + password,user_name,user_type, + email,mobile,tele_phone, + id_entity_card,in_dust_rial_id,sex, + nation,politic, marital, type, whcd,bz, + birthday,begin_time,end_time, + salt,xt_zxbz,xt_zxyz, + xt_cjsj,xt_lrsj,xt_lrrxm, + xt_lrrid,xt_lrrbm,xt_lrrbmid, + xt_lrip,xt_zhxgsj,xt_zhxgrxm, + xt_zhxgid,xt_zhxgrbm,xt_zhxgrbmid, + xt_zhxgrip + + + + + + + + + + + + + + + + delete from sys_user where id = #{id} + + diff --git a/common-core-starter/src/main/resources/mapper/SysUserRoleMapper.xml b/common-core-starter/src/main/resources/mapper/SysUserRoleMapper.xml new file mode 100644 index 0000000..0479b10 --- /dev/null +++ b/common-core-starter/src/main/resources/mapper/SysUserRoleMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + id,user_id,role_id + + + + + + + diff --git a/common-core-starter/target/classes/META-INF/spring.factories b/common-core-starter/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..0a69e92 --- /dev/null +++ b/common-core-starter/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.core.config.DefaultRoleConfig \ No newline at end of file diff --git a/common-core-starter/target/classes/com/mosty/common/core/CoreAutoConfiguration.class b/common-core-starter/target/classes/com/mosty/common/core/CoreAutoConfiguration.class new file mode 100644 index 0000000000000000000000000000000000000000..ff7ccf9c5cac03eed4bf938988a0a6a5f50c3b1c GIT binary patch literal 534 zcmb7B!A=4(5Pby}6cG^hpf?XDigEX1yl6}aiKkT)FpQ{F3Z)X4 zSsDp*!=njBI-!pFWXO%o{Y9|i?xkfo3}c-JskUw&&?(i5j1fVfpqDw_*J>n_%y1{Q zI$@{}bY^04E_31SKUw~m&p5-@b*7w5#ZX#FWqV3#SEx|c<4~Iy? zVdcb=3-~vc+W1|*TO_9Qh?ML?;3xlrPp85RVxITv&G;mvHg{<-zZlW~8j*|))2#1 zT{j%n(GY(|J3@w)P;65m9J16DA2qB~$|#R2QB994YDQM+1N#rDrYT)fKB6Yma6>@S zTI39)b-A%~j8j}!4vsp=i~)oO=By8ChGLJZi3Dgdy@0K>np&^PE!Q;2)lS~|ZQ|n9 zCqI7kum>S?+01BZ9v3j$kZYHl3?7w|MnVZ0 zBEaQHJVE;4RATp!nRrzS&u{Z~0xJ$AyKTHHmh42nnS zSereyPZi;DxRo`(`1pA{Lz@vFgYt!G6U%XLy945EH&+bwwYT@L#cnHAk-&Y%Cjzoos!y5lL(iOkqubXDl$ zzM@b+ap64n>d7nDAK&^eo35o@9oP-?Y@~T<0;jiwTd<@W?Tj^sW&!OOBj;)TepqOm zH_@wQd*V)J)KMgJX5+fFfl z?%%|ow_DRSr-jk}f~Z85L35t7l||%ubK@XNs4N3fbV9ZQ64{QGjyZt&7Acg4DAobHZM(qWTLdccEJwK}Xbbs9&J&8)jXibi0w@Y*Ti*9oOZ3g<0 z1b4cp+w^8x!izZ%O|O^f=UZ|X%-)R(Pz;@?t&Z?+eF%xH79{MP2Ny|H|8b+yH{`Y~ zjFwDe@cIVutv@_~9$`}sl-ZAaj4JJPEaskbTD=~~U0DWV-rHk9_L9;M;b-m#; zJ8|Ni*|N!=GwYm|yQ9iOh&X--8{M5DDBGvDG1+W9bz$)}P{r10B=-4Yoi%qY$#dAx zCi3jm^NL7mL*pQ=!Jj5U{E33nB=!b8Rp5Cs)lfMt!P_vEQW@^`o9`0qY5J8)Hf%_v zFJkTrjF!+!dI|R(n70aYtB(=0VdGkit%J;Jn_i~%Hf^AdF>0VjOlT5An>cNzEwmM4 zRm7Izrr`GqehW(=^Qt!>U~bDmOL)-gvY=IzQhsC|u(cDDyL`y%GRW#O$m%l4Y6~LU z<|6Z8ye466pF+CBhqM@EJK^{;H)v;ZpBXeZPL*XoXr;cO4FK8^%slFYR-b`Zk6^wr zOVHkgXM^6iUDS*x8OGh2FnZwjNN_E_u4AliJmTs&>VAC*aNow)cidDxM(^U=dl~8De*;G|p!om* literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/controller/SysAppHomeconfigPlateController.class b/common-core-starter/target/classes/com/mosty/common/core/business/controller/SysAppHomeconfigPlateController.class new file mode 100644 index 0000000000000000000000000000000000000000..09367e26bf04ad3b8e64c04e49a38551e4161117 GIT binary patch literal 5809 zcmd5=YjYD-7=E|6&@?Sjgcb#)T-$P4#iB?NXlbE^(AK6c3f?x!X}XZ?F1wqS;1y9+ zW|R*yI(}dP6^Bovjtmq>`R?za1^$HNbM|bKO_Mh1fR_*1%h~sw^FHtM-cJ7f>&_oU z)JEt0^d`MkO#xDBC`^%RiW2kFD8=~e7{93ea-3gI@JrlJwUqFY<|AFA6;{gXFpM5O z!6Ldgs>TN5ip@gI99JVuqV8ZsPsj<~vQsji61s+)$>ea-QZ;5-vLz(t&>YLOOSC|V zMxB)<`m(v$noP4*>{oEf_TX`4Tsh_J8)vpWX4{6`g9}#~1B2{jl38|pOa3Nd#bR<) zPbjJ;4>HTpHH+b%jN4GKVxJxb-i1NH>PsfV%p6j}ag5Xl^@tK5QB0M;yMq<>m}*IM zD1Vb&>%gS8smJ5YER1Gf<~vlVG`Q&{da2l|bJ|CuI?hSf6cTML(Pk1=t42pOYJyk} zoLgFsD_Tqr*`}(+pksANjcJOVG@0O0W^tQo&+} zrs=j~tMCAcwg+`HCR+waIBF^hHldp*SgQm5i)BfG{|$7=|!K<+u`0!VGKk z>9X|`Op^~z*l^)tumKI$2UT6RCX`qVzK~thk~<8w-(aSr4dfc9Z~ZoP{>sB2zIu4| z=G2{w_b*{e{7OLv)3v~}dx0Sg@=bv*7-{`s}?5IW^{PGBY z#2RaIrw%Bb7n_+m^GherO$wcQG=;@$)48Zqu_I#=jW!F*C2ch>2UR2wS1~t^9$Sv7 zasnJKw`k^u5-rP3Gq9DLYWio$?#d@5H|NZm9e6O@nThvNm;5KpHCrU}LgMnaYWlOu zho4-SJz#2*2K-}J5(aX1tl zI*-L{at-Q8t(=(8^NGom`ZsOeIQ8k3hu?hf%|cV>FF!c@JA%BcJJ`+bR_~R$clYY_ znH$Jd7EBPa2b35x$f;7xgegjQ;Y!KZns-rO5M_p|MQ@2=Q(OrYLB4FSK)2OdH>~Ih zHL54&L@JC-W*PCMB^o89Ed@@f$c{WnPRwhWY=?*!;wdM`ll(+2@MLmvj{EPWK9A^KRN z-XbTSNTz2mOj;Hr3Vk+z_lJ)oB}&wkx4hGjIn76}F^nDrJy?v{z1dE@UDSnA4n5iZ zGA;YQybW``w-gUVqiHGQtXCVwkx?n?)N{5Vq7r(K6)m12rx;4KI19w>gzazEyw?v{co*3}t!}B6qOqEoRw=pWG3fvnv-zKTA^;as}v}KaY%jw83RB@Xs zf5NviT7qjGB#E|R-gB7UMo-|aRm`QOv)?jQcWST5mN9!%xKpP{}Of8tu%7->F+Duz$E5xcv;(N*XJ%e9u z8DySy2RO`aP_M#)cDf+6svKzL9%!9Vb|0X1%>u0rY8Qs~JoXQ`-`eN}JPEKn3V?ml z3wCEd*qv#x99?x8*5c?mvi1yVF&9}w4r#t}D$Lm+fQ4Y?ArG*I3}+1)&KfAqS$$E? z+8r1!LA!*`FQqx$?SWMaXL~Z7r3xZj;6>)8OaZbmkVR%emZmHpS(dT}`10J8?eSvW zI|J)p57s=&Ix@gc!zpLRnKVh&6&}vK$W8*81;T9)vc?Q&jnr9^Gj_tE)6UqHaYmQ5 zZh>UKClWin&Us)iWIfais(1#8A^>@2SmY#+N%EJ`Vfdw!IRqjHn~;BAterUS{$Ff(Z>f{F+t zYbh@*Sw64;6_*b#P?szyF5%tZK`K1?4_tm{W|B;rhNLb~A3B-KKIiOjfBSrUpZ@;W z-Frl|kM>TawiT5UCi-#1`3UgybiE>6=p{SOWlA39aNw`aDDt-(uMN+1sa?_Md$5INH zn5v!83^^9FS73ChrPRD!wG^ybblUdNVR=M8X0M;%mNaZxy0jM;;W}RQ@uMkjTJ5cc z3q@p;OEE1eE2`ATOj^9+mf|FG{wHR>E3<2K$R5HSiemRoBn>isZDklbILlMvJ z%PMPFF&Xs~E|MQ5gx4~(M1mW|5$(*{z>R8MP{AlzYUYx0V$>iw%7ui{>M~=;s8-Q~ zv6um(MF2#^rG%`;rLbivY8-ynhLyM~TPXv+{_y`Kb(_cU4oypNS#94A*BA7qkYh8L@9sncoU}Z?rBy&`b$B`GgIZY|3D?K_lY;RzGM|~ zefQ;~Yq!#OFaB}y`-#i<)0Z!$&z?!&7-!@c+275rVJ(IX?(GTpW4D1dJGB|jogxB^ zRu%ea?+iDi5?WjeX@cWw>_o8xnu@u>D3H;E{xKbvQt7EXTmcaSutrVS{%~g>++LQ? zO0O)UZ*k)v(&NfNhZY;dD)ku!>X5DIFr%RsCo(BZNk~HXo|dZA*xMP2HEZ&MjOOPH z3*zC5OL&s)w!*09t4v8P5NUsJGUg{St?lU(7UN?3R+JH!zZDaojX(PILb1HeY>&E> z9)p^?wWq20KB^h$-4*Qb#EyG#|Hj0{@#2;=_EcpJsknaMkf0Mo?>2p^fef4djjHSXqY=loRC^7sDz1#p|q?Z`y6aj2PElPrA$8hUGbe5-O(da!{_f z=Z?r)Qi*9PDLEEF?wEQaWjbvaq)~vE20}{DcYLn8rk(i zX&5bfOrL{kt1LN=(l`%Yl((&!_~Lr{!Z(aImmPdG@m6ke%sic;_HiNC$t{%3sZKNr z(Ixmu571FE0@Oe=ePjm6qLhzD0yIi3J~|elF*+Wg_vu7{PSOVf`j9>f&?)*jK&R=G z0QJ)uM%^V2R?+NnptzLfz@oFrsd`W3Fm#hqbHNgJgJ*X;UHSl;9&~PTZgu6F{C1~W zlvB!c>t#;^dkPlJPv>$|65XpQkMJ&a2&YtDGSf@;Jx-nUo?Kczuk2FEXm$>edrUxT z_V*2-60Iq~Rs0Oe$Y-XaQTxagbZf7@vct->D^GnU5^lq=a&kR)de*#iS?fV;R;TH4 zVmSCzVhG)snOkK#{$XT|)6p>6T?U}SlIt9e0RY!@09aQcOgF{hTEEEjWmh1&T? zLb;U(;#1kuI!Mj<=S)5RS;MG8hz0I^xSvI{sfy;{X_zW;N7S_T4zc}hzfi@Rb>mc7 zNe6zWsykHuBfeG8TwEJqN%SIB(*}&*NYCJ@%^6GcXg;1W3pL`8*>?-*S&Xd4*oCwR zV;AFX1udcH@Vg1)mcp+25HSASu*NJwjah;kDMQelk_2tFVYqCx zJ3epA5cY}()^^0EmY7I}SMewKs;>Zvf-mtxaJD1M+1QlGW_Xc#DU*RL0%Xx5$TE}_ zBFj^N`sOtXqCt9htpk1MCK~ gOE$prfIY_>_SYo<^d`O@w6*IHy@hXYXRY7)8yay2B>(^b literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/controller/SysDeptController.class b/common-core-starter/target/classes/com/mosty/common/core/business/controller/SysDeptController.class new file mode 100644 index 0000000000000000000000000000000000000000..d741128332bedeba8c267d4a6e664e0026b3005b GIT binary patch literal 14684 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/controller/SysMenuController.class b/common-core-starter/target/classes/com/mosty/common/core/business/controller/SysMenuController.class new file mode 100644 index 0000000000000000000000000000000000000000..381a97de634d405236a1dd95be56ffa7c1f83391 GIT binary patch literal 10219 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/controller/SysPositionController.class b/common-core-starter/target/classes/com/mosty/common/core/business/controller/SysPositionController.class new file mode 100644 index 0000000000000000000000000000000000000000..b354c0e1e59d00f33a88eba2ddc72218e8f3c5cb GIT binary patch literal 7460 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 V>%W2HO=*EQ;wI9ccI(h*{s)G`{3HMX literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/controller/SysRoleController.class b/common-core-starter/target/classes/com/mosty/common/core/business/controller/SysRoleController.class new file mode 100644 index 0000000000000000000000000000000000000000..c33fdf94a9f951beca5aa1842ea1d18a7fffddd6 GIT binary patch literal 19956 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 O9>9Yfzt6|;{oe<0KPj64 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysAppHomeconfig.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysAppHomeconfig.class new file mode 100644 index 0000000000000000000000000000000000000000..f3f0027458474fcc3544e416d768f153e3168ff8 GIT binary patch literal 10928 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysAppHomeconfigPlate.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysAppHomeconfigPlate.class new file mode 100644 index 0000000000000000000000000000000000000000..5647f1f0400694ada7ec4cae2dc30ae617300fa2 GIT binary patch literal 13734 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

tyM9ideJ7I#sMWV$BunG_g(>Yo1v1#i|!; zfmjRW2#drzL$EW&Y7lF&SZ9gVDAp3OmWs7ZtmR^@5bJEQn#5Wu)+(`9i?v3qwPLLk zYrR+-#M&s<#TEuDaj|x7Yn@|)^IvsOXo1jYezb5t6Ke+`fp@C@mp=lepRP!Jl0Nq zOnvR)?9VKNTR~8HtryhoQYQ>4yzDO^<67|MNXR3NWNZ!?$S3EMYmH>=C>Y4I^T`v9 zUA)mb3NXB-OfqYgzd83hxZ72hINj|y7NXGV+ zfxIlA++ieR+si;+kxz~r$=EJ4kel+!X(JiiYzFeGd~&amjO{rCc}+g~A|n~wdIs{k zeDW1WGPVN^IBPUMqcHj=U7Y#?vVC%DkHpe-u*f_EUOjKu%v!vKKvSUni zj5*G-V&ljLGtsf;I4g>cBm2=r$C=|a6&pvkuL;k7#_N4mv2kR#o9F~{oHfP9kXXUO1j)($!7H#*v+R!V62|JU15`M>h5eFFj|Q#uF+w zj(i6|cxh^k(^_mC`D}pj;??-O!o|jsuM7w;Z;kiC_G076M+t-%z{c@Jij5=RFc4lM z8{=##HjaGqKzOfWj1wz1j(j0OG~ax_62-=m4=RZ2&EwfxY#jOif@p#He5HzwBcE#! zEi{j(tJpa5bqCQR^LVxw8%I6{Av(i6o}Oak$hRXzXHtWbm1QI9?7HqEjw9Qzxv#ql z*LD1<3DIKomRDhA`1s^aT={SCs*=tE)<{bVlwj0Bb#bvHl}}VGTB;*1b3Z|$<%oJ! HidOs$Lv{#z literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysLogininfor.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysLogininfor.class new file mode 100644 index 0000000000000000000000000000000000000000..2d08a7ac09bb0d405ca8bdac894cc7f26562776b GIT binary patch literal 11938 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 C&%(z5 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysOss.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysOss.class new file mode 100644 index 0000000000000000000000000000000000000000..3aeba2010fe37f4d3765add06c6af2d0506cf0df GIT binary patch literal 15768 zcmeHNdwf*Yoj<=jnaoWxc|UIwFo8tKixA#k5D^doLqHNyuvQZ?z+fJjnIO?VtS{;V z#R{S*3iSahzFI{Ds%>}G-R^tsZo9g6wM&B7-P(O`w_5xCopbJ;$;?#;#s9V+dhYj} z@AvyV=ic+4_> zn$*Y7ev>xw^D2`D_!%)N%FjWQHuLjpleX}4$fRrdd96ub0A7~ z-lQA&d80`;@$+Vrw(|4aCf&l%TTQx+pSPQ|jh}azbSFQzn{*dHzhlzf{M=#EPJZ5F z(k_19YtnuE+-=hR{CvQqJ^Xyoq=)#q*Q9;?{H{q4bGsf1(4(AxjC)}}CkF!bcz~WD zkrxRKggbjyg$5$w{=SQrEF?ioNn|hR?~6n``=YBldj>;(^dbL`NEqR65(TXrJ2!VW z_jLBHZ*Gqcg!|UdCSk1{?2CqbL#x7(a92<0+`hj4XlE2bBP8lt!~M;Xt2@`P4-GVT z#+c@FH-(q=cZYgb4D@db4Mc|!$G@4YB$0dk$X&xv-8+2!f#Zjdp4{;?iKf=I{k_dy zo&CMx?*75%-k~nUk8J80jKsxk?&w7AOS%y$EjqLbff`e?E$Qxn8m^3U+uN6%-*!2F z3SV#cbQ0#ea8IbMvlp>4M(){q{OF(ZhdBdDSMkE zvUXDsw6(+czkK4BttXy4I{e^m9~|2~x#`5Q$4~5h6vZDLyS=4p_>uj9Bmx)~o5O46 z8$YlO%^2Q!GdjQP8nkx!k*y=&KLD^Lx?p2uBgT+wz+g1o)4Z@V${#U!a_iQU_uo9S z>(I$v&r50R084|zKiD~Z)1yv#U`w=hU|Z#5XM}eB&S<%exb~sQ@<;?@#lJojU4jlPnphV%lHGMB9rQAuhFJiM+?kk* z-11QqFkAD^)MMjCa;^ci>nRohUM(jQqYgQNibqu(n?h0{r%fhDaApLzcRs#x2A-Gb zDNx{qh@S*XpawoixWpOkZidH;o8iF`bYyB2I1#wB`SmYxhpG~~12ZnmG2^lvHOI9M zsJO9M99h+(29ASyaQGvtW9Cmx?w7h#?d5a?Q{4y<*Nw;}bff0oZbV*nBY@kDz`7fO zR5vb&Z>H0Wr`%4ge9;co>0F=N>Bz`V$J6QbdAh<_pPzDV88Vz6A{xt;Cez8tA>w4@ z5Q$}&b0WwgA}MDz3%WTOF)k~INQ{+3BtFZ0mRlf)h|0;eMb)@w3l9-9+OH-m){f9s zgPlEC0E*-LVR_fa(Awzix-~dg^p8F{XbR)3Ke{0_fR&vWkQ%PslqCwvLb(rTs8Wfu zWpQj{&QV;fAYTebZ_x!xG`cX?jpU5DyjU!!$dn?rb1PQjELrSq-$BJV*$hdlT{}}z zDx(Osd22#tG@(YHa;R-PsOoVBW45ly$*T{?>%RVQ3{~5lJzBTT$vULol~p|69OWi0 zYm-|kZ_TaG5HxI0MS`M^$n)SJ{%AM88mGIDWTdsC))$wYtu_R3|Qo8%6RLq1OR7z1lN`_ALJ2)Lm$vO#U)*wL3@s;yYL zWZ8L`i@@mvp~zrQ6q~)AXlXTSlGViKPZ2;3T$xbJUz^7QOWaO&GaSdw zaHOCkQ?W91mZNc8_2CububkQ5KRB>9#CsNIl{&Ue;tLRo=9I1$vUm8BfWuCKJQ!Wx z)fov*iVQ_A?~h=`tp2R)5ud14#lz3M^xkv((2nj@6z^iNCR`>l$QU z#Y?(?2RRCkZ~+47#S|q+bx6IQqU2b7NmnmQe!wL`?cza;vX|YucwI!nD_nqY(4-7c0;iru7HGC(*AnM$- zDb$C#-xPly(btOPn}!~fm}#T*&iN(j1nlTVwOB1K6C}PWDn+@tTwDR%i62W0(S`qG z3L?J_`3mIL18<0ku-J$UK)1LuBzifX~urx zVfH7Q>pjibS3Jz=iRLCxGqxcQb0EGry0jK z4|92`b4|htxA+c z?^Y1&0~v{*cn9*O9EcBWyj%X6cc8SC1E~`qi9h!aXIgmO* zllZB3pkT^@)QOwK-+2ehPC1Y|p_BM~@iVV)l#_BGb)qNnbMHX8DF;$F022S;{c3qB z2U0f%5^s73%1=3vx?zxb%R5j(%7N64gv3932P#ZCkh;N;c-uQrQObeTjfcc9ynC%U zTqxC_#sX8MSy>II7^5$ ze?$Fa!k>1q;YVWiZsGSGZ1|yAy{r*mc8$yeRJY;#R@-S!uZt`z?KP3VUj&=1v_s-j zM={>^Lo(h@xBRS0e@ztZ7ulBIN{gZ5GQJ}3n6N;i>yKx6=_kSRTL+hW*0*=%`UNuSyZA$#a2n2 zXog)1(G0uHDrHfb7L{6MaiUqa1<@?K+_G3yu0@tr9w)Nx3W#jG(yCxlr506Km2sju z_85rf*ki3REE=mtW2~`pqPg}N5Y4r#tTR|trA2307<%p~m}gf*G|wJqRkLWE7FAoA z+OBB6JszU@c8xWjMKxM9-ol)BMGNg(h!)ysTD2@XQ;TXXEC#MFLC`1#KeHNJPnzo5(~>V0pCe+5bt=lfn3 zzXtM)Wxm7W1E6%#tP%#Y}+r`H~CA7o13j5OgqLg+USK_~Nd|#B&OGYah zKo-4XEFvFJIsL+zKxse~blj*WKTxINGYm=x8e?S8hZF!BYfPlK$pkvXm_$FL44^7w z86BofplYL?zDHR=f4Jy`IQ-5m#k~6!zCV7M;6IqDFu5b}jfMH`yxDWo z&X!wxW!~%!Sjf!0hW#RdgVR^8;PUZy8WUEUW=!7Z6;*5dC50VcnoP^@P!sHQNu|3K z_I>55vjdXCmakm_hib4*NtrH%gMe~1*%^|;89=)-9IDyQlvJim;bfp(Eq0cqa468O zEQgwA2PGABsh~s6u(KtFQ-XG7JJc*YM^ZU1g|maI%eHeRg=2$uuce3nhhvg?1G>)Iz&RQbjI>~cw!yA)0+ z%C*w2kQ5Fl+Ew9D9d@OpDqRXk7Uf!HkC7BkE7~$jYLw9wpiJ=&eT0RNH?iN*FKHT3kV@!vnhumrEp(7(0Oe3C-9gQ+UyBduY@lKz1B?1xpc117f9*d9sMI(| zJV^6^%8WJQ209nWG6uy4nh#WtO>Y@30ID#a6jNv+P^Ix2w!ZU##t@e6tQWPg8fte z$x)Xk4-cuRb@1HOg2!5Z3I<(8UdmO(YB@EJt|iJL4(=QrDH>UK9H753D zPD3EwB-~cM$oEknO@F1+6H7PDIvov*eX-LPPB*XoG&L{Q!qXX1H?rdNH8R%D(;QSc zweqw!HP+hGA6GYc%;|1$tj%9aXx;3wUqZ8EE&sBjqw&I^Mf@89oiG23QwwM@t~whc R`1xolZaM%LP-}#i{Q=_b+Y|r* literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysPosition.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysPosition.class new file mode 100644 index 0000000000000000000000000000000000000000..9822251f26085b5cbe07af72fd6b5384abfa2b41 GIT binary patch literal 11968 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysRoleDept.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysRoleDept.class new file mode 100644 index 0000000000000000000000000000000000000000..b5ce8ace1900c985d0c8d628f05e327b0b9a9c3f GIT binary patch literal 2850 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUser.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUser.class new file mode 100644 index 0000000000000000000000000000000000000000..1978000b6a13de4e4c209225f7c13cd89d111be5 GIT binary patch literal 17182 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 F-vU|RE(-tv literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlate.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlate.class new file mode 100644 index 0000000000000000000000000000000000000000..1ded6263d63ce18b04bb47456f79fc2c149fb26b GIT binary patch literal 13800 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlateList.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserAppHomeconfigPlateList.class new file mode 100644 index 0000000000000000000000000000000000000000..c186b460abfb298d11ce53e3f6c12b2d2e93ba3a GIT binary patch literal 13809 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 A6#xJL literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserRole.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/SysUserRole.class new file mode 100644 index 0000000000000000000000000000000000000000..2e220c5983ab2b1b1a4d2426d3fac58d4a07edd5 GIT binary patch literal 3214 zcmb7FYf}?v6n=JdB?QF~6_J*xErkS#w^pm-4W)*Hr~$keH^~+jlWg4GSfRJ6|Dr#j z^@|_cnHp!>nNFu)oayiA&*;=XXLljtQcIJ`zVA8bJ!j8z&hwu9@%PWa0yvJZW9Y@L zHiU3n9(P2%8^OI8h5Iplf_d3JkcTE>A%bEI?YI>~3A*e)jbb5+MLAIr*@$9ELOm3r z97QFHY80kOwJ09RYDHj2;3!ayl7i03CGD}6Eo;?WtG##MFFW@zO( z-LeU9Hg`#ZGNGVjj94A5>dZ;At%)v+2T;UUW_m-jQxBY9v6SB~RZ`_n=BXWM!BS0JP=yY9qCkJoxe}dHW~%29FV<$mVL;yFOC>Hd@!bxL@@m z5L%CI@@dJ=jj>S{uY;blplek->vG1b7ah~OW|=kJatz%jmRR1bTSa}`D6>$VEsYwH zi>DyFeNJE1D$?F=mk;v=&DKZkWqaObxNtg-qqrVNKlyfIN=f>;(x|%^6z;xjD7Eo!(r*P{k!<(lxQuZYvzds;UJ}k#8D=)` zUTkAUt`sRrnv9h-n^&T19i?0)OS+>OO1jN!+EnfsUKeil&bF{`UCo(#@4&>rhr7xY5GTL?mxx^ti6{7P^=K+Qp$ z%0oKd!Ml{m9N*r~^*#P*AE1G3+H6Rp2N?{}Jj{qHM%>7&o`>(?2;%fQier2p=aJhy zB*SxO`X!Wf<^|OB&%y^9|3NZ=V_vTY#tU{z13t9s&W>WOhxPk_|-HnH^}%sj@3 z^b+x1CfCM^@FPs&N(+u@A4hb@l#7=MNBNWq}u-j-=?~aP9w(s6r#9FG}G9RYozFPg1^BG^Zd@R$+OTg z=N4y=m#JTzC<-jx72;522K#ujt_*}E!RD*NRD0Y8i)GkXhXb)$1?OJ~md zEt~@zo%^?Ro+5DXx}PF6X+v19da`-Ty}T1G@WX!IJnPRWg{9jvj=J4A-YipC{w?FQ zOr1C942LLA0Ru>*i_<`JBQAl&C2nxAgk%ubfi;pXaN>Y%d>_~* z#uvtp4}4*K4aPuloWzbd$!4>ObF6c$9WxSSH*vDrBiY#TzQ3w^rWtj}*x~T*xBkRG zuj+sA@2Z;W>Z+RV_P73gApL58}&0u#M^9YrbnNMZ`nF=zMWEPTHL}oFW zC1jS8sUowC%yKd-$gCu@ip**OMP|2in^9aeRI?D@>!hm`J82y zH8(|CtD9O^R5!HM`PO{+hyL%C?R}LqqrR52V8!O@E2>Kys+%^JR<*X&H*K86nONG^ z)LP$Ix1v5$U(--Gqp7L6wYn8SBb*gf)Hjz#uB_g;v96`GI^ijuv8BGUxwfuhaZB@- zx|Y_hh~sUlZmi=h_vC>mVt3x#`P?I&yRJX^$derp-*EEa^;A9|0@ooZljp}DcNrn^S>M{3==1xG4MNmgFF z3~Z<}XH->{&t15Fxoj+N%T{U;-xbtOoJ~1#Zu z+tAdg$ce)TI`6-Z7`L80z7vcShmSP1H8gy1>?Sntr45_~RMlfQUf=n`Q8etxQSWcx zp`t-Fax_v(34TL+oDXvBp<6hsmi*4gj>m32a=NPH#iOz3Zc5~hL8RD?cb+)@L?Ul2 z#P)7SZbN&mY?mFoJ6}55xjTCD;9lg`Zre)VCDO42yG~v6T<3EyptV}J z;B=$5zxT!1%@3Tq;f~k?$2)Jj0SAdhYS7O)>(+78_Sg##ox1kPQ+uAI3@>>Q$(gVD zRJx!u-~O%;t$kxP8cKU(x4#zK`7An1>;;tAR9*_+Q>mSP%GL~u-={0XJ_=Y79K{*u z@HO${P&Udzj6^vcet8t~I*;P;+eh)Yw^nU#*vi?kjxRmmaockpdmryOvg?Cm_fscX zT!!949i-!?TRI**()kR&CMnp~%Gt=2Mglp2%&D(ykYmWD^$j>>OH)!x(HscS{ru$% zt7b1<#@Sd^O7!cF?K@CP*{@%E^3?9_x?gu3crCxZNVN}%Q%UAJ&L)|bhbr4#kB(@@ZhRni^ho()okwR@PjzNR zE^jDZhS47vjm9nV?2=Ub>{3JXrPYzvx|a6FhSJT|8!n49H#x`U`AE-cZfUG;g*|B5Rsi)(B1=FPJj8?6Y&ev_^=+nSp&NqcMA=9Y4FqD)mx z48`(tA@e!Qj^|>`>fHZ4f{>@CQJxgasZJuhBWZu*208_0b(G(sU$bdrJGG2|`QlkK zmd&QK@xkq}UAK2U@N&mJ&r?Go2$86%f=-{^GU>|SLcPDclc0-_YLUK$vtCJFyBHaY zp(@hHN$OG^ibP|B3(JmXP@nS09=oCAr6~wX)EfR>K3*& z*3`AglLJ+)Xx@NXMK$IYxZ3JWZ|kOde0QVexzgAiY28|i3w9&A!G`9Ry3(4q2*N}n zrFED`z_+Ys{)UYWt1gwNOBxEYR9$L;=HQg0qE%qTq|a5T6ERlF>ky$TdF>(Je2lg7 z6I}AFk=GbP^W=4f&{BDk2-=l&UM9$0CNB+yD&^%M9cZP#1W@jLIqXX$2Yf;ma*!u9 zOAhQ*gk|U{q^;6JH+cysa;YyWh8m7DC4(^ak3@=iDrFC-N~H$RgvXAzN)L&|B21&5 z#&Qr*Se@lIrY_stZj$8lJ3|K2C!A>~RH0VIPb(^jO3_KAQuZm6NYQ};k|}#S)l`Mo z9X~7XQ++(4q^6^Woryl{i>R(TC%-^T96oiI1JYd%NOiecy0D2J_o<7jJ1IizP6`z7q`lNMNOw{o-ARFDC&g#H zlWL3(qmk@X66;PH$Fh^gQ?irFRJ@bMQ|JwGY{!dtQh4H>RAJRgCDxr(W9mEebR(YL zM?Y0VX6Uf;I%3)hRai&2){dG+*{x+N-mT*)*{$O#Il!y%cDIiEbhmb-Rd=Rt?XSDM zt-1ljW-n*IUR1NWZbR#&f;CvKHPdjLSdeKKA~d&ds>5|7jfUM2eKn@ckuY6ms>Mr& z%2o-*re%m`6I7YB*3g**RVFP2bS6O+SFHzhT$NA`wIt9El~7@5RiMKV)R~C`ZU$5# z)EYsDPzmKw%LMIE3FS~r0PRo-D?0VDX8+YBD>iRBHCGRVtw! z@`SS;GNBx5C7>NDp&V*4pdBiqnuOK^x}6BBQqhE;zTbc&u;1+esCgQgr=uI4K!-%CRQllu6sE2A{Z7B@<40%Bv=!xus0X7Ne9LQ?e3Xna)VK zQ3Qw6ZYff#@jaC}hgECa-r>Uv#`~7iZ(}~#X+_7_24Evl&3)$y`M6$ON zQe9gi>ItUIlYQ2&ARQ;s8Es7cj(C;-=oxxVn_wEVF@4U5H zZ8PFqn_S;i-#V3hik+83y$R{K3jQz4NzDIL9g@?|t=9j&wfyYY;`Axxxo+w6b+m#N zoDETxsi~`Oij>OT{g$>3t<5cZ=e@ozf^8R!lAvZ(HMg~FsKZ7Tt?d)b@DiG2ayIy{ zZRR6TwsXr8o8CCbYwIE#TI#pZF9NCVm&tK`A$|@(#9X;yu)d}`QdiPivwkzS2G+M@ zZy>-PU=Ie^Q)HecbCAr7WL_q7h|FO!N5~u_bDYfU>}vt`4Ki<1@+~soBJ&+G-zD=s zGT$fjHkluh`3aeK$o!1VFUY)0=9gqnkm(?ElFV<&{Ep1;*}n(ap9p#kKQjHv3?MU*%pfv( zWCoKNLS`rr1^6&B!znp}Og@WQxcXlPMunN@gUPQDjDw8AE0)nQ>$;A~T-M z1TquJSbS1|PbM^l%v3Vd$V?|QgS;~dm64f6W;U5QWZvOFMej(gf7Hl7v#q|Nwyq^$ zWEnY_Pb4~Vetqqffbpzx02k7tJi6vj!Ns>I@6rbK+0d>&+Z*u-23`9VqN~61ZMHv& z3l7Zz6rx#xLNpJM2YOCYXgZ)AG$8;=FUnI>0+maX0*x>&P>3c53enU62*qsOf=_7G z^gwwDCvxrRYLbBbOk%6~xicks(x;{hb_7bN7HDORJHD!onOd4!V(}n~_6JR(& zBdX~y5~fZ7;@I}|!I^5@V5ig+!kLos0;JQ^PdH_GnM5MX_R&@oH@+)vc8{p?BjF;;4J4n7}3&eIY0jA9!!h$eXv>i~J50~4cbSMT%W zeF0t!yIs96*^x0GclAbXF9zza-dAidM)0oQS8Xqb_O9Newijc5SMOJBFD?dMy|0n? ztEdsK5?#Gtx3#!@boIVrdvRUq>iwqe#RaFU_wQ^ku0&nE-?qKDM0NH4z3s)dtE=}P zY%eZqUA_NkdvUeX-b{Qxgn#(N;_%R%~Qg(Ix6CAjDc6Iy| z4qQ>YI(`lZuCiSn{|pDNyj>md!GWuBSI7Hs;0oQ<5rYF)ZS8QJ6`fT54tQ}n*WP|e zodW(<9s3vdulDKlYa*V63zvLN9E8*G1Dujw$-gD?Z$QS>;EYlKjflSk5z_}vEI`z* z5&wgTzi0mm>VHMpAJ`uw?7x9A;W%Ub4@veX5HTq^Bk|8f{0Kx$T+T$qT^S&L%nX{` zoRMgN2$De)AQvL{>Xzj`B6>i?BAY!t0Mq(xrGeE?I?2N=L zA_hRjr0tBvY$A385feL2O!PM1oxC~h65Py!xf^Uxbe~f2(5%cCewp#-0Sw*?)-N-M z@ZP`yMc}!-4^o__doE%lSv<^DjA^2a*pn>IcNJrL=_2+fiwj-Fn3lSTeaYeyS23ou zE@FSOc$BLc(_j~ITC#Yos~FQ~7qOWv9`7o~wA)3To-DRp#h9+Uh%=JKQ(VQE=DUb9 zlf~0r#aJG=hy%&uGFLH{6)xheWbqtVF_t4P;%>>}a#t~yF)rflWO0S77|S0QaZa*$ zk*gTXCKqw{Wbsm0F_v2{;$X6PxvLnim`lk5%)PnfVl0s`bHlEqiJim@HwA|9A5Zg&-98^J|9C|Ue@S24C9 zT*P_F;vKGHY+Ja92Pcbnx{9&g;UXTAEWX86jBOGZ@z7-P9j;<*uegXq$>O_R#n_f{ z5f4ii?{O7lJI6&lJX!pJs~ForF5(f%;(e}SY#+IZ^OMDox{9&wl z98MNL<0{5Bmy5VCS$xn{jO{TOaZ$4PC08-F)m+5I$>Kw<;<|+=AhmhId4+o* zU&?{hJ`3lS?t%O%2U1%yoG)|_l$LTJwR^+)BKJUM%7N5I59f>B1Er@NNbL!6zQjFH zM#_QI_7Uex-2-K&97ydnabCrjxt$_`lmn?vDbAO>2g*u0klMfEe1&_}x}_XQZFO+-YsU1Ad z*SQDknQ|bt*~j_C?tyxx97t^ra{f8@K)q8Aq&5>dU+*3$H|0QT^O5sQ+ynJVIgr|{ zT<0Kx&tohO7AO|pLu{1I7;X7L8EyH6k2wA}S#Uqg5h}2h;gy`!aO|klcG{x#K`VpzWCiN5j9i*w&0Fb6y1H}L$4b-FoVxWUG%^C#K zG%HUGB2u0v4H9_{(sXMuNYkw$Vla`0XwqOY#6g;24Fze26%s><6w;)jBIF>=w1$B+ z(;6;@5ox$44HLs1q%vy+NM%;O7(t|bO&THc9i&-S0Z6l~uqYr>Sd$6_`gOef&bA6c znr#({LLwDuQXw^QoHWNOMski-BIJ2cqDjS~#6g;Cm4YlP8c2(*>0%m@rfbqPG2KC0Y|Q{^u{Bf7Aks`tnjvO7NK33T zkd|1pL>ZB0X;PV(ZtX^tk%7IPe=Dr+uCRn|N)mq_z8X|9;(AT6`X zL0V?b7v)5nuSw-%zJs*fS^&~=t3oUwQiUch5ETy63ab*N71lygNu-6ER4EoZNGq*H zAg#0(i$z3QtVxT+Vh3rJwFIP9)>5&ANJ}+oiCF3&t+uK_T5T;8RYY2*NmXK*gS5t4 z4$>NHg;-9c6`HhMtZ)(mHE3Nb9UMVl|Q0Xwqu2#zDH+ zS_{&});h74Nb59dtypK1yw76a&Exo;SZ=m?9#fYtd$Y~Ik8kDM@Y``O|IPd={B~@x zkpC+FdE|Lm*x$y#0OVzJ{j2!ZKt5LKU&_A-5v8f)tKj zIeeIJ8^0N-J1_LL@>_s{e7{x&&Tfs>ce04cJRA^1b@x@F25V7FaL%2b-o*@A3xze%D)8E-|%=Jn{ zUXworG|brRHTXWD;l?q~`}|>`5ysa%Kj)7C_u<TNeh@WVjU zyjL58`Kv(Fy?YIV9|4--eUyL5j{?o~evSW}9|J1$zQupczXCMN+X>}ypxNGEu~ev8$cDlt9XdN z2~_FZf%{*-3AE7nF#DLl1+>Wb1p6cZJD|nBH`qJ;TR=;E-)3*~Zv!p${fb5TcYvyV zzhwvc-vcf4XR}@WyFknRz1YqCAAnZ)$Fj@#_kdRVEmp_>5oncvHJih~54769o=xXJ z09xa}nhoY}1FiL6hd%g2pmqF5xP{}7?B+D{L)I;g|M(-;JB|MYe z|AXzoyma%nUfEB?;7mWE_-L6yW4iO+ALkD!K6^}OK8)lvrgOS6T7?<<9RwN4nD^^B zlO}to$fZgDoJpH7Av1Fd_p`L(L+o>xQ2uDkOAg`H9+Q?U$~DIFNf%ZsQe+CB?HX(O zrOO|8Vf~_1n(rnj7mML9k+=T^=QjNFLr3-5rtxC6D6RZsB%80u%Y}Z69 zQ@XIY(W*?_Wmy5~3dCIj+cn9`k}j-vv?|MXO}4s8SGTweYams^DOR?0Vfmv~*|uw{ zl_Om_aTgXvN;S>uE?rm;X;pXIHQfqIS1|6vDoLqkSUsc*3nZ=TVY_BpJ*BH>+=XS6 zQk7Y~qzfx1t?FgFW?8+Zt9RUmb(B)gwsNHlODL_%wOw$%Yg>{)$4Ypm2ts&AiB<{j$O{tbx zL!}D~HLV(IyOvrZ=?cYNSiUJ$l{HMduyWI?VYX|THC(!e$6Z*@Db;dogmhskr&S|t z*9t3Ny7J>LEbx?SrBxtZSlek;f$dslg{3PTcVSpis?}DZbYZclRfV=|ja4LFMR6A< zs7kfgDwZyLurWn^v{`4BNLNW*g*Bm4U2K&~7nXziSf$d{-*sZkf2oEyJqUWdU*$jJ zKgS^G^B(8F05VvH_f`JS7#KZlsP|$1E|3?~lAZiLARk-p-OPUp@vpi{{re~JY)3X ze*o%lyvaY}e*_v}yocKUH_$-iLrj4F1T@H#i;3ZfKzW|gm@t0?G}u##Ewn!a4e@Nk z&sHA;4fR~hryC3?!+pM(*m_>&8JNsrV(WREePDQiMtDA8ZyR2qd~XJO)$joo zc!#lv3_noVJDpu?qyZIr*RoB92~_00f>j#nK*ioW*=QpJs00g{Tq6^xl%_=kJZ#O! zESGsPE#e$gAza@+##fq1qdXt8Ud(3`Y>xNzEKTz}XbEO=t|q6QPEPP$99m*_kt9^^ zJ}pdl6DG8O(XHhfe?gvza3+QhlKGc|B;x!Pk`5I(W2i*5zs}PEv;JDZM9h?^IxJ1M zWxs;_41coMdFA9h6}AqZom%ij$v=TWA0j8^LnMy!$u#;v-9O2J636<)GJUwojCfZ*XsiG`m_Z|l;Lj*p^JfqZz|^_4(j@+&(ps( ziY`p<-&UAJ%bbNkx=7d!_*>dXHJWavvlB}fOq`8^C0gvPh113BdzOlqDB;=iOm&a)g;7q$OcEo!2)XFskk@PM;j;6$0vNoZZ{f#;yuiIShI=(_NO&Q0MHbZJYB(I=c|H=I-b`<>S_)@kJU`n^n4#xS9Zktt!$#c7vR9U%K7KL%86QEm}BdT z7hH&nC+dE|4zH^pzChJaw7`Wdfo_Dt3)cvVcDTTW&`nWvL7O7c8W+ACxyi(!WgxeLy&B-;vtqRX2yiH-;k6aVH zO5t+CpI3N3;V&q>fbi7{R}lW9!j*)#D~ubBYl1rzUPSmBg>i3jP4HTUmk_>AVcbsK z6x^wB73E*AFzz6(3ErUaa>6$%jGKmQf;TC=lJLz6<38c0;4KQTru;f*qHSoorNKb7!DnLjMjqIl$Am{DeiMS7H_hebw|WrRg$lx2oR zAj$$^kricGVbLwhx`jn{lx2rSPL$<@MfWJ{9u~nU3x-9HDC-dxJ)^8=SoDgrUSZKY z%6f-IZj|MQMV~0^6BZ)ML|F8Vvc6%_FUtCbMgJ)49~J|mY(Q8HjIx1YF(}Fgg+*SJ z<%PxIC>tCWL!xX*SPYG_p<6T_*yQ;11`|)^=exU){Pri5&xAOtfD+Ta>tplQW z0(d2&hx&aI(Np<;iRiKVG>PcBcvB*JusvNOdNMsjB6_quQzCjcJRlK0+?^#6J)PZ6 zB6_?!TOxWsI!7XUz`46b^n`LyB6`HQheY&@FnR$>N)P$s&0|3HlrGgZN511PS0Z{& z7H=Oz9zEzPB%&u(`$|NQn)Z{3o)zsc5k2fVKq7itbD%`@xaA;;=y}OJiRgjH!4lCE zi$f%$M-GQdM9&O{B%+7@h7poa?G2ZR9=jVM5j{7TFA+WXRv-~QxfYg)9z83Rh@KrQ zl87GuDwZ$RybEJ)Hpbbf*RtXWdmzG|im+!R>|lhw7-26**r5nJ9AQTy>{x^ykFeJx z>>CmGW`w;JVc&|d??l*lBkX$-_WcNZJHmbxVLyqmcOvX(5%!A+dpE*<8DS^zmO;Ef z5N`#<`~L7IKfIL>@7u$h^ze>6y!{UEwZj|h@Gd&MWe)F;qnE_d848>9ia4C1$=$LK nb<3nz#2E&@aAp`mSv>*N11I^@5u>Nk3-1gydQ)X1M(+OrBv|&X literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/Ybmj.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/Ybmj.class new file mode 100644 index 0000000000000000000000000000000000000000..a7ce0666e66427c7101b1d8780b9763da2e207ee GIT binary patch literal 4433 zcmbVP>u(%a6+d@(W@mOi`|vi2Gc-_#xZr0teNj42O5G-*E_M=PH*LzJo%K%aarWWv z?51&ev?V;+LYqJXp_QnRkeUdBLJ_g01}gfcNPOlKd_roP^e^BGq5RI=8GF4uMJr_c z+}}Otch1~<&pCI-fBnzf?-0@5^m>Z=>12|Uw9MiZi*K;_CW~*e_%@4YHF_?E@p%^C zVW-oKzRTi!EWXd;2P|G-@gh@R(&&dN+C(RH`Vo&W>-36FXLLHN(~oufiB7NTbdD`Q z)#zs$ofi~yOM>!Ki}ne-P`0b{g_%a(tIu8tbOb4lj<^hw8N@r`}kGi+=sw#SdOso!pBZo~#Jk z)zuUI1@CvAGOsyt?ZT_q&c2KQiwl_D`0bn5&a7fq;@S0cS8iPX1%T%jD6c+U;WdK%OECpyH&Swzo7Ww z&=D{m!gd5@r`)P@pjjz8b$?}?sM?%eK4RBhKH5O3G!|UsL>_9T<~5cJ$WEnJ#ZY$& z#ioZao>y>?PS}nXD~p_xd8aXn+;18jipoBlAII8xd<3iIaWAhL<4mw;Ex>|&}0^y6am<6>Nk8(_p`lUS~uYg zrNQ4&t8kaiIOyZDd&)*HBYpPL zl2b)_jzzUjM>hpa9;fZN{rgE^)F{S>3p{{#&8?W-j=#@%P=3~-K^mfA*f1Y~8VLx9 zn=l)bhS89*6FOw4lTip6yTCx|IvIC_j61U?1x9svmBd>BG1?88@RfPm18hhF-A`Y@OmOW$Zgl5MXsa8}x#`y-uE-Vx4fyYoP#Guk4;InnMs80n05ig4E2okt^`(S{Mu zdb{(kNau%XGH|w#*cc~vc;pJjq7%JEGJ-^N5yzD{cV(#W4FIXybOLMeX=&~soE!cxZmLOrJP9`#-zW6V@m$Osu}O9dru zB}|n$iT5affzqaGCR#`tO9Lrm>88dcJs@eO-a^V+NszKu%1kmT6_Ao(s_D`z6zA06*^8|1L~nal0#nyGUy+8BR>h0rhnr0eF`XpJ9|6X zKv|K%yQ>J4qdDy1G1{u>|E7#arJJ-xBL}~_xCyNflm9Qow(#W;+$Q&7!O&Lq|O{hrUNjKHdl(iDRDY0fkol38qrTHe5XyB!Vrd~_;P5PP%g)6=C zR?;`2W&^LJZ`u}JJjdkbf+L92JLJ+Lwyq+z$ANhBt0)XEo*ncCRe%(*Pg500MY$|c z4Jbhk6w(rqMrY_wdKyTlUsE4SiHiqm7xR?)2nq#h7Xqm!AwELb^?8gHn@J4`AxGJ$ z3TTNI+B&mc8<4e)SNs3Bm6H0f*^hPP?hyd zuONl|@l?7>n~tv1=KPiw>f0#)pu}P*6z;{Q|3%w_wVl8pzF?pEFa3HMJpcdz literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/LoginLogPage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/LoginLogPage.class new file mode 100644 index 0000000000000000000000000000000000000000..f4ae2eecdca2477ca4784d5207df3f46a99a6492 GIT binary patch literal 2375 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlateListPage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysAppHomeconfigPlateListPage.class new file mode 100644 index 0000000000000000000000000000000000000000..fa10f5f68d89fd7f4f9de2e3803942385da56b3e GIT binary patch literal 2589 zcmb_e+jA3D82@dun@!U#l*lbuwLpcWX<1afkW#eVTar>+sDc;Rrfag8?8e;<+CKo_ znDI$xoZ-P2`ob_cBW2X__JTA14Zc=}cOOOko!xDd)DHSUr#pV!{{HSq z00(d>g)}C*Amg-HiYiJe?vr9Ulfo3<6x6h!W>lO_A%%$~&WU|iEN><8b`s|Wc|pZH z5_&z;wT#-V>3Wu9pBq0WL7I@zbJVdt-?05zqt-MP`W8Qu1hr8!d~38$RuN5^_b$(Y=q2O2u?_qs7t38dk}fH)~U_ z(=c6sfp(ND!mEVjAJ>0czW#*>O19m4Swgza>5T7Mfm?0))2qw3zFq$8+Wp1b5)y|j z+wu=fh-Y)N)I3V-5;hhs+nj9H=S=sk!Qg}~r_9U^=Ff9@r>&tK3< z)g7CgYwB}Nk7hhiH<>7TuK7{Z^n870!5eEdPC0e6?ARYzl_`Nz(enH$qhd0nRK@gz zJAqs}n`=uW!cL{cWRT^@3OBIYojt*I>)aKv!zN0FyztO7;~V76XnCmgu`(k8PHHVyYzU{I79gQ}r2*#)BK5Kltj-gR9r>|8Q$K9G7q!By`W4UfH!8 zVgNPl#4ZinkjbUmUMdYjQ?E@l9Ji zYdVh=%l7n!!7X@^bTOEG#9G0H9mSFoRnz8}4!5`BYTvgMImE5zZw1L;w1~rbvJc%?hr+%^82=sEvuA+=0*bn6=C!yj2bD?}weXGs5-8>s56f{mx_i#H=d8-tnwl(a znx?6#$!3@)sTs#~CUFw&^2KKQI|SpC|3GHH_nc*S!EN$`z`pNuf1dZbv48$^`xgLh zNR^`whssccx5RN+97hx!Er*OlAsiF;@p2MR2xu^blLFC07!r3ZgkeE96r2)xyc{Di z#c^7}841;nkv8?jfRT1g+d9~}Q-ZWlLgfzIa$MbV2lPb7kQs>hkt761?4)51Q?cu` zepc5Kx)s;DY%AU_A>5a-Tr+75n2tG=Fgh&Dc6FC#9SIFxrmZ>W^myDzYkHoeb)?L0 zd)P?yrtOrGc1LMPJ}aC`2+dsid}i#Xh$%31CUIUuZGqE%H*I=u?di+EPF?=u!HvnO zZ$5f>=Y!VP$b-ArX2vF_FJ74W^xDHa7hBgy?%)1w`rY?@NkQ2VnY#7e{kvb^pPZcf za4b*X7@5BE&eZ!i^OUy8%(oxUeEGvH<$@PYGA2RwNmHL(dN6*Sso7#$rn^l-X??>0 zg?8{+5*BosmeG?*4jJhKImPMGQmMVHNzArRnepC)?i#&%++Z5Z;)W|YqFS}}4F##o z)=Qzlb}z4s=CE^_^##OJ%bdKeqxJJmH9W(p6?*c6I$r1}8`HD*BwiPCZQnkN$i(Ui zR-&%Z`~IQRM$Bz*IKt_$=eA*%#jds85hE?3LR50??3kz?HHVgYOuw1SeU^{RGDJ8z zhCnL&T|IWDTTgk7!YNjeV8k)q+9e_-IHEfvey_3dIvGfBUuX9&MoKuCHk?etm7wH8 zkk|Si#qD|Pw=?OOvD*~Ax#B+?szr>u1kEe;kZvcuM{aILqls8O~#0>7pT;r;#C3cc}AnHVmCIk3sh{vW)*v|S3*?SE?O1iylYru zw`(j?+_W4mrStOkvL>FzRi00V-_7hBX40^@I3k5(kQ>6h!kp}}Tyx}S$EILk%#~+F zYWUv`2;ey^#uBhyh?OAB4@*Y;dEynkSMc+KgOy~kj88JwkipVE$yn#9vkAzmr!kGU z#9MB>1?h(8t$}CIBQ8ZFVbvEv6Pk(fQE1^gSNSKDT%V`Bx~MXHqKI zlmqjX>x(LHz{ad{JCjqwXqCpMn<#0VukOEku`iN+HHEVkkoYC!G2zNNrb z22_fC3x~a4IOYeME9NCc(avYo;XJmmt;MjI*h*R{>!sp6OF#}v=wC4x`~c~)RnCNP(j6$=)KC literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysAppHomeconfigQuery.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysAppHomeconfigQuery.class new file mode 100644 index 0000000000000000000000000000000000000000..5923d74f687f2c617a97131ae47871a813a61066 GIT binary patch literal 2502 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 YOt5pX{$=XryU+8)FVhQnF~m#%0`#cmdjJ3c literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlateListPage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlateListPage.class new file mode 100644 index 0000000000000000000000000000000000000000..2331b5fb3f1fe29063534aafbc3a40c468347043 GIT binary patch literal 3538 zcmcIm+iw(A82?Q>voqaJOIf+CHgXZ6S5^T*w}9NC*g~OD1r?cYhwZ@b%&;>Hl=uqq z1*0#LnDF2WB!&toXLW{!*#vT3VCUupm)UaGQkBapSMdHt0u|p@SRa_ z$}WtRJl`&bGrUJTFP>CjJidJO(a*OXzSibn8Y@_#Ene=F?7y!6`tbTS;cmMxL?ccR z3bFC<%H@Z*e-HxIEfsSLQgyD5hb1R+)|6@wzqtD7<{brzEspDi+Z43+^iI%n7kyH& zV8n6lgXQ9+T{>zpBypFQW3nu!jC9OY!)b>x9v;bg#Z1u)!kG-QqUZ7`*_p|5z-xja zV>3OJmF#n6I|wu5Gr=(?e~0hy_lkDTb5A?@C`u8^n3cDg3q5a#V^P9WJ-u~t#3?r; zaV<51tWSn8KNuxpQG;e$Gjx=;n6(| zi+G}B2jxOYX2pG;Ro~3je!UOcYWbuQda@h}lH*>vl(Y9bVl>t~v!BHbHE}1`}@yunC(@9Kx7_rM2BCQ?;|~6sAP4tbJyZdPE~_HE{tK1(;D_ z4y>qFWh?g|$y!~=&<9qC$`Dg}O?-gO3bG>bNy{rbQ(ie!oSEbv4*WuyJLqC)yJFL4 zNah_k$oLkIXisOv(&1{ac`tjNjly!+F1PDo{g70rvS!c_F6-E!Um2>pMboH{mHdJ& z<99~G%SiL5;1yCW=;n_FCcT1mJI|H;tqSlO1uXh}!Rr*T5#|flQo!bzFX%%Dnd~LP zLB5jVsqobL?nC*GNDI~xCL-oSiUCt9;0?SPMei$Y$ce9G|KnWMY?eK(+~xB7oa z;%jKFxB7oWVsxNy7J5VyF%Aw8WYxhx(4JNwVBt-egK2dZZ554VR-;NXn@DRyC-DHO zo9IYu=|r7Udse4Xd)7$nLdl4g^t4f@WM?M{!f#*JAI!e4_KQRMe za?FQ`wc#2U!2x1PyhlGaVS#S^jZPgSPq0MCDE}ME6D*Tx+kc>Znfp5~spwkKt(qu- z2yXs(%U;#0!D$Rh1ji2x#^g21724^v_Pd6*s9U45b$1O-vuH+F|4rzFv*A66T~ze$5OmcED@#oTNqEtP?=^$VQTs3|5F;)=oZ0P46UM2 z(NP;&v09=|t)@Ab8!PLL$~FBa0-7*Je)wcfaE5V;&At66bRNHt1*xuCEEJ`gMJn}@ z#M#)X)FO$u3w*J}O&+Nw1hZJ$e1plQzdg=z3v(uV=S1{n>f*Z}lH!-?BYaHoFI-IN A#sB~S literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlatePage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserAppHomeconfigPlatePage.class new file mode 100644 index 0000000000000000000000000000000000000000..b6ef8653ad073ba7ddc800902d77590a58a2f432 GIT binary patch literal 3569 zcmb_f>vL4)9e&>AoINL-U2`E^wq+_H*4)-bptjur4dGIv2}UAmu_~Ty4x2-E&sq1J zMMC?j9UZmGRHsu$r#O>w1lwV(I1)xt+kUY#{W}PlPyPemp7*?GFA1yi0fv3w-~IjF z&*cAKfAlGUo%nqm8*sc0J$PCkmOQ5Akuxw8M-0bJ*z!IRCowOfSrd*#PMVmLcfmwa z-mVEx@=FGuk$5={AAvk722Kfd`gYl|3R8C3cRcs#=zan5kU(;u=lX%=22)m{V(auu z{u2UP>CEU1)y7U*r>soDa`Txn&&>}Bq>fbFz$w~Oj_*tt?7gn*1y(?#zChoY<7ND3 zt$f}tXRJCWv$y1odoy-nqU@FIaxhOj`YHLOfVuqKD>pxR*WqhMsbB@ReAm2j{@+XI z&q<;-Jy$p_(B0t4WKecOUpyst^YXQ&H~;*_$1iN#mZquYg~b~$zqtI`yI*|#^0o)k z*FXB}jXyo7Bqe2gdgE*Z1F2DYdD&@t{ zn_^BNp-4-AdFAHC_XJ|Q9M=i<2(FVU{!tcnZ>e<1 zE802FJ>ldhWd0_syv_U?c{`X0i`d=U*O0uZjB&}Xrd!I6glXi_b7W2iYzCfsgJovwtpaPcw$Xz}rcc_rV5skL zj+D2uQ6mT6EQ85e?g1GD!CA|nRgKE79i@*GM@GjFFbKl2vh7z20f~`+=GNM5>RZ** z@(!P!^eW|?ebA8|zU6z{@_xBZ1UCQBnqd3>n1*ic?WKQx`1$1pf%X~O&y}5$+&cnm ztWs(D!rzt`uB6pme!lQd0s|OK;3v2{fvxiRDeg<45BCYIukSQf*^!Dzj|3jRg9D$y zBN%3h6ZjQ|6PUoG0$FK)+VYCdj91AN=cl=*{ZgUARdPD8UHKu%5Y0QTpD9_q!Zn_e z`-7Xmo+Q=9Yzn5?cDa(%jqP6>z`DYUtg@CX7>B8~7R0@gt=8V>1wI z!AAaAPvV=1xAWf2-xeSDkiix2{&cyQwm}t%T6s%T zW%gzhWqq~sy-k&WfnP?-L(EVMLpAybuArrVwYo~#IwcaNjKWb}*|W_JwcfTN)dvDY z*wxGn0ThE$&kIrEW6CmFtMs^M#h9lHvn+gwCj|03dxXzxxaI4R+~ z6x_k9yHmkk67J@)h&9cVtNL-c){k5W>Rs^%zT3`s-yi6|0A0H@@L%-20loFoz<z|hNWLA@m zlooMJSxUv~$m$`BRScEPlwM_ZWn&>LR%5ZY)Y{m*9EX%Ik;knl;s_?`sm_EyMyQ1e zJb|N(qLnLq98-iej>UHThLDb9SdZTliiK(ZC(Lh1(3oZ+m|Ff-@(mU1c#9;ggN@Ir|axkTCs!RQMn{v9Iae-QCIduA_fm&gNzJ?A^W+xcD3^v{3q{0d+_ zE=19alM#e*N-maMM&y#xF&gD=%VkVTjY~8k7e_9qCGCukbQBA4(m+P;S-H3dat6*C z$Q$q^!Pij`X!Pv7W2J}fyyv*tBmFxB#9o1h?QYidt*k$6r3oJ8Gv7{)t4$^P;LA%7 zCvVWp0>kQ;dJn(8`uD}@q6tYG8vAI1CKPq%&X0fHy*G3HlLuc+Q)iQtb^I*?_3a(Q z0-^2nN?_rDlePC1G9z~Wu*IO{{ceg0vzRuX17gUZa2RF(K+4S|GOp)eNDyV*EVsO! z7%6x(<9P|22_i3VpDoy)pBTE}9idl!x!fMcmvXaX&iKKCotIgNjN87XO5dB?JF21% z(j5x~R9Y6z5-BG}T9H@CWJm>xRT3gz#s2a3x#l~bVbn9zpXY5du5!cy zRuPApbt}y>wN$&Xf8?~C@_RduvGd*8?G>=tk*+^s=b1rS=GCPUFpJdkv7yXVfi9@9 z6+vkif@%cXrK8f8C*^FQT_H3K`Bv)8pp`4O93O(>{2D1MyHkcGXT6WUbzqIa?&ma#CidZN6YKE0i7gVX#|9G{%cG5-n^t}lG%Q7&KY3q=SP-69@*Lyd z#@{LrFOk6_&1bw!1`9Wz(M|@7IiJyq1`=6&u06aZ!Ci3II;SCS64YTW*Km>8L^fb5 z0lbRWcoMRpTxTo)jJg|hl;bs(*#k9{>*p#jtEtT1si7R2tGuG7GJCFuvNl(FRZZnL z@m8SR%M8^qRK2t7HtIU(s;iVORw6;lC>+#PAc@{uhU%Z$km>`0O|?A=J+mRzHv*e$ zd!#+HA=PI>&bSIqe9Z7;%+al`&MVMD*Sda3_&aFz*SdZ~c(A*33VQKKVC?JWk_`3y zfml3rA5D`md*Y!fL`o9Tq(+fwG91^WO!z*UC(#hs;^8WxSW>4@ENR4bDP#mfdfccI zGLsPsnaOB8B88%XP$V8L35BlF>-u>UkW2*UE0yWC>(&^T%8Ds#Xq8V@NVMAs=XEMtnv+o!Ys^ z-c6y+#j-7H?44lIjK;1>=siR79 zGK;mP*0S2=*rR+2Jg!Fu2XTm=YE1YLQ5_RFhQo}ao=@i>ju3^|p6f77q~R!*;9a6{ zG0i`~ctS#mX%>R1<=^U0s8~7INkR*>l0Zo&G@BHNg{#CWl5?qnus&P3B42|+6~@SK zm#PU)Gfw$(Z@r5JN2jr{xp4|jvNTg@Zhk>wHg;35I8cVM*;5Og;Kr cgB;f}XR>#W6~9c4y!SXy{4%|d6COVJ4{N#5xc~qF literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserEditPasswordRequest.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/request/SysUserEditPasswordRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..156e96a7de61041acf76ace410a93ac85f876c7f GIT binary patch literal 2656 zcmb_e&u<$=6#mBE^{$;w>bOl?Lw`X7Bym#nBS7mkfwWEAP$vyZ8)zvd8+(;(alB!7 z-OwW!#HBX`5+_cCLnVp?i3AdYOOg0LNdE~+`DS+=+lednfMn0SnfJXn?|tvh*nj=| z%WnXNQA(i)#UxZr$zfU!mo?0!IKL~0SqYev(iJ&emCJbz@1`_G%8cu*TCRVGe$?A$rDh4}55N3=>x<3Fa{?Vsr95ML z-kRg`>`c?ybG~Z_rzf|*UjO@t&mVsK87)`0vB|Bk?$@^yr|qikj|s&4`sW3dvpiT} zPtmSg)3udF%e`VUZt34CnU#6dwdFe6RQzR|iM&%RIV<@U$Mf&xDXlnFPOg<-ta)_f zd3lQ*Q0H2o)GW`>&)xB^dX_s;w*7hnv!P06x@7s2GNHcyrj#N&yQsX}oc6vJ)OO+> z#MNEXr5C!~+qcuBOu38N7N0%Mu*jtZb`aQbnqb6ch1s{jFE8G*O8!XybpheDRwYs~ z9LHa_Tmen8*DD)G4|W1E9c;Fgwma0e>~#jPMoGIuOk<;S&NoXRPnoMhso3X1o9ZRA zIw9lcnaifP99Em9pJZ4wvy)R3jGJ=8wY*xzXIBJ48NDrsCwm*`=)MzDB#@eOYHrCo zZ_9o;`s5;?khjFZb9mmsejG4x2!{J zfyPY@!#`8AD`i=gBTo*z&n}M|SO9}xz#=x!@?#Y z!RG3!Rb}ai+BI8Ko3=#9>(PR*ciR*3Bw6J%2E-AQTtna>R~?+Q{66F1St`i?Zp9HQ zSd-m~V}UuVN7ZpU%X1c-)qzcjA1TDp%P|pbCh-DgBLv_@yu_7|W#QOr{1amLcNllJ zHD)E-7{_-Sr`sB{1KJoXJB|0YH6Fr=$hg2HV=~Es+|P)$PkMidh?16sgar^}?B#ZT z;!o=*te3zm?focE>nAL)kQXG3N1SBLN#=DoH}D-)61BqZs zL7N`rP*8^cL`PP6fbMk|Ls?}5dL5B0sDva7iL5Fyi3iB6qcf{!6HTC0K_e(t(6gEZ z=@CfF>UEHEj{(JZ_0)|p&~19}@;Cl@do=$cAAm{tvn|j6K4B4R7(Ii$^#Zipge?uKD0ZRXxR7 zc84nIlhN%SB3RK-(G;kGY|cHX%qAgm_GNV;z$lJy7d_I!0;TieQN*SOd9pmtcm; z*EZx1HyNsYl!kwWacvWwnXV1&krZwqo#_tcB&SR!lv7gP%V7iic0LBpZ`g1|4gd56 Hb-nZ-#3=tD literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddDeptVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddDeptVO.class new file mode 100644 index 0000000000000000000000000000000000000000..1b0d19def56c52acac3bd3755707197a6ca8342f GIT binary patch literal 11250 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddRoleDataPartitionVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddRoleDataPartitionVO.class new file mode 100644 index 0000000000000000000000000000000000000000..93ca1b845bd994a5c2b3b9ddb5d0e60cd79c4399 GIT binary patch literal 2457 zcmb_eOK%%h6#lL~6FZKRCeEvF3T+{P6UUtb<Y0LA&_0JTb@}pR!!Gjs~FRkWqZ13+LkLYQZ#MN{YWpD z4M)=(H`;W~oVQCxWy!H?hU4949CcH#)D3~;qpi;$-T6Ug>n-V?zGOI6({&lJXlxo4 zflL#I70)q!6q(&G?(Kg1-R{?){Q2c)55K+h@cx!S+oWlk-g$v|Ze&$Jxx|zLM~bFp zEYz!OhI3sfVj0n1*DI^KW6E==RJ;w7Pna&Q+f}VFWG+__<8{nnya`>HnE!GDwRox)iO73v1 zktYCkfYBq-+-Oc0f_V}Nlb#(!W4VkE>w1Np_c!NST)SngdlMt?3JANk`r#D`w!IC* z5lG0I4a?R^`Wjz6>MJ8#DH~Wt-gT~c`uYd+dd=?#4n+dj8FyW`W+hCD8@js@v=sYm zjwqIv=jLY#lX9D5xb=$1*7Gs+4M*lkt=M&E-MDPZE*y&PpVM;U(m0N%(&$BB8d)3@ z7;Ma8K;Ol>St&^ljzx#bnWd>TZeTTyXE7|Ln*sx4CnIpt?m0ZqcZ{Twm%@erIRa_C zjsodRV+@5f&S6|&T*h3}?W$R_>ss~p8b34KTBXi``q(opIqw>eWz%xCn$FGtOwpF~ zGO6lrygujw60X;3hQ-Pknw#gKQ5y~|ba6Oa?Dw0kX|!7Haf%;}8GgdX_``C5-O5u3 z_W}M5x;V-UmgwIXLujXxb>#XqeKhWZyE?i9@x34N1lKlS*@Kgm(}4k#KEsocmE+p# z{3Bxbco{>(`BMw~gdB+B2y@?%mRk@r04P9SBjo;1ximv%FW;)^@NAo-A4kRXD7~?Xo6n;lXR(XJ) zEu;%sWxHX~F|N|2W4tY^N}IL^$ZVlAt7Zv52&3F()_7B4d;Qv63D6vn>)^ECO#OHd zXV@t*o@ekPb#eY9a2_vFQgDs-FH=%+6GPN%?6g-H{}fV*;|mQLl6Gv<54=V0*frR3-017h{|j`X$RX*?MzXg zNsK<27+y^D-Nl3lHM$UtMqe=TZ}1T#y!$BP@6JryZCPUi+0DJ@p6~NJ=icdW|J?iu zzNQC%Me%wZam;IYL+)qfa#q8e8qP`bttj3W zh!o74J690s&0a7r8hY8N7WJ%MElvoe78+I8s+dcbV=b4>nQGN`4cD@(j=&yI{R91? zQML*mQ_oZ2)(xxbI{Lir&Ns?sI*C?H$1#egz}CB$uipLas#Ums3ZPe*=mk&ToJlPG%G!6FtZ`reznwRSKJ1bZ2eEjX* zFFyR^(~mkUj`<=>CKZ{qs+Kz~5Kd>71e7DJSYT7us+#kS%CcEMZ4i2aWY*3b%8fhq8IQqE~Fky~HL|Dt47y-PD&G4&6A8ZnBM(U9|O?LScb;9A(p&PD%iZ zrYjF}0+Q)WcgX^ADo6_t!Ink~B)S-CnzfkgA{TSokxrz$17#k*gg70yGHiNowLK1CSbGmUQXoJb z`pubGGYg&i*vZd9lAn$c{|Fk_KAz;>50>g+J5nSbbMQC@DCvRNg0?IqK}Hx)dM*ZA z#yfrET}|WNYm8g67?s#9u6t;%a~Isz;p-6Jc>eZsjd;v0NRv+Z3dmrXCn3ATwbS@J zgud=F9$43y4P}+x#^G+`-Rl_p)yjmQ#xp?%6Lc10;OOwk_XrJlyYUO?_f>)dsO(`b z>wXr`1=-}*ItqJ^!stfgK}WI=g1-QoC`H+sL2~?D50K&*bCm`E#Sl^MrIFz;p(@u# zeu45i)bO>DpP}SNhgYF`M-q|wQ7+@k*ss`-Qf^`M3KC-}Wfjq;hBmHJMH`Q#RH+lW zh2#o)QfeyFR8p=n)`K-1_j720QNkg-zzqAah;eo}#NjxK3G%``O=FUjf|oh6Q>0Yn zIFi$(B6yMh2N8>Ee`8}5FWp0b6f^wS#64{H$r!(#@=6B?$T+fFsw`cm7y1u~)mC~c zlagjaz5;=p-)X1Pdc1dHQknAL8t9!U5iG5DWChW&Rm9FqzBaB%K}rcEnuL&|f%T!; z?|Thmhne;)jxnZ+0|ek0qsBRU$C*zUyRi*(q!bT^6HxAxp%4ZkSUQBbPo?%bBpH2B zn+i=GrIST9#^dW0RJy>J@^+?wK>W;gY)B?n(IX39#m3|&pVlPZOL`TX*Pnm?0;hwz K1hO9Txqks>SYrbK literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddRoleMenuVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddRoleMenuVO.class new file mode 100644 index 0000000000000000000000000000000000000000..a7075128d751e875e1e49e203cab2fec256c6b1a GIT binary patch literal 2707 zcmbtW-*XdH6h1fEO*ZKkN}z>k(Sj9|v}I8dp=qlHL5fMiwpKw@w#iPinC#ZwO|{Ry z$czkwGd}3}pd(tHVa6Y$foavz7o72L@UhtVIv1rFWg;X{mJgF*IvK@$iVx58y(unDb7>|_FGMLy8Hr~3{30J-lIXNV zXSn!sn9ec^S!PL_$TRB7oL3iArKB1KC1V8o^{koKN~bJyUbCD<#1R+NQbl7V)t26?UHDc_F&=#go?V5m;TLj2tx0gdgEc0$JBFjl+t(anqR>v?;y&l7K6 z`f7FMGY?JelP}h;EZ3GkU0b>Q*AMUhae)K9`Oe3GesIMD557lqLwCj)1ry0xM#2$r z#b|RzH?+x0c}}xtR8Y+*mN9c`X;!s#zV?-ZQ`Aw&!A#C9D`nGm7QtG%Y#Nv>O_{6M z2xHrdhGWCtf~kz>^HVtBEI61w$qO!M4p;CKk0p}rB{GV_fLptaH7pvWAVh!Nt)bkI zsfgXobRyB7D0%lKL=m`wupYUAC4CQ(ds;b1C;7ae_3<~dY*6t%fnvhU%$$-t8Fgb&Bit8^md!;X-Cbyo>k}F zV)3B3?}C(5jiVeEu5D4Zi(a3iX(y2N)YL@wC}2SjS(;rbIk>2ed{TcSw&a-8j-?v~ zT;F=zxG#*SMK?vK&5D)Nj_GdGx3ueCUa(BN=^>f6(l(iP(gTbR++FX>^fWyoQ<73L zo>52xG$_+J9cHw>NvsF!a78cWIj!9-coH7JqcXihukztFz#r`MiyZ|YNtuolNa<=u z^o|NVsq^!ifm=7U{)~MZ*5AVx2q37%zTOk-dZE>xcH#Mt;ZqU7A4tR4jTN7J2&LMz zgW?eGv*~{7#ZD)&t<+QnILR=6&<)Y&I(NX{ciu%2EN~(i`(dJBW|+m)HDcemJ`ZCI zxyr4y2eRxL&?A(<3Lg$iVQh8&jsjn|Imb72#-RaRyK}JJxpxC+uc9I3-s{5VLDC2o zz#L8ud{2Q?dl;{P9?!%t0LCt_yzYJUsE;PQK2XpN6r^@0?hM4aX7m^kcr1m%ejhX* z*2f{CRWWj`eHUy{LZfAo3mo6?iRCz)?s6{N~z6$Dj}5{%i*+ zoElEU2@-BYA%F(PP&zSo8%E7_fGfI5tQ*vAgjN;IkPk1AU+ENb^4pnMq3G#r)De@b i)X593(x%vEPnNjc1-VLFHtv6~H4}ba3}`v?&;18PW@O0# literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddRoleVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddRoleVO.class new file mode 100644 index 0000000000000000000000000000000000000000..78d4056f3a45820c035f015e300d02a0828da6b0 GIT binary patch literal 4442 zcmbVO`*Ryt75=WI)vn}~tT?d~wP|r$)A$)d2roHlNt%QhY$qhaq@_UD@?tC1!_ltX zCOq2!C56;!XLt_Gz`)cn6Cgb5bWC~uQfBy(pP1n%W*R&E4=Lrldsot0S_Zc>nsd*+ z=ljk*_ndR@>Tmy9`y+q@cp-^*h)cgC$1EA!(5+0*rkTP)i%MW;AhvJY1(Ro8Nh)rupq*CRZYTe3>U zId3snpuw$K#ft0XrmOC;@}hf@Ui7l!v6#oJeYbL-mGjg=d(zjF2V+Z#W6dUGJYQ)Ti~bkueV&F$8gmv8^+29H&(&Dpi-s=)R@?j|a( z%_H#G5B%Q*P1j2$0(;k=fAQAZ@~!2YnsNod{=>`v{@%5XUtHN(TOsFQu~Kv&6o?KE%?QNQ`MW2J6??i~ zp0#UdEml_6zgn5Mnxm>MqsM)#Mxwks#9!FCJ|1=7@Pu?9%R)tIS-C+Xm1Bgws+_^mW+1RY^= z`Zyj9OG}p%4CBOLXB0zk^L)NzKXiZQht63u^oih}jmY2TrWzf4$K@D$+_-(AZk1TI z-r%k$XV2ROcYNqk0l|(9-ge(4pjF)kyC#s5RUc?Q4QX#Zu+RdiqXz(Lp#@Oc2mt)6 zuElz>g6j~m18nd++x9U z7F684BNNQSsnZiv$CxPU@tW<_ORhj7aDJsLiqh4ojDh9}q60GI9Rr~u8E#eezd-U# zwO%XO$BXg~rkl5CpL~o>ydNJh@ecHx7?NUCihanLc#qWHi++LqZ~bbTn8isG58@#c z(^C78)DBB=1P_}yDz#%$6fh^Sv;D(xq+TrX<>NEdjCZinEr(1zk7eHd(SErkb9AUV zlUd>{Ioj{%$wOab#z*^SFVWIB+8>fI8pM!^3LX;3w1QE6%Mw|Oi*|*9js+Xue_%S_ z96x%#Pn+lQc{?Yfh(fr!J2E24gg^4+7rar9yaj1F=8gt!azMzUlOKfPUCZord>e z8yDGxlpkaSIgWy(HhdG}*Hj|NQ^vi;492OO3V?$+#F>yyM!A{%J49}@k?#s6voAx) z(RT8lP%`^DgdA%p?+qpM9)ys!cJjVZGVf0aIo?h_5K88~3nA<6Q zldKPqyo|_jJ6#p4PeJ@*5$yG~tnrC(N6{@ilD#e+O@up&ZP}6Pe}RwSqhUwWw(LmW z7a7rHctr6nJ5qN@U@F{^zGX-1&I$PjtD{9?EJ!!2c4uVxC1|nhBY%PMeQ43^BY%c5 zH9EYCgg2#jb6pMpl;~!w2bEBLGV069lF6$!tP`l0GPrO$I>S`7VOG^Jcb7f=nMoEda{oQv_x5 z>1;}Z(mp7aO*cTX>pXw7<6Zf#%1g6V@8A?Z#;o;X1E=}cMELst182Av#W4Pkv(#cN z(98HZHI2pk6=tZ#QNlHRf|`yRp2In62427uc!XL4-+_%ssU@+BLdyFWik!Q%mDBjCT^fx^V|-9gn|(J{=Z+hIj+Jl$v-;D&yw&S#<x8*j3TudKR^pOPfcTir&wm$ z0xtHm4P*-}V<*bg3|U5TAIvwo5MvpIVCf*ln{?KiN8~~;v<9GoiEUo;VetU0g=}B- z!TM%!3m;aV(wT4m4^v%*XP9&Of8gBj(eubnZ135zieA}V z9D4ec&fDMHvs39Qsqa!cFMPJ=E~R(N^}Cgxk@{|mRooN))lz>k&iQ>HQ1x!b;(r0t C$dzaS literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddSysMenuVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddSysMenuVO.class new file mode 100644 index 0000000000000000000000000000000000000000..6d691fe38af7146c6f77c8292e0610f52811aaee GIT binary patch literal 6119 zcmb_fYjjjs72anuk2{Yf^T-6QJWOp`@}gsDY3=19P${NO0umZ+eRYzI$-q3)nLAJr zEm$nAEd{Bxh=8;rv=s~35-^}ke^}S@mp}ST|LC$w;D^h#T(0GEEh~Qeo;!2zOfDr0 zT`SpVpR>PjpL_P*d*3s^`_IHLiRfOs5}-x&vY&$VJr;*pyu#vD7Kd4UpT!XtKVWgx zN5=vfkF)q8(@(JW8jIIi{D{R#7C&Zjip6ObZ!q{xAH5Zzx%9F^KjHBVi=Qg=wnAqW zI;YTig?^^cI|{w4&;^CY*?!SSmjo$e$wDfpcMl5+_iRpXO(rtQ+(@D)pBq^wNZnY< z>FI20AYDukW>TwjxxAj#)A?LcPi(mX`wpeCp^{DIN`1*J3{l(O{dys7?7qlYd@2EQdf3=DF@&x4 zLNcAxi;2FxzBW5%`1fT~#bR;Cr;Q+U@AM$z!|Bv+^E-Vz#q(=kyff zhY;O))5G?aG8q8P6HcGMJbCW5h&Pbf`)yK?02zwFv=E?wT!vZOL=xd-aC*DhQ; z_Ik^`yn12J)WiWieZDZ9D)i+A#iw36I61L@a{tBZ9sHGb9H}^(-^OoR(4wisXD1Jw znmm7K`s9SUv78vY!iSs*at-bfIADX)+nP_T9v<%BUhKsy99WM?2S-x+ zhDv!v+uCg}&MXjyFkWVHQx&9=$7PUw`hZC>vZQR1nGvtzTe-oM_2pN?l>SQOJ(#UQ zNFzMf1T$E)KYw>y?c=xKdSu|)I`$)W&*rKBci(2T%$;Pk%!!OvkA2&6ux@?d0GwMv z#>5t6%#0xOSQBJ#>d8_vgFK7dA7}mG=G2hBto?C80_9|HZ>9-NF|UuN3WDl6Pg|`% z++eKR79@Z>i%c^UU@cex88jO}E`*FNm|(=QUhZJcD`pv48(%I+ex*B@d~0s-t#)AY ztp%R};L=y*)~v?lVof}oOhCsSsaz8MYHHe zcsFe9?p=%cL-!U^#ZpEWXNP)>qemDvW$V!S~;)3)jC>TE1#vYwYHNf zdR~@-pg_OT-5yGFtBTm0%w7D&4bf+*J49{N9-_M_5u&9mKE*<#Wg+@Bi#04h!)p&w zLeSD%>S-a`O`{=NPa8rs!rJF(V~F}$Y+~^!4TR|PEWW_vFdAM}%p-z^F1z$}Qd6aQUBS_}i;HzXUHFn$t-yNk4>jJOAvNuqiZF|uqf&X1X- z`^u#IXOiv%9Qic!5gvd6IcD>=Tt32zvbU8sZxx%1b8;qWRhhJUCTSJm$l;lf@E{Dx z>zRhNFd)}w8rIPqETU#0A4Yr_A~1S7E|NG8#YK-mdX2>}^*|3v0QFKIW`ZjKvYPxZ zxz5#)PY?~eaR$quDg&MzK+fd2cO-T+?CeOHwIkW31f`r~l`QLwkGW1K?96iR(x7lh_s{96jD?)NBinnH_J z_c%3_5sjJ$kVeg`dKlwSK^%f_$oC14T4HKoKpV`WX~3 zL4Gx014XqUKv6BE1{oAGLC|cVm{t!^Olwf<8Ps5c>eU7ts7Y%Cs7VW}jSLE#phh)p z1I4unKyfXqMi>+|K@l}-12trH3(R#IgXW_G{fnN2rqFlk z514Jn72;KTpNh}|G)@;thZdwObe2lcLi9&mcD6#Rr$5toXdAQ!d=R(LQ_vcP7pc4* zT3FnH59$tR5z$Gj=6k=w0@)0*Qx^Mfv%E#hZ<&;iA1Iqrh5s?tr}Vemp=|1-R7 zxqF3C3iHFuMo|b#xbrmm7LU`MCwRS4bF)Epn-+!3Lz=>x$1tHX43eUH%BG0sHB8=$ z3H2gbQO#$VP%0+NS2o2o#V{!q6ADPOnl!&*LhYC=f7uk*0){D2F`=R)t62*gCKQv& z3L2*Q&I!9ihQth99sPs$(6;{PWN}_)Tye zDaHw_BhW8E^U;31xfh`+^cMW?gXX8-;1>H5v;h4H*R}o7f}B>aI*MM$f*WZi1X78F zxQ?x?xr-O#=u7P5BL1pBJN7T&>NQj{4Ki{)%HiGC-d#l4}~qz7(5 zw>*3l!gLb6u@lSBO+cor&_}wmyxklJhe$X4IFnUMr;u`dd*6AP=00|j)ab{?X&x8r zIL(hPka{DA=t8NZx6g}yTMm VJDo3d@<+o?vs47SF?XVa{{=fAAmac4 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddSysUserVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/AddSysUserVO.class new file mode 100644 index 0000000000000000000000000000000000000000..9515e3ce9d416c538fe55b496e255a9dd4fbc3ac GIT binary patch literal 24881 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 z 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 x6Iqm>GnnD3v>3SqeMC3bn{9D)?H}1ewax$l literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/Base64Str.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/Base64Str.class new file mode 100644 index 0000000000000000000000000000000000000000..a1920bfb3714d76664ae86ad4df0adade40b9be8 GIT binary patch literal 2069 zcmbVNT~ixX7=BK&o85$k0u^W!6)S2!pj#`gHUSh`TBw9F;4q_CE@7K&O|mh&L3`(& zcaB#&;}0k|IHQiHj&&TpsWbitFI)QuytLNmWH)@~LLJz1-gDls=Y8IHH^2S;!%qOF zu$sUCX5&!sx?JASFqhyyFPBSFcUejcQo5qyY61z&>R6Qfl8$RS-jw39hJrwB)AH;K zQv!p_H?3{UtXQ>@x$ZZdS}8A(Tx-^Rr)qCFp0io8=V~?Aw|vK~c>?KW$2GkVtWwEt znAX0=oU1zpcgwDbQ0Kf1+U6PKucQe$%S3qM?KFuW#P8i+(=+j(~6vH!@VQ z0j^)R8v;F&k?~H?jrQ%{F;I3I5-K~#-gVz9zE`m7ZEiVo?eWozR&7Co641+*R}R|4 zUM(@_>e^CafuJbI8n)N0_yXEqHf_8UTKC;x;sg@wZnIIeuQ;-&eS6(FBWKgVlX%L& zAWj-Mg_8p3{(D;uyn>X0=WyDey5FmiPM=bKJtOOiIQha(j*H)CK0*Et~* zV?hlwtTJsNkJAGE`*8yLS-n-S+qEr$$%B0h-?HO_6(-ITrowj^i13ePgLBAJ5BDKH z!yZPcAQi_INyK?czPOIk$K)=!tC>3xU$;X(%{A7(jN=)~Mqq$vF~*aS9C1DD{4FA1 zQ5nI$b6;0y(%Qv2denKKtMfQs2%Yoo(g7`#{SJ}LQTG7&FpX#u0+&+2mB5SL14aLJ zpnzK;M^bRE>70W-5pp=8oc3T;Rj65i`F=DZ-z=v$#k+QNH{m$Wc<- zG+cx7m=_9Z5Q3#ch{rVAKS$)n5Y&!A$3{7PMKk8(w;-%^jXCAJm%59@+jr12XtdBP e3+6W17s$GlPjG3Wzx$L2uV*T(OJKUq{LDYaSAeMi literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DataPermissionVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DataPermissionVO.class new file mode 100644 index 0000000000000000000000000000000000000000..7add3c9c900b731aef3cee86b6e69af302ac1bc5 GIT binary patch literal 2618 zcmbtWOK%%h6#lL~V^7>ko0uf6A(W(qVmnD)pgbC!*fw1RC=#S1NEK{~#BX4mR^79tl<&@rAF<7b%JIEt&OMLseD|D*|M+M7 z4uE5LKZZCibV0#IxlBcIDaQRxx#Z+oUP{wanu%gIh8QkrcuVec8s_DGS;O0MUx?xz zfqiAOvT8YwWtVd1npqTx=dK!SMy6<#Rx3jjlQBsf&(`eBS;IAE>trv? z5Mq4AbQ`LG|Gs3Zshs)^#AtiA#!tLv)6CFFo3bM>ai>GlnPhv;)MM2aW12eNd=S0? z_wj-c?7ouqa_w3^Xie0Cg2zi8F+Z*vMP7Y>Gi5W2SIs3in|e<`*t=&aIAZVHZo#Yw z^vTv4X`8!#@3>vBd*=1g==RMT&-1Ra^ikd@dyUEWfj8FLl2JM*feL5^!zuW^%|@Rh zj@h}X{5b-p9I2R2wdiu<+7oLd^(2~W`;90No42c#CG)%`N29;BsgKBahmM1IM#mHA z(~-cF0>}UNkm#7i3p$>|VI4=M^gNO}PJmOpzx6eBx@r}dCBeh3sFE#YpV09xuCSJ| zp`b)hBQGzd<17x7k4AL=0?Cz8E}Nxgf$`>>4+gY-W&=1J^Ii6}PHCIBnmva329NV? zAL54`f;97K5BC9n_d7Vi1M;(!p74u(#B-a8*h`?tlO7;h-@v%yN z*qQ;>znCIQ%fe{-22^Ep^fxG9Lk(|^{t6{OmfnKuJyM8Fk8zn$#(&42gmM?X8_>rS z$`+zE3vEKBi8c{QsM02K7x4{rC)7lwW~6K~S9=W?eGGLn3V0DO5n(^(`6FV47)RLV zFH;vL&nNK;B?TAA#jBK5(%Xl_q~d?8Cib`oivOF+SxT+YXFA<2DQE(Ix@kkq84F2?bC5=orXFeUeCxy)#IL&K~j-;Cpu zK*U}UNR3}HmrSE7j%RwdQ*{M$ zR^2eyCC15`U2qnx^2NGSv+CY5{isW3xnT)t53b*M@bL{9?Vum+nn8)Z;QKU+^y}44 zyXv{dgyT&#%4OQdE0*h;i?rU^w7z%ygFmnTaPRh=Kfb&pu(v(QndMr0qOoh<+_mLp zfpklO(_Y>7OVoe==Ej4M-oO9hXZJt-T;R}urZqxSs;VkhjX?F|b=v$Uajv>ezvuI`-lz zfuma*79B%)K}QaG9nVXu7kxU0@v6Y?^|v6%X{2G77bIM%)@-u&!jO*3n3Ky}0*StT zK{Z3HHK*e=`e?E4D*&Gun6;W!CFK3BU0WN5b%VCx9PT##W|v#$v|S(j`3|P}W=8lS zT3mPWB=>HxNEbcGka)tylh{K^C&Uh{vmz4R$BmxGzQAaIi_sb@K^fb_^#DB@+y!?v ze+%Mk5)nMdHRdyuI7nI#6mSSxp7^pN&$Zq7TSUIvV4U96m@VAIIJ(iedsE|n91e{K znP-Fn|-qJHE?7zN74W7Na8LXaV$eee=%5`8I^kTUqDrE z_Wlgz6R6Rfy+1)I^yOEf`bQG6i9Rj^O8+nD$S8NwwF13AqpTv{)X)Z0s%QhTj4E|v zcadH}XGYD$no7z|#)>}Ht8+mPYbBTPB7czi`d}JI*}n+;Hj0r$eo=}E-xb~z5O9V?x^{yb^zly{=lCKRYQjk$Xi6$YW zXwT-*$nxklj2&g^ui+$P${a>WMfi8)2u?AdC~wDZ!X%-QFr0_-hzx}=2*J`J#3L%L zpCgj73u;rLsiU;BsK$7FbHYle7*pQ8?Dt4szJ-pozKTv+@G7>Yw+FPwEuG@BimuJ4 RJh-0Our7f!^cca}e*yQk2qgdj literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeleteListVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeleteListVO.class new file mode 100644 index 0000000000000000000000000000000000000000..97b666976fea0ab046ecaa70a6d6b7fb29b85751 GIT binary patch literal 1969 zcmbVM+in|G6kW%ju^oHbIBt^?Fod)Le2F_;QcCMMkfsS3>=ZR967a&r9@$gu8RHoT z^$QSB@XQC$mpl{+Tu~$hFCg(DNc;m()|r{a7xEOzI%l7K&R%=3z1R4Ue;@x0U=6!T z%%U=b6gJ{`Gl?iF3A`ou%_N<-q_vg6ZMkp9u_K*t%b0iMQjOzXfvDAV1=6*9#-X7P zJgcMEEY~Xw%s=-5w&At|eNZe_0=|E@ zTHj_y+OfXr4mutc6rd&doI$@~?pRVhbK_&bDoYbsygQ&Oy5_#+T2$1gZ9AUfS&mI= z%Qef<-Or6y%k1mM=tke{S#=7u!#=2oMrS~5Z5&%5)im8k-|9&uej%gFKfnC(uP?sR za1rww(wGytH0n{%-CF~z)07>Ws5i$>RW!VZnucePl~$dc^BOMWiomrqXm#fztS-Lm`Bp%a}I8>e-r!_s7Z@Q^W+@GM4!VGt0jwfrxAj z_Y6-FTtJ*Q`^9yE9-X`3t`;6aeCI#8#5LwSlX!}@7CgWrp5{r&ei3Lg_mtLsHN4bx@!5Tp)0eVwn~v$yL_5 z!)Qq|`xBxcK7x`_hlmx1h!2s-%+MYpIbHrZ_v{IG&Njq+NKBQOTgAe+P?e+NuSk6Z zHF{M11*!Tf(KY`l)9kKtxv7+XM`}^|4Ra5ml@^sD&iOBtBf^YRPWhc%3*b*EZ{bC} z#N_i-S&pNKP-siY(-%d7uL`sj6p1yDSUmAJ&d0I(4;JDm@t5F7Eae$ie}lVhx+=?- z`6FX35Ap{sS5NY*%qsH>sqGNvYsM*zUP_nOm5NU_n=ZFWG?6YoK)f`>`A;g@(+L)W z&@e%is(J;l5?Cd<*JwqMB$YLvprmyLkteKDAuS N(09YdO_W`%{|CFZpDF+V literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeleteRoleDeptVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeleteRoleDeptVO.class new file mode 100644 index 0000000000000000000000000000000000000000..75f7ddc7c64f8087fa6000d7b4cb21d5eeb305fe GIT binary patch literal 2356 zcmbtVTW=dx5dPNQ^>uSI&BZj776LeN+$~Tpv6Dj5q%HhxEQ@h0r66M=foo!aC&k0-LRwDXhEU#3U`6PwajXe_J%tV26w78DTM}Yb zqvZ#Z_-aJ)U@D7$*SWk^Uo`r_`RukV_S7I*Brv0NokrYr82=a_!v zre%6pBt&zQ+Y;ofM3*qIVp_&pt5G(bTRM{yKz2p1Z|jaJ^zcyj zc1&WFRw{NwYuK*0r%`Iy7B|Px$}N{LuB#b*DDQS{ZPBP3p0UaF7Rk)^I`dD~3{NP6 zrc7?KE8&o+6b*!j|DZEH7M&-#9gx-BNsP%SN-#z2cKr2j@G$(7!6!UBz+o|rPg{DO zj1G54Sufu)Dqd;wLkW`IThj1~O<;RFh9e;@Dl&20b*g{bQT@wyZ}bJX9evBwE1#_D zO~1PA=s0e%ttz^;B+{a|qq{pngRonc8FgcGd3A|tQI0u=+p2qPzIMFCL>oJ`Ww)G) zam^IHG<>oPE{fq$F^*?cJcTnVvUpm;XlG;sf)-k4y((Tgb`l^Lym(Hajm= zovwlCwZ{d1Yi0Q57vUeN2dhIZ&3%Obqb|mH!E*fj;w+LpWX-sqqmRa2;;u{`Lb~rm zKFc-c9}eI=Wi>Eh(C4U0qE1|Uoqs^&J6=Z6aUMI>nbkbSIeOCh+^NnlAs0HA{HFu) zsr-+KOr3NO5+9)vO~S;56mZ3FYD}F56#dUY0k@Lq$q;Ch!32@HpCNy62qhCcV0H&c z93YuV1#+5OM&)vVzSC0LD|m&HjGMH7m6C$nILmX5o%R~> zFCZ09{DuBFUQa&8NE~nQlaL-`ED)3YkrVS9k}<vD|icYlp-A7OJql|RKO@t1xtdF8<3CaCX*3KA_vdtrn#7g(n0_yj=KfQC2>+nnv|yG)}&1V35iX-a<7j23UWhO<~EP_`}ZhUb`m zjhHYLc{2`-^;$+V1>Ms3S*?&!=-;Mm)GbyIgtp@)aE zw_`F!X=&T8X*JvR_B2X0+v4UJ+E&9QjO%I!-^sgOTbnnkhG*PmcJm}=bCu~QD~2Z& z!BRFq)|PL`Q;G({!++1Y4vXfCl5PuRIe!*o?5Pq=5xW_GwH-VR|8(#P&kk@{4CAwg zUL~Ug?NL^@?i<@)Y3w5jlHFO+@QOWPdpm|BAuTF0dfIfVf7(+0%Vulz1h*}H!_&7v zUDoS(+uui{g&%?gS0OZdqj1we`j21*Szg<`{0H>aq8l@e-p=?9_(c zaJG#brs$=Cvt4jm%!Y~)Jg4FroKum*vl50{6B7_L*D$MP@yg+|0Qum>Gb-+4Q^kuI z71BKksfmkW4!nB_FEiIM6$K$o{_mz$@ivMiN5uq+Dkd={VM?HF>2}R5+YPO@x5Y_z z>(vIE{|nEsT#mIywPISXR@b@tldi4l6%vwZy)>vO>D23W!{SI3+gqX8a4m-pYB)|E z_NT4WHV~cmxWq55EWi6A{3G>Xb*QDe5AuJ=#V{{ej(=aAN0NuE8P^N+(YQ<8mGNUp z4}8eyxyJm%K3t@%1_liJ0yRn0iEF3x4~Trv%LrP|!(E+O%`VQ-v(6W~I=_N^=v?xj z4#dX`KO!=I);&mkkVZ5K6Bkmz6~Cx4-VG@FpMe5yCDD^1&^m(&BJ)2({_q$|Hg?49 zj*vJ)GMftIG`FnE^mnpgUJJLD%A^P{B7IX4Z%OX9c&?G$-%PGPp_7K^9^yHKr(+^a5}`hiS9uoYPxLjsMoGqP+P_Xo!9ASkxyDX= zgZP(_iYNX;ZyawXpI|VKxA;j&PcR&aN&d)*`3=dKYV3RH* z-C4RC;D=d6F^dwW8C}6Un4uKm@LnN1f~6vccq&*DjNF2JLN}R=ND@haB%RQxrANfU U0F+aMQyaPSh-QrUuFuizKeS!s_W%F@ literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeptPage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeptPage.class new file mode 100644 index 0000000000000000000000000000000000000000..666c567bc86fcd4d630117c75c0c09dcc219d44f GIT binary patch literal 2947 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeptTreeVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeptTreeVO.class new file mode 100644 index 0000000000000000000000000000000000000000..7c490755b8a6fda8096a670cb679ccfc996071ff GIT binary patch literal 1636 zcmbVMO>Y}j6g_V|_Dr2g;<`zNInOi1X_8f?V; zHXOU{cujjH3S6&Q7bslod6CU3z84CVmt5Zt?>Nn-3~XokV$XNo zWq)0^uLgcs2GJ(-q&J*)PYR6xardh~AAJ4$XFojs;@iKz`&=M1>w0c&eT#&YBFaJ1nf)^BYck)d^g6PA>JR<+790OAWtccl@NL7lFUW3mJ&0Meqv|R zD{Hr8BdV8g3JCxCp(IZv(~nv*5U>>b6WaqE9bE4?uS8Dc_OjC*kj3Q~4BTuu-bGbe zz-&2TE9RTzFEa7fYm3VlS($bwkYTSK(QBB|jQn^rNZpFx3mWp0t7bDkWc8$4A`26k zv@njGz^NA)jfD!1St#PDh1Zl-#k9bY-TQgI=eE}s5r>BLO9>rw7UprDP|6nG!BK(S zFghlZ5S?yUdR+b5&Iu&Dzjqmua&;Wz_cg|kPe4-`sSolrLY?RTp%8~*&>#ntNBCq@ z3+i;`A;kAIG`vKa8C;H{K--EP@G@TENhs`;&j&w%c7IoJe&66%F_i?@SxRG!QK|k2 zt+G2ju00vMB(>?Bpc0DwB+-5Pq?u@;TKNWPeXIH_QePsS+N%D7)bezt4}EZ?k-j`l zaaONA!AL=WjDz=J)e3qanSqDC#Wbls1kA+gx0_hN>p0Hh6F7+zBt@f~!W+CxaXSil zla`LRm}>$V!~7d#21@^6(mK+RnB9*kNa#wT;d{Q*|u(4;_$6Rr^&KRVvnv@~Q1Ahi6Tw?zr4ZcbAw#ZCUXrm^U8cKt9{Yh-#85Z&CCyy8i;i P%U4WV6L@#P(5e3b%O694 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeptVo.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/DeptVo.class new file mode 100644 index 0000000000000000000000000000000000000000..52bc613ad7c8b0e0deabfa8bacab54f999a9b19a GIT binary patch literal 6659 zcmcgwYjjjs72YSA$DLQ6Ou{Wtk|xnS8S84Ty@6U9pn?e?P;Bd~Lvou8oy?>&6I$>^ z3w=;1f?`pMk%~6hQXyJGc?hjqs`c&aFa4uyIi&s7-!5D6+xMJ1Gnu)R(I2wHIo~pY z3r?;kT*TT7Vuf5!UNN)xB<$@axrfr*3jH5GnSJHa?CA;1Ke*ZcZ8qm0irM~ch3((7 zIF^WIZWC15-my`TtIs;U>i$^5Ts=Oz$xLmC;;Q&UlY2QyAHsl2ENz4%DVFus0=PUX6k8N5VlClS{Cj6EFImS^Ikk)D>U1Ok@k|X6fN6Uq%PljBMrQ;zPK+3TiNlOf7 zInIr9^eo4q)p&g-I{3gqbj->y)MgZ8l%K(9VmaRx;7Bw*(q|1Iuw& zz@C(u9*<{Gd2*NFvyfbi#PWl**4#1r7^)NVw5s#b7)UbQt{4HC>x=k7AgK9T^&K@KBrTezjjQaI=`3+qk)% zn>)B!#?1JlyAP`Wc#8MClvQnZC1Ol&= zSPlZgSW4Up0s&e|tOS9eEhRn$0)bpg4A4AGA~n#i#i2yd3-s>J(Q~NYpk2P6C z>wtq&KP$tZ*={EH<9+XpH=EFm@FiFLX3UsyP_Di;Zt^ zG)7W77<-D1+Z>IN!4AgWV&is4V@POH(a{+7 z#=$sHYm(krIB`UfhRux0gptGaO zvK`3^BWTFkk*jP+vLXpGogKN$b|fp9p!=O2dCGPqE1sZXXGh+$9mxtQXvEo(R<&CZVeWjm4;ThIf}jsj&nk`-Q1+}TmEY)A5mAoz)|Qse@npUeM& za}>JgG*#7APg70jG}WT3tCP5%@f?Z6j2k3wWIR`5o$+-N&tp7a;suPamv|xLCW)IF z-ym@d<5r2=7=H-OG=11PU**&2K<;UTHxRj(%Db@_9S^8eU7gR9+jYF_HEKUZ?#km` zuTuL!H+I!w4S9R3yU`e~o;N62BRq zAPO5^h{A@Zds(C@kyqCWM2&_IqDI57`&i^xBA@Or5a~t$BHak;0Tu<72&h0b&j>*@ zNvEUHqXkX}_FT3}Q|w7{s*t65Z|MAbTuG`G8jMlD1OjXJ%SMRiJ4tK-UZqGqEW zqGn@`UeBUAN>r~S7ILB%BMecC(V&M})SyIR9YK;4wHb{NwHb5uMi$LgqDCFjBSo&` z2*OIrzk1YKwf#MLp>}Z=r)Z2G#C3UjwQZ9y&qWfoen>?W0G4YDE`4MUMj2iB(Ad9YFPBEz0*!pgAIm zx4g%I!eSh+j*kO1hy!?$eFCUa9KsvglR$H67tUk{wR*MpsLD%Ey-y8Z+KoR=yiao_ z^!+~|jubEZs$$%Vo*$}iPA|T-ijrHCk5spPYq*CL_QUU)_@*G;xSoMs6_T~5rgyPx ziItM`YkEhJkXlXGBzb$Lsp~$TuQyyw=q|-*oTicr8*Yn2hFV6N?zX8$!(&mN9EH4< zR=VM}D5R{i^4ioqL$fF?MN;{Dyc>I z>6<_0b* Im!|Lk2PcACJpcdz literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/EditSysMenuVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/EditSysMenuVO.class new file mode 100644 index 0000000000000000000000000000000000000000..ce63f4cc1fa73b2bc06d1f89305681cfa1f30341 GIT binary patch literal 5535 zcmb_fYmgLI6+U-%9zBoUdF(FGKq8PO>;ss9CdOXCKwOl#yC6%@#8+l#+ubJf%1jSr z;|oNCLm!8G#vUZY}+=Jc(FLeb2a zMzK&4bh`zAG`&BQGsdjRbQT7)oG}V!B|Tg;hpV|9oP_dvrIH!f1$A6MadzhTX=Cio z*N$I5{L43AyE^ycRY5(2MloGEkQpD>%jt}>MtW<>7%GnGxn1RANiUm|a2CLFRk%`W zt_0oExXC?}rN)gadA(2_&g8*LxsEtumJREWYu@%C1NoA*_!7D3%*o?(Q|Kyen!EP&+_^)ZBx$k&RjA%y&Izh{J9~NNxq~ni%VT~TdqyKPy9y_W`6c2DT1+AHV_R`GB3p1~ro;!c_pV!W8`1`>_aR|2XyX?71V?FFg+6CZk}O zTLiUq_v{tqm*6FhG3wV_E^k}sLHM?pc(Akf7CIZ~&U;|~NIlHFpKXX=lAleH3smG@@9S>fYR@|l zKom}$GY-04+edsCoZGRnmy)r;pdOnc_p-In{GaQ(Vv41#nDVnJra}FYY9@yq>U3{m z=jc8?Yxeg%C`h1y+#SF+A#;l6gkDCSaSnEIFI21OBdAfDP%w!)P%9N~H z#O-5U3Q9Ip7~qh?@kFLFArFJv-hqhi+P!0F03n4QEbEnO&P3T;@d|f2p^>^ID%QMp zVx_Box^S0skd`jqdAzH6dx}|<`7036qy<&7PeJDn&>Gl|<>5dq# zUWoUz_yB1!+RWmEJlslm2)gT?HJcbcN?7VX`e=+EVr`IyVl>QRCyQP5u^8=UF~Y+= zEG7wOTkPDh@kVO`_o}-NxAF7+s_vvv^rhbnS{-P&d~{99E1X(uTmwfgM_j zs|6RMz}gj~kKvibv!QY@CwgM^I1S+&z}cXz4!qt>siYTB6YJb%Rc|N`q2Wa6#|`*e z8M@kCBc4{`Bc=-NX$ei z;0Jj+-*68M$ldvdZPbZLq(9^UwwA_I;2G$>LgE!DKH3f$v?deuVdyalppVcFj07h% zWFz@!ekyFN~z@N(3$U`JfD?C1e+NB#vn;yPwW4|+QaEZC8(Z9$);Pr)76LPLy#3wFf4 zfOqt1Z%3g8JCglD&}Y1lrYzWz>?eXg>+LAKU`Mk52)_GdjC{wCBIw3qdtdJb3ivPf z{hA_YDA01T?{$g{t?iwrs5OKV8(s^c`PcoHqN@K5N={L1o$8;a)*7Ns3jorl1=Rp! zf^Sf2idxlx8gzl;S_q)Hrl=tXDK;piDlSk$3j>tUB5IgH5gQa%BQ8)9+Y z*F^s&|7I(VmnZrski<%&Z;C?erm6EGo^R9qY*78SMd8$zrnnZcOvq}Bq^N{=Eo_;P_ckkBGj(VY%M_`bPz_)$_fET# zJhvU47Wxx?p1y#n1n7_SMQA=G%J1n*h*%5VMn9)7L-W%XdY%qK3!t?hrbEzzNP-Fa z3bYWNKr$YNrqD~Yk-iEoOuwPU^fhP^P80DHO5DJNA88^4QiFuJfd!ngk0&}QPy^I3 z{>CXA7IeWJWb>>I4mE-uyobT2DDx-|%iCrX!(K#(dsDMbkKBarc=%rk+e!51P8>gP z1A;5$1pY(FdZ9DO3;y~n{el)faD^79mQ0h%Wiw4nQ_G}|)~TkJOFho|EmB9fR8zM~ sJ<0g@NF5DwX=;Vk+ZnS`>K&}Ff|#b;yuV=Nhi=KvVL?Z%KJfMb0+7;%1poj5 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/GetUserPage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/GetUserPage.class new file mode 100644 index 0000000000000000000000000000000000000000..58539daf496a5ae888310b9417604c8fbd8e2a9b GIT binary patch literal 2091 zcmbVN+fN)-82_E!nVs2XDVK8TDk@gAyWFO&wAx)jX-jD-Py&@ipB!MqPP^>j%q$IW zCdP+8>4UL}Au(y9^Z{?N(s+r{mzwxD_zKFqkJkD-I|D4R52k@R=R4p1`+eUz`}@B? z{0yKElL<6nFb)N;$>ntoLkaHZ<#IvFE=p=xQkOK0B#^+Mj>~etqGMFYRY{I%7#C3d zl_g7{aqNbd#>*Mb?fBK;PRPWa6`u2PG zw(s0)Ki#`^``xY8+rd#lyJ@Z5a@=`=x~&ga|Ga;9^ZjqPKl*a>i#r0be!FP{$Z+iKlJ?zyLMx30wGCs_dNXJ~uD;0b) z!)SWPu4mnMf*}-0Ogkla&bnmFmeyA^qgM`W5>MgjBpPuviDNh_(Dx*LP2y#wlXxD- zlQ(x1Sdc=TOhU%BjWz~% z!Cmcq0P#)PAK>=`#zH72fAjH3sQTdNv( z;Kk55S1ujUI=j9@r1PM8ka!D~s1hbFsQ@d1m#RC8{%=PCwtUZ!4m0|j!8C@;cXfUa zRax))70M@2qw8J2KpF4u+<;m>l88-obIB?_zo90jJVe79l07M91KN&;o>i%$XJaW< z>ck$RaSgR8H5J=YQq~zOS^;-Z^5r0h-IDXjppzLkV;WuTUj!Yvh;H(t{07m(Rlx{* z+Dl5sI0wTZ6~jsTZ%16y|G^Orryik2!)gBO;t`GoWSmd0yf+~N=eSG2Rav@BuW}kH zJEHEUr!py-9&atqgl_(zol5I$eXd^_D8toOpUV?0y}oM=TF(aJZ%e+ORiq%Lgc4ms zNKspLX!-)LVeBYg!C8KMd>HvvQW5?jp2Ruk6Xor1MV6FOhG7)SV=@%NAOuT?5Ra*} zcaBI#Gt?c09UWyqi)xI=w;-%^iZSKgOaF+(n-5UanA||EESOv4k$~1EUB_hu_0^|5 PxSr{-E`k0s@&o??n%0*j literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/GetUserRoleListVo.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/GetUserRoleListVo.class new file mode 100644 index 0000000000000000000000000000000000000000..5261815c2d5b2455e5cc0aa0d5ba095f6fbe4109 GIT binary patch literal 2879 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 b8mW&&qmiKyBnKfrQieT0B^1uZ5ik2+r6)Ak literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/MenuQuery.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/MenuQuery.class new file mode 100644 index 0000000000000000000000000000000000000000..b58ea54d840841a44e23d929554731010421b3ce GIT binary patch literal 1523 zcmbVM+fEZv6kTUJ(;3Q8Dq0Y%;sv!A${^ykpos*d3E%}|qE8NGLI>L!Y^Nsvh0lI~ zyzqdD)M1uCb zTqfo51-V?*aVY@<;|4BEd&R(2X-hh$1dN*FH5crfBhWXuYCpHFs_m^R!Rc# zDc5s@YXY%s?xBD><1h1S@0{y73(eY+Q-5GDRolUS*{(jc>#p2KhiXu98v>JaWxrHtt}V37j~pj!BG>3F=!$qy|c&)4D24C8%?*mER{I8 zjh_7@$FzxQaI8emL=l4msh#LhNiww8)*NqHpxD`hXf*duLj+gC3C@3#FNc64DbmyF zlQGwW+*!1OR?EMKctc0QA+GWEVG?QjW_SVp7~oDws$BmLehX!DS8#gY;2|7|f=h%_ z7^CM4@1W#&hlkkx;gtwm7B5N2lBso+Xp?s|CYmYaUqe$j3SSU=1ueEw_>9>6Xubut zy``fqjB>fE7Qdl;Q2mMn>oALhY76o94RwQQVtWLb4AXBHF@s|mCU_cSI8IR%jBtN~ z{}}QV=OjH9r_{*NAJ}*a%rJw R{{aYxFB6p}sJK+f`VCE|8jJt{ literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/PositionPage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/PositionPage.class new file mode 100644 index 0000000000000000000000000000000000000000..38434696438678b6530cebbb384d06eb8dbdaf30 GIT binary patch literal 2098 zcmbVN+in|G6kW%j@vY;;c9XPj12ho8mpB8orNmBB+9su!B!mVPfrP}^8O2lV8RHpO z^jG)*@{$LTz>z>g@KPi`gs-54b!H}s?f3yzw$9#XpM6*de3xfZO5kQntHwGGL7r%rtMigd+O-hA;4{8 z&m@@1J<~fj1(l}?#c`+y9RuK#?r7-4!r92;%R?K;A5=_uPQW5rGr#E>Ena-6;Yv%29~Zl~4b0DtS5w#$d5 zbGv8RuHG>ycuteNyFljjoa7x0Lcy`P~VrrP<)6Vk8A;J%d^fhux znFL1;Gh8olr&9__wR8yaqwjW+Ys@!JAWvNj9B>Jjxf7C6uEW7UA@ajW@XXj?@;)Xw zIvRX=Z18Ki5(d}&ivjUc`Da8*qu~MY89LD=1THnnguL(E_(akFok&tC6LEUDN-iF; zm?X0BE0oU%F1k}*5oV5e6=Fmwk5aZEs-hjBVOr;_Ec4o z2YDqtNk}#sGCQ87YeD`HMHIL29sK*Y+KFY9(Zmf61=jem~0Nm1-i~s-t literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RoleByDeptPage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RoleByDeptPage.class new file mode 100644 index 0000000000000000000000000000000000000000..7e01566dedc20daa0baf7f80a5a97301fe0db5dc GIT binary patch literal 2235 zcmbtVT~ixX7=BK&o6qGdy0!10O!&_2%H-XzySxDfH)bGYol=@-{OSmVOU zzpyFLS$t@08+zHWOM20VC^wl#prdHn=2ES)Zn_T)q7cXwoeiVBX1JEr!$Za2vIuLexZzavisSh^ zI;DzZb8}67z2-5E=jkSIMBBEbuMolP&K$45Y?MsGOqNVvsuETvmp{#ibdXWfA?Y=p z@8(YW=Kl{2W^PnT_|B^DT6RgGy9H5jO3*R$)0$D{&3lf6xVQe$-0&yz9|{OZGS=*E zXku3!f6H_Q(vrEs#u#Yz(<3!7HkuV08*1CCZ)|+BXjJPx;DE)k!j5hj_Phi|am(D9`Vm$e6W!^wd&N|4fB>I8-7mG(QMUac^M5aVnD+= zbZf|>TcEFb#ekgInpNJE7wl~f&jnYV(y)pL8eYLADZR&*4qph$(=>=nM48u+LtfzO ze;g_e@1Q_ZGz_7j;VP~PjLTf>hEuUNotj?RS?7!Ls^uC-^K;*{Jw7j;YRR%ay=ri) zzc^jaC?9F_l0hFyqfxDzHYalA_yC0SaeRndSmETf_%{aT*r2rf<08L2GW-sT@QO?Ajw0vi|b2_(YXum>d*ni_w|%7bB)yxJ8+(|7C7Jn%YrhS z#I-f}2SmO*5!`=fFnf7MaP(yG`7?uG#cN^kME&YOe5mjvB10#`1K_=MqDu%|N&!~_ zub-VL`mYlO+zL67A)*x)lSJlzhVsDy)J$xj==PD=M>3NN z%bb)5*Ex>Y2xCVvjVqKC+^6LYN-Eyx5WYz%hPRmiB2w|hUuchGH2EC8alFm{gm{kr zKuq!{NWR~Yj4|%Ax2j}8;)|TZ7c^fz!lx3C#K$iXTnp3u$vBnKbDa~D%G5yT#1>yc z*T++`ZA(%mZ;8&rF5)Bm;dy#ok%p`iS`v~?h76p|(rA!BL=nXd#xTz6Dz0OKQiN~x z3MPpx%1@GUXl7V{l3Pl$O^%u`~%tK)2(&+myjC!+5Q zdRoj6#5^PBSusBp^CO`=r{noJw&HOE=jC}p%nJryH1J~s7Y)2*;3o!_4g6F*KhyED zj-P7?73VZ$#!nPZ7V@P+c|Jd0DbJ5+$W7MEPI1wmF4l@OCHp|RTyY9cu~M#S=pQdu z^0mhb^YeB!Uub&r2bPKxl{vd~q*__BtIlc0iJUBy>b8c|+PN#&pSno<-jz4yH=}d* zk~2nN+&Fvb#_}b1tXe7A?%4H}7q36_nv5ATcBrt(7}=I-PC3=0J5f_n*DgHw-pZ>U zeblbaYVbVQ&Y!>jHa*c(&hb+-XEbbS2{Tr9Y_5V6HLqQ{bmQWa*M9x<+S|)6d%RjZ z(a25RDVFl11;-ZZ+Mi!qJNKJw%d0n*Ung~Mv0QZaYv}6hpVkn*n<>zc9xs;dL-oZO zyZS(Z8IbTw1C*{D(b(R!i8a_ecG>*1Lb_N+6~e_VrBY40-6#X74v z3wBk5F6G+m_N6=G!h}2M_p_-S{;P6I6HDoNPX9IOD&R7z=^15JWTcnd)dsPKMk zd*S_8->LH0aH`kjlv9{}WTLR-b|TMQ9*I0ZW((zmk|n~0LTy1cGdp{XNjNe&HgS+y zB92z=TD|13>D?6Qz5aUjUVm{h7pa9Qtfs8@`tuW{CSy1iRhSy$QCy9ZZq*IF`vQhCidX78gAdjfnwqjOq=)uzG&hrf({6} zOU&IEHE~ePJ-FAzeHb%Q!lH)l&8tJL;I4YHG$*x^YRdA0p482msJhj#)g9t(HD&YEEfvqGlQ>#f zTC&S5$KlpKXq*hqIBhH9aofiC`=;eEYv=P?j`3f^$Dku5n@0R`ehVb{`~?3$SwkNk z+{pEg0Xn$3>m5UMaKqO-@^r8W);m5;2Mc4p;|@AlEbASg!xj#*)MzbEIM1iXXJp_i zv_BApFhU!32e)7^v8f2yhy8rhq=;zS#jhjuYKM4dpqO$1;Z>MEBWXoQNm|idL^#oRkzGMD z7s*9iNGVGvDP0HJqg)g&5y4D?mmsRro#?W@-K^$dj zdo&Zrcr1o^oZrN8j&)%G|HfB|!tDBg;A=z?R{h`cb)qP5);I7CA{|xy9^WJ~@B%L2 zA)*+T@hl2Najf#fo*_!$Pp~mdWa6K^q34K__!kdCn<&Mjdp8~?N^4Qvf_b707Py87 zu|qfhgOrZqO>EO~f`5i~lcO$-Z5DD_{F3m>Q!WuXR3cJNlDYMlhdNRse&(2qW1OSh zIsC>@VM4D_7pMB2%*fvGKDPvSW=0lRfJSC;1^VzRwmc-`Nh>UlT-fs%QkKetcy|D&2Q=TZZd08ZH*DQe~}}>tfA%s+jBA8C*OM ztHpUK=)zklqr#;}xV1|}viPfblxgYWdHV_rLyBiV&Z0&n30r_e6s4U&ok+)dUi&AB z4Ezq;@fcA|wq2V?>U|D`x$T<9t%jz(&#=w+kPP%7;uCyMxP8c@MO$c1X6L9!*4xQV zet^T180#cWRj|(!#)5=R?FYI&dHe(9%?SUG!64i|ewnKJ#q-=k`G%T%6I+j6MNf9y zDz-}*uVP0wr*Km6hZN?Kv?F_q!f8ITI~C?Bv_1P_g}a6G5rwmYKT5ocUBMT(`b3-a MN=(CPw-?X+4|Kn)y8r+H literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RolePage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RolePage.class new file mode 100644 index 0000000000000000000000000000000000000000..400d2b122d0816dea9ea44bbabe967c06bb104ee GIT binary patch literal 2008 zcmbVN+in|G6kW%j@z~Bdb=)MaX@CX-_!4I*DVNwuO53DuN)k!}MIa$Dc1HFT+Y@HS z75x=HfV|`ZByc2SvZ);W9cvoGtcy^rRPzkhxT;5s(a7{fve z8C2y`)3BI^f`ufO^AK zkIcuW(KfqHW7~J_ZnGwk=y{gAwnJgj?%MvcK)g_VD4^VSb{KPE-R@eOy-wY7KQ`;_ zAdAy5+Ye3GmU?7V{Fdzr%&#|`j?r;E|A|4V<8-;XmQn9{OyhZm)%9(jJ$8&O!g^pf zEkYP+TE0|6l;efsFq|nmeG)+(@lFQZEu8l+{x2XY<{i{X`cB9ZnX$g^nQdNg;$)={ z>yNC4Un_ntAe__WMn?jwTz+c3MU5*Wpn>9xXsv3YE|`e18qW0k-tCtSA4N-jxBqe z8FXb%PKu5ROzOztqK*?s4G0@vW|Ba}cRE z?XG9+n%sC!lbk<+?D4I_#*s5~ch~CjQB+QLJbE+d$1|d#hG{;)F+SlKf21vt$Q<_+ zI6j!c-gkOUDKwF&Ok!2JqDfo!g zmnf!F~!e-d~FdK3*2RIRmpq4tE;#{R_0lMoOs?QvN$T7qjxAN0VDUJ9Fi7=j0iyz dAjBb^j`f%{Oh6qt41AQ+Cc3fSy8%b<{R6fIaB=_u literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RoleUserPage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RoleUserPage.class new file mode 100644 index 0000000000000000000000000000000000000000..ba8db6f7c4c2caa432d5b2448ba9d9dedcbd02da GIT binary patch literal 2785 zcmbtWU2has7=BK7W@mOgOWT!FRuNIFw%wNTqX=v%Qm|-cTS^N>5P|7-(hlzKtUI$s z5^wavgczgohG4w#%HD8+M%x4uqc@oNKlt!Ji1?hD*>>CR1;L~}=RNP|^L|bCuYYg- z24E0&5}n8=(1CGzOvvN7hRGyUci!B=cMn zAL6_`E@-$YkSMzIPIC<_m7gEV-V4 z#Uxd7%e<<#Ia~AS#`8>@`BS#&no|UI%CoDJ*1XM>jCtG7ua$3WPj3U*)dK3&nhcXn zkd!`TV(E3-QEG;_&f~G3%?^8?7_Ls|bs!|`K*kz_1UUXj2;U9!W^3$^YgUoGgzGQZRe>$CKiv)U*%k;IImtjJ8ll!uTz>_k`WP9Zto}?* z`&QwjajO!H0#`$WC7>6q@~A{ja>4Qz!fE1YjSGNEgI)sf-xa_hvroPg{kuXmWMt7VRXKd3*TCyiyyuB#-@ph4Suz7}V9>x} z91+M#PqUU=a^~EcS-LXIkAzn#*0?{P_;%Uj7sKR}9~;lCSiFLdh$&ZzTfUZaI0h`T zRjJrzVjXClpJ=N#FIrS2Zsj`t`n+x0qq;s@(82F35JQXX1O&G8)yg}=|EE1XLjk+9 zS@0|c?AT_(uE3nVrRYUEGkFW%YTpXPPb6B<%`+Y_+wc-;BUHf4c!e(^d&zUX@h@n( zxxsjQQ)4#1iE(VB@y@2k9Fiu+%0}bvrp5!<9T^WX$rhs3`m(>GrEjBonDw?$CCZx0 zQ3nJ|*3?n#u^ojS6L=M`HAAF4wxh7aLas~X=sZ!&b`IW#dS(Ujw6+YrZy5<*>10T^ zO4li8m;v zavGIVIX$CEB|TEoGE5|lrQ9I2Si>-P1XFP?guL3;YuJM~nNTM_$6gM23!Cd;A9*n* zTEKo%3QpiCa->w8#vu%mier)Md4QCLPq~M~q;wo)%zmUa{U2=6@K)j>wrM!TKV3Y; z_K-|8lJw2bRn)xwyyaY~vXT;h<1U8q!>LqP;j08K;S2ep3*Cr)w2RaFLi^AGWq3#X z&;oaR>&0O?1{3nh+UxDvC1?Z75x+I3NI^!4B)aTKXp+jQfr!lrjP#5eh;}ru@4+y1 z1TcnkcpIYx#$S1?;V7YP#WB1?&@l{faNi}R@a)1EDK)6zWyBw`xC$#M1d9eC9#MVm g-69#CQ0oeH9c4W$Qj0gJt!ZxLQkgK{3#xwXKhx_gTL1t6 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RoleUserVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/RoleUserVO.class new file mode 100644 index 0000000000000000000000000000000000000000..c709e634d225f9e0f093d2b514e7b9e0878f3eba GIT binary patch literal 2838 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 Kp|BES(eD6RkhW?7 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysAppHomeconfigRsVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysAppHomeconfigRsVO.class new file mode 100644 index 0000000000000000000000000000000000000000..43bd2f1484e47dce6ba93ed5459a43844922206a GIT binary patch literal 12058 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 Wpi&&I+cP2{%5bs*1cjLqq5lK%SrUE# literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysAppHomeconfigVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysAppHomeconfigVO.class new file mode 100644 index 0000000000000000000000000000000000000000..63797ed7d1dd174018dc496e83c7bb7377151fb7 GIT binary patch literal 10951 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 R=Nm%=Gv65BvOXrh{U1i;r}Y2; literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysRoleVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysRoleVO.class new file mode 100644 index 0000000000000000000000000000000000000000..0f502522cc8f4a8ade8837003c87c0a067af4015 GIT binary patch literal 4870 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 Ay8r+H literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserEditVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserEditVO.class new file mode 100644 index 0000000000000000000000000000000000000000..7a43c44387d031ba72611959f5acb4cd01790c6c GIT binary patch literal 15635 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserHomeconfigVo.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserHomeconfigVo.class new file mode 100644 index 0000000000000000000000000000000000000000..9139275d2c4e278f1cae96bfc169fdb52bdf5d47 GIT binary patch literal 4415 zcmbtX+ix6K8UM|CXJ^(PUlYgKB$T8W>T5SG<8XT#1OJh&ZBc5WEzLN1l*)LL%6C;vYyUzi-a$#p^*BC5q4a zo$q$O^WDb&^S|HyJ%Ic0Rx|FvLK55Xj4a=jWl@$>vV2RHZyWedGfXU)_^#~FHk0^0 zLC=|ZUJj>Cd|&n#O#DFh7frk*`^zR?k^NN@uZjE_13#4WS-JF_EUz2*k%99XI((<- z+Sy5`=(}G2*yw{Aw1+jc9`N#h$9YLOG$iJ|oa4??aqOhMV5hToel9)c z<>y8;q>h&JB{%0xy1qM|b@u1;Udb-etgoSe%=Oa#Gxpq^Q%u`6PI`aA9rtFP?2)2Z zaEhfx+R+!}QVr(Ki*Me%a8+(I<=VWRBekpU;)znx4X(D7=#6t{R+g^N%QBxeDtaq# zy#3FYt_3E9HgV$AJWVL->bt-C$9vaTFF$wV?6pv5DyP9x+#5^hX--4Tr=9JqFaKus z%IV$r46mO51@XV$e{J`@!z(|%PE6H3Zr&~J)6mq{KdB*pfDh8pKIZ0~!{ywxQ+(8B zJj8WxhOxF8ah^kByfp7JK>NmKyj(ix`K84)QO?VAD>~`vvQIO>1({Q|8}3$5}H>YAFaP2bojQfkQY?n8{+W2;VF18vAowTdFo>3+%h3q#ma;b$LtyJf$)0&?+%5!V%YniPLV+1Oe^3HJ zIB)y&s`A+eqkQL)qod;o83^J;(ecaK5^Yysm<*75jL}>1JQ*P6wW5kgO}*km^MqF} z&NvUb(o0(-y5MdZNgC2Y-A&tG&Yktj>D=Npr;uOBmi@ZPlMdc-m?MR~)8jAt$Hj%? zcA;=wQlc75!><1|x2U}>bY*{`Q0vJXmw&hV&IM+9*70YGZb9ZCy;ie@x2S=2^Mx}j z*MGfw;cW|_#pf)15}&d#h#?Di3)(H{URmzL5Z$beTvdh-l-=yC)YA5dX!NPl+H2tr z{Mf=?>=X1RT^iacED1fCU%(gH$U{3-21wWsPBO{}K@vgI19dV}IT8*CK_A-b&+_n~ z9JGE5;{x{F&K$EajYljTmSqOac}MNZs)00Y4oLi*Oaz}U_mmp02?o{4Q)RfmA**wu zW@k<4n7%dgl?JYxWozZJiyzWEpyA^%h<5U<;ZA-WWB3Grm_VNI;<<%;AAkCN43NR3 zu4fFB!9=fTq{(3N*E8-Rg9Wjk@o6$xB@8_Bb zh&{*U*u#@1rNect@^2Bl(xAL6QknG?q1@D{+#9LPT8vPRH!9y1sm!X4P}Uoj z2O^bO;StJ-M&;p1Wp+e_veBr#J5u=|9txF5n9~@8Yzz!uMQor^T_tOa5($$<;jjiZ zdO9NcDt3(76O_I2B*Uj*3KkMyE)7CXv!bCh-Bfme88gQ;9mE&Wu5!&WxEdM92(< zjFed?v?-IM(56gtDk(zEp-?i#a8 z#MXsIO%=Tw8l3@=&}i~mR%T*{sF$Sn#g36Z@x4L$?C2PoXYrUFgG(@mm+`SDh2EZt z3nLW|Ii{49Vs&QpfW>MGl+2V~VQtDJ0#>5RVvQ-S?u-$zSYDx)QDOCD%z$N9Su8qg z?T9XcC)5kVcQ)adOw|d#Psat!5yhCapJSeHZ{qj;G+d%MKT7jBNu)Eu<4m)ZK#AYw zERlh;=s}Lilr(C0!up7WIMb+UOdbD<{)onE=a>+>p;rVdGV!&fP%Kd=R+DU`hQh{L z;hKB|BUCZhsnoQhd7)x5O0lNhP`9H~5 BiBA9k literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserInfoVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserInfoVO.class new file mode 100644 index 0000000000000000000000000000000000000000..dd67ebe100e80e1a3eaff6537ef28aaf87f6f49c GIT binary patch literal 27291 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/SysUserVO.class new file mode 100644 index 0000000000000000000000000000000000000000..a09dcbcf57ae785fd300be05d158b289d0881100 GIT binary patch literal 9763 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 X4s-tlnfzn>i|XnW^lR(I^_%|z#e?_Q literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UnboundUserRoleVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UnboundUserRoleVO.class new file mode 100644 index 0000000000000000000000000000000000000000..2d5997127781771bf94bf6e16e725d2d4bcf7909 GIT binary patch literal 2176 zcmbtVO>Y}j6g|(L@i?y2q@hU&xCGijV>`(}DIblKK$;Iov6GMwOR(z19ywF&88b5u zgar}{_AFTO1IQ+eq83-85`qm#Nc;>0KLRM{%}kTn$%;zJd-r|ZbI(2ZzVUDW{_rD! z>nNwths7Smv7})+#rYjMyeqd?&dxqZft-4;cJij2& zvuV|A!*98!z~!#vnQ&b{?-t4kH^a+qW8K+48KNx;by#j&JxRLHw(M!>9V5 zQManWre2YRT*I<`PhWNXrAE`=CyLfEJ4AmmarA}5``^`>fi5bhb{5c9So-GR~3&dgUqGg+_ zt;UY&ZW&BQV4&z!D62tnxsEm!f7fDmGsTM2&>N2D?=!7N!?8KJroPki2;+IWNnv=l z=jhw^j?=QM+pN-tQ#Z?NOgT|A{S{e-f$?mY&^#SGwRxuc2`>U!9q-1-J{i5C&de!b zl>P1QNM{gx!q^G(OR{g zL`(Y4rteyIP2l3=as_n4T~;x*>9pL6xopW^8amYlQ!;}zUcluvhA=EJ{r@{EjT?A5 zjd5ht(4{pE5*R+#C?s{WW!0-vq0?-}Dc5Woo7j@WHghJ_+nDEf;us|?0uv6l_%Jtv z50CX(_+Ao5vuWB@fytAVi}Z-v{Dedi8xrlf|G3g8D%`=oK*{3#Hj)`)cm@|RK>I0v zP-D2re`?9|r-Stf&k^iC%R3nlm+%~oQE5ESlU@iq9-V1CV?8)t;i1l1a8`2& zr#K9SS0WC)94J6hc{}7McSZ;thM1zo9^oi?-lez7c_E+s7OHZX{~7UbpvDjLKOtV4 z$hDyaOB(9x1czy5@>iT2QGUUN1EeQMlr|E<4dw7mde=kvBYF#X1=kpS5L0-SvPn@# z`CE96spUxXHChT@C)OYmTJmq4*YL(a7}D@2|B`%vvezT_H#kdyR7qRLKV70w9`z`` z%BV6v-x~@M%vbbN=sntBm{DefR5SgBT_&3B&mTaWY(u*}n>jndT<97Fh$Dj;%o12- z@6FMQA;nbQ3KEoQT|w*-TU23MLNFx=@rbz}uVX^8Z literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserByDeptPage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserByDeptPage.class new file mode 100644 index 0000000000000000000000000000000000000000..7cc85b2e2cfc3ed0fd32f465fd2d3b26ed3cb53f GIT binary patch literal 2235 zcmbtV+in|G6kW%j@pW=@b29|m(g1dxbP5F8+}b8hO4B-NnzTV6Au<&J=sb%!~th z=7kSHLgE8R9`XQENhFXEycCHKDe6B^!aAOD94C1|pv33wefDjgwfC|A`1_|{0E}Wa zg$!;c(T-`k%*1gk1qC+~n3elniifwQ^nL<&q%xntU8&!TqbT)-6c%w`E=zGd5QuG< zReyd%ptJbc*fR98VVCrxW0xibvdcBww<_kUU zb)#v~r>oY2vtgE(T&HTf{xQ^U5nLXHP3Wq*~Fh;?>_tLpnf)K z*_MA@Aezgs3MjXjMxdi;+2&%cvSzvu4Wbap6rFXWylS|X)Wbu?-?Rv8thnw}^ory8 z+d8F+V{>y&eXZs(jpykmZ$#Ucqdy{oneAC#f5|ABgqbXvzEmZwOfG+#59uJIq(jnc zI^WBk^v(Yt7|h(LlJK1s-?i+LKz9qG;FO?a=4Umd%$xTd2XTMxvAOO~ZeC)U~DuiG&a<>72jC@bit_Bd%yvUW0@UYH|#kHisGi> zZ3b;*Pv=>4X?cEOj-V*VT+^$SeS!Ei1oOHz8omJVMC%F{H6OGKI1kV9VJ z>VF(64ey~qQZx*qpy4X635?5JYlc&?Hk_JX*kLm$=GdUL`r{(MJTm+aitvxD zgA+$B&ApeOJ`epguoI^ZFCoc8wu|d4jM2FZ?&{D1#1Hk9uX2sm4?A$4vKBbt0?UFj zo5Zy>_z5E4p9t?4^;1#()-8s&YooeeqQI(Ni1 zM>WiU$oz5UcMC(`K~?q&zoGqGsL{Q`uV`NwW~Gk0I#f77XCSfo;xLzSW#o6Hv&vI+ z?LZsJD*H{3^teiw^mr_*N}t$MWOmS&RkMU2q*3-*HHzj`bk%!vCqQ#Vu8U!e5Ni)U z#$`@QgzGHFYlN|*xQ;876g;5iElMgr;1Iq|DTa5L{~}WH#9wHSV>I~!y>YzD|Acsf z{y5L^q>JY$^7=-JMRNo8uFb7GUP zpzD(<*|tTglD9->VF&S%{qQ_Ju1G^x2`vf9CPN0!W@$9YAEJn28e`<1{ioDeaKA9Ok>YbhAA(Bfmfb*&x8zr0562{J9~GfwX|V8o=NWg z-Sf5Qp06wa^}oOWBN5$2zsS&s=!{BZ^b9XsynKz9uk-ROFW=zhIhnqhA(hT3^ex_> z&w%)Ch0gN+9fiKj`wI$vkM|c9`abV3Df9#0f2h#QyuZSluPSto_aDjhVor+ywGHaGZgA1q4O|w)r>y^@q*R<=EIf?XBt-5E|tX12!*Q(a>dfo9% z&vxprL{kg4Q*zIkm5S9YnH^5)c*9(&86twtPx-bO!HJ`n0X`W9kQpmM3_}$W#=-Ct(Lf&RA>Jf>n!C&2hbDX7o!WOW z6c`V$2^hI%aPqGS+_@$W?P~@?;+pe;XPsN_->;F~so!dZ>3_WYBe7B2|A!UN5eWj)7>?ALik#(cSb3jXq4bYc$ErG%qu}9Ok9O z%g5;B5{-7x^7~qLwaob(jar>-=k=&Y=jjcNj?hu~IWz9x1H@x|&d!X7*8%BMOi~4D zz6`>rnUI+o4=xAF@jyh}5rq39X85Wg-A@njH!mQbQyP7q1@7M0Jk)4|R**c6PSJ`+ zHl3EpU`uPJQ?tuXt5n-s!=vRksx8daXFRL!;sq<=h{w+@HB4;&qgLYaiYKEJJkbtF zx7lb|b);}M+DE}N**koLXk$|Ek`Mc?XZnTm_WgG?rrPRwPfr0YEdI!8p(4F1h-9>+DPZuv!V!GRm$oPm52{O*LE-GE3&&C_-+p{6j84}IM8%plkkmw|d zJ{NB&wP!=3^CWsG-cWkahD4`Iv=DDd-m@Xm*%B?%Qjq$^Xx0?pP#<;oX>Zne5=eBi z-NQ0w!=0dr!dM2vP!9^@6?}pRLHS)$AKjtMV0N3d>21nk8|)W2&$uA)0OLV{hZr9a zc$o2sz@vEaH3P#`$IG=s%R&i$!JcM+kpyyer5D4XUIB-IWSMhhVJ2Nq#)>b4Hj+`~i9yX#cG+cO-fAU}0_puj=>{N4brb_=s9m3dM^g z&u$0wypd#vo(wn&SEx`KFj77X#px?4dMacM8EK!DZnIFbLTlKNeHN-U(2_&esG;~Q zrOiSO3oYGHeHO|$&{BQY!T36QQd~0#Mj!nJS*{`oDP*|@l%NB&Lv;kGk7nst z6HFMUR45S2BzKbnv2;YNBiT(2gyr4B9r+kWprZ7sbhP4mfub6x*wMWyJ5bNuM7?9- O|4G0I(%14UfAfET;KeEc literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserDeptVO.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserDeptVO.class new file mode 100644 index 0000000000000000000000000000000000000000..b3ca1604a62618ffd0e4aa9ceba27315f81b8130 GIT binary patch literal 4776 zcmbVO-E$jP75}X)X;<>?FjEn}n~*_SRM^ORls^ zlN4x62>pVlg%r013NJJnCNmV0*fRtQeJL|M^8`;k*lGR(UI^uP_U>A1dCPb_W1s!) zJ-^@Gd(S=RT>b68e|QJL-S}k^JMd%z34B}3cf@>G%u`~X7W0gl@98+34f(^3ic^}k$4m9nMA_b3sZ^b!Q>s?#8hS@c z)k6J=;`Fp#D-@fa!rr;kXm!diAF5U7?3#0$^TbXT%MDvYdgU^mE_$Uj5;$V#&qY%WOcSMTdg~%3q-Tk3LiDQFwv-U zntHup^El``SuGr4K=v_s;|C?a)3zJMTu*OcSKc8e=oF@eRIn%ow|iKHY4a*+Gq5C$ zG=nMnqh0_zS1FnyR2&tyl?4R@7ptq)-rv)@*xn89KfxJSwn)6PMGvbj4hO&I?Qo-C zG&yrHE`0Ul@?h{Yepoj89ogAYM+MW5S2LCyoi%Ph-YAxtaGk-m9-KH~PdY=r$2Dlx z)rID{m}ymK#;$45C1JbW(sV~$*zOMcC2cB)|Eio)$C7-W(|=95N_kU9l~&rofJ+FJ zbw)7)BkBWwd3zu5Uwx;F<+4V-*Vd1+$(7XK|>)rnL5-w6(OLhm=tatkh6r@&TI8~LL8j@qx zMs3o*uOy8lb7ZCD?~qPy;tTkqiBF>2M6Z~BF@w0n#An3ZiMvef#OE~JwSlf;;xUYy z_!7Qs;)tNVg6FZP+(FXlenZ{h(An|ZQ|$n zg_t+lk_Ng|z;?S>g^aj;pi8g>jc?{a*GkwFQ3cM&5;|h7*TgC8W4~@LMdhxB&F&B{ ztudRuw_G}-`f4u5}F1!4qHWDA2(ySnK#K9n6fij=Sk#wybr09-BDG zT%)zP-~yi-pRvA0Xul(fV2C#E4rZ~7*i;1U#vZzAw-x(@qVTFkGR`JeIF$*$8Y_y7pLd6f_ zE1r0W2OHrD>3#jz5b0}`tCQZMDBekv>}9rwk?@Jy);*D`1P!C%6GhiOk*XXG2XHWK zYq51tq$*9rq40^~>z+teriQQLaM+6Ubx))!S;H6}3Y*AS_e84lHEH!~qR0b0*$x)( zj{d&45Q|>!e;0{25No^K{}&`i2l^I}bYBVD4-C*)(ZRo>Js*7!9T#B^=A#QReMZWP zk&?3F`IvCx?;&>)seCLS50KK9PEy)3^16@=kEG{~04ZZ7NXl5rd_qV`kCezK1Ej3g zPEyt~^X)=1JrYrX)M2Ga>af!Jl#tRMDV0wLNI5G*QqIceGeXLGq)a~RlcJYdBW-J1 z;AIs&zc92Nco;_++D^^HF}B4B+xaaV=U5y1@NayLD9Wn;2fj`eW7hv2-yn+fYQ2VU z66vVnxA+#3fmiS{9wAC#9xtFsl*9sW>?RSrV^8MlE|&S zJXA}G`H^ERj&Y50=kP~{nkMpl>XKByn;qH}-R-8}_UzCM6VS-^UxYrmfK89cc*=^3 zBOmoVhNPu(rLCCjVn(_mBOmi!87uC(;wvuZsZwPv-E}cVJ(cdeIxNF=87nR(u2SW! zgzI9?da8u$+8&-fkE+diA!x%psG!QN$9S}JM6&rsJkGGRvERPQ#E|6KgR`g;Nx){{ z5XEUn(IC=sp4a|KA_Kp{Ry;wJkYm@Tk^X=KQ69Ud@u;C`A8^{{dqf605%UQ?C%Ssb zqs0TXCbMkWEoocsHia{M7{12(yum1o5 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserPage.class b/common-core-starter/target/classes/com/mosty/common/core/business/entity/vo/UserPage.class new file mode 100644 index 0000000000000000000000000000000000000000..06296abc0b3cded9b55f4f142b06fad6d78d1ed1 GIT binary patch literal 5339 zcmb_fSx_9;6}=B;rh8_3U>JjNN65x9c33r$EoW&YC9;Ga5dHuR)Z6!pN z0^Ymt-g9ohci+9Yn?L;P{3k@TjpjqtLQe&$nV#muGkkcK4~O`0m=DkK;dws1Akm8< z3ei(C9pUp!At+y#=_sFHk?F^LepRL!KEK8hugmlXU%V;PPx$;(nU3-KEt!t16#~H=?_Ui}rctTH3#D}wKGda=CNFB;0v*wgB zVrIrObY7+(-^&9iG~-dTQiarNXgI8)k682n7pqBHeb z_KD=R`PbKud}zWdS?P%}Y!s52**$3{cobINI0PTgGxw1elYDoS?=^$WB;80PJZgbdLkkJx)*Y^X${y*waGrS%?4@g$VFPX#}{YBm#2Q64!tfF&@q73EXo- z@y_;+?l;D=-E9vuVpeIjIwq8Zm7O%wjKVxmTHL}`Y;As7V;hTVs#e&GG$9+})K*xS z-IZ-}>&tPSU)sieRYe3dzgBE>zSJCZeqATbC4q_w7p3**088TM0!x&U;jBJ(pkGhf z^@9c|(JvXvV|ucOhZy3do|zOSh#$bqzx$tAMr4*A%HT8g3+XmMg9 zwYUM0Tk?mMTk;2sw3O~2>ym8-hs}wkp3S9E_fvMJkLuQxId0|RQ`4hpx0zHThpK)& zYa}!1y>Tqj5i{|Wj>&GvabD!x*I6aQ(;40ux_6>0godqLdd#@b$NRiMz9 zNK@zzx>KPJK6LRRPM=fgE-u~8hkN+&1-g?_WBKdj-W)nAPsgb1wpFC$4uyV2zgFlg zvf!V`Y`wGDi8j>taU3*G(4o1XYigk> zN+_tm>Z*&b0P0?@W^D>Rz=f^S zWhC*I=_+mvPWP^C=uZ4`$t8HVkyLb97f-k0Goc0FE;3c|+b2e!#VU-s6@P6RYKH+C zQEBLe0a;RM*a8DGr_!($24qvE;Vu}EVU>n$Fd*wH4WEYrnOJG~A~isXWX9Nylf*GI z%>MR8V!weu(ma%H_`p zc_WvbguIE%w_sSHTfGxj^tDvJui<4S_E~id`@9LQZm^?$j{LsU9lxXIS@Kt(?zl+J z{hiqHZT7OgW05us35OWy#Gv`QeotZ5cZureN$FC33k5_}^8*sq0;->50+%Q@PZ8Cx z28uv2O#&#U$*RObvICM-xd>FR1p%tpLTZqMLJlaXhKfLqS{R^4O;N)fq&Of*MIcp+ z0HkU)YJ`Jo98g5Xo#cLQ|mY==78!{+@b*a zPUG&Yi{39WyYE~Sv345=8>Da2L%4|s)=m5H&Z(j;Y%@I!T{UfEP4q2DJ`~I~`Zgp# z(Ep(CKnl=7`U`y*l0;9?pXqy$@DD$orAHtI=@gwI9a4xc(hQA43ezQeiN+u)v`hzR z98!e-P6mD+q8b*$r_}c$)v_qwdJ~YMERIitNl10<9@*9ZIuNXlTF^G31RPe-HEq&D zwkec1p)kN|^3K4Nh=3EPYWf?c=uyPSPk*H}q$;YXKT!s;tHvkY$CQQS!`Jf(%0cqu z?hhgNcm_U++;|L_duPLo)f0F^nNeh_P#U zKw(|Q6%FKf0WQW@s&Zg~B3J=gu64jtDY$_5FgO&sf>L04+Zp8j@;Vq~Q&*zbTeW8gvaSLM*8$ zt1u)CI7ZXdYs*H{F>UMo{0Rxt83}#IZOd_W%U#xMEkl`DEzB*>{QiN2Sc?wxWjf|B z>sRz#O}8q!ylqvcB%~KxmTT6HWz#WNYQ|B^vR&O}SVzJ>&-}gI6}@JbJ!P&WQZ#kb za-H0Q?Jl%xH3m`ZhU4fJmNt0jvoHVr=(<_HedCk6AO3jz#?3ol-IS2cn|985SFcoz zW=`+q$Q^B%1-oq2&Nc0Z(R8men8I`|hSK~{0^RQJBA2c`%7cZI>OLtpM#@y=@5FStW5;9AN{r?MluHNuU9lX2x>D`aN?L`}JS6(Fd)23y* zvl612?6L&;IMGVz&zqL9(5kN(%_W_*OGxGI5?iXXvHT8{vRgF?>Ttef*K>8-aj&ug z^}20wYZ|$gmcuZPlQY;to?WqX=h^8+lCgYNAg>s%P>9y2GTC0N5)w2J)*f}CMaT|A zjI`ZC<%X2Sold4xnchU%P1c`a)UdpE*szeP&4wNBrkcYP(0w7OJWR0x*3Bl38Sk|8 z8k;$^o}RNSmyMD;mA%LtY>Of2+|S^M_rZ3nMpMETF$^Q^tDN+-oloyDyas*#Y3IA> z>ZP{}dc#A?H;7LOZ&*pU=0sT(tGZM5XOn|E&#dPb=L>Tzi*l@KIIWt?dmiS~M#9*d zYZu+7X;pap+tcE`Fus;UlqlM*X302dib3!1jOYP@Hi=P;C6UI?Bp%0zgoB$H_9RYY zCW)u;bQ04-I*3C_%!9Aujt-@MLC0EVtt<#lbt=jDw9@e{RK!wc)#G~tj5DMmo5VT1 z#0RDm&hHRWdn!I~MekWQ-}i5HOm8#{i!@KH?|4AU`pei=7U}A;Z%@d&$>_GnWBmO{ zLBe)Ku@i$BqCCvso(OjEpS*H?nBRlkckyhugGcZvg*^^^_wu9<(sp#tBBBor_JkK? zU+BEwch0n(v+JD0vp9{|P_E;2&vBQyE2GyTedEQO;2QIk{Ww55=^N1WNq$M9hg`dz zzeD8f9_RFi&TKnT_BuyjX0D#6G z=K}Y0I1*G-SRW|r1&X4Vi3bCTK1i4hSyI`Vebo51PEq2pa}|L9VhWXeb!_wtDDt(j zUm$-DC3 zIBh2=#W2VCdk|N(zp+)t$$J=9af*MMbPo^tVw}IH;^GGk9N{jyr3mPvyvTo0tc2w$ zEJ~CoiMJvM^9TJDdQT2aP0KSLUAqRRsw7Jr7+Zxpv4;31q1Ps5agdgS6HQRaqg@+Q zbI6YxyDrC|iNrVnbx=*9dcSIbuVHJd-cG9n;m=U^&D-E39RA64oggMDdY$IC=Y&sA0RFT|fx|7a#)w7J202LkFz{OJLoZ{ N&#@Nlz@T||KL8nhubKb= literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateMapper.class b/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysAppHomeconfigPlateMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..2ecaba516870b3ff6352ca3a955d3dc43e266f72 GIT binary patch literal 540 zcmb7B!AiqG5S^`UV{5Gye?SC5FYd)#L}(ACji{Tc>u!z&H@+-7%nIyPm}7|YElaU7dO!g*C;bIsf?^i z!`r!ltGCj4rD?95iZhyGfttsPu`$-8SJpTI*O4t!i8&@qk}Br1leh=SW-1iWSz}g` zfbMd~*_)}|+ zw-PX}6&@hmNj$Jfz-a&MTi*g|_5U&66(FF+am4>D+5+0p;jGKqpl$^m#}0ao>2s|G JCopKv(;rhmsvZCU literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysDeptMapper.class b/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysDeptMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..eecb86508d7d1169c3220921f0d260807f032216 GIT binary patch literal 2192 zcmcgt%}*0S6n~4*0-|6A5%CKU1x=iTMh`V6RANF>QbLvcw4JO&c6XZHSxj#dl|Z~0 zLt>(diiv?6QDZb5^zPq5OZ!h4-|UutSuECs!)9k^=l9zAj69${GEFr1n z!g4eijdDSphg8>@O=$TKnMm_kn%Uktw9&Re4Hsh@$-VuM-+aHbx{+J{ntl2?zqq>d z>Pg}8M&acKPZeG-WuGr2MW8`BsJh;d#I6c9d0qlAq?rGQVW8p%=kEE0TZEgOi*F+lyHfe@uEl@uH);8 zLDLkKluUWYHF$SWzV^!S9-NdCbAGmmvdc?_wJ(02{KRa3d*&x>`^Q>taTBwdRv9TN zIx7s;tfC5gP>TMSuYXWf`Dv(Ve*Hy$<&0BWNX5e*goVl;3SK;=?O3ujNl8+n{xlE%0DqL2 zwhJnV;2|@^%$u3_Chs4wZvd`v9AOdRFv1bTX+afv+SFtdQ?A-|;TX=AkI7a%3tkCb z^3+?Y%lP7fVUbrP^bX80UUtb@DoZVVV~OGATi+(zQtsmt2Pr}y1Hr{ z&y6LnL>+eXm2h<5hc|tLGS0UFp_I`BFl(IDj$#`rSEJwn917tC8Yqw`_9N}= z=2@IEOxBvhE literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysOssMapper.class b/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysOssMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..8c1829e8d3f85d7a8900c20231b63302487883b5 GIT binary patch literal 336 zcmb7=OA5j;5QhKws*jCc#DKV~xNzZ0anTc`HIzt`lujb_YA!s0hZ57)g}4x0%me11 zpKs>zyxjq;F^e#cFo`f_m?SDU!ud)v(BUGkf)~Q%{FGi~=Hf$UHBW`r>TEsNbt;^q zvhc(+TS=}(S;~s<1j%FDZrTNH$<;xjwKbhE^`wj>;?g)3W=TyaqIerKOcU#?Ozu?? v5Ek8_Gg~$|46BCWhvggMbCY5IeF{SZ^v^9L28LdUe)t+fH)!(^qqasbp1x|8 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysPositionMapper.class b/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysPositionMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..e2de0c95aff021b18a0b7d342bc09e2145a9b33a GIT binary patch literal 351 zcmb7=O>V+45QU!$B@i}U^%(UAiA4|#7OYaWQcmCmD>8~bQN~8(YAiTF4~6Q4E~-|l z)W!Tr^XBQB`M6!K09IHgm?u~yNCg&!sh#qn(*o!Gs7^{Y%GL6%JnG74c|}&1imW+M zkhU+CH{3RXWksEqR<*6}L$Cm&;T5%$o zYI5PEtx9isVQS(^R29{HCM+$x_P1M5#=0gblrs7%%)OPGtmUMg4704UYg5vkDwj@E zh9on-F6d8|fn$6(z1n`aU<^Mk%?tAz&eJ->=%p%R7 zuQzjlTyFrDm_!&x7)2N}j1rk^;e165Zg&eboeC#y zS$NAcQxR99EUDrfVQJsCt9C&d>*}CT%IKFc^;T-KmXmfe%#zw3O+oQGW*8^NR~c<( x5g2Cg$;)ou05L2YiXWzLjE_}@>Gw4Z4bwm83>X+XA-dsl2wktueGJ+fJpl)PYp(zR literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysRoleMenuMapper.class b/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysRoleMenuMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..c70e5d033240a0e764237b20c8db3691888808fd GIT binary patch literal 351 zcmb7=J&wXK5QU#vAWLYdI0kNzD6-muVymE)$O)V+50Jbg3g%kczYiD`t-2$Kjg!z7cX7S1=s@R#nzLGViGlKEX`g&2 z3~^?BQ_zpB0>}JrdbM42U<|8{=7sqU=V_f`_IMdX$M?=@V+Mvnh>!3@gl^d95ypLu F{s9SvaC!g$ literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserAppHomeconfigMapper.class b/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserAppHomeconfigMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..be740630ca04dba3636aaa38183b780bd58341d1 GIT binary patch literal 535 zcmb7BJx{|h5IvW+p`}0>n30f>V8IJp5P}Yfp$J4ocPG83u3|g#N2PS*Z!z!#_)&;U zic|(bVzBJHdw1`>^ZUo^8vtCuK?Hjd>_;$UFqmS29!FI&Tg@39o{kq{DR?1t&J%B? z&f~KQgX5>5y;L}nPNoGu3M&+~*&D5m7hW3e7@Ula&ABK=Hb*W~N;@t#0N!-P3_43u z1Z2>54QDTrxfVWHO1*ree@GXY`FNZe#ZzIFoSMK@)yyr6;CN;%awWr<{PTbP=kKrI0B{AL+wiFkhiy1w(3@h89tYKUKAJK(Ig1~} zOz>RjjK@Z2(d+#Dmcj8&sl8NqE1gVo9E(CI8d7}K+IZom(T>4sY>JEvE7E)9GNEn9 zMI+#KSHxgrCh`&)v}{e#vGZ{*JO-K$!9A1p-;f28ZfU0^9#la-d?R@czak%Lj~NzG zn7VBPK`fmQV_WmbWKJ*>nQ7t6f>@tk4Em8gVCthdHHs&~C^Y7oUcfsl+g=eQaY*8IgVs8)h3nu>Bw4ZzZr$8(RVVd4GMVC7c#Ir zF=dhBQ07E-wo<=1`ZD}t2BSc{0$_>!j)4sJn^&{&gF(2}{}{5#fWaEAb$X=hE%F^U zDBGm$C~UWBZ8_*PVV6YP&|8Xnq5oM#l^xh!RxVmEDoxmJ!o4QkCx#Dn<{BJ8zy5yw E2lZg=*#H0l literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateMapper.class b/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserAppHomeconfigPlateMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..9d9f87d306d475efd0355660af23d2024315a918 GIT binary patch literal 651 zcmb7C!Ab)$5S`T4+FG?*#k;8J#az6t2o@9z6^q5*v)ge^*(A$mx48QOev}74z>g9q z+d>PX;vpoH_h#nJOFll|-T~ko_Uf=xhfW=K8MMY2VT#>+P{=WZ&PjhFrh-R8hrDle z=$(!j96V$?l?q4FNDqF!An-EFV^Eul zC_@I-xad*GW)_cy6X1g5Z|#@l^mK|LCZ(c^6I(4_{DMJaC_^pMETN*WOZnshd**>Ezg|i46dEhUmDM){!xrUd+~%b z4;Z*f{$s)_0|pgZEA(S3Rq`5Y6s=O!a!{StnuP`-O<12J`z~RQv=+w=Dzxd!z!tR2 GeftaHdcybs literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserDeptMapper.class b/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserDeptMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..620ebd3feab89a1813040c73b116e1ff1db7e4cc GIT binary patch literal 351 zcmb7=J!%6n5QU%Y#Ot5Nm5*UH0T*jhgy71-#o_~KH-nK`NsC4b*{iwm0dlAi?K*{V zAmCztVBS2wnXm8D8Nd@}8O9kV8Kwf0LLaOO(UZXE_NYFTtd%{;U3sJ`8)?q{ep2E+N3bX*^97@tSvE1vO%X=(ej?jzfu$O z=UiY~xacd|=sIyMuBI2;Wd|m(>S+Ek|Hb*UE-=5nOrYbt=d_W4z#zpiJrSvU=<_2+ Hea(IV6I5`C literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserMapper.class b/common-core-starter/target/classes/com/mosty/common/core/business/mapper/SysUserMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..cd40a4083061eb74572bd560f5a9ecbd7f830403 GIT binary patch literal 1953 zcmcgtNlz3(6n=%k0D>YYiwi1>f(Pp$@iK&jaY;zV3~}PzYi25KV=t4gZb-+A#%+iT zn7GG8F`AGV#f!lZqIZ7>GcYIqf$>%MuuKoi662xM)m8Pq`o8zQdj0d)>~{d@g;OCo z8G`N*^bn{QT;nM_;tnx|6S&YFO_@5?O<}tfN4ja?%i=WY2-V<1P;S^Nu8o-Vir|(+ zg?pmIY=lwARy7(`g&ihP8&?&B*^Y%Vum6jfeVgYMcZH;uh=u!+N&9678S6Zu3N@+m z0mCqDW~-(l2y{hNlZsKMDBPlKb%hRO)L4dF-ad>`HNrFpm9*uucMFqW^KU*ZPQP1t zGL_HH%>S6o-<&4US$fP6vzX3pZUxRWErqfSOI_tuO=5Uaa;%5K^J<)8Y6&#?{zyUR zdB*l#Qnr}UWh6Q!-Ayu6SJS3Lb=TvN(H!BsjFefL*^CZ)#uAwPKPPS7T`8&PaNAlx z3b&>T&!>E!u)1X;m(>$!R=6!QDT_4X%K5=Gf!^+5{rcY;GZY%PE!9xgD{(gn>nn%# zhs)=Jw`H^1i)HNHHnncVm@U+nz1`wOpb=f`g3UytEnes(tZ_(lHdm;A%eOLN)W zgFCs2kGW41{^q5*F#@5qCmnA<=o)uNO$)QovQBPd1{Qs1QKy%VsJVVJ;u~(-j?9if z$@Dc6XjtxE=S;li1kP@;T>bVnh}Udw4PovI_r|?6X%SbJNOQTo1cGwew}qGQOB;c` z#_?Ek7<+4Yqf5s!*lTEn34X~NZYNcBanrF<{GzI%WlhCe@xz^#-I>6d4H~=d(NwIOiZ>WtZh(U6IN z4vgX=Xm@-W(MW1DrPhk1u$w~aC7KJ=nxZh=`X-Y0XIwoNVEZ6rN(>LFBX1L^40s@z zNfZ)z{J)n@md|)F)vowqw|#2!+v_K`mI#Mjb1%dmQ!GM*>P!e}nBh`r0{b1Q0?K0M zkC1ZDUTezc0W?KfvciOgi7m9Oq%=KdMhjv)fe6$CH1CpS@?W=>PyG^&OWhGT@KAoG z_`{zP{#w}kg|6y)WAshdRUVTOzmo}#rm2u|nCPs#A{NJ}=sDAPm72@GJ^N87OZunP zflQQ-7d*6zHy6Aa?V)RT0>|I<_$-}IZ~~3_ykwOTaAQJ$P+E}yft+0{c06-=0(mId lbJ3lk1ZBJLI(Nmcs)p6MS+l`wux>B1;Q9xw0UIfN^9@?ZO+Eks literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/mapper/YbmjMapper.class b/common-core-starter/target/classes/com/mosty/common/core/business/mapper/YbmjMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..5b4b06c8ff9cc23adde3fcd7edfe2bdf1d2b13da GIT binary patch literal 330 zcmb7AIS#@w5FB%bqkxxS3c4T)3aTIqDoQ(8k)zlSv5l0kQSbmBg>V8A5(N^)9@^cR zo!$H6dIPY;B*HMlD8iUvbdZ^5&R2rqoaF4nXu)(w_dFM=i<8tS%9&B}WIR&CW6cybtD|T(VY5~evSBD9ujD8JrZ>1L2QlXs;y(3q7yp9RR2ji<$Y-JGy vOq=qHXx>O6STy^8(7gqGa0IjOBM2HP|6DO3Am{|^hJPVsz1H_JXk+vQkHlx` literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/LoginService.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/LoginService.class new file mode 100644 index 0000000000000000000000000000000000000000..109dd4fdf9c57156779c9283ab2e4cc07f815df8 GIT binary patch literal 660 zcmd6lyH3L}6o!vW@8!C|10cbI2iSs;DpgEDks9cphNH+;Vn?x4)RBz^x^P)o*w`2= zF~Ev=4qEyYh?5`z14xVv*74E#{mcG-Kfm2S0KgV3RA8U&{ISeB<}qw(HhB}o-KAL?8X4v7@ literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/SysAppHomeconfigPlateListService.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/SysAppHomeconfigPlateListService.class new file mode 100644 index 0000000000000000000000000000000000000000..78605b7718db2e3960eaea351dad80dc37a056f9 GIT binary patch literal 1540 zcmc&!OHTqZ5T5z~L=oT5vx#2pL2nonIjAHgl58}_TUmy+y4&KmOXT1m@F#gNp8ZkA zfmJlf292-7rk!uwZ>HZo9-r>+0bm=e>7!z8(8+zv#(rHfq%9eX&L-zoO9z zgZ!J9ugF3-|4IsSm8zkSmgL{>mA{X69}{BrB`SVwFl>ui*dWH!UZS1edg+&zPf<@8 z3f8s7Rz-Le^37*67vfcf#wJ&Jn~& literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/SysAppHomeconfigPlateService.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/SysAppHomeconfigPlateService.class new file mode 100644 index 0000000000000000000000000000000000000000..fe3c0927a008c986a50e7c49728c224fef63bbd8 GIT binary patch literal 1500 zcmc&!$xg#C5FN9$rR@85;(!Dfe1KaK5=BB(sstheA#QFu1ee4vu~U&B;F}N!K7fxx zOdBYuq%10eLuAjyelzplcpjhb9{^wrmb0*sg~co^F~}Lwz>>Pq48&U5)d3H*u`#Dz zpcO44@=9c+LSr~8E9svTo85Z-KnLh*bs@bYUsx=ZYoZ~zFO zjK4+r2_1CvFDRfenJW5diSqqU%2PP|D1y~jsQ8J&ut{QJoeNO+WT{9VODypGV=^sa7VQ6D$oMMda9R&~UKxFW1Hbw4u6`v}kqY8Amtt>X;t z{wsE`FM+}BJ3S67H6paoy?VT{sEnjJK^ixti@f9{o8A-2J30zo+?PIyxsp0^USe%D z2M>e2FNW7^il0F-n0T9FN%;&myQ<&4{tN>Kef0Iy#LWya7=S?lS~HL(Z;rfuFhq79 ihFks-7;XE<$UhDfZF`dJDVT2CGjumWn1#6(()=^1-S)Bo literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/SysAppHomeconfigService.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/SysAppHomeconfigService.class new file mode 100644 index 0000000000000000000000000000000000000000..5fc3724b6cc0fe1e9bb8ce62853ec834efc1a8e3 GIT binary patch literal 1277 zcmc&!$xg#C5FJD5#=c+p0Jz`-+=40rQbnao1tJhvHyt8FVwc#d$dL=5!v}ES1NbP! zBq@u!2n0wRqVagFc{B6g^Csy#y;ISS`UCgR&7lY^Y1kKx{TW9r92cn{YaX zT9Jv6w__s}8pBapNwJ>hZesSk-6I{Mr`4tO&s$FOO7sK|gz~v-BdL66>(f!r_LkzDC8*3`XftoGr>&aiy<>jU!5W zF_?63u*cd@VP*^!?%9LnSonlwzdM`=Z(=ldh>|o7QIJyF7CMw29rG}03oA`Gh)qsy zh*l6Gf;Y0~3?BXgc5j%5k-8fcol_%4O;h(#a+s-*!ToQ`KS{Io$M&O5I5o5j4DLSZ zqSd}4Vx93+;H^bvB<&mNt|vX@4L3jhYBW_>$B~D18IYbf2B+6Y*iP4$LG6pxe=BTE z76uC+>!0__U}voM#y4DKz+i&DN%~by6&Ms?3V>`8N|`M~g`!o8PQWzX&%o@vKS%yN OEM&3##UdD=@V zEZ->5sCeFa)D%sci2yB(u{U%C|n6mXY|;92lavEYm5RMW9W~>cRS&HwBTYoW&D1#I8%}UL$OY zTx}HMpb~*mPw^MMg~pVv>AE%$QPt?&wB@3o1O9(udRJRy0)j;*FS-=fpPw5Rd)4rV) zR=;lRZ3V20sN0cPG1Eep-ZG00%97AMDVF{Us{l&^CoDg~(zNKoXixQGr9f`67b9h) zT@R6!1~CT%;da?HQLf!y~YoV=~KIE}1WqL$oC*tp*LZ zv&9S?30rAP@odWX*oa0kfs%n%Q6w;54)0fqTxFO<-NE!tgwX1Sn?xzT00=B*I&tip zev#wY`tcDcBA-tKrox}XedI#*PR$_jG7}@4kE0hU-f4Rbp$=0XG+O)kimUX0h|xn% z9nZw)9L~9}*``{pss7~clqd-z%JC-i-8S7ZEzIm}_$9QrEa)V#mK{nwr6M)6H9~;E5dKc#lXq^Iz%ZOfX#}MqD4{$GW3fDr@&ruA@)?w;Qu0}p zr{Np`t}`$z*EyJ%>v^~!*Nbo|*1wGBuE5n;zJ~I3xFOHogj;f5fZK9iOyS(Yb9dpM i+%LnDT<`bz{Qw@ub|2ySRtyY?N|B0)V0V)vxJv9|I~7@Y1s;O8VBi6G zD8wZx6romB3=DD3=ey5$-+g|2e|ZIf6WFUkvj(ji>@sK=473S79Z4nCtu_pv+Fqa& zo@nbbPFA87{S5L!YNbMJIVvaV%+Kt#Mbq(yVk~$pRK$H}q>AQw9yo=MV|4t^xe>ph z#V;LKc%PzmGZGJP7&JqqB2+PIZ)lwoq;>cE=5FG@uH-dvJ+k~N=u&JIV>0*2%X4Kr##69 z!bv-dQ(H2dpcA2Rg7=DW2G9R^U3c+uPh~>XF?jsOXMZpxx;pb4#RrGVN)l5p0vRCh z<-;fA?***;IyC{F%a}&APkNjdIKe*3waK9Ki=sbEngv0RWGe8oO$Ns~;LL%}?{kF# ugC+VZ^bD(2231%lgTV^a$h%73C0L{VI&2jFI&6OVx9F^l*oHLO8#j|nBRCQnLfYh-0hMc`&y*i=n2!{82Odls53h>-$!LO+brQe>u!6nnjwGdn9^ z{0|?u*H*V*zw>4nes8Y$(`y7eSw3G$o08);0nxy5B&*o5kwk+W2ge9>`(M|+SLK5h z#Z9454o^!3tbBSPJ;92Mx>}et!*!i3S*AF)St`w>Ms>KB3Y8HAc!;|?kWf&jZ3s!z z!F!ae0tVp7VsKx+G!}xV__L;lp~%H#(m=R0uw93_pKMjf5mfiq;<~r7u)R6&EiL=+ zpYJTr;q)0?2aFBFAYe6D^KYPdsD0PL2-?6Njg#(v(WPTfrm|xO>F?x?9FUFoCXc5JP1| zqzK#&LN&;$l>mVzd`{u7prx5WGqm8o6?aV#gVXqJM{65CaRu$@&;e&~Q)B2v!&&I6 iBG1)2bfZHLoIi}bfQE~3sfz5aMfO!q{ct%f>&jo4cvH~; literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/SysOssService.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/SysOssService.class new file mode 100644 index 0000000000000000000000000000000000000000..b5fdf04e623a5a398c85dd514522ea7f7b815161 GIT binary patch literal 420 zcmb7>!AiqG5QhJ$wXsz}di_URGP%SyNlTG3#>6Rm=y&(uT%8g=Ct(w9(0Poz&_zvKOZ- zgxk(lY#xeH-0nwlmurk7q_*OFS1ZQ(i1+PwwPPYI|4H@(@oScF_BRpXX6LkLq#1!Q W(K^rz(3CL6p{faH!<*q~=<_e4Jcfw? literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/SysPositionService.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/SysPositionService.class new file mode 100644 index 0000000000000000000000000000000000000000..3dff898705003b374fbd2e3eb710c53866becf3c GIT binary patch literal 789 zcmcgq!AiqG5S^{Hv9;CS`~`b)4|~6{K1_OSIU*f?J=tqg0 z#6Zv%iw6(O&dl!2dv9hoA8+pfa0O!zMjo7aa7tjPF~!K-6$_Rif#iG^DM5wOrl8Ie zO1djU8d}XIYE4lZ?%r}m7fN%(l`J#;NtG8eC3vhX6-CGl*Xz{kI$xk+F*A%#tM3H* z0Z$||Hgl-2|ATt7r?#NbjW++*Cor;WM;+_1A@H;>-FBgE*z%Dlt%lym+%&+;xj$JF zc$uwO&S=VHLg(SiP0HWhXnZy(wVMdlnB_b|It^;$ugV93vRQ-=Jatn#YsvYldr`6@ zaQ(~9G<1FzATa(ekicbGZtE)TR@fszpySSgTk%epKo<_3*DF2noPPxU%B~{=IIg_m ECwZt0CIA2c literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/SysRoleDeptService.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/SysRoleDeptService.class new file mode 100644 index 0000000000000000000000000000000000000000..5a0ff84e0e1c3fbefe2979de5aa32d077f432fac GIT binary patch literal 639 zcmbVKO-lnY5S`T8wY6#wf_G1PF$cZKilB&4SP)#qb9Q%FQnE?eB*g`PnFoJ>KT4eJ z`cdei)I-R;ndHrTnS6Y{y#v4nOd{BeU_XKb24f|yyKU}p?xqEU%4phZ8xFHLGX*br^8ZekP xcignn2BfNLyFVrzFksN5XN&%;UY|i9wn+_Y1p(e?i{upP;gVD6 zc!(J13AX3!SXv;?xUOio~Tm{}UXs3()u*7V;Nt)+{#cTwB-!x$B5-EffN zM(^2+?Bw(8_+YmGo!i%&8~gC%+n9HGlEA7Y6=ylMC2p8;L7<^2+^MH^&Ct!H7PibJ zme>Eo5zNq}4@N$>pwnVGV;}RhqwPNNe6pFL39oOekn+Rq*aU$pW@4&B=1QQggub;T z67mot1h_?n%_O@hfjVz$+PyKV&|T4Hy*z}UnfKF}i3Dv$t#(j5#W=@?6Nr`$>xa;792JZ(KW{09YXjc!TW{cv z_w-8c@m&I|Q4+-&v;BB=@q*~P18KI$I`Kvd&3~!TZb3~sni`fb&EiyRi>NP)t$uLRS4Awx zj?B|xAIpCx#GSCtbe zhYI|?6n~XLB`m}D3bZcAr;5W0bf|`vGY&Py4y(|i7FMHo(aAbAtbw(24eQXb9yZK1 zY(&E**gV&;1r1yOmgP2d*bX~pvfNpmOg%a@1ZeCkc4$P0-LPja_THJGO|Z|eQS&dm C$t*Ph literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateListService.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateListService.class new file mode 100644 index 0000000000000000000000000000000000000000..f5dbf6a11c8659ac308db929504dbc1d0a6715be GIT binary patch literal 1580 zcmc&!OHTqZ5T5z~!T0-hHj#@x=nZ3{2P2V0la0oBE6cD}cU#EU1cRAUBJy4tSuAt#jH1 zTG0|BFGWTwG=`(HlKwe$b7nByuU3zAfUZ^*>7Dw*Vo@5KFJ6n9;J#2EcWfw?m(P80 z6*V~+Og6(F2jjCmOW5U(t zuW@zGV7eXYC-l(Gzodl1rON1|B`FR&rRc)pXK}2)LB-=zib>7q2=Ss5Xt%R=y2;ZQ z^n{^gU3*YJ6&|I0->-rp-bQHb*Hs^5Qk}>BQxZCmWgYRLUJ_QCsvnu8j{>xUN=WcR z<2Zxo|IT4h9mC+^gH9)hs7wB$+un0>Hq~$lAG8bO} literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateService.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserAppHomeconfigPlateService.class new file mode 100644 index 0000000000000000000000000000000000000000..339a23cffffe80279c84e286cfe31dfc838d73c4 GIT binary patch literal 1540 zcmc&!$xg#C5FN9$P$*?z&q#2=2e=g>!2zgLiAoU&adXpYFeG+~or)g#0X~TX;><@O zCJhu+8WqHLi0pZ>-;CcZk56~^0I&rsSy;@%QWlmOj2O|xlB#P4xK?&`zyob;i_K3bB0zgzwu+I>uj)t9JvTspCs#dTsl?Izmpu9seE`4siI zp9mtxFc+jc}D^0_XOwuy}T0vzac&UAy z!NY(0|B3EkaQiMdN7V}wx0tR1URzW~(hQ+|H>Hcb14bo)J3^5pjVE|e)kR^14&;b}F jI|pNJd>rx}e1h--Om^%kvZrCDW6#pvgkcWm+e{13j4=lv literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserAppHomeconfigService.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/SysUserAppHomeconfigService.class new file mode 100644 index 0000000000000000000000000000000000000000..43ba31a0ff7f6eb38f04717f605285a2322b4884 GIT binary patch literal 1766 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysAppHomeconfigServiceImpl.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysAppHomeconfigServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..02c9fd07e4f6aca205fbb0ac3c469e33e493b3fb GIT binary patch literal 14114 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 TTqbV`SFo6^SF@;qwgmhE)dPhr literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysPositionServiceImpl.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysPositionServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..b09886dbe6b1cd0d6b8bf7cef62ecb6b4cd557ea GIT binary patch literal 7020 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysRoleDeptServiceImpl.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysRoleDeptServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..726f93610d372d08ebc2e2ec3aeaba9c3ef5090d GIT binary patch literal 3852 zcmbtXTXPge6#jZcvdcO^SQ6xB2oN9%#Nnb`TtGq~u(E)%5WpKwcAL$R*_mZ#He^x6 zE8azYKqRZyiq`$K&6SzP?HAqk-(#ZI3-)BT-Gf9Le%w}0>b4B#1j zlSU^7k~o}30s|T9@=7|9#K|<);#3AgY1ZPUBu=MMz?n48Vkm`kYCNC91*LphJzh!S z)ihqic{O=Gg^Ox@BLzc^!>Mq4F@;hRGKEWNtU)=6ktEC{E(^5mGi}p9Akfs^GbFHJ zz$r7Fr$Eow4(r)XG1hHI*Mq+H;Sn4ZAle9@`s702`II;DzZb8w|T zT=NLydAcXvF|#Ojvr@J6Lft#v_j6XL~|L%{MJQ&$ZmsQi@i$KD?N*C_I7aO?=n#sln8%jew3kWMSW2kxAP(8FehC z>;by9uwa&L!>_r_+_^d9n6H(#vV4%Qe!HZysuFj0n!$&2(=(5-m}@sO(B#;RYv;T` zmUWdR>0la`c}?bx%5cf(64)Jg*|f);QK^$0;i^)&ta1DSA5INlmc@VoR)8U}Ar|Cp z2m*@=zEK=KVN?SKCowAUdl1L4;Z)3$Q`0N;VZ%4Qs#WuJIqpl_Gs)+v44$OzoJUtN zs#WR62}0x4Wap8+19NU_xEbRk)2M2Xq)Zo_np>2ErmE-F)0e0+d|H*9z{=A#61yUY zOwVMw_uIDPGb@hGYVXcFZdv!Lu4$Jqxkg1^b=*ToKsz*oGrJ8v5W8($nChCa`^uwl=-^lNi%*72_n9hB~gX6R<|Zj;7&F zycH_KO4V>3*EGD1aTdU%ef1s38Z~|0t5vIx>+6NVnq5>$OX7xxcN9W1Q)SgPysIXg z;`J2OO4L2$<)h&}jB9vbZOL@U7X4XfWR*D4JB$as;RmmUaonB4=AH(@PWXgIg;6+?j!C9f$Xeln!8j5_CBTy(@TR4oXkYQSJY4AL)=Uw zjgJJ5cF&`l|28z*1UOeJpGfC)u3@+NLl&JUu2WHDY)p;pYy& zeRA|zUa1)tJ6!t=8SHuaVesRo&C7N*4K|9=uyQur;3cCd2Q0%QQj9fW-UT{m-Vk?q z{H2Cg5f~l@Vm<-!a23S<>qYH)dlDjXaELrffXJ zJ0|-|?ClJUjy4P!mQ^r)nN8wrfsNDnGm|ImXOCWob^I>x@2{iwT zmI)+JY`w#`O#xy?y~2}Nj1_3(xB@E!^v)0=LMIlsU@NVxpp8B}&8NABo$V`W8nxF3n^n zu$$!w5#D1|T zz3Ok|`2R2D&>ZpP0G{Wf1P-E~qk=lb@eBUalt05Qd`>PN;k<*Z2D$Gjj&c7BI3CSj H3}^oV#LHW| literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysRoleMenuServiceImpl.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysRoleMenuServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..f08db2f2df80b81ad879c4a3934ee30722fbdeca GIT binary patch literal 4565 zcmcIo*>@XP8UI~*8AX{SuCg?VOKc}jW5-D+O$$ws6NnwV6_ryOr73BFGL|Ot#G@Hy z7AGn@g|bt2NGYYP1q#Jwaq9E{edh4MGk*Y&JoX$8%i(utM%E~j?VNJRIi7p(cfb36 zzi+))`O|-H`~kqdSXNNTKwu`z zHV4=t$}VR!Aq&*(bCfGidJy!O70|eP9=Dxyz%u+F>K$YnF%98IU9;*#n%16rK{#{ z@^c5pH+%lgs#T>|ChF3c`EoPDO&gPnWXJ`2t1)xz$|f%}rs(UX`5CEO1{^v}rFm^9Iv0<|;>Q zjT{ZtKQw#ED1|myp$vh2iI}b?LBYob{uah{R(Gmq*$K32eOC8PuVw|FW?c0R+cTN8 zt!diK&2^(w)oV4wO(q3>NJ{QaWz%|x8ZZ+%NVmxXV|X(~CvZ!~v?+_Wznw+a+Fi1^ z1a_Sbn9Nn_WZt~l21$M<~FW(aEdO?*qmw{eX{)6%LGJgee6c#c`8;=6cWU_-_5qaLi{ zdw3xtL=~&z`*>c(5AYnTVQoWv$Fb&3U-N=m&2fFLI33s}=~fj#l*fDMNvp2nM{;pz zva;f;iOV)&ZBE6HCHLJ@^BUc|z2&L+i9DDcNeT^ns=(f+Q}dQ(RCMc?8(~;YzF1QsE`Mn?IBD+nGi1uOsoT}Q3z{XD+0My{kneP3mm^i2V{$Dwm~%rPvh8XeZ;s>#F#k}?^e@eT=;xG5(c zMmEg8&InFNw%k%vh|97eD14lRH@o!9FBpLiP##aT{ngW3Kry|kYR#{Q_t0a!me^ek zy~@Ve$lOp}MAaA*ZsufAe#w`?{~C|D9tK)eU5u+%Ym_fNetR=dT96PmFBXAgu?Iq| z?E;ebam#s%?r#$vht6@?
N4d~NM%ff&nJVWb$P6a}2^Hi@N;GuaMSF6*IYLs;dC z7PyT)Qr=8a<3GduMqpb5RoJqMVZjhfdQSJ|qE{*(7kLKNxE$yf&Dq`|Q$`u}R^bnt zHeX8pRM-fCZsl!WY!~&CF=^=@B@K4oO`_Ys7E9tWsK%DXl6S<*NK}Ha1$=DmD1TbK ztm0Srje;vGEU>@Z^7C8#uBFk&evNKciq>h1@3_qS&AR0$2nw##VFkyT513eL-nI=l zL}t+Hr<4ARMMgLu(Cspx=EKp!T%!77qzOvP!E<~nMb@HyfwmRe}9&717Dfyd~G>!w`RU9^jA75x$AKIga8We`}6$ zb(L%RRN8&;HHZt>k-8z5V@v3M9X(6vojJ6~-7XyBH^VdJ#7^|%FlU3&N!$gEE4gz7 zcT@UK@*TxJ{N79Ij`-9Oyme*oZKU1Dy%dg-b{uc#OrlwY63U!zqEU$W_efvp8Y?bg zLj%+@G6K(H;LtKQ3f$mB56jq;!mHT4j4dg=j=n`9k#~p4vm7Pf0eWHtdvO}W2@9rI zESN?P<3uz-Z#6AYS11zq2}(*s{0pZQoQ$n_2RZmMTXNeT~(V|0KF$QuWj_)|J{f}z;@64ytioZ-J3f8luG@ZT#3IPMzD zZd=0kYuMU#;zev8%kBtQJ>4hnkVo(`|76JIzuo+kI?I%Md-?@D!*OSJ*AjML!&991 zXYUB-S2%x5c278;=X@YL7|x&Id?>p&oEO6+StLbDn&Q}ybe!{sq{EyyBn@%ikhGoi zhNKNQ7;!AVhJ6>Z!`HF@k3<+HTjZ^632(i@uuXAa1|W;xe`8p|wAhr{{ZHiofjqq# zrPTd+fE+1O-o;VMd646;`6vIsWf4nw1-o#D>k;aDi09sohjA7~oQqc%;?)z}mwO-h EFaCE*nE(I) literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysRoleServiceImpl.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysRoleServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..b9de167c064da63bcf389d697ccb53e05295b5d1 GIT binary patch literal 21526 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateServiceImpl.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysUserAppHomeconfigPlateServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..39522f0aebef591e0747fa3eab32996da73fc17b GIT binary patch literal 11085 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 Ae*gdg literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysUserDeptServiceImpl.class b/common-core-starter/target/classes/com/mosty/common/core/business/service/impl/SysUserDeptServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..96843404389a1dafc4eca8a009b3cbfee4ad4b4d GIT binary patch literal 5564 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 XOVhATPhvYl&2s0mByIF_9Nhm8PdQ1G literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/business/timer/DeptUserSys.class b/common-core-starter/target/classes/com/mosty/common/core/business/timer/DeptUserSys.class new file mode 100644 index 0000000000000000000000000000000000000000..3df04983f98568d4bc38dac7e2f18ba9186cc84e GIT binary patch literal 1163 zcmbVLTTfIm5dOLg9AFPDAgiJx7jL^qV~x?6h%r%&zO0uBt`9zS4;71h+O_S$?9Vch z7<}*t_@j)|vjoJ6R#7t}x? zL6vQ;X{|R}3?u7ii|VR2DgBE)YfHN++8wgYHBBlyEn!vA4~!%JgK`YFhjrmqCM^%0 z7nysGvM#*Nb+EUTQ-t_PYvYAiMib!urm@@Hb*<9d@2$w>XJbEdZ-sUu4L)2Py7SE= zv*-};*aM}Nf5`BuKCG^PuzP~AK_&x#tIZv;D|lN{seGN9@itGrv9GM@O6!#jt&i@C zPEMRoZkXJr@~H|0&kWFWGk`E8$I{@uw9@!qS5ktkYqZpUEyg$|B3y}a71v@+q7tDV zqY;!ErWkGwd1!xK5mi*Q(h+)_zijWw)HB>2f^s~e4AEA2^*y@UTD{SysK9+}Ooyl< zPELS4z&Ro3;S=;6R_Mz`^bbokh>JoZ8j77E#uVA7NqYuH1E?im!S+#NcuP`wA0s4v zDcq~HPNPigA~CsydHTpRq{aO}%wmqTQ#8lOGEY18h0_NKp3@#;tI0QvCfE1Ck{f#{ zA3=v85JZ4n?zBt5cTucXD&uClwr zF@&Z^lAfVy)AUI1EA*f(y-Zu)>uY~$-|OGhHvP=b%9f47Bk$QeU(I~)<1_Q`|NZrE z0LF1Mg<2W{P6}=saX1?48lID+r@_|{XlQ7-q+vzF^BPt)T-I2WTM#E<{yrkh}4XCuGiug~>n#@-Dd-nVh8eitYSCC1C@vV)hDDXh zOOg;67`_s^Q81++g=OW)v64~st*dmrYz2{XC#iDQ2r2@_?8uDi){14eb?7R>^2on}W2Km?n?Fjv3pr<{Gs{%X`vbAYo!mqq<;tw)`D!CW4C1$nv3) zn(GIvv{9?M4i`__b4qr(IIUcr4u8=`*U~1d0%Pye$#mUw>y{VT7LE6+LNo%qT0FPD zPct3LyukidWd@TY zPYVcF)^)>Fbi|%>gNo%bx3a#&ZMwfNWN3G?eLgVE3O%|nbv7L z?A}d1SdbwL9J$wes}5;+;Uv>a?p@4O1|PyX`Wt3>OOtXGqG>EFy55q^czo6JGx#xn zLXpj91=Fp%9^tJMPUuj0F$_g$G-UfjSFUDo6vtAy zp25%Y3xQFo{oZgogJQ24z%I_;m)q!EXh+H}onH5;zoI#CN?d&k#mgVEZy5L1MB%Cm}MzTqg68R@{p) zq6O}vomQ}2N5K9_bj!p}N?hGWBMK5&+Uz}DE>f&}>&t>Si0zb!!4KWt&n9BatHY?* zEoX^WW*d>#KsHr}khO`wsql_mMAamJ-&SW&s}~BRSCDy_l{VzCSslK(+M& zg}r=}P4Mk@1TpN9Ez6fs)_VOK>Aj=!KAuilP zZ00uNTobc-J*juBA@x*V*Ys_QNb8-7$mrV@(WUQDM7O?E5xTxh5xeysMfB=@ig=IS zuZTVReTo>+->ZoG^+8G8#?XcQE$p4kjjiE<+|4kKll*=VI=_R^_)P7_1L(&vzYikE z$j32?Ddce)1)RkJd<2I$OcS`sO!&;g3p{<9fnQ_TuQTXrY8q8R<1w7#FAc9!`f(AXh)F zw!%;1!;$bY`Y65Z7|s0&``erDRUDCN@GkyYYs*M#xVdBOH`cXXj`OW?57@-!T@Dh`w)8@eMm4YAs7;bc$=|r{Ei9f9j}AP zyVF!5n{41V#yIK)y|{)0(#bU()DMwf!{M#%)7pCjk!u?4^~T*BY6Q0F**|0a57;L= WNVF7hH;rE8UJT3OK*^L=f&T;EXTIV9 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/config/DefaultRoleConfig.class b/common-core-starter/target/classes/com/mosty/common/core/config/DefaultRoleConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..dbe7561f7bf35df57aaf1a21b91036e1f0c9b7b7 GIT binary patch literal 3033 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 a*!HTT(t5A#aQ-9y(%jp1{?F-$F#ZQm`Mkye literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/constant/DataPermissionConstant.class b/common-core-starter/target/classes/com/mosty/common/core/constant/DataPermissionConstant.class new file mode 100644 index 0000000000000000000000000000000000000000..de38ca7098b108d84aaee9d87a8d03693d4f7069 GIT binary patch literal 648 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 P$@PD~#z>EcnVa|@_+$~1 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/login/JwtTokenGenerator.class b/common-core-starter/target/classes/com/mosty/common/core/login/JwtTokenGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..2638125f249ed187d261aa0576dd4dc5c6d63f2c GIT binary patch literal 8184 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 COis4| literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/login/LoginResponseVO.class b/common-core-starter/target/classes/com/mosty/common/core/login/LoginResponseVO.class new file mode 100644 index 0000000000000000000000000000000000000000..ae9b659713546ac85ffaaea2798380b95e9dc1f6 GIT binary patch literal 8615 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 P8Z=>Dp=V&#ML+%@CJ(wy literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/login/LoginServiceController.class b/common-core-starter/target/classes/com/mosty/common/core/login/LoginServiceController.class new file mode 100644 index 0000000000000000000000000000000000000000..5ac9ddf7a668de6d8d0fb809fd8c52649eaf1881 GIT binary patch literal 20185 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 Fe*-q*+uZ;F literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/login/UserPermissionsInfo.class b/common-core-starter/target/classes/com/mosty/common/core/login/UserPermissionsInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..95f653d8c9b5f2214a2a8cedd5651b7f3c2ca673 GIT binary patch literal 3971 zcmbVOTW=fJ5&jOjH<6SrQKlt2YOFYND^gO}wCN?3?bh)nQA+uy#Ic>E&WhSdYm;1g zcd5icUWyi})4rrnMGNGiKvBOqK!Q{X5F5EYq(J{ben11KeaatbF5lU+5-DHfZmm=nL*H$!%n20F zwOgUvbk4hhyVP)wwpw0jhpyM6L8<0?mEa|NWySF;c1Ke=y5=r;%TD8r@2xq0c%6Rq zb-U4a1PXWG`1ODO^!mR)`0d@>f4%$0Up~9N8U48B`73qW(Cxl{NJlwDhfOyKWCS&5 z-DwDnEBxngzV`WhH@~=Z?<<(z6ammL2on{|`b_3C!xyzRU4Jr-)= zs!LxF*Xmxg()5DxdWBrmYw_Vbm4>(Cwkl5tj(?_;^?d6^j|I&#kki{W8{u0QCa%oz zPHB{Vp--kFHi9^@6I1IQ=Yi+y1Y8AQzJiT)hUgqyb-Q&!R*AW;+QF*Arl(5tEW(*{^9v_f zCGv*v1novBpvBdg>?Aup*`LquZdnxcNRLGQk`;PtaquS&xh*$5!rd}eIxp~ichBPG z(m!V3P9psuP^L?c-3ltlxEn&hT@O7!-axJs@W^Bqy|!O>PP+0ujwKwchvWjx;XaJ# z@PH%_N^($=?_pd(9?t*gnC4K!Tn;6abEr!0`;vQDk{?L&LrE5JN?^2i^*+{i8_SNL z!v$PS4t9!zd^m@f@G_Ud%*0j)4-1UUO!W4U(%~Iac9F6|uT1ula#70R8I%QvI&rDv z#Ln7lYffufU^bzr{W~#EWR3+jc;Ns#QnJDj_zvH)eBRIh{Q)MZVAcB-2dH2t`W2H@ zusi*V?^3~z^(&?@L?IhOI?bQ2@F`?a<-bF`MJ9zAQX>+MW0rhQ0q_vPAkQ9>_8O;p zjrS)Sv-b(c>0aXliN>6n1Y@n&_+X+jXDz{4?=_xEG=2m>ijC)3p%m+2mZvu$%Dv`= z$b7GY#3ds*Zn(gYlO3h**^wF$fuAHhO5d|1HBbUSO?IT+vm-Tt0*@v;((l=k8dxDW zg(|lAkaZknu|J(I{|&l!Yx*M?e}DBak=p`kx0qVG>%6Jq`Hf0>dw4#@Asl8w3iudDcm`9L z#5?#IWoeG|oA^074Ugk>93`i7pZ*Syku%W1RU9K{!iR(7;%khg?#BR->@MeE-W%^lJXN39jf## zR5ht6YO%(WU zG;ZKD&M*lbui`AZ6ifdroMVD%uJ=_elGB**0-hqL<03D~r^y)zF^co#%&0B@Lgs4< zG`2+uwgN(YO&6W_loS-8ZvnP2+D=gnGrC|MWUn*^n>)cBe1al2vHDCpR>?XVvP`^x zRmZW;QproIb{o4dzKfy!@Fw!I@qFY*6wjlV&+k!uR`LbK^R(sjdlf$@`B9Qhj3qB_ zb=TG6mI?Xs5y#NEDBnf#?VjNsO}sQN;1UCu7v(E_8hlQaX{;`enGK}Mvl~d4i`oXX za#7!a-s^WP@_R(tZXb$?_%@-x=zBq)sfp+VAsumYA!`vQH>w_eX6$1c&+>o&v(N+F V7vO;a4+c0G@H0W+Iigc|{u@@b8OHzs literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/login/dto/DeptAllVo.class b/common-core-starter/target/classes/com/mosty/common/core/login/dto/DeptAllVo.class new file mode 100644 index 0000000000000000000000000000000000000000..277d970d4d9743341b23f32ac7b376bc70e788a9 GIT binary patch literal 7343 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/minio/UploadController.class b/common-core-starter/target/classes/com/mosty/common/core/minio/UploadController.class new file mode 100644 index 0000000000000000000000000000000000000000..01cbbecb64492170b148498dfa2fb1d7a49f5b04 GIT binary patch literal 16954 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/util/BASE64DecodedMultipartFile.class b/common-core-starter/target/classes/com/mosty/common/core/util/BASE64DecodedMultipartFile.class new file mode 100644 index 0000000000000000000000000000000000000000..9945b45ab67b01fa4edfe27fd1ac5f5a5dbe5613 GIT binary patch literal 2071 zcmbVN+fv(B6kW#`WQ4-S+}e~h>4jn&f)Ywd18Euzq=9g0Yf3}tCBha)i7a_!xs<-= zr4Rjp{y<;anRccznKF~dKJ=qHT}KwS0%@nyVK_%yd+)W^US}Wq&%b_u4qzI4DuyxJ zi6P9Ta8t$mxFwAb6x>$Pfms#v$g5buqBNIMxFh!uQ@AVlWx1@Ra8JRiiax9@u9m_V!NGY5Cx=|tiKqh;Z zkw8BKHax3rIfgBBoFKTHZ^Onn539^ptlCng>K_WkGua0M=L)`2e7t5ykgQd0 zi&VzK6OP`k?9R)EHwtoC^G!}sU$O3aysw*9#ay#&TV9{;Hm5bi-{(E$Je6EVlglDa zqgpi`>N%2GJbOvPW9A%Qei^YdyxQ?8-#zJVB(w5w$Vq-Lq$eG02`{f1pcl&wqfD_>tQGL`R(3 zg1<8|Xfy&g7=q;jZ@eddTLO(^f~!2yt06fhKz#BuUquznMWB=xugjQZluXwNBTFV_ z`st?hNOCev))|~&$`$@!#Z(A0L;ey*J4WBOggQd{G}?3o?L?v|+PnOrZj!o7v>4HP xkI}z9euM#u*uY?WKGnc~gHt&hpbjsAw27~LlqCX9nz1O!E?wIcVi1+fK7OAt%y09GO`rMF2KU@*zV$&5np*XQW! zFaO#!1L7j9%jNRq%=vEn`}RIF{Qd7Ae*qZBFFJaW)o@=&3|So) zu_AXLYWPS;16DPBtRp2YDXi)E1fOd7OvC3on(&1V1Ga{ojuz=*ATM|8a&hFcA0_FLQbBik(4rA>1=@ZHkp)WBL=K(JOv&E|S$W@&CG@00`AD>1q;r*hF<;yDq| z;G95AX3=VO=+|Xc!jf5ZD|s_LvphF3eoGJFIrciIk~tcw8u#&$CdziOMcUWxz!pflB~@rh z71}Ws4AM|h`OVvI!O6(3Gtw<8s$`j?)>zkf$^|>`%#{L%UBns2)puwTlv;NUzETAb zogMS89ne!!D~k2(3wDs-a^xuWWiRyejzmCpKG)Q!RDpq4a7m!EKGO#7VA6n(et|Pe zG%pIvK&4)EM5BQT+@LlL1PBENWP+C(499U;Orn+;AIashz=cCYT^bGSVAsHx_{zZ7 z2n~EA;nk48$R7z?(?^>4X86{?clh4G5BO048h$eHGbRPDywt@MXiwJL+8lzGqsab5bFvGo{`= z6fxzR?B|W6WRs75SIS@Gb0#AlP6gi4#AweKybA4S750;=VkEmSE5(e|gYiFd)QUCb z35*?&oZYhhW#?hYi%Q5R;-Aa)1g6MDAxC#)rcl5ozV&-KhAO2qlykP@mc;Kz#yYo0z(+)Z;T!z z7>#n8xW<#$dESZG0hhRjH#CfC{OSn}*As-xI~Bpr&^Jck)_tT1w$U0ItU@Q=rz)}R zTYeY8PE+hv_Rh3iTk$4Kf~Sof*jr2|(@sWdttf5#@wBJvXC7pZp<|ibF{Ro{amqKN z%x@pgS6oAqLjzWXB^LH!tnQ;}l|-H1Lo=US*hK4MYXX0!CKK_A>FDq2^V zp+;*KbBfjk?lIGQ#2{&93(0*%@=UQi_08RogHo6 z*3dJYqc*EJzc|v?Q^kenl(#9TJA`AAoCS)0@koJErIrF1M;mR!Or7FiMT=}ZMo*2+ Ne85OS&{CVr{{cln3!?x4 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/util/BeanUtils.class b/common-core-starter/target/classes/com/mosty/common/core/util/BeanUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..7bb5c74a01f029f2be97782add76e0def136086b GIT binary patch literal 2745 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 Z;4+nna0OS(QrB=Dr^u^O!H9NX`Y-x=_^ki{ literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/util/HttpClientUtil.class b/common-core-starter/target/classes/com/mosty/common/core/util/HttpClientUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..835e88dd775f0f56e2cc6d4b433d3b729586c97e GIT binary patch literal 6491 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/util/KafkaProducerConfig.class b/common-core-starter/target/classes/com/mosty/common/core/util/KafkaProducerConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..ec10e55127ede379e5005f864900c4c7e9077191 GIT binary patch literal 336 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/util/http/HttpUtils.class b/common-core-starter/target/classes/com/mosty/common/core/util/http/HttpUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..f8e5c432717ff4e69037aa96e2e1a383902ab872 GIT binary patch literal 12633 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/util/http/HttpsPostUtil$2.class b/common-core-starter/target/classes/com/mosty/common/core/util/http/HttpsPostUtil$2.class new file mode 100644 index 0000000000000000000000000000000000000000..b0fc8fdfe69a00256b4007ce068cbbec49e50ed7 GIT binary patch literal 998 zcmb7CU279T6g|_V*%(u+_1ju)rD7`R)}jwuQA$u+NJL01f=|=QH9NYQ4KuTa{40GD z1pNX2DDloFg+_$LeYkV>&YW}aoIAgMfBy;KF*a%_V>QCf2x}2;2~?hIqx}nkQe*2- zpxn%QB(U7lhTi0ZBeGq2lyYXJl_{AXN~^>FBw6-}b^`SSW5_mB=^XLzqn64B@gQ@4 z6f+uRh8Ih5?sXa`-Vft_4(=@F)+37F8m( z5x6^-hCo&3KIx8zg;hn*rxi~+?2tWXOHVqib+X(ldaVnGr(Ag$GR!MK$AB*45|sYPO%cM6#ZYtHD1fO PjvF}3sK#YNmq7IommcNY literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/com/mosty/common/core/util/http/HttpsPostUtil.class b/common-core-starter/target/classes/com/mosty/common/core/util/http/HttpsPostUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..a617dcbece0529fb2730c810698b23a7b1fc7e2b GIT binary patch literal 8797 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/classes/mapper/SysAppHomeconfigMapper.xml b/common-core-starter/target/classes/mapper/SysAppHomeconfigMapper.xml new file mode 100644 index 0000000..0c735b1 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysAppHomeconfigMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-core-starter/target/classes/mapper/SysAppHomeconfigPlateListMapper.xml b/common-core-starter/target/classes/mapper/SysAppHomeconfigPlateListMapper.xml new file mode 100644 index 0000000..d5566d1 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysAppHomeconfigPlateListMapper.xml @@ -0,0 +1,10 @@ + + + + + + + update sys_app_homeconfig_plate_list set xt_zxbz = 1 where plate_id = #{plateId} + + + diff --git a/common-core-starter/target/classes/mapper/SysAppHomeconfigPlateMapper.xml b/common-core-starter/target/classes/mapper/SysAppHomeconfigPlateMapper.xml new file mode 100644 index 0000000..dd50971 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysAppHomeconfigPlateMapper.xml @@ -0,0 +1,10 @@ + + + + + + + update sys_app_homeconfig_plate set xt_zxbz = 1 where homeid = #{homeid} + + + diff --git a/common-core-starter/target/classes/mapper/SysDeptMapper.xml b/common-core-starter/target/classes/mapper/SysDeptMapper.xml new file mode 100644 index 0000000..a591671 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysDeptMapper.xml @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + ,org_code,org_name,root_path, + org_type,org_level,org_biz_type, + org_no,parent_id,bmpyszm, + org_jc,org_qc,address, + link_tel,link_man,link_man_tel, + web_url,email,xzqh, + bz,xt_zxbz,xt_zxyz, + xt_cjsj,xt_lrsj,xt_lrrxm, + xt_lrrid,xt_lrrbm,xt_lrrbmid, + xt_lrip,xt_zhxgsj,xt_zhxgrxm, + xt_zhxgid,xt_zhxgrbm,xt_zhxgrbmid, + xt_zhxgrip + + + + + + + + + + + diff --git a/common-core-starter/target/classes/mapper/SysLogininforMapper.xml b/common-core-starter/target/classes/mapper/SysLogininforMapper.xml new file mode 100644 index 0000000..ebc94f2 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysLogininforMapper.xml @@ -0,0 +1,34 @@ + + + + + + + + + + + + + + + + + info_id + ,user_name,ipaddr, + status,msg,access_time,browser,os + + + + truncate table sys_oper_log + + + + delete from sys_logininfor where oper_id in + + #{operId} + + + diff --git a/common-core-starter/target/classes/mapper/SysMenuMapper.xml b/common-core-starter/target/classes/mapper/SysMenuMapper.xml new file mode 100644 index 0000000..2560380 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysMenuMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-core-starter/target/classes/mapper/SysOperLogMapper.xml b/common-core-starter/target/classes/mapper/SysOperLogMapper.xml new file mode 100644 index 0000000..769696e --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysOperLogMapper.xml @@ -0,0 +1,223 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + select * + from sys_oper_log + + + + insert into sys_oper_log(mkmc, title, business_type, method, request_method, operator_type, oper_name, + ssbm, oper_user_id, oper_sfzh, ssbmid, ssbmdm, + oper_url, oper_ip, oper_param, json_result, status, error_msg, + oper_time) + values (#{mkmc}, #{title}, #{businessType}, #{method}, #{requestMethod}, #{operatorType}, #{operName}, + #{ssbm}, #{operUserId}, #{operSfzh}, #{ssbmid}, #{ssbmdm}, + #{operUrl}, #{operIp}, #{operParam}, #{jsonResult}, #{status}, + #{errorMsg}, sysdate()) + + + + + + delete from sys_oper_log where oper_id in + + #{operId} + + + + + + + truncate table sys_oper_log + + + + + + + + + + + + \ No newline at end of file diff --git a/common-core-starter/target/classes/mapper/SysOssMapper.xml b/common-core-starter/target/classes/mapper/SysOssMapper.xml new file mode 100644 index 0000000..7d31bdf --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysOssMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-core-starter/target/classes/mapper/SysPositionMapper.xml b/common-core-starter/target/classes/mapper/SysPositionMapper.xml new file mode 100644 index 0000000..ea2efcb --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysPositionMapper.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/common-core-starter/target/classes/mapper/SysRoleDeptMapper.xml b/common-core-starter/target/classes/mapper/SysRoleDeptMapper.xml new file mode 100644 index 0000000..fac3104 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysRoleDeptMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + id,role_id,dept_id + + diff --git a/common-core-starter/target/classes/mapper/SysRoleMapper.xml b/common-core-starter/target/classes/mapper/SysRoleMapper.xml new file mode 100644 index 0000000..0ce5679 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysRoleMapper.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,role_name,role_code,role_desc, + order_no,bz,xt_cjsj, + xt_lrsj,xt_lrrxm,xt_lrrid, + xt_lrrbm,xt_lrrbmid,xt_lrip, + xt_zhxgsj,xt_zhxgrxm,xt_zhxgrid, + xt_zhxgrbm,xt_zhxgrbmid,xt_zhxgip, + xt_zxbz,xt_zxyy + + diff --git a/common-core-starter/target/classes/mapper/SysRoleMenuMapper.xml b/common-core-starter/target/classes/mapper/SysRoleMenuMapper.xml new file mode 100644 index 0000000..85c8092 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysRoleMenuMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + id,role_id,menu_id + + diff --git a/common-core-starter/target/classes/mapper/SysUserAppHomeconfigMapper.xml b/common-core-starter/target/classes/mapper/SysUserAppHomeconfigMapper.xml new file mode 100644 index 0000000..a436c93 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysUserAppHomeconfigMapper.xml @@ -0,0 +1,10 @@ + + + + + + + update sys_user_app_homeconfig set xt_scbz = '1' where user_sfzh = #{sfzh} + + + diff --git a/common-core-starter/target/classes/mapper/SysUserAppHomeconfigPlateListMapper.xml b/common-core-starter/target/classes/mapper/SysUserAppHomeconfigPlateListMapper.xml new file mode 100644 index 0000000..9e6e7ca --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysUserAppHomeconfigPlateListMapper.xml @@ -0,0 +1,22 @@ + + + + + + + update sys_user_app_homeconfig_plate_list set xt_zxbz = 1 + where pz_id = #{pzId} and pz_plate_id = #{pzPlateId} + + + + update sys_user_app_homeconfig_plate_list set xt_zxbz = 1 + where pz_id = #{pzId} + + + + update sys_user_app_homeconfig_plate_list set xt_zxbz = #{zxbz} + where pz_id = #{pzId} and pz_plate_id = #{pzPlateId} and plate_list_id = #{plateListId} + + + + diff --git a/common-core-starter/target/classes/mapper/SysUserAppHomeconfigPlateMapper.xml b/common-core-starter/target/classes/mapper/SysUserAppHomeconfigPlateMapper.xml new file mode 100644 index 0000000..8366a84 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysUserAppHomeconfigPlateMapper.xml @@ -0,0 +1,15 @@ + + + + + + + update sys_user_app_homeconfig_plate set xt_zxbz = 1 where pz_id = #{pzId} + + + + + update sys_user_app_homeconfig_plate set xt_zxbz = #{zxbz} where id = #{id} + + + diff --git a/common-core-starter/target/classes/mapper/SysUserDeptMapper.xml b/common-core-starter/target/classes/mapper/SysUserDeptMapper.xml new file mode 100644 index 0000000..b26947a --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysUserDeptMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + id,user_id,dept_id + + diff --git a/common-core-starter/target/classes/mapper/SysUserMapper.xml b/common-core-starter/target/classes/mapper/SysUserMapper.xml new file mode 100644 index 0000000..4c63b45 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysUserMapper.xml @@ -0,0 +1,207 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,manager_org_id,manager_org_name, + position_id,position_name,is_virtual_user,login_name, + password,user_name,user_type, + email,mobile,tele_phone, + id_entity_card,in_dust_rial_id,sex, + nation,politic, marital, type, whcd,bz, + birthday,begin_time,end_time, + salt,xt_zxbz,xt_zxyz, + xt_cjsj,xt_lrsj,xt_lrrxm, + xt_lrrid,xt_lrrbm,xt_lrrbmid, + xt_lrip,xt_zhxgsj,xt_zhxgrxm, + xt_zhxgid,xt_zhxgrbm,xt_zhxgrbmid, + xt_zhxgrip + + + + + + + + + + + + + + + + delete from sys_user where id = #{id} + + diff --git a/common-core-starter/target/classes/mapper/SysUserRoleMapper.xml b/common-core-starter/target/classes/mapper/SysUserRoleMapper.xml new file mode 100644 index 0000000..0479b10 --- /dev/null +++ b/common-core-starter/target/classes/mapper/SysUserRoleMapper.xml @@ -0,0 +1,54 @@ + + + + + + + + + + + + id,user_id,role_id + + + + + + + diff --git a/common-core-starter/target/common-core-starter-1.0.0-SNAPSHOT.jar b/common-core-starter/target/common-core-starter-1.0.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..c7ab9d40fcd88bc4e6cb0a9f7e9d4cf1eb515465 GIT binary patch literal 449907 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≫Mg5M= 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

Sbf&La?0`7qX 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 literal 0 HcmV?d00001 diff --git a/common-core-starter/target/maven-archiver/pom.properties b/common-core-starter/target/maven-archiver/pom.properties new file mode 100644 index 0000000..c30e5b1 --- /dev/null +++ b/common-core-starter/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Thu Apr 18 12:45:21 CST 2024 +version=1.0.0-SNAPSHOT +groupId=com.mosty +artifactId=common-core-starter diff --git a/common-core-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/common-core-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..d672e94 --- /dev/null +++ b/common-core-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,178 @@ +com\mosty\common\core\business\entity\vo\DeleteDeptVO.class +com\mosty\common\core\config\CaptchaConfig.class +com\mosty\common\core\business\mapper\SysMenuMapper.class +com\mosty\common\core\business\service\SysAppHomeconfigPlateService.class +com\mosty\common\core\business\service\SysRoleDeptService.class +com\mosty\common\core\business\entity\vo\SysAppHomeconfigPlateVo.class +com\mosty\common\core\business\mapper\YbmjMapper.class +com\mosty\common\core\business\mapper\SysUserMapper.class +com\mosty\common\core\business\mapper\SysAppHomeconfigMapper.class +com\mosty\common\core\config\MinIoClientConfig.class +com\mosty\common\core\business\entity\SysOss.class +com\mosty\common\core\CoreAutoConfiguration.class +com\mosty\common\core\business\entity\vo\MenuQuery.class +com\mosty\common\core\business\controller\SysUserAppHomeconfigPlateController.class +com\mosty\common\core\business\mapper\SysRoleMapper.class +com\mosty\common\core\business\controller\SysUserAppHomeconfigController.class +com\mosty\common\core\business\mapper\SysAppHomeconfigPlateMapper.class +com\mosty\common\core\business\entity\vo\SysUserDeptVO.class +com\mosty\common\core\business\entity\vo\DataPermissionVO.class +com\mosty\common\core\business\entity\vo\DeptVo.class +com\mosty\common\core\business\entity\vo\GetUserRoleListVo.class +com\mosty\common\core\business\entity\TbJcglXfll.class +com\mosty\common\core\util\http\MyX509TrustManager.class +com\mosty\common\core\business\controller\SysUserAppHomeconfigPlateListController.class +com\mosty\common\core\business\entity\request\SysAppHomeconfigPage.class +com\mosty\common\core\business\entity\request\SysAppHomeconfigPlateListPage.class +com\mosty\common\core\business\entity\vo\DeleteUserDeptVO.class +com\mosty\common\core\login\LoginRequest.class +com\mosty\common\core\business\service\impl\SysDeptServiceImpl.class +com\mosty\common\core\business\service\SysUserAppHomeconfigService.class +com\mosty\common\core\business\timer\DeptUserSys.class +com\mosty\common\core\business\controller\SysRoleController.class +com\mosty\common\core\business\entity\vo\RoleUserPage.class +com\mosty\common\core\business\controller\SysMenuController.class +com\mosty\common\core\business\entity\SysUser.class +com\mosty\common\core\business\entity\vo\SysUserAppHomeconfigPlateVo.class +com\mosty\common\core\business\mapper\SysOssMapper.class +com\mosty\common\core\business\service\SysMenuService.class +com\mosty\common\core\util\RSAUtil.class +com\mosty\common\core\business\entity\vo\AddUserDeptVO.class +com\mosty\common\core\business\mapper\SysUserAppHomeconfigPlateMapper.class +com\mosty\common\core\business\entity\request\SysUserEditPasswordRequest.class +com\mosty\common\core\business\entity\vo\PositionPage.class +com\mosty\common\core\business\mapper\SysAppHomeconfigPlateListMapper.class +com\mosty\common\core\business\controller\SysPositionController.class +com\mosty\common\core\business\service\impl\SysUserServiceImpl.class +com\mosty\common\core\business\entity\vo\DeptTreeVO.class +com\mosty\common\core\login\ImageController.class +com\mosty\common\core\business\service\SysUserService.class +com\mosty\common\core\util\CacheUtils.class +com\mosty\common\core\business\entity\request\LoginLogPage.class +com\mosty\common\core\business\controller\TokenController.class +com\mosty\common\core\business\service\SysRoleService.class +com\mosty\common\core\business\entity\vo\Base64Str.class +com\mosty\common\core\business\service\SysOssService.class +com\mosty\common\core\login\LoginEntity.class +com\mosty\common\core\login\TokenRequest.class +com\mosty\common\core\business\mapper\SysRoleMenuMapper.class +com\mosty\common\core\login\dto\DeptDTO.class +com\mosty\common\core\business\entity\vo\DeptQuery.class +com\mosty\common\core\business\controller\SysAppHomeconfigPlateController.class +com\mosty\common\core\business\entity\vo\SysUserVO.class +com\mosty\common\core\business\entity\vo\AddDeptVO.class +com\mosty\common\core\business\entity\vo\SysUserEditVO.class +com\mosty\common\core\business\entity\SysAppHomeconfigPlate.class +com\mosty\common\core\business\service\impl\SysLogininforServiceImpl.class +com\mosty\common\core\business\entity\vo\GetUserPage.class +com\mosty\common\core\business\entity\vo\DeleteRoleDeptVO.class +com\mosty\common\core\business\controller\SysDeptController.class +com\mosty\common\core\business\entity\request\SysUserAppHomeconfigPlateListPage.class +com\mosty\common\core\business\entity\vo\UserDeptVO.class +com\mosty\common\core\login\IdCardLoginRequest.class +com\mosty\common\core\business\service\impl\SysOssServiceImpl.class +com\mosty\common\core\util\HttpClientUtil.class +com\mosty\common\core\business\entity\SysUserAppHomeconfigPlate.class +com\mosty\common\core\business\entity\vo\UserDeptPage.class +com\mosty\common\core\business\service\impl\SysUserAppHomeconfigPlateListServiceImpl.class +com\mosty\common\core\business\entity\vo\SysAppHomeconfigVO.class +com\mosty\common\core\business\entity\request\SysAppHomeconfigPlatePage.class +com\mosty\common\core\business\entity\vo\SysUserInfoVO.class +com\mosty\common\core\business\entity\vo\DeleteListVO.class +com\mosty\common\core\util\KafkaProducerConfig.class +com\mosty\common\core\business\entity\SysAppHomeconfig.class +com\mosty\common\core\business\entity\SysAppHomeconfigPlateList.class +com\mosty\common\core\business\service\SysUserRoleService.class +com\mosty\common\core\business\service\SysAppHomeconfigPlateListService.class +com\mosty\common\core\business\entity\vo\UnboundUserRoleVO.class +com\mosty\common\core\util\http\HttpsPostUtil.class +com\mosty\common\core\business\entity\SysLogininfor.class +com\mosty\common\core\business\entity\vo\AddSysMenuVO.class +com\mosty\common\core\business\entity\vo\RoleUserVO.class +com\mosty\common\core\business\service\SysRoleMenuService.class +com\mosty\common\core\business\entity\request\SysUserAppHomeconfigPage.class +com\mosty\common\core\business\entity\SysUserDept.class +com\mosty\common\core\util\HttpClientUtil$1.class +com\mosty\common\core\util\BASE64DecodedMultipartFile.class +com\mosty\common\core\business\entity\vo\LoginResponseVO.class +com\mosty\common\core\business\entity\vo\RolePage.class +com\mosty\common\core\business\entity\vo\AddSysUserVO.class +com\mosty\common\core\business\entity\vo\RoleDeptVO.class +com\mosty\common\core\business\entity\SysDept.class +com\mosty\common\core\business\controller\SysAppHomeconfigController.class +com\mosty\common\core\business\mapper\SysLogininforMapper.class +com\mosty\common\core\business\entity\vo\DeptPage.class +com\mosty\common\core\business\entity\SysPosition.class +com\mosty\common\core\business\service\impl\SysAppHomeconfigPlateServiceImpl.class +com\mosty\common\core\business\entity\vo\SysAppHomeconfigRsVO.class +com\mosty\common\core\business\entity\request\SysUserAppHomeconfigPlatePage.class +com\mosty\common\core\business\entity\vo\UserRoleVO.class +com\mosty\common\core\business\entity\SysMenu.class +com\mosty\common\core\login\LoginResponseVO.class +com\mosty\common\core\business\service\impl\SysUserAppHomeconfigServiceImpl.class +com\mosty\common\core\business\service\SysLogininforService.class +com\mosty\common\core\business\service\impl\SysUserDeptServiceImpl.class +com\mosty\common\core\business\service\impl\SysRoleMenuServiceImpl.class +com\mosty\common\core\business\service\LoginService.class +com\mosty\common\core\business\service\SysUserAppHomeconfigPlateService.class +com\mosty\common\core\config\DefaultRoleConfig.class +com\mosty\common\core\business\service\impl\LoginServiceImpl.class +com\mosty\common\core\business\mapper\SysDeptMapper.class +com\mosty\common\core\login\dto\DeptAllVo.class +com\mosty\common\core\business\mapper\SysUserAppHomeconfigPlateListMapper.class +com\mosty\common\core\util\Base64Util.class +com\mosty\common\core\business\entity\SysRoleMenu.class +com\mosty\common\core\business\service\impl\SysRoleDeptServiceImpl.class +com\mosty\common\core\business\entity\SysUserAppHomeconfigPlateList.class +com\mosty\common\core\business\service\impl\SysMenuServiceImpl.class +com\mosty\common\core\business\service\impl\SysUserAppHomeconfigPlateServiceImpl.class +com\mosty\common\core\util\http\HttpUtils.class +com\mosty\common\core\login\dto\ImageRequest.class +com\mosty\common\core\business\entity\SysUserAppHomeconfig.class +com\mosty\common\core\login\UserPermissionsInfo.class +com\mosty\common\core\minio\UploadController.class +com\mosty\common\core\business\entity\Ybmj.class +com\mosty\common\core\business\controller\SysAppHomeconfigPlateListController.class +com\mosty\common\core\business\entity\SysRole.class +com\mosty\common\core\business\controller\SysLogininforController.class +com\mosty\common\core\business\service\impl\SysUserRoleServiceImpl.class +com\mosty\common\core\login\JwtTokenGenerator.class +com\mosty\common\core\business\service\impl\SysPositionServiceImpl.class +com\mosty\common\core\business\service\SysDeptService.class +com\mosty\common\core\business\entity\vo\AddRoleVO.class +com\mosty\common\core\business\entity\vo\EditSysMenuVO.class +com\mosty\common\core\business\entity\vo\UserByDeptPage.class +com\mosty\common\core\business\entity\vo\SysDeptVO.class +com\mosty\common\core\business\service\SysPositionService.class +com\mosty\common\core\login\LoginServiceController.class +com\mosty\common\core\business\entity\vo\RoleByDeptPage.class +com\mosty\common\core\business\entity\vo\UserPage.class +com\mosty\common\core\business\entity\vo\AddRoleDataPartitionVO.class +com\mosty\common\core\business\service\impl\SysAppHomeconfigServiceImpl.class +com\mosty\common\core\business\entity\request\SysUserAppHomeconfigQuery.class +com\mosty\common\core\business\entity\vo\AddRoleDeptVO.class +com\mosty\common\core\business\entity\vo\MenuPage.class +com\mosty\common\core\business\mapper\SysRoleDeptMapper.class +com\mosty\common\core\business\mapper\SysUserAppHomeconfigMapper.class +com\mosty\common\core\business\entity\vo\SysRoleVO.class +com\mosty\common\core\business\mapper\SysPositionMapper.class +com\mosty\common\core\business\service\SysUserAppHomeconfigPlateListService.class +com\mosty\common\core\business\entity\request\SysAppHomeconfigQuery.class +com\mosty\common\core\business\entity\vo\AddRoleMenuVO.class +com\mosty\common\core\util\http\HttpsPostUtil$2.class +com\mosty\common\core\business\entity\vo\SysUserAppHomeconfigVo.class +com\mosty\common\core\business\service\SysAppHomeconfigService.class +com\mosty\common\core\business\entity\SysRoleDept.class +com\mosty\common\core\business\mapper\SysUserDeptMapper.class +com\mosty\common\core\util\BeanUtils.class +com\mosty\common\core\business\mapper\SysUserRoleMapper.class +com\mosty\common\core\business\controller\SysUserController.class +com\mosty\common\core\business\entity\SysUserRole.class +com\mosty\common\core\business\service\impl\SysRoleServiceImpl.class +com\mosty\common\core\util\ShiroUtils.class +com\mosty\common\core\constant\DataPermissionConstant.class +com\mosty\common\core\util\http\HttpsPostUtil$1.class +com\mosty\common\core\login\UnifiedLoginRequest.class +com\mosty\common\core\business\entity\vo\SysUserHomeconfigVo.class +com\mosty\common\core\business\service\impl\SysAppHomeconfigPlateListServiceImpl.class +com\mosty\common\core\business\service\SysUserDeptService.class diff --git a/common-core-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/common-core-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..5c3336a --- /dev/null +++ b/common-core-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,175 @@ +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysAppHomeconfigPlate.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysAppHomeconfigMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysUserAppHomeconfigPlateService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysLogininfor.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\MenuPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysPositionController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\request\SysAppHomeconfigPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\LoginServiceController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\EditSysMenuVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysMenu.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\AddSysMenuVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysRoleMenu.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysRoleVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysOssServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysAppHomeconfigController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\request\SysAppHomeconfigQuery.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\UserDeptPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\AddRoleMenuVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysUserInfoVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\RoleUserPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysDeptMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysDeptController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\config\DefaultRoleConfig.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\http\HttpsPostUtil.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\TokenRequest.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysRoleDeptServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\BASE64DecodedMultipartFile.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\Base64Util.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\ShiroUtils.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysUser.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysRoleDept.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\AddUserDeptVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\request\SysUserAppHomeconfigPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysUserAppHomeconfigPlateServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysRoleDeptService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysAppHomeconfigPlateController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\MenuQuery.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysPositionServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\UserPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysUserAppHomeconfigPlate.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\LoginRequest.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysAppHomeconfigPlateServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysDeptService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysLogininforMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysUserMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysAppHomeconfigPlateVo.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysRoleMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysUserRole.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\DeptVo.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\IdCardLoginRequest.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysUserAppHomeconfigPlateList.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysUserAppHomeconfigPlateController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\DeleteListVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysRoleMenuServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysOssService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysUserRoleServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\Ybmj.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\dto\DeptDTO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\config\CaptchaConfig.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysUserAppHomeconfig.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\RolePage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\LoginResponseVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\request\LoginLogPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\UnifiedLoginRequest.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\UnboundUserRoleVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\UserPermissionsInfo.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\GetUserRoleListVo.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysUserDeptMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\HttpClientUtil.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\YbmjMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysLogininforServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysRoleMenuMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysUserAppHomeconfigService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\DataPermissionVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysUserEditVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysRoleDeptMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\CacheUtils.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysAppHomeconfig.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\AddDeptVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\timer\DeptUserSys.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\RSAUtil.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysOssMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysPositionMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\DeptPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysAppHomeconfigPlateListController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\AddSysUserVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysDeptServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\DeptQuery.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\ImageController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\GetUserPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\http\HttpUtils.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\RoleByDeptPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysAppHomeconfigPlateListMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysUserService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\constant\DataPermissionConstant.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysPosition.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysUserServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\PositionPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysAppHomeconfigVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysUserAppHomeconfigPlateMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysAppHomeconfigServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysPositionService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysRoleService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysUserAppHomeconfigVo.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysMenuServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysUserAppHomeconfigController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\LoginServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysDeptVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysUserVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysMenuController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\AddRoleVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\TokenController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\RoleUserVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysUserDept.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysUserHomeconfigVo.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysOss.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysRoleMenuService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysAppHomeconfigPlateListService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\dto\ImageRequest.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\request\SysAppHomeconfigPlateListPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\request\SysUserEditPasswordRequest.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysUserRoleService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\KafkaProducerConfig.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysUserAppHomeconfigServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\LoginEntity.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysUserDeptVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysUserAppHomeconfigMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\LoginResponseVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysUserAppHomeconfigPlateListMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\UserByDeptPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysMenuService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\Base64Str.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\minio\UploadController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\DeleteDeptVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysAppHomeconfigPlateListServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysUserDeptService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\request\SysAppHomeconfigPlatePage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\UserRoleVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\LoginService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\config\MinIoClientConfig.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\AddRoleDeptVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysRoleController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\UserDeptVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysLogininforController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysUserAppHomeconfigPlateListController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysDept.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysUserDeptServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\dto\DeptAllVo.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\http\MyX509TrustManager.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\DeptTreeVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysLogininforService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysRole.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysUserAppHomeconfigPlateVo.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysUserAppHomeconfigPlateListServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\request\SysUserAppHomeconfigPlateListPage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\SysAppHomeconfigPlateList.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysMenuMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\request\SysUserAppHomeconfigQuery.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\request\SysUserAppHomeconfigPlatePage.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\SysAppHomeconfigRsVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\util\BeanUtils.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\RoleDeptVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysAppHomeconfigPlateMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysUserAppHomeconfigPlateListService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\DeleteUserDeptVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysAppHomeconfigService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\DeleteRoleDeptVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\CoreAutoConfiguration.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\login\JwtTokenGenerator.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\mapper\SysUserRoleMapper.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\impl\SysRoleServiceImpl.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\vo\AddRoleDataPartitionVO.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\service\SysAppHomeconfigPlateService.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\controller\SysUserController.java +C:\tools\dy外网\mosty-common\common-core-starter\src\main\java\com\mosty\common\core\business\entity\TbJcglXfll.java diff --git a/common-dynamic-datasource-starter/common-dynamic-datasource-starter.iml b/common-dynamic-datasource-starter/common-dynamic-datasource-starter.iml new file mode 100644 index 0000000..13dbd0b --- /dev/null +++ b/common-dynamic-datasource-starter/common-dynamic-datasource-starter.iml @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common-dynamic-datasource-starter/pom.xml b/common-dynamic-datasource-starter/pom.xml new file mode 100644 index 0000000..98819e6 --- /dev/null +++ b/common-dynamic-datasource-starter/pom.xml @@ -0,0 +1,33 @@ + + + + mosty-common + com.mosty + 1.0.0-SNAPSHOT + + 4.0.0 + + common-dynamic-datasource-starter + + + 8 + 8 + + + + + com.mosty + common-base-starter + 1.0.0-SNAPSHOT + + + org.springframework + spring-jdbc + 5.3.6 + compile + + + + \ No newline at end of file diff --git a/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DataSource.java b/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DataSource.java new file mode 100644 index 0000000..0ffe6e7 --- /dev/null +++ b/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DataSource.java @@ -0,0 +1,19 @@ +package com.common.dynamic.datasource; + +import java.lang.annotation.*; + +/** + * 切换数据注解 可以用于类或者方法级别 方法级别优先级 > 类级别 + * + * @author kevin + * @date 2022/4/29 8:59 上午 + * @since 1.0.0 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE, ElementType.PARAMETER}) +public @interface DataSource { + + String value() default "master"; + +} diff --git a/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceAspect.java b/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceAspect.java new file mode 100644 index 0000000..6038c38 --- /dev/null +++ b/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceAspect.java @@ -0,0 +1,32 @@ +package com.common.dynamic.datasource; + +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.After; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Before; +import org.springframework.stereotype.Component; + +@Slf4j +@Aspect +@Component +public class DynamicDataSourceAspect { + + @Before("@annotation(ds)") + public void changeDataSource(JoinPoint point, DataSource ds) throws Throwable { + String dsId = ds.value(); + if (DynamicDataSourceContextHolder.dataSourceIds.contains(dsId)) { + log.debug("Use DataSource :{} >", dsId, point.getSignature()); + } else { + log.info("数据源[{}]不存在,使用默认数据源 >{}", dsId, point.getSignature()); + DynamicDataSourceContextHolder.setDataSourceRouterKey(dsId); + } + } + + @After("@annotation(ds)") + public void restoreDataSource(JoinPoint point, DataSource ds) { + log.debug("Revert DataSource : " + ds.value() + " > " + point.getSignature()); + DynamicDataSourceContextHolder.removeDataSourceRouterKey(); + + } +} diff --git a/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceContextHolder.java b/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceContextHolder.java new file mode 100644 index 0000000..c20b1af --- /dev/null +++ b/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceContextHolder.java @@ -0,0 +1,55 @@ +package com.common.dynamic.datasource; + +import com.alibaba.ttl.TransmittableThreadLocal; +import com.google.common.collect.Lists; +import lombok.extern.slf4j.Slf4j; + +import java.util.ArrayList; +import java.util.List; + +/** + * 动态数据源处理器 + * @author kevin + * @date 2022/4/29 9:02 上午 + * @since 1.0.0 + */ +@Slf4j +public class DynamicDataSourceContextHolder { + + /** + * 存储已经注册的数据源的key + */ + public static List dataSourceIds = new ArrayList<>(); + + /** + * 使用{@link TransmittableThreadLocal} 进行存储,使用线程池等后还能获取到 + */ + private static final ThreadLocal HOLDER = TransmittableThreadLocal.withInitial(() -> null); + + public static String getDataSourceRouterKey () { + return HOLDER.get(); + } + + public static void setDataSourceRouterKey (String dataSourceRouterKey) { + log.info("切换至{}数据源", dataSourceRouterKey); + HOLDER.set(dataSourceRouterKey); + } + + /** + * 设置数据源之前一定要先移除 + */ + public static void removeDataSourceRouterKey () { + HOLDER.remove(); + } + + /** + * 判断指定DataSrouce当前是否存在 + * + * @param dataSourceId + * @return + */ + public static boolean containsDataSource(String dataSourceId){ + return dataSourceIds.contains(dataSourceId); + } + +} diff --git a/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceRegister.java b/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceRegister.java new file mode 100644 index 0000000..823ae58 --- /dev/null +++ b/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicDataSourceRegister.java @@ -0,0 +1,175 @@ +package com.common.dynamic.datasource; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.MutablePropertyValues; +import org.springframework.beans.factory.support.BeanDefinitionRegistry; +import org.springframework.beans.factory.support.GenericBeanDefinition; +import org.springframework.boot.context.properties.bind.Bindable; +import org.springframework.boot.context.properties.bind.Binder; +import org.springframework.boot.context.properties.source.ConfigurationPropertyName; +import org.springframework.boot.context.properties.source.ConfigurationPropertyNameAliases; +import org.springframework.boot.context.properties.source.ConfigurationPropertySource; +import org.springframework.boot.context.properties.source.MapConfigurationPropertySource; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.ImportBeanDefinitionRegistrar; +import org.springframework.core.env.Environment; +import org.springframework.core.type.AnnotationMetadata; +import org.springframework.util.StringUtils; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 动态数据源注册 + * 实现 ImportBeanDefinitionRegistrar 实现数据源注册 + * 实现 EnvironmentAware 用于读取application.yml配置 + */ +@Slf4j +public class DynamicDataSourceRegister implements ImportBeanDefinitionRegistrar, EnvironmentAware { + + /** + * 配置上下文(也可以理解为配置文件的获取工具) + */ + private Environment evn; + + /** + * 别名 + */ + private final static ConfigurationPropertyNameAliases aliases = new ConfigurationPropertyNameAliases(); + + /** + * 由于部分数据源配置不同,所以在此处添加别名,避免切换数据源出现某些参数无法注入的情况 + */ + static { + aliases.addAliases("url", new String[]{"jdbc-url"}); + aliases.addAliases("username", new String[]{"user"}); + } + + /** + * 存储我们注册的数据源 + */ + private Map customDataSources = new HashMap(); + + /** + * 参数绑定工具 springboot2.0新推出 + */ + private Binder binder; + + /** + * ImportBeanDefinitionRegistrar接口的实现方法,通过该方法可以按照自己的方式注册bean + * + * @param annotationMetadata + * @param beanDefinitionRegistry + */ + @Override + public void registerBeanDefinitions(AnnotationMetadata annotationMetadata, BeanDefinitionRegistry beanDefinitionRegistry) { + // 获取所有数据源配置 + Map config, defauleDataSourceProperties; + defauleDataSourceProperties = binder.bind("spring.datasource.master", Map.class).get(); + // 获取数据源类型 + String typeStr = evn.getProperty("spring.datasource.master.type"); + // 获取数据源类型 + Class clazz = getDataSourceType(typeStr); + // 绑定默认数据源参数 也就是主数据源 + DataSource consumerDatasource, defaultDatasource = bind(clazz, defauleDataSourceProperties); + DynamicDataSourceContextHolder.dataSourceIds.add("master"); + log.info("注册默认数据源成功"); + // 获取其他数据源配置 + List configs = binder.bind("spring.datasource.cluster", Bindable.listOf(Map.class)).get(); + // 遍历从数据源 + for (int i = 0; i < configs.size(); i++) { + config = configs.get(i); + clazz = getDataSourceType((String) config.get("type")); + defauleDataSourceProperties = config; + // 绑定参数 + consumerDatasource = bind(clazz, defauleDataSourceProperties); + // 获取数据源的key,以便通过该key可以定位到数据源 + String key = config.get("key").toString(); + customDataSources.put(key, consumerDatasource); + // 数据源上下文,用于管理数据源与记录已经注册的数据源key + DynamicDataSourceContextHolder.dataSourceIds.add(key); + log.info("注册数据源{}成功", key); + } + // bean定义类 + GenericBeanDefinition define = new GenericBeanDefinition(); + // 设置bean的类型,此处DynamicRoutingDataSource是继承AbstractRoutingDataSource的实现类 + define.setBeanClass(DynamicRoutingDataSource.class); + // 需要注入的参数 + MutablePropertyValues mpv = define.getPropertyValues(); + // 添加默认数据源,避免key不存在的情况没有数据源可用 + mpv.add("defaultTargetDataSource", defaultDatasource); + // 添加其他数据源 + mpv.add("targetDataSources", customDataSources); + // 将该bean注册为datasource,不使用springboot自动生成的datasource + beanDefinitionRegistry.registerBeanDefinition("datasource", define); + log.info("注册数据源成功,一共注册{}个数据源", customDataSources.keySet().size() + 1); + } + + /** + * 通过字符串获取数据源class对象 + * + * @param typeStr + * @return + */ + private Class getDataSourceType(String typeStr) { + Class type = null; + try { + if (StringUtils.hasLength(typeStr)) { + // 字符串不为空则通过反射获取class对象 + type = (Class) Class.forName(typeStr); + } else { + // 默认为hikariCP数据源,与springboot默认数据源保持一致 +// type = HikariDataSource.class; + } + return type; + } catch (Exception e) { + throw new IllegalArgumentException("can not resolve class with type: " + typeStr); //无法通过反射获取class对象的情况则抛出异常,该情况一般是写错了,所以此次抛出一个runtimeexception + } + } + + /** + * 绑定参数,以下三个方法都是参考DataSourceBuilder的bind方法实现的,目的是尽量保证我们自己添加的数据源构造过程与springboot保持一致 + * + * @param result + * @param properties + */ + private void bind(DataSource result, Map properties) { + ConfigurationPropertySource source = new MapConfigurationPropertySource(properties); + Binder binder = new Binder(new ConfigurationPropertySource[]{source.withAliases(aliases)}); + // 将参数绑定到对象 + binder.bind(ConfigurationPropertyName.EMPTY, Bindable.ofInstance(result)); + } + + private T bind(Class clazz, Map properties) { + ConfigurationPropertySource source = new MapConfigurationPropertySource(properties); + Binder binder = new Binder(new ConfigurationPropertySource[]{source.withAliases(aliases)}); + // 通过类型绑定参数并获得实例对象 + return binder.bind(ConfigurationPropertyName.EMPTY, Bindable.of(clazz)).get(); + } + + /** + * @param clazz + * @param sourcePath 参数路径,对应配置文件中的值,如: spring.datasource + * @param + * @return + */ + private T bind(Class clazz, String sourcePath) { + Map properties = binder.bind(sourcePath, Map.class).get(); + return bind(clazz, properties); + } + + /** + * EnvironmentAware接口的实现方法,通过aware的方式注入,此处是environment对象 + * + * @param environment + */ + @Override + public void setEnvironment(Environment environment) { + log.info("开始注册数据源"); + this.evn = environment; + // 绑定配置器 + binder = Binder.get(evn); + } + +} diff --git a/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicRoutingDataSource.java b/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicRoutingDataSource.java new file mode 100644 index 0000000..32f4354 --- /dev/null +++ b/common-dynamic-datasource-starter/src/main/java/com/common/dynamic/datasource/DynamicRoutingDataSource.java @@ -0,0 +1,21 @@ +package com.common.dynamic.datasource; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; + +/** + * @Auther: yukong + * @Date: 2018/8/15 10:47 + * @Description: 动态数据源路由配置 + */ +@Slf4j +public class DynamicRoutingDataSource extends AbstractRoutingDataSource { + + + @Override + protected Object determineCurrentLookupKey() { + String dataSourceName = DynamicDataSourceContextHolder.getDataSourceRouterKey(); + log.info("当前数据源是:{}", dataSourceName); + return DynamicDataSourceContextHolder.getDataSourceRouterKey(); + } +} diff --git a/common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DataSource.class b/common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DataSource.class new file mode 100644 index 0000000000000000000000000000000000000000..0b43083612b119a259b41f99a16ee68d30821925 GIT binary patch literal 541 zcmaixOH0E*5Xb-9S8RQ>)v9<99|vhK=Hks$ArS>@OBx07v`xpdCD}-_DfFv(@B{dv z#EF9Gq2OU>=keQ_;lH0>?;ilJaA=`pVc)`mKy@L*j08H}-u+xIq#a5lu#>6TA>37ylrmI8?!sLCbr5@b3n$!14MgzD#Chm^@!! zcSFh-^OtYLP;KD)w?jvu;y;hLX?@i9`kZq;fo>2-HlHZg_H?Obqyl@&+N3{X*@a93 ztwQnPWKIE#ds3uUbSbpE5D+NwDf3r~3U7caM>UShDJ(8+uvTDn*lgnnmMw;9eSG&8HvlQj(`xn!tWT~m^( zquOTP(zr6>iAG2==}HFe9M>E|uhnK%Bh5=Y3}Z2urs}H9DH+;Vu9~`WlO89&A5sw_ zF1)GCi9-zSZ!*c?OOg|v|J^i&DQS--MNsC{1=Zs?=~%jvCZDP&9aWpZuIAhzNtj{? zU0&39&e2W7mT-%qWg>4ldX`V?wocI;Gz`;G-ED^BySb{xePxKJOp6mr<${{Yi%eZA z?Z%RJ2Sc63ZHJV~gL>?ZMh8=lTML0cEmNq5ke8@YUF5#~UlMpmc)uUxVy-(~4t7q2 zDP^fy{=l^66`P>B=`7{AGHhmZrok!8GFs6lVOoZQ+Y&yKaR+xL+>`M!?#noc7KVmf zHjkEkj9y$`i4I8kM8>E1OoA$71{y>6=2uTQA3oW9@x{I6mHV&OAHIJ4==C?NfByLS ztDk=P?aS3aUOxK$$+tzN=)m%dj3hJ}94Ut8oe3Vw>zO3C2!DbvaLd_7Au1z{S?ZLfq5 z>2C$AjGKp1(hoT1R`s-4JZmnL-5+H-a7MN5xEJ@G*=(Lq*pH{62h*=4YskRCS%&fW)wYfFIxCppXTNvXCEL>j(?b z3Kz7MV1YVFh@hVSCy9G6n$Sng1(8k@a{V}gw~4xhb95?3_Bu#E2;W~g zDWS6gr)Vi0KaDP$g=uz%9>vBxG`vd=`CNw<>0|{dbQ9B;kncQ4b);qu2R#315~-z^ z=hPbN))3i1y$|bXD21-Zwa`ughsg2~mwD8)T4df`WZqq1zD28hi&g;dVJk^TNhp57 fNaH%1en6!_V`Yg75&s^N`Eb^CP^{0<`aJLtBf@MJ literal 0 HcmV?d00001 diff --git a/common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DynamicDataSourceContextHolder.class b/common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DynamicDataSourceContextHolder.class new file mode 100644 index 0000000000000000000000000000000000000000..a84546d25ef23b25b707f2ef62e84247cadcc253 GIT binary patch literal 2320 zcmbtVZBHCk6n^gVGVJUWwo9S5D6OzqpxS8_>&qhA@*-=epe&;G{qF9tT$r69Gj~y9 z{9L~@@r!@J&&Je}v=tNMXXD?H_$!R(&MeGyd5MW6%*;9WygcXJ=bZiHpWWX8OrWkK zhihpVcu~hon9%UD60UdQl?-0RYfAaLdK8p;GJ`iTrQuB-Z{dc9n>xC2Ek}{&brkWA zhFc76j#p#IS)N}r17~$&-L$+~&Grinr>b1?lGpGncCi{TWUY0+#m$Bkj%kTNl1aKG zYA%-z-)6|S98X5F!`+%$lD=?jg(-6BoL{tNW|tVwCeD}Fe4AG-ufiQNxqS4=aRDcV zE94ZFGCH=x&_3-|2~CeBTzjEWFWdeyFFT~68Y%n=_l1(1%67RXsI)1o;?+(1uY0ap z-FA6hR7_QV5SDMwM5>vChD>{|w7-(`o>L8b)nBt^e7fW{r0w6bw;9fijwPyT_JN^4 zIL5wj^su=qt2e%kMD*NYV}^6SUH7)^BjMyK1e^;uh))@g%=r<65$7ycsih9Dm#aJ< zNG?Ssf0dzYvf?zGuSZ0g6ROq2C->`$;*o);@r;3UIIqDna2pH6u#jL0#u(_u8EWER z-`?H3_ru?JcfS5+@B90E_kP;j{Z7N8fp_tqfhCj-EURdJ=-2SRffanfF!_J(RKte` z?tr?`8?*j~@AGX%eS&(^^JE}>zIof0YhE?z>BPrbEYRzdEb^+LPc?jI;B$QOL}82N zb-O|V`r=v>>?alzlUivL`Osu!TgR06F5Fd*;nESjNsyx%K{2U~sMm7miPO%AJPh4& z*-^z^`_wtcnOb$W72X`LNYAG+NK;kOVqq9bLY;Pa5ERA^?;jl;Wu4Yoh2g^f5QV#E zwc%Ezpg}D)Ha8s+&floIYwn0LFLP5$$6WTg8`OoA;jqW+g(35$kZVO+8G<_u*PCFD ziJTnX#5EN(R1Me=23|m(VJN;#;cj^wwrPd4Lfqi1`#s3iV@bmXtwPK5HX55WXhqkx z{je1_ZKFSv4Qj@VST@hys$&QF$gz;P;O1sYXr6Ff-rls6=KuXLN_nzxvP;d#)7)`N zLfX_R>hj2;{v1^g!{Etwc$WB}e!$vrUTp^YN~@U%QIEb;c#8D2Q4Zt*X!K2shMt3D zVbYt?yJP$j*w3NM1$uUd%G0<=-$rCWsfI{OV;FhTDCeQ@1kfKK^$=~pqy0WbiZy!clyw#BsL^#!ldM`YLpHOR!`uG?)o)on literal 0 HcmV?d00001 diff --git a/common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DynamicDataSourceRegister.class b/common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DynamicDataSourceRegister.class new file mode 100644 index 0000000000000000000000000000000000000000..e66e89cc76ebb1245ab09496d3c746ef0b3b5dce GIT binary patch literal 8417 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 BAjSXy literal 0 HcmV?d00001 diff --git a/common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DynamicRoutingDataSource.class b/common-dynamic-datasource-starter/target/classes/com/common/dynamic/datasource/DynamicRoutingDataSource.class new file mode 100644 index 0000000000000000000000000000000000000000..f18526e33424873affb3f18695b1c8fcfe719e93 GIT binary patch literal 1019 zcmbVLU2D@&7=BLMHT{U~?B?p!sZ;0LP0h^^VMUOZAs9B;WcO)$8q=jY3?_3pgR@zraV~?Y zJkH~ShKo5&SUBe5>o)M$1xGAbQf~Mk7|O zik@G3rEK+{l-yUQ5F5SCdwh#wyizqg)Q8T2qozkXNQ=dxOq$vGbA}_A&LhVs3;WI`YspT+uOut2(mCF_ibeyx4!X z-G8~$-+t5Id)|Nb_WS48Po8R+)lor};pYFfuVGHdJgzY`qQz{6rMD&Z^hn4Jqtj~s zHbpO*jB%$KC~4X1*fbex|5V4}{OiJ3{IR+#ycU-X6Ao90#t@&&KP=*4#G^;giO$FM z+k#=XGPJmX|Bz;|%JAOGM=_SDH6dyHS*j+!Qihpfyt-!v!D99JG1IxH>1O~K{SCA_ z;*!MEM(I64l0lRa9hv(G_KuhY3iPHUrH&%;p({CH6eo$MP{J5#!r&DGOAsB~MZ$cK zWGOZO2_s36xI^j~sz6Sl&@iw_p&{f%9CiR%#5hh7Xof7mDw~ed0@+e}7up9T!|LeN P>5Z$)lT;=tfzv+$lXwdy literal 0 HcmV?d00001 diff --git a/common-dynamic-datasource-starter/target/common-dynamic-datasource-starter-1.0.0-SNAPSHOT.jar b/common-dynamic-datasource-starter/target/common-dynamic-datasource-starter-1.0.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..ceaad884fb35c39c3042567c6b3a98d7e608dea2 GIT binary patch literal 9292 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common-generator-starter/pom.xml b/common-generator-starter/pom.xml new file mode 100644 index 0000000..b92e8ae --- /dev/null +++ b/common-generator-starter/pom.xml @@ -0,0 +1,107 @@ + + + + mosty-common + com.mosty + 1.0.0-SNAPSHOT + + 4.0.0 + + common-generator-starter + + + 8 + 8 + + + + + com.mosty + common-log-base-starter + 1.0.0-SNAPSHOT + + + com.mosty + common-base-starter + 1.0.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-dependencies.version} + true + + + org.springframework.boot + spring-boot-starter-aop + ${spring-boot-dependencies.version} + true + + + + com.alibaba + druid-spring-boot-starter + 1.2.8 + + + + + + + + + + org.springframework.boot + spring-boot-starter-validation + ${spring-boot-dependencies.version} + + + + commons-fileupload + commons-fileupload + 1.4 + + + com.alibaba + fastjson + ${fastjson.version} + + + org.apache.commons + commons-lang3 + 3.12.0 + + + com.google.guava + guava + 29.0-jre + + + + + + + mosty-nexus-releases + release version + http://47.108.232.77:8181/repository/maven-releases/ + + + mosty-nexus-snapshots + snapshots version + http://47.108.232.77:8181/repository/maven-snapshots/ + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/GeneratorAutoConfiguration.java b/common-generator-starter/src/main/java/com/mosty/common/generator/GeneratorAutoConfiguration.java new file mode 100644 index 0000000..4418f30 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/GeneratorAutoConfiguration.java @@ -0,0 +1,16 @@ +package com.mosty.common.generator; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Configuration; + +/** + * 代码生成自动装配 + * @author kevin + * @date 2022/2/3 3:34 PM + * @since 1.0.0 + */ +@Configuration +@MapperScan("com.mosty.common.generator.mapper") +public class GeneratorAutoConfiguration { + +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/config/BaseEntity.java b/common-generator-starter/src/main/java/com/mosty/common/generator/config/BaseEntity.java new file mode 100644 index 0000000..b9c2a84 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/config/BaseEntity.java @@ -0,0 +1,113 @@ +package com.mosty.common.generator.config; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * Entity基类 + * + * @author ruoyi + */ +public class BaseEntity implements Serializable { + private static final long serialVersionUID = 1L; + + /** + * 搜索值 + */ + private String searchValue; + + /** + * 创建者 + */ + private String createBy; + + /** + * 创建时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** + * 更新者 + */ + private String updateBy; + + /** + * 更新时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** + * 备注 + */ + private String remark; + + /** + * 请求参数 + */ + private Map params; + + public String getSearchValue() { + return searchValue; + } + + public void setSearchValue(String searchValue) { + this.searchValue = searchValue; + } + + public String getCreateBy() { + return createBy; + } + + public void setCreateBy(String createBy) { + this.createBy = createBy; + } + + public Date getCreateTime() { + return createTime; + } + + public void setCreateTime(Date createTime) { + this.createTime = createTime; + } + + public String getUpdateBy() { + return updateBy; + } + + public void setUpdateBy(String updateBy) { + this.updateBy = updateBy; + } + + public Date getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Date updateTime) { + this.updateTime = updateTime; + } + + public String getRemark() { + return remark; + } + + public void setRemark(String remark) { + this.remark = remark; + } + + public Map getParams() { + if (params == null) { + params = new HashMap<>(); + } + return params; + } + + public void setParams(Map params) { + this.params = params; + } +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConfig.java b/common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConfig.java new file mode 100644 index 0000000..f989255 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConfig.java @@ -0,0 +1,65 @@ +package com.mosty.common.generator.config; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +/** + * 代码生成相关配置 + * + * @author ruoyi + */ +@Component +@ConfigurationProperties(prefix = "gen") +public class GenConfig { + /** + * 作者 + */ + public static String author; + + /** + * 生成包路径 + */ + public static String packageName; + + /** + * 自动去除表前缀,默认是false + */ + public static boolean autoRemovePre; + + /** + * 表前缀(类名不会包含表前缀) + */ + public static String tablePrefix; + + public static String getAuthor() { + return author; + } + + public void setAuthor(String author) { + GenConfig.author = author; + } + + public static String getPackageName() { + return packageName; + } + + public void setPackageName(String packageName) { + GenConfig.packageName = packageName; + } + + public static boolean getAutoRemovePre() { + return autoRemovePre; + } + + public void setAutoRemovePre(boolean autoRemovePre) { + GenConfig.autoRemovePre = autoRemovePre; + } + + public static String getTablePrefix() { + return tablePrefix; + } + + public void setTablePrefix(String tablePrefix) { + GenConfig.tablePrefix = tablePrefix; + } +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConfig_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConfig_bak.java new file mode 100644 index 0000000..12bb2b4 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConfig_bak.java @@ -0,0 +1,72 @@ +//package com.mosty.common.generator.config; +// +//import org.springframework.beans.factory.annotation.Value; +//import org.springframework.boot.context.properties.ConfigurationProperties; +//import org.springframework.context.annotation.PropertySource; +//import org.springframework.stereotype.Component; +// +///** +// * 读取代码生成相关配置 +// * +// * @author ruoyi +// */ +//@Component +//@ConfigurationProperties(prefix = "gen") +//@PropertySource(value = {"classpath:generator.yml"}) +//public class GenConfig { +// /** +// * 作者 +// */ +// public static String author; +//‰ +// /** +// * 生成包路径 +// */ +// public static String packageName; +// +// /** +// * 自动去除表前缀,默认是false +// */ +// public static boolean autoRemovePre; +// +// /** +// * 表前缀(类名不会包含表前缀) +// */ +// public static String tablePrefix; +// +// public static String getAuthor() { +// return author; +// } +// +// @Value("${author}") +// public void setAuthor(String author) { +// GenConfig.author = author; +// } +// +// public static String getPackageName() { +// return packageName; +// } +// +// @Value("${packageName}") +// public void setPackageName(String packageName) { +// GenConfig.packageName = packageName; +// } +// +// public static boolean getAutoRemovePre() { +// return autoRemovePre; +// } +// +// @Value("${autoRemovePre}") +// public void setAutoRemovePre(boolean autoRemovePre) { +// GenConfig.autoRemovePre = autoRemovePre; +// } +// +// public static String getTablePrefix() { +// return tablePrefix; +// } +// +// @Value("${tablePrefix}") +// public void setTablePrefix(String tablePrefix) { +// GenConfig.tablePrefix = tablePrefix; +// } +//} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConstants.java b/common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConstants.java new file mode 100644 index 0000000..52d637d --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/config/GenConstants.java @@ -0,0 +1,181 @@ +package com.mosty.common.generator.config; + +/** + * 代码生成通用常量 + * + * @author ruoyi + */ +public class GenConstants { + /** + * 单表(增删改查) + */ + public static final String TPL_CRUD = "crud"; + + /** + * 树表(增删改查) + */ + public static final String TPL_TREE = "tree"; + + /** + * 主子表(增删改查) + */ + public static final String TPL_SUB = "sub"; + + /** + * 树编码字段 + */ + public static final String TREE_CODE = "treeCode"; + + /** + * 树父编码字段 + */ + public static final String TREE_PARENT_CODE = "treeParentCode"; + + /** + * 树名称字段 + */ + public static final String TREE_NAME = "treeName"; + + /** + * 上级菜单ID字段 + */ + public static final String PARENT_MENU_ID = "parentMenuId"; + + /** + * 上级菜单名称字段 + */ + public static final String PARENT_MENU_NAME = "parentMenuName"; + + /** + * 数据库字符串类型 + */ + public static final String[] COLUMNTYPE_STR = {"char", "varchar", "nvarchar", "varchar2"}; + + /** + * 数据库文本类型 + */ + public static final String[] COLUMNTYPE_TEXT = {"tinytext", "text", "mediumtext", "longtext"}; + + /** + * 数据库时间类型 + */ + public static final String[] COLUMNTYPE_TIME = {"datetime", "time", "date", "timestamp"}; + + /** + * 数据库数字类型 + */ + public static final String[] COLUMNTYPE_NUMBER = {"tinyint", "smallint", "mediumint", "int", "number", "integer", + "bigint", "float", "double", "decimal"}; + + /** + * 页面不需要编辑字段 + */ + public static final String[] COLUMNNAME_NOT_EDIT = {"id", "create_by", "create_time", "del_flag"}; + + /** + * 页面不需要显示的列表字段 + */ + public static final String[] COLUMNNAME_NOT_LIST = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time"}; + + /** + * 页面不需要查询字段 + */ + public static final String[] COLUMNNAME_NOT_QUERY = {"id", "create_by", "create_time", "del_flag", "update_by", + "update_time", "remark"}; + + /** + * Entity基类字段 + */ + public static final String[] BASE_ENTITY = {"createBy", "createTime", "updateBy", "updateTime", "remark"}; + + /** + * Tree基类字段 + */ + public static final String[] TREE_ENTITY = {"parentName", "parentId", "orderNum", "ancestors"}; + + /** + * 文本框 + */ + public static final String HTML_INPUT = "input"; + + /** + * 文本域 + */ + public static final String HTML_TEXTAREA = "textarea"; + + /** + * 下拉框 + */ + public static final String HTML_SELECT = "select"; + + /** + * 单选框 + */ + public static final String HTML_RADIO = "radio"; + + /** + * 复选框 + */ + public static final String HTML_CHECKBOX = "checkbox"; + + /** + * 日期控件 + */ + public static final String HTML_DATETIME = "datetime"; + + /** + * 图片上传控件 + */ + public static final String HTML_IMAGE_UPLOAD = "imageUpload"; + + /** + * 文件上传控件 + */ + public static final String HTML_FILE_UPLOAD = "fileUpload"; + + /** + * 富文本控件 + */ + public static final String HTML_EDITOR = "editor"; + + /** + * 字符串类型 + */ + public static final String TYPE_STRING = "String"; + + /** + * 整型 + */ + public static final String TYPE_INTEGER = "Integer"; + + /** + * 长整型 + */ + public static final String TYPE_LONG = "Long"; + + /** + * 浮点型 + */ + public static final String TYPE_DOUBLE = "Double"; + + /** + * 高精度计算类型 + */ + public static final String TYPE_BIGDECIMAL = "BigDecimal"; + + /** + * 时间类型 + */ + public static final String TYPE_DATE = "Date"; + + /** + * 模糊查询 + */ + public static final String QUERY_LIKE = "LIKE"; + + /** + * 需要 + */ + public static final String REQUIRE = "1"; +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/controller/GenController.java b/common-generator-starter/src/main/java/com/mosty/common/generator/controller/GenController.java new file mode 100644 index 0000000..e101e1a --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/controller/GenController.java @@ -0,0 +1,194 @@ +package com.mosty.common.generator.controller; + +import com.mosty.common.base.domain.BaseController; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.domain.TableDataInfo; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.generator.domain.GenTable; +import com.mosty.common.generator.domain.GenTableColumn; +import com.mosty.common.generator.service.IGenTableColumnService; +import com.mosty.common.generator.service.IGenTableService; +import com.mosty.common.token.JwtSysUser; +import com.mosty.operation.log.util.Convert; +import io.swagger.annotations.Api; +import org.apache.commons.io.IOUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 代码生成 操作处理 + * + * @author ruoyi + */ +@RequestMapping("/gen") +@RestController +@Api(tags = "代码生成") +public class GenController extends BaseController { + @Autowired + private IGenTableService genTableService; + + @Autowired + private IGenTableColumnService genTableColumnService; + + /** + * 查询代码生成列表 + */ +// @RequiresPermissions("tool:gen:list") + @GetMapping("/list") + public ResponseResult genList(GenTable genTable) { + startPage(); + List list = genTableService.selectGenTableList(genTable); + return ResponseResult.success(getDataTable(list)); + } + + /** + * 修改代码生成业务 + */ +// @RequiresPermissions("tool:gen:query") + @GetMapping(value = "/{talbleId}") + public ResponseResult> getInfo(@PathVariable Long tableId) { + GenTable table = genTableService.selectGenTableById(tableId); + List tables = genTableService.selectGenTableAll(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + Map map = new HashMap(); + map.put("info", table); + map.put("rows", list); + map.put("tables", tables); + return ResponseResult.success(map); + } + + /** + * 查询数据库列表 + */ +// @RequiresPermissions("tool:gen:list") + @GetMapping("/db/list") + public ResponseResult dataList(GenTable genTable) { + startPage(); + List list = genTableService.selectDbTableList(genTable); + return ResponseResult.success(getDataTable(list)); + } + + /** + * 查询数据表字段列表 + */ + @GetMapping(value = "/column/{talbleId}") + public ResponseResult columnList(Long tableId) { + TableDataInfo dataInfo = new TableDataInfo(); + List list = genTableColumnService.selectGenTableColumnListByTableId(tableId); + dataInfo.setRows(list); + dataInfo.setTotal(list.size()); + return ResponseResult.success(dataInfo); + } + + /** + * 导入表结构(保存) + */ +// @RequiresPermissions("tool:gen:import") + @Log(title = "代码生成", businessType = BusinessType.IMPORT) + @PostMapping("/importTable") + @JwtSysUser + public ResponseResult importTableSave(String tables) { + String[] tableNames = Convert.toStrArray(tables); + // 查询表信息 + List tableList = genTableService.selectDbTableListByNames(tableNames); + genTableService.importGenTable(tableList); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 修改保存代码生成业务 + */ +// @RequiresPermissions("tool:gen:edit") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @PutMapping + public ResponseResult editSave(@Validated @RequestBody GenTable genTable) { + genTableService.validateEdit(genTable); + genTableService.updateGenTable(genTable); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 删除代码生成 + */ +// @RequiresPermissions("tool:gen:remove") + @Log(title = "代码生成", businessType = BusinessType.DELETE) + @DeleteMapping("/{tableIds}") + public ResponseResult remove(@PathVariable Long[] tableIds) { + genTableService.deleteGenTableByIds(tableIds); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 预览代码 + */ +// @RequiresPermissions("tool:gen:preview") + @GetMapping("/preview/{tableId}") + public ResponseResult> preview(@PathVariable("tableId") Long tableId) throws IOException { + Map dataMap = genTableService.previewCode(tableId); + return ResponseResult.success(dataMap); + } + + /** + * 生成代码(下载方式) + */ +// @RequiresPermissions("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/download/{tableName}") + public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { + byte[] data = genTableService.downloadCode(tableName); + genCode(response, data); + } + + /** + * 生成代码(自定义路径) + */ +// @RequiresPermissions("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/genCode/{tableName}") + public ResponseResult genCode(@PathVariable("tableName") String tableName) { + genTableService.generatorCode(tableName); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 同步数据库 + */ +// @RequiresPermissions("tool:gen:edit") + @Log(title = "代码生成", businessType = BusinessType.UPDATE) + @GetMapping("/synchDb/{tableName}") + public ResponseResult synchDb(@PathVariable("tableName") String tableName) { + genTableService.synchDb(tableName); + return ResponseResult.success(); + } + + /** + * 批量生成代码 + */ +// @RequiresPermissions("tool:gen:code") + @Log(title = "代码生成", businessType = BusinessType.GENCODE) + @GetMapping("/batchGenCode") + public void batchGenCode(HttpServletResponse response, String tables) throws IOException { + String[] tableNames = Convert.toStrArray(tables); + byte[] data = genTableService.downloadCode(tableNames); + genCode(response, data); + } + + /** + * 生成zip文件 + */ + private void genCode(HttpServletResponse response, byte[] data) throws IOException { + response.reset(); + response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); + response.addHeader("Content-Length", "" + data.length); + response.setContentType("application/octet-stream; charset=UTF-8"); + IOUtils.write(data, response.getOutputStream()); + } +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/controller/GenController_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/controller/GenController_bak.java new file mode 100644 index 0000000..2707f0c --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/controller/GenController_bak.java @@ -0,0 +1,281 @@ +//package com.mosty.common.generator.controller; +// +//import cn.hutool.core.convert.Convert; +//import com.alibaba.druid.DbType; +//import com.alibaba.druid.sql.SQLUtils; +//import com.alibaba.druid.sql.ast.SQLStatement; +//import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; +//import com.alibaba.fastjson.JSON; +//import com.mosty.common.base.domain.BaseController; +//import com.mosty.common.base.domain.CxSelect; +//import com.mosty.common.base.domain.ResponseResult; +//import com.mosty.common.base.domain.TableDataInfo; +//import com.mosty.common.base.domain.page.SqlUtil; +//import com.mosty.common.base.entity.log.BusinessType; +//import com.mosty.common.base.entity.log.Log; +//import com.mosty.common.generator.domain.GenTable; +//import com.mosty.common.generator.domain.GenTableColumn; +//import com.mosty.common.generator.service.GenTableColumnService; +//import com.mosty.common.generator.service.GenTableService; +//import io.swagger.annotations.Api; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.commons.io.IOUtils; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.stereotype.Controller; +//import org.springframework.ui.ModelMap; +//import org.springframework.validation.annotation.Validated; +//import org.springframework.web.bind.annotation.*; +// +//import javax.servlet.http.HttpServletResponse; +//import java.io.IOException; +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Map; +//import java.util.Objects; +// +///** +// * 代码生成 操作处理 +// * +// * @author ruoyi +// */ +//@Slf4j +//@Controller +//@RequestMapping("/tool/gen") +//@Api(tags = "代码生成") +//public class GenController extends BaseController { +// +// /** 前缀标识 */ +// private String prefix = "tool/gen"; +// +// @Autowired +// private GenTableService genTableService; +// +// @Autowired +// private GenTableColumnService genTableColumnService; +// +// // @RequiresPermissions("tool:gen:view") +// @GetMapping() +// public String gen() { +// return prefix + "/gen"; +// } +// +// /** +// * 查询代码生成列表 +// */ +//// @RequiresPermissions("tool:gen:list") +// @PostMapping("/list") +// @ResponseBody +// public ResponseResult genList(GenTable genTable) { +// startPage(); +// List list = genTableService.selectGenTableList(genTable); +// TableDataInfo dataTable = getDataTable(list); +// return ResponseResult.success(dataTable); +// } +// +// /** +// * 查询数据库列表 +// */ +//// @RequiresPermissions("tool:gen:list") +// @PostMapping("/db/list") +// @ResponseBody +// public ResponseResult dataList(GenTable genTable) { +// startPage(); +// List list = genTableService.selectDbTableList(genTable); +// TableDataInfo dataTable = getDataTable(list); +// return ResponseResult.success(dataTable); +// } +// +// /** +// * 查询数据表字段列表 +// */ +//// @RequiresPermissions("tool:gen:list") +// @PostMapping("/column/list") +// @ResponseBody +// public ResponseResult columnList(GenTableColumn genTableColumn) { +// TableDataInfo dataInfo = new TableDataInfo(); +// List list = genTableColumnService.selectGenTableColumnListByTableId(genTableColumn); +// dataInfo.setRows(list); +// dataInfo.setTotal(list.size()); +// return ResponseResult.success(dataInfo); +// } +// +// /** +// * 导入表结构 +// */ +//// @RequiresPermissions("tool:gen:list") +// @GetMapping("/importTable") +// public ResponseResult importTable() { +// return ResponseResult.success(prefix + "/importTable"); +// } +// +// /** +// * 创建表结构 +// */ +// @GetMapping("/createTable") +// public ResponseResult createTable() { +// return ResponseResult.success(prefix + "/createTable"); +// } +// +// /** +// * 导入表结构(保存) +// */ +//// @RequiresPermissions("tool:gen:list") +// @Log(title = "代码生成", businessType = BusinessType.IMPORT) +// @PostMapping("/importTable") +// @ResponseBody +// public ResponseResult importTableSave(String tables) { +// String[] tableNames = Convert.toStrArray(tables); +// // 查询表信息 +// List tableList = genTableService.selectDbTableListByNames(tableNames); +//// String operName = Convert.toStr(PermissionUtils.getPrincipalProperty("loginName")); +// String operName = "kevin"; +// genTableService.importGenTable(tableList, operName); +// return ResponseResult.success(Boolean.TRUE); +// } +// +// /** +// * 修改代码生成业务 +// */ +//// @RequiresPermissions("tool:gen:edit") +// @GetMapping("/edit/{tableId}") +// public ResponseResult edit(@PathVariable("tableId") Long tableId, ModelMap mmap) { +// GenTable table = genTableService.selectGenTableById(tableId); +// List genTables = genTableService.selectGenTableAll(); +// List cxSelect = new ArrayList(); +// for (GenTable genTable : genTables) { +// if (!Objects.equals(table.getTableName(), genTable.getTableName())) { +// CxSelect cxTable = new CxSelect(genTable.getTableName(), genTable.getTableName() + ':' + genTable.getTableComment()); +// List cxColumns = new ArrayList(); +// for (GenTableColumn tableColumn : genTable.getColumns()) { +// cxColumns.add(new CxSelect(tableColumn.getColumnName(), tableColumn.getColumnName() + ':' + tableColumn.getColumnComment())); +// } +// cxTable.setS(cxColumns); +// cxSelect.add(cxTable); +// } +// } +// mmap.put("table", table); +// mmap.put("data", JSON.toJSON(cxSelect)); +// return ResponseResult.success(prefix + "/edit"); +// } +// +// /** +// * 修改保存代码生成业务 +// */ +//// @RequiresPermissions("tool:gen:edit") +// @Log(title = "代码生成", businessType = BusinessType.UPDATE) +// @PostMapping("/edit") +// @ResponseBody +// public ResponseResult editSave(@Validated GenTable genTable) { +// genTableService.validateEdit(genTable); +// genTableService.updateGenTable(genTable); +// return ResponseResult.success(Boolean.TRUE); +// } +// +// // @RequiresPermissions("tool:gen:remove") +// @Log(title = "代码生成", businessType = BusinessType.DELETE) +// @PostMapping("/remove") +// @ResponseBody +// public ResponseResult remove(String ids) { +// genTableService.deleteGenTableByIds(ids); +// return ResponseResult.success(Boolean.TRUE); +// } +// +// // @RequiresRoles("admin") +// @Log(title = "创建表", businessType = BusinessType.OTHER) +// @PostMapping("/createTable") +// @ResponseBody +// public ResponseResult create(String sql) { +// try { +// SqlUtil.filterKeyword(sql); +// List sqlStatements = SQLUtils.parseStatements(sql, DbType.mysql); +// List tableNames = new ArrayList<>(); +// for (SQLStatement sqlStatement : sqlStatements) { +// if (sqlStatement instanceof MySqlCreateTableStatement) { +// MySqlCreateTableStatement createTableStatement = (MySqlCreateTableStatement) sqlStatement; +// if (genTableService.createTable(createTableStatement.toString())) { +// String tableName = createTableStatement.getTableName().replaceAll("`", ""); +// tableNames.add(tableName); +// } +// } +// } +// List tableList = genTableService.selectDbTableListByNames(tableNames.toArray(new String[tableNames.size()])); +//// String operName = Convert.toStr(PermissionUtils.getPrincipalProperty("loginName")); +// String operName = "kevin"; +// genTableService.importGenTable(tableList, operName); +// return ResponseResult.success(Boolean.TRUE); +// } catch (Exception e) { +// log.error(e.getMessage(), e); +// return ResponseResult.fail("创建表结构异常[" + e.getMessage() + "]"); +// } +// } +// +// /** +// * 预览代码 +// */ +//// @RequiresPermissions("tool:gen:preview") +// @GetMapping("/preview/{tableId}") +// @ResponseBody +// public ResponseResult> preview(@PathVariable("tableId") Long tableId) throws IOException { +// Map dataMap = genTableService.previewCode(tableId); +// return ResponseResult.success(dataMap); +// } +// +// /** +// * 生成代码(下载方式) +// */ +//// @RequiresPermissions("tool:gen:code") +// @Log(title = "代码生成", businessType = BusinessType.GENCODE) +// @GetMapping("/download/{tableName}") +// public void download(HttpServletResponse response, @PathVariable("tableName") String tableName) throws IOException { +// byte[] data = genTableService.downloadCode(tableName); +// genCode(response, data); +// } +// +// /** +// * 生成代码(自定义路径) +// */ +//// @RequiresPermissions("tool:gen:code") +// @Log(title = "代码生成", businessType = BusinessType.GENCODE) +// @GetMapping("/genCode/{tableName}") +// @ResponseBody +// public ResponseResult genCode(@PathVariable("tableName") String tableName) { +// genTableService.generatorCode(tableName); +// return ResponseResult.success(Boolean.TRUE); +// } +// +// /** +// * 同步数据库 +// */ +//// @RequiresPermissions("tool:gen:edit") +// @Log(title = "代码生成", businessType = BusinessType.UPDATE) +// @GetMapping("/synchDb/{tableName}") +// @ResponseBody +// public ResponseResult synchDb(@PathVariable("tableName") String tableName) { +// genTableService.synchDb(tableName); +// return ResponseResult.success(Boolean.TRUE); +// } +// +// /** +// * 批量生成代码 +// */ +//// @RequiresPermissions("tool:gen:code") +// @Log(title = "代码生成", businessType = BusinessType.GENCODE) +// @GetMapping("/batchGenCode") +// @ResponseBody +// public void batchGenCode(HttpServletResponse response, String tables) throws IOException { +// String[] tableNames = Convert.toStrArray(tables); +// byte[] data = genTableService.downloadCode(tableNames); +// genCode(response, data); +// } +// +// /** +// * 生成zip文件 +// */ +// private void genCode(HttpServletResponse response, byte[] data) throws IOException { +// response.reset(); +// response.setHeader("Content-Disposition", "attachment; filename=\"ruoyi.zip\""); +// response.addHeader("Content-Length", "" + data.length); +// response.setContentType("application/octet-stream; charset=UTF-8"); +// IOUtils.write(data, response.getOutputStream()); +// } +//} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTable.java b/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTable.java new file mode 100644 index 0000000..9ff86fe --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTable.java @@ -0,0 +1,370 @@ +package com.mosty.common.generator.domain; + +import java.util.List; +import javax.validation.Valid; +import javax.validation.constraints.NotBlank; + +import com.mosty.common.base.constant.GenConstants; +import com.mosty.common.base.util.StringUtils; +import com.mosty.common.generator.config.BaseEntity; +import org.apache.commons.lang3.ArrayUtils; + +/** + * 业务表 gen_table + * + * @author ruoyi + */ +public class GenTable extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** 编号 */ + private Long tableId; + + /** 表名称 */ + @NotBlank(message = "表名称不能为空") + private String tableName; + + /** 表描述 */ + @NotBlank(message = "表描述不能为空") + private String tableComment; + + /** 关联父表的表名 */ + private String subTableName; + + /** 本表关联父表的外键名 */ + private String subTableFkName; + + /** 实体类名称(首字母大写) */ + @NotBlank(message = "实体类名称不能为空") + private String className; + + /** 使用的模板(crud单表操作 tree树表操作 sub主子表操作) */ + private String tplCategory; + + /** 生成包路径 */ + @NotBlank(message = "生成包路径不能为空") + private String packageName; + + /** 生成模块名 */ + @NotBlank(message = "生成模块名不能为空") + private String moduleName; + + /** 生成业务名 */ + @NotBlank(message = "生成业务名不能为空") + private String businessName; + + /** 生成功能名 */ + @NotBlank(message = "生成功能名不能为空") + private String functionName; + + /** 生成作者 */ + @NotBlank(message = "作者不能为空") + private String functionAuthor; + + /** 生成代码方式(0zip压缩包 1自定义路径) */ + private String genType; + + /** 生成路径(不填默认项目路径) */ + private String genPath; + + /** 主键信息 */ + private GenTableColumn pkColumn; + + /** 子表信息 */ + private GenTable subTable; + + /** 表列信息 */ + @Valid + private List columns; + + /** 其它生成选项 */ + private String options; + + /** 树编码字段 */ + private String treeCode; + + /** 树父编码字段 */ + private String treeParentCode; + + /** 树名称字段 */ + private String treeName; + + /** 上级菜单ID字段 */ + private String parentMenuId; + + /** 上级菜单名称字段 */ + private String parentMenuName; + + public Long getTableId() + { + return tableId; + } + + public void setTableId(Long tableId) + { + this.tableId = tableId; + } + + public String getTableName() + { + return tableName; + } + + public void setTableName(String tableName) + { + this.tableName = tableName; + } + + public String getTableComment() + { + return tableComment; + } + + public void setTableComment(String tableComment) + { + this.tableComment = tableComment; + } + + public String getSubTableName() + { + return subTableName; + } + + public void setSubTableName(String subTableName) + { + this.subTableName = subTableName; + } + + public String getSubTableFkName() + { + return subTableFkName; + } + + public void setSubTableFkName(String subTableFkName) + { + this.subTableFkName = subTableFkName; + } + + public String getClassName() + { + return className; + } + + public void setClassName(String className) + { + this.className = className; + } + + public String getTplCategory() + { + return tplCategory; + } + + public void setTplCategory(String tplCategory) + { + this.tplCategory = tplCategory; + } + + public String getPackageName() + { + return packageName; + } + + public void setPackageName(String packageName) + { + this.packageName = packageName; + } + + public String getModuleName() + { + return moduleName; + } + + public void setModuleName(String moduleName) + { + this.moduleName = moduleName; + } + + public String getBusinessName() + { + return businessName; + } + + public void setBusinessName(String businessName) + { + this.businessName = businessName; + } + + public String getFunctionName() + { + return functionName; + } + + public void setFunctionName(String functionName) + { + this.functionName = functionName; + } + + public String getFunctionAuthor() + { + return functionAuthor; + } + + public void setFunctionAuthor(String functionAuthor) + { + this.functionAuthor = functionAuthor; + } + + public String getGenType() + { + return genType; + } + + public void setGenType(String genType) + { + this.genType = genType; + } + + public String getGenPath() + { + return genPath; + } + + public void setGenPath(String genPath) + { + this.genPath = genPath; + } + + public GenTableColumn getPkColumn() + { + return pkColumn; + } + + public void setPkColumn(GenTableColumn pkColumn) + { + this.pkColumn = pkColumn; + } + + public GenTable getSubTable() + { + return subTable; + } + + public void setSubTable(GenTable subTable) + { + this.subTable = subTable; + } + public List getColumns() + { + return columns; + } + + public void setColumns(List columns) + { + this.columns = columns; + } + + public String getOptions() + { + return options; + } + + public void setOptions(String options) + { + this.options = options; + } + + public String getTreeCode() + { + return treeCode; + } + + public void setTreeCode(String treeCode) + { + this.treeCode = treeCode; + } + + public String getTreeParentCode() + { + return treeParentCode; + } + + public void setTreeParentCode(String treeParentCode) + { + this.treeParentCode = treeParentCode; + } + + public String getTreeName() + { + return treeName; + } + + public void setTreeName(String treeName) + { + this.treeName = treeName; + } + + public String getParentMenuId() + { + return parentMenuId; + } + + public void setParentMenuId(String parentMenuId) + { + this.parentMenuId = parentMenuId; + } + + public String getParentMenuName() + { + return parentMenuName; + } + + public void setParentMenuName(String parentMenuName) + { + this.parentMenuName = parentMenuName; + } + + public boolean isSub() + { + return isSub(this.tplCategory); + } + + public static boolean isSub(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_SUB, tplCategory); + } + public boolean isTree() + { + return isTree(this.tplCategory); + } + + public static boolean isTree(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_TREE, tplCategory); + } + + public boolean isCrud() + { + return isCrud(this.tplCategory); + } + + public static boolean isCrud(String tplCategory) + { + return tplCategory != null && StringUtils.equals(GenConstants.TPL_CRUD, tplCategory); + } + + public boolean isSuperColumn(String javaField) + { + return isSuperColumn(this.tplCategory, javaField); + } + + public static boolean isSuperColumn(String tplCategory, String javaField) + { + if (isTree(tplCategory)) + { + return StringUtils.equalsAnyIgnoreCase(javaField, + ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); + } + return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); + } +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTableColumn.java b/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTableColumn.java new file mode 100644 index 0000000..32f931b --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTableColumn.java @@ -0,0 +1,349 @@ +package com.mosty.common.generator.domain; + + +import com.mosty.common.generator.config.BaseEntity; +import com.mosty.common.generator.util.StringUtils; + +import javax.validation.constraints.NotBlank; + +/** + * 代码生成业务字段表 gen_table_column + * + * @author ruoyi + */ +public class GenTableColumn extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** + * 编号 + */ + private Long columnId; + + /** + * 归属表编号 + */ + private Long tableId; + + /** + * 列名称 + */ + private String columnName; + + /** + * 列描述 + */ + private String columnComment; + + /** + * 列类型 + */ + private String columnType; + + /** + * JAVA类型 + */ + private String javaType; + + /** + * JAVA字段名 + */ + @NotBlank(message = "Java属性不能为空") + private String javaField; + + /** + * 是否主键(1是) + */ + private String isPk; + + /** + * 是否自增(1是) + */ + private String isIncrement; + + /** + * 是否必填(1是) + */ + private String isRequired; + + /** + * 是否为插入字段(1是) + */ + private String isInsert; + + /** + * 是否编辑字段(1是) + */ + private String isEdit; + + /** + * 是否列表字段(1是) + */ + private String isList; + + /** + * 是否查询字段(1是) + */ + private String isQuery; + + /** + * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) + */ + private String queryType; + + /** + * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、image图片上传控件、upload文件上传控件、editor富文本控件) + */ + private String htmlType; + + /** + * 字典类型 + */ + private String dictType; + + /** + * 排序 + */ + private Integer sort; + + public void setColumnId(Long columnId) { + this.columnId = columnId; + } + + public Long getColumnId() { + return columnId; + } + + public void setTableId(Long tableId) { + this.tableId = tableId; + } + + public Long getTableId() { + return tableId; + } + + public void setColumnName(String columnName) { + this.columnName = columnName; + } + + public String getColumnName() { + return columnName; + } + + public void setColumnComment(String columnComment) { + this.columnComment = columnComment; + } + + public String getColumnComment() { + return columnComment; + } + + public void setColumnType(String columnType) { + this.columnType = columnType; + } + + public String getColumnType() { + return columnType; + } + + public void setJavaType(String javaType) { + this.javaType = javaType; + } + + public String getJavaType() { + return javaType; + } + + public void setJavaField(String javaField) { + this.javaField = javaField; + } + + public String getJavaField() { + return javaField; + } + + public String getCapJavaField() { + return StringUtils.capitalize(javaField); + } + + public void setIsPk(String isPk) { + this.isPk = isPk; + } + + public String getIsPk() { + return isPk; + } + + public boolean isPk() { + return isPk(this.isPk); + } + + public boolean isPk(String isPk) { + return isPk != null && StringUtils.equals("1", isPk); + } + + public String getIsIncrement() { + return isIncrement; + } + + public void setIsIncrement(String isIncrement) { + this.isIncrement = isIncrement; + } + + public boolean isIncrement() { + return isIncrement(this.isIncrement); + } + + public boolean isIncrement(String isIncrement) { + return isIncrement != null && StringUtils.equals("1", isIncrement); + } + + public void setIsRequired(String isRequired) { + this.isRequired = isRequired; + } + + public String getIsRequired() { + return isRequired; + } + + public boolean isRequired() { + return isRequired(this.isRequired); + } + + public boolean isRequired(String isRequired) { + return isRequired != null && StringUtils.equals("1", isRequired); + } + + public void setIsInsert(String isInsert) { + this.isInsert = isInsert; + } + + public String getIsInsert() { + return isInsert; + } + + public boolean isInsert() { + return isInsert(this.isInsert); + } + + public boolean isInsert(String isInsert) { + return isInsert != null && StringUtils.equals("1", isInsert); + } + + public void setIsEdit(String isEdit) { + this.isEdit = isEdit; + } + + public String getIsEdit() { + return isEdit; + } + + public boolean isEdit() { + return isInsert(this.isEdit); + } + + public boolean isEdit(String isEdit) { + return isEdit != null && StringUtils.equals("1", isEdit); + } + + public void setIsList(String isList) { + this.isList = isList; + } + + public String getIsList() { + return isList; + } + + public boolean isList() { + return isList(this.isList); + } + + public boolean isList(String isList) { + return isList != null && StringUtils.equals("1", isList); + } + + public void setIsQuery(String isQuery) { + this.isQuery = isQuery; + } + + public String getIsQuery() { + return isQuery; + } + + public boolean isQuery() { + return isQuery(this.isQuery); + } + + public boolean isQuery(String isQuery) { + return isQuery != null && StringUtils.equals("1", isQuery); + } + + public void setQueryType(String queryType) { + this.queryType = queryType; + } + + public String getQueryType() { + return queryType; + } + + public String getHtmlType() { + return htmlType; + } + + public void setHtmlType(String htmlType) { + this.htmlType = htmlType; + } + + public void setDictType(String dictType) { + this.dictType = dictType; + } + + public String getDictType() { + return dictType; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public Integer getSort() { + return sort; + } + + public boolean isSuperColumn() { + return isSuperColumn(this.javaField); + } + + public static boolean isSuperColumn(String javaField) { + return StringUtils.equalsAnyIgnoreCase(javaField, + // BaseEntity + "createBy", "createTime", "updateBy", "updateTime", "remark", + // TreeEntity + "parentName", "parentId", "orderNum", "ancestors"); + } + + public boolean isUsableColumn() { + return isUsableColumn(javaField); + } + + public static boolean isUsableColumn(String javaField) { + // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 + return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); + } + + public String readConverterExp() { + String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); + StringBuffer sb = new StringBuffer(); + if (StringUtils.isNotEmpty(remarks)) { + for (String value : remarks.split(" ")) { + if (StringUtils.isNotEmpty(value)) { + Object startStr = value.subSequence(0, 1); + String endStr = value.substring(1); + sb.append("").append(startStr).append("=").append(endStr).append(","); + } + } + return sb.deleteCharAt(sb.length() - 1).toString(); + } else { + return this.columnComment; + } + } +} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTableColumn_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTableColumn_bak.java new file mode 100644 index 0000000..b296b2a --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTableColumn_bak.java @@ -0,0 +1,349 @@ +//package com.mosty.common.generator.domain; +// +// +//import com.mosty.common.base.entity.log.BaseEntity; +//import com.mosty.common.base.util.StringUtils; +// +////import javax.validation.constraints.NotBlank; +// +///** +// * 代码生成业务字段表 gen_table_column +// * +// * @author ruoyi +// */ +//public class GenTableColumn extends BaseEntity { +// private static final long serialVersionUID = 1L; +// +// /** +// * 编号 +// */ +// private Long columnId; +// +// /** +// * 归属表编号 +// */ +// private Long tableId; +// +// /** +// * 列名称 +// */ +// private String columnName; +// +// /** +// * 列描述 +// */ +// private String columnComment; +// +// /** +// * 列类型 +// */ +// private String columnType; +// +// /** +// * JAVA类型 +// */ +// private String javaType; +// +// /** +// * JAVA字段名 +// */ +//// @NotBlank(message = "Java属性不能为空") +// private String javaField; +// +// /** +// * 是否主键(1是) +// */ +// private String isPk; +// +// /** +// * 是否自增(1是) +// */ +// private String isIncrement; +// +// /** +// * 是否必填(1是) +// */ +// private String isRequired; +// +// /** +// * 是否为插入字段(1是) +// */ +// private String isInsert; +// +// /** +// * 是否编辑字段(1是) +// */ +// private String isEdit; +// +// /** +// * 是否列表字段(1是) +// */ +// private String isList; +// +// /** +// * 是否查询字段(1是) +// */ +// private String isQuery; +// +// /** +// * 查询方式(EQ等于、NE不等于、GT大于、LT小于、LIKE模糊、BETWEEN范围) +// */ +// private String queryType; +// +// /** +// * 显示类型(input文本框、textarea文本域、select下拉框、checkbox复选框、radio单选框、datetime日期控件、upload上传控件、summernote富文本控件) +// */ +// private String htmlType; +// +// /** +// * 字典类型 +// */ +// private String dictType; +// +// /** +// * 排序 +// */ +// private Integer sort; +// +// public void setColumnId(Long columnId) { +// this.columnId = columnId; +// } +// +// public Long getColumnId() { +// return columnId; +// } +// +// public void setTableId(Long tableId) { +// this.tableId = tableId; +// } +// +// public Long getTableId() { +// return tableId; +// } +// +// public void setColumnName(String columnName) { +// this.columnName = columnName; +// } +// +// public String getColumnName() { +// return columnName; +// } +// +// public void setColumnComment(String columnComment) { +// this.columnComment = columnComment; +// } +// +// public String getColumnComment() { +// return columnComment; +// } +// +// public void setColumnType(String columnType) { +// this.columnType = columnType; +// } +// +// public String getColumnType() { +// return columnType; +// } +// +// public void setJavaType(String javaType) { +// this.javaType = javaType; +// } +// +// public String getJavaType() { +// return javaType; +// } +// +// public void setJavaField(String javaField) { +// this.javaField = javaField; +// } +// +// public String getJavaField() { +// return javaField; +// } +// +// public String getCapJavaField() { +// return StringUtils.capitalize(javaField); +// } +// +// public void setIsPk(String isPk) { +// this.isPk = isPk; +// } +// +// public String getIsPk() { +// return isPk; +// } +// +// public boolean isPk() { +// return isPk(this.isPk); +// } +// +// public boolean isPk(String isPk) { +// return isPk != null && StringUtils.equals("1", isPk); +// } +// +// public String getIsIncrement() { +// return isIncrement; +// } +// +// public void setIsIncrement(String isIncrement) { +// this.isIncrement = isIncrement; +// } +// +// public boolean isIncrement() { +// return isIncrement(this.isIncrement); +// } +// +// public boolean isIncrement(String isIncrement) { +// return isIncrement != null && StringUtils.equals("1", isIncrement); +// } +// +// public void setIsRequired(String isRequired) { +// this.isRequired = isRequired; +// } +// +// public String getIsRequired() { +// return isRequired; +// } +// +// public boolean isRequired() { +// return isRequired(this.isRequired); +// } +// +// public boolean isRequired(String isRequired) { +// return isRequired != null && StringUtils.equals("1", isRequired); +// } +// +// public void setIsInsert(String isInsert) { +// this.isInsert = isInsert; +// } +// +// public String getIsInsert() { +// return isInsert; +// } +// +// public boolean isInsert() { +// return isInsert(this.isInsert); +// } +// +// public boolean isInsert(String isInsert) { +// return isInsert != null && StringUtils.equals("1", isInsert); +// } +// +// public void setIsEdit(String isEdit) { +// this.isEdit = isEdit; +// } +// +// public String getIsEdit() { +// return isEdit; +// } +// +// public boolean isEdit() { +// return isInsert(this.isEdit); +// } +// +// public boolean isEdit(String isEdit) { +// return isEdit != null && StringUtils.equals("1", isEdit); +// } +// +// public void setIsList(String isList) { +// this.isList = isList; +// } +// +// public String getIsList() { +// return isList; +// } +// +// public boolean isList() { +// return isList(this.isList); +// } +// +// public boolean isList(String isList) { +// return isList != null && StringUtils.equals("1", isList); +// } +// +// public void setIsQuery(String isQuery) { +// this.isQuery = isQuery; +// } +// +// public String getIsQuery() { +// return isQuery; +// } +// +// public boolean isQuery() { +// return isQuery(this.isQuery); +// } +// +// public boolean isQuery(String isQuery) { +// return isQuery != null && StringUtils.equals("1", isQuery); +// } +// +// public void setQueryType(String queryType) { +// this.queryType = queryType; +// } +// +// public String getQueryType() { +// return queryType; +// } +// +// public String getHtmlType() { +// return htmlType; +// } +// +// public void setHtmlType(String htmlType) { +// this.htmlType = htmlType; +// } +// +// public void setDictType(String dictType) { +// this.dictType = dictType; +// } +// +// public String getDictType() { +// return dictType; +// } +// +// public void setSort(Integer sort) { +// this.sort = sort; +// } +// +// public Integer getSort() { +// return sort; +// } +// +// public boolean isSuperColumn() { +// return isSuperColumn(this.javaField); +// } +// +// public static boolean isSuperColumn(String javaField) { +// return StringUtils.equalsAnyIgnoreCase(javaField, +// // BaseEntity +// "createBy", "createTime", "updateBy", "updateTime", "remark", +// // TreeEntity +// "parentName", "parentId", "orderNum", "ancestors"); +// } +// +// public boolean isUsableColumn() { +// return isUsableColumn(javaField); +// } +// +// public static boolean isUsableColumn(String javaField) { +// // isSuperColumn()中的名单用于避免生成多余Domain属性,若某些属性在生成页面时需要用到不能忽略,则放在此处白名单 +// return StringUtils.equalsAnyIgnoreCase(javaField, "parentId", "orderNum", "remark"); +// } +// +// public String readConverterExp() { +// String remarks = StringUtils.substringBetween(this.columnComment, "(", ")"); +// StringBuffer sb = new StringBuffer(); +// if (StringUtils.isNotEmpty(remarks)) { +// for (String value : remarks.split(" ")) { +// if (StringUtils.isNotEmpty(value)) { +// Object startStr = value.subSequence(0, 1); +// String endStr = value.substring(1); +// sb.append("").append(startStr).append("=").append(endStr).append(","); +// } +// } +// return sb.deleteCharAt(sb.length() - 1).toString(); +// } else { +// return this.columnComment; +// } +// } +//} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTable_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTable_bak.java new file mode 100644 index 0000000..f1ad2ab --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/domain/GenTable_bak.java @@ -0,0 +1,365 @@ +//package com.mosty.common.generator.domain; +// +//import com.mosty.common.base.constant.GenConstants; +//import com.mosty.common.base.entity.log.BaseEntity; +//import org.apache.commons.lang3.ArrayUtils; +//import org.apache.commons.lang3.StringUtils; +// +//import javax.validation.Valid; +//import javax.validation.constraints.NotBlank; +//import java.util.List; +//import java.util.Objects; +// +///** +// * 业务表 gen_table +// * +// * @author ruoyi +// */ +//public class GenTable extends BaseEntity { +// +// private static final long serialVersionUID = 1L; +// +// /** +// * 编号 +// */ +// private Long tableId; +// +// /** +// * 表名称 +// */ +// @NotBlank(message = "表名称不能为空") +// private String tableName; +// +// /** +// * 表描述 +// */ +// @NotBlank(message = "表描述不能为空") +// private String tableComment; +// +// /** +// * 关联父表的表名 +// */ +// private String subTableName; +// +// /** +// * 本表关联父表的外键名 +// */ +// private String subTableFkName; +// +// /** +// * 实体类名称(首字母大写) +// */ +// @NotBlank(message = "实体类名称不能为空") +// private String className; +// +// /** +// * 使用的模板(crud单表操作 tree树表操作 sub主子表操作) +// */ +// private String tplCategory; +// +// /** +// * 生成包路径 +// */ +// @NotBlank(message = "生成包路径不能为空") +// private String packageName; +// +// /** +// * 生成模块名 +// */ +// @NotBlank(message = "生成模块名不能为空") +// private String moduleName; +// +// /** +// * 生成业务名 +// */ +// @NotBlank(message = "生成业务名不能为空") +// private String businessName; +// +// /** +// * 生成功能名 +// */ +// @NotBlank(message = "生成功能名不能为空") +// private String functionName; +// +// /** +// * 生成作者 +// */ +// @NotBlank(message = "作者不能为空") +// private String functionAuthor; +// +// /** +// * 生成代码方式(0zip压缩包 1自定义路径) +// */ +// private String genType; +// +// /** +// * 生成路径(不填默认项目路径) +// */ +// private String genPath; +// +// /** +// * 主键信息 +// */ +// private GenTableColumn pkColumn; +// +// /** +// * 子表信息 +// */ +// private GenTable subTable; +// +// /** +// * 表列信息 +// */ +// @Valid +// private List columns; +// +// /** +// * 其它生成选项 +// */ +// private String options; +// +// /** +// * 树编码字段 +// */ +// private String treeCode; +// +// /** +// * 树父编码字段 +// */ +// private String treeParentCode; +// +// /** +// * 树名称字段 +// */ +// private String treeName; +// +// /** +// * 上级菜单ID字段 +// */ +// private String parentMenuId; +// +// /** +// * 上级菜单名称字段 +// */ +// private String parentMenuName; +// +// public Long getTableId() { +// return tableId; +// } +// +// public void setTableId(Long tableId) { +// this.tableId = tableId; +// } +// +// public String getTableName() { +// return tableName; +// } +// +// public void setTableName(String tableName) { +// this.tableName = tableName; +// } +// +// public String getTableComment() { +// return tableComment; +// } +// +// public void setTableComment(String tableComment) { +// this.tableComment = tableComment; +// } +// +// public String getSubTableName() { +// return subTableName; +// } +// +// public void setSubTableName(String subTableName) { +// this.subTableName = subTableName; +// } +// +// public String getSubTableFkName() { +// return subTableFkName; +// } +// +// public void setSubTableFkName(String subTableFkName) { +// this.subTableFkName = subTableFkName; +// } +// +// public String getClassName() { +// return className; +// } +// +// public void setClassName(String className) { +// this.className = className; +// } +// +// public String getTplCategory() { +// return tplCategory; +// } +// +// public void setTplCategory(String tplCategory) { +// this.tplCategory = tplCategory; +// } +// +// public String getPackageName() { +// return packageName; +// } +// +// public void setPackageName(String packageName) { +// this.packageName = packageName; +// } +// +// public String getModuleName() { +// return moduleName; +// } +// +// public void setModuleName(String moduleName) { +// this.moduleName = moduleName; +// } +// +// public String getBusinessName() { +// return businessName; +// } +// +// public void setBusinessName(String businessName) { +// this.businessName = businessName; +// } +// +// public String getFunctionName() { +// return functionName; +// } +// +// public void setFunctionName(String functionName) { +// this.functionName = functionName; +// } +// +// public String getFunctionAuthor() { +// return functionAuthor; +// } +// +// public void setFunctionAuthor(String functionAuthor) { +// this.functionAuthor = functionAuthor; +// } +// +// public String getGenType() { +// return genType; +// } +// +// public void setGenType(String genType) { +// this.genType = genType; +// } +// +// public String getGenPath() { +// return genPath; +// } +// +// public void setGenPath(String genPath) { +// this.genPath = genPath; +// } +// +// public GenTableColumn getPkColumn() { +// return pkColumn; +// } +// +// public void setPkColumn(GenTableColumn pkColumn) { +// this.pkColumn = pkColumn; +// } +// +// public GenTable getSubTable() { +// return subTable; +// } +// +// public void setSubTable(GenTable subTable) { +// this.subTable = subTable; +// } +// +// public List getColumns() { +// return columns; +// } +// +// public void setColumns(List columns) { +// this.columns = columns; +// } +// +// public String getOptions() { +// return options; +// } +// +// public void setOptions(String options) { +// this.options = options; +// } +// +// public String getTreeCode() { +// return treeCode; +// } +// +// public void setTreeCode(String treeCode) { +// this.treeCode = treeCode; +// } +// +// public String getTreeParentCode() { +// return treeParentCode; +// } +// +// public void setTreeParentCode(String treeParentCode) { +// this.treeParentCode = treeParentCode; +// } +// +// public String getTreeName() { +// return treeName; +// } +// +// public void setTreeName(String treeName) { +// this.treeName = treeName; +// } +// +// public String getParentMenuId() { +// return parentMenuId; +// } +// +// public void setParentMenuId(String parentMenuId) { +// this.parentMenuId = parentMenuId; +// } +// +// public String getParentMenuName() { +// return parentMenuName; +// } +// +// public void setParentMenuName(String parentMenuName) { +// this.parentMenuName = parentMenuName; +// } +// +// public boolean isSub() { +// return isSub(this.tplCategory); +// } +// +// public static boolean isSub(String tplCategory) { +// return tplCategory != null && Objects.equals(GenConstants.TPL_SUB, tplCategory); +// } +// +// public boolean isTree() { +// return isTree(this.tplCategory); +// } +// +// public static boolean isTree(String tplCategory) { +// return tplCategory != null && Objects.equals(GenConstants.TPL_TREE, tplCategory); +// } +// +// public boolean isCrud() { +// return isCrud(this.tplCategory); +// } +// +// public static boolean isCrud(String tplCategory) { +// return tplCategory != null && Objects.equals(GenConstants.TPL_CRUD, tplCategory); +// } +// +// public boolean isSuperColumn(String javaField) { +// return isSuperColumn(this.tplCategory, javaField); +// } +// +// public static boolean isSuperColumn(String tplCategory, String javaField) { +// if (isTree(tplCategory)) { +// return StringUtils.equalsAnyIgnoreCase(javaField, +// ArrayUtils.addAll(GenConstants.TREE_ENTITY, GenConstants.BASE_ENTITY)); +// } +// return StringUtils.equalsAnyIgnoreCase(javaField, GenConstants.BASE_ENTITY); +// } +//} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableColumnMapper.java b/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableColumnMapper.java new file mode 100644 index 0000000..991c275 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableColumnMapper.java @@ -0,0 +1,61 @@ +package com.mosty.common.generator.mapper; + + +import com.mosty.common.generator.domain.GenTableColumn; + +import java.util.List; + +/** + * 业务字段 数据层 + * + * @author ruoyi + */ +public interface GenTableColumnMapper { + /** + * 根据表名称查询列信息 + * + * @param tableName 表名称 + * @return 列信息 + */ + public List selectDbTableColumnsByName(String tableName); + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段 + * + * @param genTableColumns 列数据 + * @return 结果 + */ + public int deleteGenTableColumns(List genTableColumns); + + /** + * 批量删除业务字段 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(Long[] ids); +} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableColumnMapper_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableColumnMapper_bak.java new file mode 100644 index 0000000..c5aa647 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableColumnMapper_bak.java @@ -0,0 +1,60 @@ +//package com.mosty.common.generator.mapper; +// +//import com.mosty.common.generator.domain.GenTableColumn; +// +//import java.util.List; +// +///** +// * 业务字段 数据层 +// * +// * @author ruoyi +// */ +//public interface GenTableColumnMapper { +// /** +// * 根据表名称查询列信息 +// * +// * @param tableName 表名称 +// * @return 列信息 +// */ +// List selectDbTableColumnsByName(String tableName); +// +// /** +// * 查询业务字段列表 +// * +// * @param genTableColumn 业务字段信息 +// * @return 业务字段集合 +// */ +// List selectGenTableColumnListByTableId(GenTableColumn genTableColumn); +// +// /** +// * 新增业务字段 +// * +// * @param genTableColumn 业务字段信息 +// * @return 结果 +// */ +// int insertGenTableColumn(GenTableColumn genTableColumn); +// +// /** +// * 修改业务字段 +// * +// * @param genTableColumn 业务字段信息 +// * @return 结果 +// */ +// int updateGenTableColumn(GenTableColumn genTableColumn); +// +// /** +// * 删除业务字段 +// * +// * @param genTableColumns 列数据 +// * @return 结果 +// */ +// int deleteGenTableColumns(List genTableColumns); +// +// /** +// * 批量删除业务字段 +// * +// * @param ids 需要删除的数据ID +// * @return 结果 +// */ +// int deleteGenTableColumnByIds(Long[] ids); +//} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableMapper.java b/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableMapper.java new file mode 100644 index 0000000..0106115 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableMapper.java @@ -0,0 +1,84 @@ +package com.mosty.common.generator.mapper; + + +import com.mosty.common.generator.domain.GenTable; + +import java.util.List; + +/** + * 业务 数据层 + * + * @author ruoyi + */ +public interface GenTableMapper { + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询表ID业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 查询表名称业务信息 + * + * @param tableName 表名称 + * @return 业务信息 + */ + public GenTable selectGenTableByName(String tableName); + + /** + * 新增业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int insertGenTable(GenTable genTable); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public int updateGenTable(GenTable genTable); + + /** + * 批量删除业务 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableByIds(Long[] ids); +} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableMapper_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableMapper_bak.java new file mode 100644 index 0000000..f485ff4 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/mapper/GenTableMapper_bak.java @@ -0,0 +1,91 @@ +//package com.mosty.common.generator.mapper; +// +//import com.mosty.common.generator.domain.GenTable; +// +//import java.util.List; +// +///** +// * 业务 数据层 +// * +// * @author ruoyi +// */ +//public interface GenTableMapper { +// /** +// * 查询业务列表 +// * +// * @param genTable 业务信息 +// * @return 业务集合 +// */ +// List selectGenTableList(GenTable genTable); +// +// /** +// * 查询据库列表 +// * +// * @param genTable 业务信息 +// * @return 数据库表集合 +// */ +// List selectDbTableList(GenTable genTable); +// +// /** +// * 查询据库列表 +// * +// * @param tableNames 表名称组 +// * @return 数据库表集合 +// */ +// List selectDbTableListByNames(String[] tableNames); +// +// /** +// * 查询所有表信息 +// * +// * @return 表信息集合 +// */ +// List selectGenTableAll(); +// +// /** +// * 查询表ID业务信息 +// * +// * @param id 业务ID +// * @return 业务信息 +// */ +// GenTable selectGenTableById(Long id); +// +// /** +// * 查询表名称业务信息 +// * +// * @param tableName 表名称 +// * @return 业务信息 +// */ +// GenTable selectGenTableByName(String tableName); +// +// /** +// * 新增业务 +// * +// * @param genTable 业务信息 +// * @return 结果 +// */ +// int insertGenTable(GenTable genTable); +// +// /** +// * 修改业务 +// * +// * @param genTable 业务信息 +// * @return 结果 +// */ +// int updateGenTable(GenTable genTable); +// +// /** +// * 批量删除业务 +// * +// * @param ids 需要删除的数据ID +// * @return 结果 +// */ +// int deleteGenTableByIds(Long[] ids); +// +// /** +// * 创建表 +// * +// * @param sql +// * @return 结果 +// */ +// int createTable(String sql); +//} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableColumnServiceImpl.java b/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableColumnServiceImpl.java new file mode 100644 index 0000000..2edafc5 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableColumnServiceImpl.java @@ -0,0 +1,64 @@ +package com.mosty.common.generator.service; + +import com.mosty.common.generator.domain.GenTableColumn; +import com.mosty.common.generator.mapper.GenTableColumnMapper; +import com.mosty.common.generator.util.Convert; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 业务字段 服务层实现 + * + * @author ruoyi + */ +@Service +public class GenTableColumnServiceImpl implements IGenTableColumnService { + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + @Override + public List selectGenTableColumnListByTableId(Long tableId) { + return genTableColumnMapper.selectGenTableColumnListByTableId(tableId); + } + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int insertGenTableColumn(GenTableColumn genTableColumn) { + return genTableColumnMapper.insertGenTableColumn(genTableColumn); + } + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + @Override + public int updateGenTableColumn(GenTableColumn genTableColumn) { + return genTableColumnMapper.updateGenTableColumn(genTableColumn); + } + + /** + * 删除业务字段对象 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + @Override + public int deleteGenTableColumnByIds(String ids) { + return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); + } +} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableColumnService_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableColumnService_bak.java new file mode 100644 index 0000000..c5d16d0 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableColumnService_bak.java @@ -0,0 +1,63 @@ +//package com.mosty.common.generator.service; +// +//import cn.hutool.core.convert.Convert; +//import com.mosty.common.generator.mapper.GenTableColumnMapper; +//import com.mosty.common.generator.domain.GenTableColumn; +//import lombok.AllArgsConstructor; +//import org.springframework.stereotype.Service; +// +//import java.util.List; +// +///** +// * 业务字段 服务层实现 +// * +// * @author ruoyi +// */ +//@Service +// +//@AllArgsConstructor +//public class GenTableColumnService { +// +// private final GenTableColumnMapper genTableColumnMapper; +// +// /** +// * 查询业务字段列表 +// * +// * @param genTableColumn 业务字段信息 +// * @return 业务字段集合 +// */ +// public List selectGenTableColumnListByTableId(GenTableColumn genTableColumn) { +// return genTableColumnMapper.selectGenTableColumnListByTableId(genTableColumn); +// } +// +// /** +// * 新增业务字段 +// * +// * @param genTableColumn 业务字段信息 +// * @return 结果 +// */ +// public int insertGenTableColumn(GenTableColumn genTableColumn) { +// return genTableColumnMapper.insertGenTableColumn(genTableColumn); +// } +// +// /** +// * 修改业务字段 +// * +// * @param genTableColumn 业务字段信息 +// * @return 结果 +// */ +// public int updateGenTableColumn(GenTableColumn genTableColumn) { +// return genTableColumnMapper.updateGenTableColumn(genTableColumn); +// } +// +// /** +// * 删除业务字段对象 +// * +// * @param ids 需要删除的数据ID +// * @return 结果 +// */ +// public int deleteGenTableColumnByIds(String ids) { +// return genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); +// } +// +//} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableServiceImpl.java b/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableServiceImpl.java new file mode 100644 index 0000000..dee4bbc --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableServiceImpl.java @@ -0,0 +1,443 @@ +package com.mosty.common.generator.service; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.mosty.common.base.constant.Constants; +import com.mosty.common.base.exception.BusinessException; +import com.mosty.common.generator.config.GenConstants; +import com.mosty.common.generator.domain.GenTable; +import com.mosty.common.generator.domain.GenTableColumn; +import com.mosty.common.generator.mapper.GenTableColumnMapper; +import com.mosty.common.generator.mapper.GenTableMapper; +import com.mosty.common.generator.util.*; +import com.mosty.common.token.UserInfoManager; +import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; +import org.apache.velocity.Template; +import org.apache.velocity.VelocityContext; +import org.apache.velocity.app.Velocity; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.IOException; +import java.io.StringWriter; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; +import java.util.zip.ZipEntry; +import java.util.zip.ZipOutputStream; + +/** + * 业务 服务层实现 + * + * @author ruoyi + */ +@Service +public class GenTableServiceImpl implements IGenTableService { + private static final Logger log = LoggerFactory.getLogger(GenTableServiceImpl.class); + + @Autowired + private GenTableMapper genTableMapper; + + @Autowired + private GenTableColumnMapper genTableColumnMapper; + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + @Override + public GenTable selectGenTableById(Long id) { + GenTable genTable = genTableMapper.selectGenTableById(id); + setTableFromOptions(genTable); + return genTable; + } + + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + @Override + public List selectGenTableList(GenTable genTable) { + return genTableMapper.selectGenTableList(genTable); + } + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + @Override + public List selectDbTableList(GenTable genTable) { + return genTableMapper.selectDbTableList(genTable); + } + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + @Override + public List selectDbTableListByNames(String[] tableNames) { + return genTableMapper.selectDbTableListByNames(tableNames); + } + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + @Override + public List selectGenTableAll() { + return genTableMapper.selectGenTableAll(); + } + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + @Override + @Transactional + public void updateGenTable(GenTable genTable) { + String options = JSON.toJSONString(genTable.getParams()); + genTable.setOptions(options); + int row = genTableMapper.updateGenTable(genTable); + if (row > 0) { + for (GenTableColumn cenTableColumn : genTable.getColumns()) { + genTableColumnMapper.updateGenTableColumn(cenTableColumn); + } + } + } + + /** + * 删除业务对象 + * + * @param tableIds 需要删除的数据ID + * @return 结果 + */ + @Override + @Transactional + public void deleteGenTableByIds(Long[] tableIds) { + genTableMapper.deleteGenTableByIds(tableIds); + genTableColumnMapper.deleteGenTableColumnByIds(tableIds); + } + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + @Override + @Transactional + public void importGenTable(List tableList) { + String operName = /*SecurityUtils.getUsername()*/UserInfoManager.get().userName; + try { + for (GenTable table : tableList) { + String tableName = table.getTableName(); + GenUtils.initTable(table, operName); + int row = genTableMapper.insertGenTable(table); + if (row > 0) { + // 保存列信息 + List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + for (GenTableColumn column : genTableColumns) { + GenUtils.initColumnField(column, table); + genTableColumnMapper.insertGenTableColumn(column); + } + } + } + } catch (Exception e) { + throw new BusinessException("导入失败:" + e.getMessage()); + } + } + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + @Override + public Map previewCode(Long tableId) { + Map dataMap = new LinkedHashMap<>(); + // 查询表信息 + GenTable table = genTableMapper.selectGenTableById(tableId); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + dataMap.put(template, sw.toString()); + } + return dataMap; + } + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + @Override + public byte[] downloadCode(String tableName) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + generatorCode(tableName, zip); + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + */ + @Override + public void generatorCode(String tableName) { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + if (!StringUtils.containsAny(template, "sql.vm", "api.js.vm", "index.vue.vm", "index-tree.vue.vm")) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + String path = getGenPath(table, template); + FileUtils.writeStringToFile(new File(path), sw.toString(), CharsetKit.UTF_8); + } catch (IOException e) { + throw new BusinessException("渲染模板失败,表名:" + table.getTableName()); + } + } + } + } + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + @Override + @Transactional + public void synchDb(String tableName) { + GenTable table = genTableMapper.selectGenTableByName(tableName); + List tableColumns = table.getColumns(); + Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); + + List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); + if (StringUtils.isEmpty(dbTableColumns)) { + throw new BusinessException("同步数据失败,原表结构不存在"); + } + List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); + + dbTableColumns.forEach(column -> { + GenUtils.initColumnField(column, table); + if (tableColumnMap.containsKey(column.getColumnName())) { + GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); + column.setColumnId(prevColumn.getColumnId()); + if (column.isList()) { + // 如果是列表,继续保留字典类型 + column.setDictType(prevColumn.getDictType()); + } + genTableColumnMapper.updateGenTableColumn(column); + } else { + genTableColumnMapper.insertGenTableColumn(column); + } + }); + + List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); + if (StringUtils.isNotEmpty(delColumns)) { + genTableColumnMapper.deleteGenTableColumns(delColumns); + } + } + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + @Override + public byte[] downloadCode(String[] tableNames) { + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + ZipOutputStream zip = new ZipOutputStream(outputStream); + for (String tableName : tableNames) { + generatorCode(tableName, zip); + } + IOUtils.closeQuietly(zip); + return outputStream.toByteArray(); + } + + /** + * 查询表信息并生成代码 + */ + private void generatorCode(String tableName, ZipOutputStream zip) { + // 查询表信息 + GenTable table = genTableMapper.selectGenTableByName(tableName); + // 设置主子表信息 + setSubTable(table); + // 设置主键列信息 + setPkColumn(table); + + VelocityInitializer.initVelocity(); + + VelocityContext context = VelocityUtils.prepareContext(table); + + // 获取模板列表 + List templates = VelocityUtils.getTemplateList(table.getTplCategory()); + for (String template : templates) { + // 渲染模板 + StringWriter sw = new StringWriter(); + Template tpl = Velocity.getTemplate(template, Constants.UTF8); + tpl.merge(context, sw); + try { + // 添加到zip + zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); + IOUtils.write(sw.toString(), zip, Constants.UTF8); + IOUtils.closeQuietly(sw); + zip.flush(); + zip.closeEntry(); + } catch (IOException e) { + log.error("渲染模板失败,表名:" + table.getTableName(), e); + } + } + } + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + @Override + public void validateEdit(GenTable genTable) { + if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { + String options = JSON.toJSONString(genTable.getParams()); + JSONObject paramsObj = JSONObject.parseObject(options); + if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { + throw new BusinessException("树编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) { + throw new BusinessException("树父编码字段不能为空"); + } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) { + throw new BusinessException("树名称字段不能为空"); + } else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) { + if (StringUtils.isEmpty(genTable.getSubTableName())) { + throw new BusinessException("关联子表的表名不能为空"); + } else if (StringUtils.isEmpty(genTable.getSubTableFkName())) { + throw new BusinessException("子表关联的外键名不能为空"); + } + } + } + } + + /** + * 设置主键列信息 + * + * @param table 业务表信息 + */ + public void setPkColumn(GenTable table) { + for (GenTableColumn column : table.getColumns()) { + if (column.isPk()) { + table.setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getPkColumn())) { + table.setPkColumn(table.getColumns().get(0)); + } + if (GenConstants.TPL_SUB.equals(table.getTplCategory())) { + for (GenTableColumn column : table.getSubTable().getColumns()) { + if (column.isPk()) { + table.getSubTable().setPkColumn(column); + break; + } + } + if (StringUtils.isNull(table.getSubTable().getPkColumn())) { + table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); + } + } + } + + /** + * 设置主子表信息 + * + * @param table 业务表信息 + */ + public void setSubTable(GenTable table) { + String subTableName = table.getSubTableName(); + if (StringUtils.isNotEmpty(subTableName)) { + table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); + } + } + + /** + * 设置代码生成其他选项值 + * + * @param genTable 设置后的生成对象 + */ + public void setTableFromOptions(GenTable genTable) { + JSONObject paramsObj = JSONObject.parseObject(genTable.getOptions()); + if (StringUtils.isNotNull(paramsObj)) { + String treeCode = paramsObj.getString(GenConstants.TREE_CODE); + String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID); + String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); + + genTable.setTreeCode(treeCode); + genTable.setTreeParentCode(treeParentCode); + genTable.setTreeName(treeName); + genTable.setParentMenuId(parentMenuId); + genTable.setParentMenuName(parentMenuName); + } + } + + /** + * 获取代码生成地址 + * + * @param table 业务表信息 + * @param template 模板文件路径 + * @return 生成地址 + */ + public static String getGenPath(GenTable table, String template) { + String genPath = table.getGenPath(); + if (StringUtils.equals(genPath, "/")) { + return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); + } + return genPath + File.separator + VelocityUtils.getFileName(template, table); + } +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableService_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableService_bak.java new file mode 100644 index 0000000..de51f4c --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/service/GenTableService_bak.java @@ -0,0 +1,439 @@ +//package com.mosty.common.generator.service; +// +//import cn.hutool.core.collection.CollectionUtil; +//import cn.hutool.core.convert.Convert; +//import com.alibaba.fastjson.JSON; +//import com.alibaba.fastjson.JSONObject; +//import com.mosty.common.base.constant.Constants; +//import com.mosty.common.base.constant.GenConstants; +//import com.mosty.common.base.exception.BusinessException; +//import com.mosty.common.generator.domain.GenTable; +//import com.mosty.common.generator.domain.GenTableColumn; +//import com.mosty.common.generator.mapper.GenTableColumnMapper; +//import com.mosty.common.generator.mapper.GenTableMapper; +//import com.mosty.common.generator.util.GenUtils; +//import com.mosty.common.generator.util.VelocityInitializer; +//import com.mosty.common.generator.util.VelocityUtils; +//import lombok.AllArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.apache.commons.io.FileUtils; +//import org.apache.commons.io.IOUtils; +//import org.apache.commons.lang3.StringUtils; +//import org.apache.velocity.Template; +//import org.apache.velocity.VelocityContext; +//import org.apache.velocity.app.Velocity; +//import org.springframework.stereotype.Service; +//import org.springframework.transaction.annotation.Transactional; +// +//import java.io.ByteArrayOutputStream; +//import java.io.File; +//import java.io.IOException; +//import java.io.StringWriter; +//import java.util.LinkedHashMap; +//import java.util.List; +//import java.util.Map; +//import java.util.Objects; +//import java.util.function.Function; +//import java.util.stream.Collectors; +//import java.util.zip.ZipEntry; +//import java.util.zip.ZipOutputStream; +// +///** +// * 业务 服务层实现 +// * +// * @author ruoyi +// */ +//@Slf4j +//@Service +//@AllArgsConstructor +//public class GenTableService { +// +// private final GenTableMapper genTableMapper; +// private final GenTableColumnMapper genTableColumnMapper; +// +// /** +// * 查询业务信息 +// * +// * @param id 业务ID +// * @return 业务信息 +// */ +// public GenTable selectGenTableById(Long id) { +// GenTable genTable = genTableMapper.selectGenTableById(id); +// setTableFromOptions(genTable); +// return genTable; +// } +// +// /** +// * 查询业务列表 +// * +// * @param genTable 业务信息 +// * @return 业务集合 +// */ +// public List selectGenTableList(GenTable genTable) { +// return genTableMapper.selectGenTableList(genTable); +// } +// +// /** +// * 查询据库列表 +// * +// * @param genTable 业务信息 +// * @return 数据库表集合 +// */ +// public List selectDbTableList(GenTable genTable) { +// return genTableMapper.selectDbTableList(genTable); +// } +// +// /** +// * 查询据库列表 +// * +// * @param tableNames 表名称组 +// * @return 数据库表集合 +// */ +// public List selectDbTableListByNames(String[] tableNames) { +// return genTableMapper.selectDbTableListByNames(tableNames); +// } +// +// /** +// * 查询所有表信息 +// * +// * @return 表信息集合 +// */ +// public List selectGenTableAll() { +// return genTableMapper.selectGenTableAll(); +// } +// +// /** +// * 修改业务 +// * +// * @param genTable 业务信息 +// */ +// @Transactional +// public void updateGenTable(GenTable genTable) { +// String options = JSON.toJSONString(genTable.getParams()); +// genTable.setOptions(options); +// int row = genTableMapper.updateGenTable(genTable); +// if (row > 0) { +// for (GenTableColumn cenTableColumn : genTable.getColumns()) { +// genTableColumnMapper.updateGenTableColumn(cenTableColumn); +// } +// } +// } +// +// /** +// * 删除业务对象 +// * +// * @param ids 需要删除的数据ID +// */ +// @Transactional +// public void deleteGenTableByIds(String ids) { +// genTableMapper.deleteGenTableByIds(Convert.toLongArray(ids)); +// genTableColumnMapper.deleteGenTableColumnByIds(Convert.toLongArray(ids)); +// } +// +// /** +// * 创建表 +// * +// * @param sql 创建表语句 +// * @return 结果 +// */ +// public boolean createTable(String sql) { +// return genTableMapper.createTable(sql) == 0; +// } +// +// /** +// * 导入表结构 +// * +// * @param tableList 导入表列表 +// * @param operName 操作人员 +// */ +// @Transactional +// public void importGenTable(List tableList, String operName) { +// try { +// for (GenTable table : tableList) { +// String tableName = table.getTableName(); +// GenUtils.initTable(table, operName); +// int row = genTableMapper.insertGenTable(table); +// if (row > 0) { +// // 保存列信息 +// List genTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); +// for (GenTableColumn column : genTableColumns) { +// GenUtils.initColumnField(column, table); +// genTableColumnMapper.insertGenTableColumn(column); +// } +// } +// } +// } catch (Exception e) { +// throw new BusinessException("导入失败:" + e.getMessage()); +// } +// } +// +// /** +// * 预览代码 +// * +// * @param tableId 表编号 +// * @return 预览数据列表 +// */ +// public Map previewCode(Long tableId) { +// Map dataMap = new LinkedHashMap<>(); +// // 查询表信息 +// GenTable table = genTableMapper.selectGenTableById(tableId); +// // 设置主子表信息 +// setSubTable(table); +// // 设置主键列信息 +// setPkColumn(table); +// VelocityInitializer.initVelocity(); +// +// VelocityContext context = VelocityUtils.prepareContext(table); +// +// // 获取模板列表 +// List templates = VelocityUtils.getTemplateList(table.getTplCategory()); +// for (String template : templates) { +// // 渲染模板 +// StringWriter sw = new StringWriter(); +// Template tpl = Velocity.getTemplate(template, Constants.UTF8); +// tpl.merge(context, sw); +// dataMap.put(template, sw.toString()); +// } +// return dataMap; +// } +// +// /** +// * 生成代码(下载方式) +// * +// * @param tableName 表名称 +// * @return 数据 +// */ +// public byte[] downloadCode(String tableName) { +// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); +// ZipOutputStream zip = new ZipOutputStream(outputStream); +// generatorCode(tableName, zip); +// IOUtils.closeQuietly(zip); +// return outputStream.toByteArray(); +// } +// +// /** +// * 生成代码(自定义路径) +// * +// * @param tableName 表名称 +// */ +// public void generatorCode(String tableName) { +// // 查询表信息 +// GenTable table = genTableMapper.selectGenTableByName(tableName); +// // 设置主子表信息 +// setSubTable(table); +// // 设置主键列信息 +// setPkColumn(table); +// +// VelocityInitializer.initVelocity(); +// +// VelocityContext context = VelocityUtils.prepareContext(table); +// +// // 获取模板列表 +// List templates = VelocityUtils.getTemplateList(table.getTplCategory()); +// for (String template : templates) { +// if (!StringUtils.contains(template, "sql.vm")) { +// // 渲染模板 +// StringWriter sw = new StringWriter(); +// Template tpl = Velocity.getTemplate(template, Constants.UTF8); +// tpl.merge(context, sw); +// try { +// String path = getGenPath(table, template); +// FileUtils.writeStringToFile(new File(path), sw.toString(), Constants.UTF8); +// } catch (IOException e) { +// throw new BusinessException("渲染模板失败,表名:" + table.getTableName()); +// } +// } +// } +// } +// +// /** +// * 同步数据库 +// * +// * @param tableName 表名称 +// */ +// @Transactional +// public void synchDb(String tableName) { +// GenTable table = genTableMapper.selectGenTableByName(tableName); +// List tableColumns = table.getColumns(); +// Map tableColumnMap = tableColumns.stream().collect(Collectors.toMap(GenTableColumn::getColumnName, Function.identity())); +// +// List dbTableColumns = genTableColumnMapper.selectDbTableColumnsByName(tableName); +// if (CollectionUtil.isEmpty(dbTableColumns)) { +// throw new BusinessException("同步数据失败,原表结构不存在"); +// } +// List dbTableColumnNames = dbTableColumns.stream().map(GenTableColumn::getColumnName).collect(Collectors.toList()); +// +// dbTableColumns.forEach(column -> { +// GenUtils.initColumnField(column, table); +// if (tableColumnMap.containsKey(column.getColumnName())) { +// GenTableColumn prevColumn = tableColumnMap.get(column.getColumnName()); +// column.setColumnId(prevColumn.getColumnId()); +// if (column.isList()) { +// // 如果是列表,继续保留字典类型 +// column.setDictType(prevColumn.getDictType()); +// } +// genTableColumnMapper.updateGenTableColumn(column); +// } else { +// genTableColumnMapper.insertGenTableColumn(column); +// } +// }); +// +// List delColumns = tableColumns.stream().filter(column -> !dbTableColumnNames.contains(column.getColumnName())).collect(Collectors.toList()); +// if (CollectionUtil.isNotEmpty(delColumns)) { +// genTableColumnMapper.deleteGenTableColumns(delColumns); +// } +// } +// +// /** +// * 批量生成代码(下载方式) +// * +// * @param tableNames 表数组 +// * @return 数据 +// */ +// public byte[] downloadCode(String[] tableNames) { +// ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); +// ZipOutputStream zip = new ZipOutputStream(outputStream); +// for (String tableName : tableNames) { +// generatorCode(tableName, zip); +// } +// IOUtils.closeQuietly(zip); +// return outputStream.toByteArray(); +// } +// +// /** +// * 查询表信息并生成代码 +// */ +// private void generatorCode(String tableName, ZipOutputStream zip) { +// // 查询表信息 +// GenTable table = genTableMapper.selectGenTableByName(tableName); +// // 设置主子表信息 +// setSubTable(table); +// // 设置主键列信息 +// setPkColumn(table); +// +// VelocityInitializer.initVelocity(); +// +// VelocityContext context = VelocityUtils.prepareContext(table); +// +// // 获取模板列表 +// List templates = VelocityUtils.getTemplateList(table.getTplCategory()); +// for (String template : templates) { +// // 渲染模板 +// StringWriter sw = new StringWriter(); +// Template tpl = Velocity.getTemplate(template, Constants.UTF8); +// tpl.merge(context, sw); +// try { +// // 添加到zip +// zip.putNextEntry(new ZipEntry(VelocityUtils.getFileName(template, table))); +// IOUtils.write(sw.toString(), zip, Constants.UTF8); +// IOUtils.closeQuietly(sw); +// zip.flush(); +// zip.closeEntry(); +// } catch (IOException e) { +// log.error("渲染模板失败,表名:" + table.getTableName(), e); +// } +// } +// } +// +// /** +// * 修改保存参数校验 +// * +// * @param genTable 业务信息 +// */ +// public void validateEdit(GenTable genTable) { +// if (GenConstants.TPL_TREE.equals(genTable.getTplCategory())) { +// String options = JSON.toJSONString(genTable.getParams()); +// JSONObject paramsObj = JSONObject.parseObject(options); +// if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_CODE))) { +// throw new BusinessException("树编码字段不能为空"); +// } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_PARENT_CODE))) { +// throw new BusinessException("树父编码字段不能为空"); +// } else if (StringUtils.isEmpty(paramsObj.getString(GenConstants.TREE_NAME))) { +// throw new BusinessException("树名称字段不能为空"); +// } +// } else if (GenConstants.TPL_SUB.equals(genTable.getTplCategory())) { +// if (StringUtils.isEmpty(genTable.getSubTableName())) { +// throw new BusinessException("关联子表的表名不能为空"); +// } else if (StringUtils.isEmpty(genTable.getSubTableFkName())) { +// throw new BusinessException("子表关联的外键名不能为空"); +// } +// } +// } +// +// /** +// * 设置主键列信息 +// * +// * @param table 业务表信息 +// */ +// public void setPkColumn(GenTable table) { +// for (GenTableColumn column : table.getColumns()) { +// if (column.isPk()) { +// table.setPkColumn(column); +// break; +// } +// } +// if (Objects.isNull(table.getPkColumn())) { +// table.setPkColumn(table.getColumns().get(0)); +// } +// if (GenConstants.TPL_SUB.equals(table.getTplCategory())) { +// for (GenTableColumn column : table.getSubTable().getColumns()) { +// if (column.isPk()) { +// table.getSubTable().setPkColumn(column); +// break; +// } +// } +// if (Objects.isNull(table.getSubTable().getPkColumn())) { +// table.getSubTable().setPkColumn(table.getSubTable().getColumns().get(0)); +// } +// } +// } +// +// /** +// * 设置主子表信息 +// * +// * @param table 业务表信息 +// */ +// public void setSubTable(GenTable table) { +// String subTableName = table.getSubTableName(); +// if (StringUtils.isNotEmpty(subTableName)) { +// table.setSubTable(genTableMapper.selectGenTableByName(subTableName)); +// } +// } +// +// /** +// * 设置代码生成其他选项值 +// * +// * @param genTable 设置后的生成对象 +// */ +// public void setTableFromOptions(GenTable genTable) { +// JSONObject paramsObj = JSONObject.parseObject(genTable.getOptions()); +// if (!Objects.isNull(paramsObj)) { +// String treeCode = paramsObj.getString(GenConstants.TREE_CODE); +// String treeParentCode = paramsObj.getString(GenConstants.TREE_PARENT_CODE); +// String treeName = paramsObj.getString(GenConstants.TREE_NAME); +// String parentMenuId = paramsObj.getString(GenConstants.PARENT_MENU_ID); +// String parentMenuName = paramsObj.getString(GenConstants.PARENT_MENU_NAME); +// +// genTable.setTreeCode(treeCode); +// genTable.setTreeParentCode(treeParentCode); +// genTable.setTreeName(treeName); +// genTable.setParentMenuId(parentMenuId); +// genTable.setParentMenuName(parentMenuName); +// } +// } +// +// /** +// * 获取代码生成地址 +// * +// * @param table 业务表信息 +// * @param template 模板文件路径 +// * @return 生成地址 +// */ +// public static String getGenPath(GenTable table, String template) { +// String genPath = table.getGenPath(); +// if (StringUtils.equals(genPath, "/")) { +// return System.getProperty("user.dir") + File.separator + "src" + File.separator + VelocityUtils.getFileName(template, table); +// } +// return genPath + File.separator + VelocityUtils.getFileName(template, table); +// } +//} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/service/IGenTableColumnService.java b/common-generator-starter/src/main/java/com/mosty/common/generator/service/IGenTableColumnService.java new file mode 100644 index 0000000..7ab46a1 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/service/IGenTableColumnService.java @@ -0,0 +1,45 @@ +package com.mosty.common.generator.service; + + +import com.mosty.common.generator.domain.GenTableColumn; + +import java.util.List; + +/** + * 业务字段 服务层 + * + * @author ruoyi + */ +public interface IGenTableColumnService { + /** + * 查询业务字段列表 + * + * @param tableId 业务字段编号 + * @return 业务字段集合 + */ + public List selectGenTableColumnListByTableId(Long tableId); + + /** + * 新增业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int insertGenTableColumn(GenTableColumn genTableColumn); + + /** + * 修改业务字段 + * + * @param genTableColumn 业务字段信息 + * @return 结果 + */ + public int updateGenTableColumn(GenTableColumn genTableColumn); + + /** + * 删除业务字段信息 + * + * @param ids 需要删除的数据ID + * @return 结果 + */ + public int deleteGenTableColumnByIds(String ids); +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/service/IGenTableService.java b/common-generator-starter/src/main/java/com/mosty/common/generator/service/IGenTableService.java new file mode 100644 index 0000000..fd9b3ad --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/service/IGenTableService.java @@ -0,0 +1,122 @@ +package com.mosty.common.generator.service; + + +import com.mosty.common.generator.domain.GenTable; + +import java.util.List; +import java.util.Map; + +/** + * 业务 服务层 + * + * @author ruoyi + */ +public interface IGenTableService { + /** + * 查询业务列表 + * + * @param genTable 业务信息 + * @return 业务集合 + */ + public List selectGenTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param genTable 业务信息 + * @return 数据库表集合 + */ + public List selectDbTableList(GenTable genTable); + + /** + * 查询据库列表 + * + * @param tableNames 表名称组 + * @return 数据库表集合 + */ + public List selectDbTableListByNames(String[] tableNames); + + /** + * 查询所有表信息 + * + * @return 表信息集合 + */ + public List selectGenTableAll(); + + /** + * 查询业务信息 + * + * @param id 业务ID + * @return 业务信息 + */ + public GenTable selectGenTableById(Long id); + + /** + * 修改业务 + * + * @param genTable 业务信息 + * @return 结果 + */ + public void updateGenTable(GenTable genTable); + + /** + * 删除业务信息 + * + * @param tableIds 需要删除的表数据ID + * @return 结果 + */ + public void deleteGenTableByIds(Long[] tableIds); + + /** + * 导入表结构 + * + * @param tableList 导入表列表 + */ + public void importGenTable(List tableList); + + /** + * 预览代码 + * + * @param tableId 表编号 + * @return 预览数据列表 + */ + public Map previewCode(Long tableId); + + /** + * 生成代码(下载方式) + * + * @param tableName 表名称 + * @return 数据 + */ + public byte[] downloadCode(String tableName); + + /** + * 生成代码(自定义路径) + * + * @param tableName 表名称 + * @return 数据 + */ + public void generatorCode(String tableName); + + /** + * 同步数据库 + * + * @param tableName 表名称 + */ + public void synchDb(String tableName); + + /** + * 批量生成代码(下载方式) + * + * @param tableNames 表数组 + * @return 数据 + */ + public byte[] downloadCode(String[] tableNames); + + /** + * 修改保存参数校验 + * + * @param genTable 业务信息 + */ + public void validateEdit(GenTable genTable); +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/util/CharsetKit.java b/common-generator-starter/src/main/java/com/mosty/common/generator/util/CharsetKit.java new file mode 100644 index 0000000..f4a6cdd --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/util/CharsetKit.java @@ -0,0 +1,89 @@ +package com.mosty.common.generator.util; + +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; + +/** + * 字符集工具类 + * + * @author ruoyi + */ +public class CharsetKit { + /** + * ISO-8859-1 + */ + public static final String ISO_8859_1 = "ISO-8859-1"; + /** + * UTF-8 + */ + public static final String UTF_8 = "UTF-8"; + /** + * GBK + */ + public static final String GBK = "GBK"; + + /** + * ISO-8859-1 + */ + public static final Charset CHARSET_ISO_8859_1 = Charset.forName(ISO_8859_1); + /** + * UTF-8 + */ + public static final Charset CHARSET_UTF_8 = Charset.forName(UTF_8); + /** + * GBK + */ + public static final Charset CHARSET_GBK = Charset.forName(GBK); + + /** + * 转换为Charset对象 + * + * @param charset 字符集,为空则返回默认字符集 + * @return Charset + */ + public static Charset charset(String charset) { + return StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, String srcCharset, String destCharset) { + return convert(source, Charset.forName(srcCharset), Charset.forName(destCharset)); + } + + /** + * 转换字符串的字符集编码 + * + * @param source 字符串 + * @param srcCharset 源字符集,默认ISO-8859-1 + * @param destCharset 目标字符集,默认UTF-8 + * @return 转换后的字符集 + */ + public static String convert(String source, Charset srcCharset, Charset destCharset) { + if (null == srcCharset) { + srcCharset = StandardCharsets.ISO_8859_1; + } + + if (null == destCharset) { + destCharset = StandardCharsets.UTF_8; + } + + if (StringUtils.isEmpty(source) || srcCharset.equals(destCharset)) { + return source; + } + return new String(source.getBytes(srcCharset), destCharset); + } + + /** + * @return 系统字符集编码 + */ + public static String systemCharset() { + return Charset.defaultCharset().name(); + } +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/util/Convert.java b/common-generator-starter/src/main/java/com/mosty/common/generator/util/Convert.java new file mode 100644 index 0000000..8841384 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/util/Convert.java @@ -0,0 +1,854 @@ +package com.mosty.common.generator.util; + +import org.apache.commons.lang3.ArrayUtils; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; + +/** + * 类型转换器 + * + * @author ruoyi + */ +public class Convert { + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) { + if (null == value) { + return defaultValue; + } + if (value instanceof String) { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) { + return toStr(value, null); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) { + if (null == value) { + return defaultValue; + } + if (value instanceof Character) { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) { + return toChar(value, null); + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Byte) { + return (Byte) value; + } + if (value instanceof Number) { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Byte.parseByte(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Short) { + return (Short) value; + } + if (value instanceof Number) { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Short.parseShort(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Number) { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return NumberFormat.getInstance().parse(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Integer) { + return (Integer) value; + } + if (value instanceof Number) { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Integer.parseInt(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为int
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) { + if (StringUtils.isEmpty(str)) { + return new Integer[]{}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) { + if (StringUtils.isEmpty(str)) { + return new Long[]{}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) { + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Long) { + return (Long) value; + } + if (value instanceof Number) { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为long
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Double) { + return (Double) value; + } + if (value instanceof Number) { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Float) { + return (Float) value; + } + if (value instanceof Number) { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Float.parseFloat(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Boolean) { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) { + case "true": + return true; + case "false": + return false; + case "yes": + return true; + case "ok": + return true; + case "no": + return false; + case "1": + return true; + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) { + if (value == null) { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Enum.valueOf(clazz, valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof BigInteger) { + return (BigInteger) value; + } + if (value instanceof Long) { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return new BigInteger(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof BigDecimal) { + return (BigDecimal) value; + } + if (value instanceof Long) { + return new BigDecimal((Long) value); + } + if (value instanceof Double) { + return new BigDecimal((Double) value); + } + if (value instanceof Integer) { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return new BigDecimal(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ +// public static String utf8Str(Object obj) +// { +// return str(obj, CharsetKit.CHARSET_UTF_8); +// } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) { + if (null == obj) { + return null; + } + + if (obj instanceof String) { + return (String) obj; + } else if (obj instanceof byte[]) { + return str((byte[]) obj, charset); + } else if (obj instanceof Byte[]) { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } else if (obj instanceof ByteBuffer) { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) { + if (data == null) { + return null; + } + + if (null == charset) { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) { + if (data == null) { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) { + if (null == charset) { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) { + char c[] = input.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { + // 跳过不替换的字符 + continue; + } + + if (c[i] == ' ') { + c[i] = '\u3000'; + } else if (c[i] < '\177') { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) { + char c[] = text.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { + // 跳过不替换的字符 + continue; + } + + if (c[i] == '\u3000') { + c[i] = ' '; + } else if (c[i] > '\uFF00' && c[i] < '\uFF5F') { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) { + String[] fraction = {"角", "分"}; + String[] digit = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; + String[][] unit = {{"元", "万", "亿"}, {"", "拾", "佰", "仟"}}; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) { + s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/util/GenUtils.java b/common-generator-starter/src/main/java/com/mosty/common/generator/util/GenUtils.java new file mode 100644 index 0000000..a5fae12 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/util/GenUtils.java @@ -0,0 +1,221 @@ +package com.mosty.common.generator.util; + +import com.mosty.common.generator.config.GenConfig; +import com.mosty.common.generator.config.GenConstants; +import com.mosty.common.generator.domain.GenTable; +import com.mosty.common.generator.domain.GenTableColumn; +import org.apache.commons.lang3.RegExUtils; + +import java.util.Arrays; + +/** + * 代码生成器 工具类 + * + * @author ruoyi + */ +public class GenUtils { + /** + * 初始化表信息 + */ + public static void initTable(GenTable genTable, String operName) { + genTable.setClassName(convertClassName(genTable.getTableName())); + genTable.setPackageName(GenConfig.getPackageName()); + genTable.setModuleName(getModuleName(GenConfig.getPackageName())); + genTable.setBusinessName(getBusinessName(genTable.getTableName())); + genTable.setFunctionName(replaceText(genTable.getTableComment())); + genTable.setFunctionAuthor(GenConfig.getAuthor()); + genTable.setCreateBy(operName); + } + + /** + * 初始化列属性字段 + */ + public static void initColumnField(GenTableColumn column, GenTable table) { + String dataType = getDbType(column.getColumnType()); + String columnName = column.getColumnName(); + column.setTableId(table.getTableId()); + column.setCreateBy(table.getCreateBy()); + // 设置java字段名 + column.setJavaField(StringUtils.toCamelCase(columnName)); + // 设置默认类型 + column.setJavaType(GenConstants.TYPE_STRING); + + if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { + // 字符串长度超过500设置为文本域 + Integer columnLength = getColumnLength(column.getColumnType()); + String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; + column.setHtmlType(htmlType); + } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { + column.setJavaType(GenConstants.TYPE_DATE); + column.setHtmlType(GenConstants.HTML_DATETIME); + } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { + column.setHtmlType(GenConstants.HTML_INPUT); + + // 如果是浮点型 统一用BigDecimal + String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); + if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { + column.setJavaType(GenConstants.TYPE_BIGDECIMAL); + } + // 如果是整形 + else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) { + column.setJavaType(GenConstants.TYPE_INTEGER); + } + // 长整形 + else { + column.setJavaType(GenConstants.TYPE_LONG); + } + } + + // 插入字段(默认所有字段都需要插入) + column.setIsInsert(GenConstants.REQUIRE); + + // 编辑字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) { + column.setIsEdit(GenConstants.REQUIRE); + } + // 列表字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) { + column.setIsList(GenConstants.REQUIRE); + } + // 查询字段 + if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) { + column.setIsQuery(GenConstants.REQUIRE); + } + + // 查询字段类型 + if (StringUtils.endsWithIgnoreCase(columnName, "name")) { + column.setQueryType(GenConstants.QUERY_LIKE); + } + // 状态字段设置单选框 + if (StringUtils.endsWithIgnoreCase(columnName, "status")) { + column.setHtmlType(GenConstants.HTML_RADIO); + } + // 类型&性别字段设置下拉框 + else if (StringUtils.endsWithIgnoreCase(columnName, "type") + || StringUtils.endsWithIgnoreCase(columnName, "sex")) { + column.setHtmlType(GenConstants.HTML_SELECT); + } + // 图片字段设置图片上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "image")) { + column.setHtmlType(GenConstants.HTML_IMAGE_UPLOAD); + } + // 文件字段设置文件上传控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "file")) { + column.setHtmlType(GenConstants.HTML_FILE_UPLOAD); + } + // 内容字段设置富文本控件 + else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { + column.setHtmlType(GenConstants.HTML_EDITOR); + } + } + + /** + * 校验数组是否包含指定值 + * + * @param arr 数组 + * @param targetValue 值 + * @return 是否包含 + */ + public static boolean arraysContains(String[] arr, String targetValue) { + return Arrays.asList(arr).contains(targetValue); + } + + /** + * 获取模块名 + * + * @param packageName 包名 + * @return 模块名 + */ + public static String getModuleName(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + int nameLength = packageName.length(); + String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); + return moduleName; + } + + /** + * 获取业务名 + * + * @param tableName 表名 + * @return 业务名 + */ + public static String getBusinessName(String tableName) { + int lastIndex = tableName.lastIndexOf("_"); + int nameLength = tableName.length(); + String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength); + return businessName; + } + + /** + * 表名转换成Java类名 + * + * @param tableName 表名称 + * @return 类名 + */ + public static String convertClassName(String tableName) { + boolean autoRemovePre = GenConfig.getAutoRemovePre(); + String tablePrefix = GenConfig.getTablePrefix(); + if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { + String[] searchList = StringUtils.split(tablePrefix, ","); + tableName = replaceFirst(tableName, searchList); + } + return StringUtils.convertToCamelCase(tableName); + } + + /** + * 批量替换前缀 + * + * @param replacementm 替换值 + * @param searchList 替换列表 + * @return + */ + public static String replaceFirst(String replacementm, String[] searchList) { + String text = replacementm; + for (String searchString : searchList) { + if (replacementm.startsWith(searchString)) { + text = replacementm.replaceFirst(searchString, ""); + break; + } + } + return text; + } + + /** + * 关键字替换 + * + * @param text 需要被替换的名字 + * @return 替换后的名字 + */ + public static String replaceText(String text) { + return RegExUtils.replaceAll(text, "(?:表|若依)", ""); + } + + /** + * 获取数据库类型字段 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static String getDbType(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + return StringUtils.substringBefore(columnType, "("); + } else { + return columnType; + } + } + + /** + * 获取字段长度 + * + * @param columnType 列类型 + * @return 截取后的列类型 + */ + public static Integer getColumnLength(String columnType) { + if (StringUtils.indexOf(columnType, "(") > 0) { + String length = StringUtils.substringBetween(columnType, "(", ")"); + return Integer.valueOf(length); + } else { + return 0; + } + } +} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/util/GenUtils_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/util/GenUtils_bak.java new file mode 100644 index 0000000..5e1286a --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/util/GenUtils_bak.java @@ -0,0 +1,219 @@ +//package com.mosty.common.generator.util; +// +//import com.mosty.common.base.constant.GenConstants; +//import com.mosty.common.base.util.StringUtils; +//import com.mosty.common.generator.config.GenConfig; +//import com.mosty.common.generator.domain.GenTable; +//import com.mosty.common.generator.domain.GenTableColumn; +//import org.apache.commons.lang3.RegExUtils; +// +//import java.util.Arrays; +// +///** +// * 代码生成器 工具类 +// * +// * @author ruoyi +// */ +//public class GenUtils { +// +// /** +// * 初始化表信息 +// */ +// public static void initTable(GenTable genTable, String operName) { +// genTable.setClassName(convertClassName(genTable.getTableName())); +// genTable.setPackageName(GenConfig.getPackageName()); +// genTable.setModuleName(getModuleName(GenConfig.getPackageName())); +// genTable.setBusinessName(getBusinessName(genTable.getTableName())); +// genTable.setFunctionName(replaceText(genTable.getTableComment())); +// genTable.setFunctionAuthor(GenConfig.getAuthor()); +// genTable.setCreateName(operName); +// } +// +// /** +// * 初始化列属性字段 +// */ +// public static void initColumnField(GenTableColumn column, GenTable table) { +// String dataType = getDbType(column.getColumnType()); +// String columnName = column.getColumnName(); +// column.setTableId(table.getTableId()); +// column.setCreateBy(table.getCreateBy()); +// // 设置java字段名 +// column.setJavaField(StringUtils.toCamelCase(columnName)); +// // 设置默认类型 +// column.setJavaType(GenConstants.TYPE_STRING); +// +// if (arraysContains(GenConstants.COLUMNTYPE_STR, dataType) || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType)) { +// // 字符串长度超过500设置为文本域 +// Integer columnLength = getColumnLength(column.getColumnType()); +// String htmlType = columnLength >= 500 || arraysContains(GenConstants.COLUMNTYPE_TEXT, dataType) ? GenConstants.HTML_TEXTAREA : GenConstants.HTML_INPUT; +// column.setHtmlType(htmlType); +// } else if (arraysContains(GenConstants.COLUMNTYPE_TIME, dataType)) { +// column.setJavaType(GenConstants.TYPE_DATE); +// column.setHtmlType(GenConstants.HTML_DATETIME); +// } else if (arraysContains(GenConstants.COLUMNTYPE_NUMBER, dataType)) { +// column.setHtmlType(GenConstants.HTML_INPUT); +// +// // 如果是浮点型 统一用BigDecimal +// String[] str = StringUtils.split(StringUtils.substringBetween(column.getColumnType(), "(", ")"), ","); +// if (str != null && str.length == 2 && Integer.parseInt(str[1]) > 0) { +// column.setJavaType(GenConstants.TYPE_BIGDECIMAL); +// } +// // 如果是整形 +// else if (str != null && str.length == 1 && Integer.parseInt(str[0]) <= 10) { +// column.setJavaType(GenConstants.TYPE_INTEGER); +// } +// // 长整形 +// else { +// column.setJavaType(GenConstants.TYPE_LONG); +// } +// } +// +// // 插入字段(默认所有字段都需要插入) +// column.setIsInsert(GenConstants.REQUIRE); +// +// // 编辑字段 +// if (!arraysContains(GenConstants.COLUMNNAME_NOT_EDIT, columnName) && !column.isPk()) { +// column.setIsEdit(GenConstants.REQUIRE); +// } +// // 列表字段 +// if (!arraysContains(GenConstants.COLUMNNAME_NOT_LIST, columnName) && !column.isPk()) { +// column.setIsList(GenConstants.REQUIRE); +// } +// // 查询字段 +// if (!arraysContains(GenConstants.COLUMNNAME_NOT_QUERY, columnName) && !column.isPk()) { +// column.setIsQuery(GenConstants.REQUIRE); +// } +// +// // 查询字段类型 +// if (StringUtils.endsWithIgnoreCase(columnName, "name")) { +// column.setQueryType(GenConstants.QUERY_LIKE); +// } +// // 状态字段设置单选框 +// if (StringUtils.endsWithIgnoreCase(columnName, "status")) { +// column.setHtmlType(GenConstants.HTML_RADIO); +// } +// // 类型&性别字段设置下拉框 +// else if (StringUtils.endsWithIgnoreCase(columnName, "type") +// || StringUtils.endsWithIgnoreCase(columnName, "sex")) { +// column.setHtmlType(GenConstants.HTML_SELECT); +// } +// // 文件字段设置上传控件 +// else if (StringUtils.endsWithIgnoreCase(columnName, "file")) { +// column.setHtmlType(GenConstants.HTML_UPLOAD); +// } +// // 内容字段设置富文本控件 +// else if (StringUtils.endsWithIgnoreCase(columnName, "content")) { +// column.setHtmlType(GenConstants.HTML_SUMMERNOTE); +// } +// } +// +// /** +// * 校验数组是否包含指定值 +// * +// * @param arr 数组 +// * @param targetValue 值 +// * @return 是否包含 +// */ +// public static boolean arraysContains(String[] arr, String targetValue) { +// return Arrays.asList(arr).contains(targetValue); +// } +// +// /** +// * 获取模块名 +// * +// * @param packageName 包名 +// * @return 模块名 +// */ +// public static String getModuleName(String packageName) { +// int lastIndex = packageName.lastIndexOf("."); +// int nameLength = packageName.length(); +// String moduleName = StringUtils.substring(packageName, lastIndex + 1, nameLength); +// return moduleName; +// } +// +// /** +// * 获取业务名 +// * +// * @param tableName 表名 +// * @return 业务名 +// */ +// public static String getBusinessName(String tableName) { +// int lastIndex = tableName.lastIndexOf("_"); +// int nameLength = tableName.length(); +// String businessName = StringUtils.substring(tableName, lastIndex + 1, nameLength); +// return businessName; +// } +// +// /** +// * 表名转换成Java类名 +// * +// * @param tableName 表名称 +// * @return 类名 +// */ +// public static String convertClassName(String tableName) { +// boolean autoRemovePre = GenConfig.getAutoRemovePre(); +// String tablePrefix = GenConfig.getTablePrefix(); +// if (autoRemovePre && StringUtils.isNotEmpty(tablePrefix)) { +// String[] searchList = StringUtils.split(tablePrefix, ","); +// tableName = replaceFirst(tableName, searchList); +// } +// return StringUtils.convertToCamelCase(tableName); +// } +// +// /** +// * 批量替换前缀 +// * +// * @param replacementm 替换值 +// * @param searchList 替换列表 +// * @return +// */ +// public static String replaceFirst(String replacementm, String[] searchList) { +// String text = replacementm; +// for (String searchString : searchList) { +// if (replacementm.startsWith(searchString)) { +// text = replacementm.replaceFirst(searchString, ""); +// break; +// } +// } +// return text; +// } +// +// /** +// * 关键字替换 +// * +// * @param text 需要被替换的名字 +// * @return 替换后的名字 +// */ +// public static String replaceText(String text) { +// return RegExUtils.replaceAll(text, "(?:表|若依)", ""); +// } +// +// /** +// * 获取数据库类型字段 +// * +// * @param columnType 列类型 +// * @return 截取后的列类型 +// */ +// public static String getDbType(String columnType) { +// if (StringUtils.indexOf(columnType, "(") > 0) { +// return StringUtils.substringBefore(columnType, "("); +// } else { +// return columnType; +// } +// } +// +// /** +// * 获取字段长度 +// * +// * @param columnType 列类型 +// * @return 截取后的列类型 +// */ +// public static Integer getColumnLength(String columnType) { +// if (StringUtils.indexOf(columnType, "(") > 0) { +// String length = StringUtils.substringBetween(columnType, "(", ")"); +// return Integer.valueOf(length); +// } else { +// return 0; +// } +// } +//} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/util/StringUtils.java b/common-generator-starter/src/main/java/com/mosty/common/generator/util/StringUtils.java new file mode 100644 index 0000000..f8ba6ad --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/util/StringUtils.java @@ -0,0 +1,418 @@ +package com.mosty.common.generator.util; + +import cn.hutool.core.text.StrFormatter; +import com.mosty.common.base.constant.Constants; +import org.springframework.util.AntPathMatcher; + +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 字符串工具类 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + /** + * 空字符串 + */ + private static final String NULLSTR = ""; + + /** + * 下划线 + */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + * * @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + if (str == null) { + return NULLSTR; + } + + if (start < 0) { + start = str.length() + start; + } + + if (start < 0) { + start = 0; + } + if (start > str.length()) { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + if (str == null) { + return NULLSTR; + } + + if (end < 0) { + end = str.length() + end; + } + if (start < 0) { + start = str.length() + start; + } + + if (end > str.length()) { + end = str.length(); + } + + if (start > end) { + return NULLSTR; + } + + if (start < 0) { + start = 0; + } + if (end < 0) { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 判断是否为空,并且不是空白字符 + * + * @param str 要判断的value + * @return 结果 + */ + public static boolean hasText(String str) { + return (str != null && !str.isEmpty() && containsText(str)); + } + + private static boolean containsText(CharSequence str) { + int strLen = str.length(); + for (int i = 0; i < strLen; i++) { + if (!Character.isWhitespace(str.charAt(i))) { + return true; + } + } + return false; + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ + public static String format(String template, Object... params) { + if (isEmpty(params) || isEmpty(template)) { + return template; + } + return StrFormatter.format(template, params); + } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ + public static boolean ishttp(String link) { + return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + if (str == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (i > 0) { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } else { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) { + sb.append(SEPARATOR); + } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + if (str != null && strs != null) { + for (String s : strs) { + if (str.equalsIgnoreCase(trim(s))) { + return true; + } + } + } + return false; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains("_")) { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 例如:user_name->userName + */ + public static String toCamelCase(String s) { + if (s == null) { + return null; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == SEPARATOR) { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) { + return (T) obj; + } +} \ No newline at end of file diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityInitializer.java b/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityInitializer.java new file mode 100644 index 0000000..3936ae8 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityInitializer.java @@ -0,0 +1,30 @@ +package com.mosty.common.generator.util; + +import com.mosty.common.base.constant.Constants; +import org.apache.velocity.app.Velocity; + +import java.util.Properties; + +/** + * VelocityEngine工厂 + * + * @author ruoyi + */ +public class VelocityInitializer { + /** + * 初始化vm方法 + */ + public static void initVelocity() { + Properties p = new Properties(); + try { + // 加载classpath目录下的vm文件 + p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); + // 定义字符集 + p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); + // 初始化Velocity引擎,指定配置Properties + Velocity.init(p); + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityInitializer_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityInitializer_bak.java new file mode 100644 index 0000000..957d5ee --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityInitializer_bak.java @@ -0,0 +1,30 @@ +//package com.mosty.common.generator.util; +// +//import com.mosty.common.base.constant.Constants; +//import org.apache.velocity.app.Velocity; +// +//import java.util.Properties; +// +///** +// * VelocityEngine工厂 +// * +// * @author ruoyi +// */ +//public class VelocityInitializer { +// /** +// * 初始化vm方法 +// */ +// public static void initVelocity() { +// Properties p = new Properties(); +// try { +// // 加载classpath目录下的vm文件 +// p.setProperty("resource.loader.file.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader"); +// ‰ // 定义字符集 +// p.setProperty(Velocity.INPUT_ENCODING, Constants.UTF8); +// // 初始化Velocity引擎,指定配置Properties +// Velocity.init(p); +// } catch (Exception e) { +// throw new RuntimeException(e); +// } +// } +//} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityUtils.java b/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityUtils.java new file mode 100644 index 0000000..365ba9f --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityUtils.java @@ -0,0 +1,333 @@ +package com.mosty.common.generator.util; + +import com.alibaba.fastjson.JSONObject; +import com.mosty.common.base.constant.GenConstants; +import com.mosty.common.base.util.DateUtils; +import com.mosty.common.generator.domain.GenTable; +import com.mosty.common.generator.domain.GenTableColumn; +import org.apache.velocity.VelocityContext; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +/** + * 模板工具类 + * + * @author ruoyi + */ +public class VelocityUtils { + /** + * 项目空间路径 + */ + private static final String PROJECT_PATH = "main/java"; + + /** + * mybatis空间路径 + */ + private static final String MYBATIS_PATH = "main/resources/mapper"; + + /** + * 默认上级菜单,系统工具 + */ + private static final String DEFAULT_PARENT_MENU_ID = "3"; + + /** + * 设置模板变量信息 + * + * @return 模板列表 + */ + public static VelocityContext prepareContext(GenTable genTable) { + String moduleName = genTable.getModuleName(); + String businessName = genTable.getBusinessName(); + String packageName = genTable.getPackageName(); + String tplCategory = genTable.getTplCategory(); + String functionName = genTable.getFunctionName(); + + VelocityContext velocityContext = new VelocityContext(); + velocityContext.put("tplCategory", genTable.getTplCategory()); + velocityContext.put("tableName", genTable.getTableName()); + velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); + velocityContext.put("ClassName", genTable.getClassName()); + velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); + velocityContext.put("moduleName", genTable.getModuleName()); + velocityContext.put("BusinessName", StringUtils.capitalize(genTable.getBusinessName())); + velocityContext.put("businessName", genTable.getBusinessName()); + velocityContext.put("basePackage", getPackagePrefix(packageName)); + velocityContext.put("packageName", packageName); + velocityContext.put("author", genTable.getFunctionAuthor()); + velocityContext.put("datetime", DateUtils.getDate()); + velocityContext.put("pkColumn", genTable.getPkColumn()); + velocityContext.put("importList", getImportList(genTable)); + velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); + velocityContext.put("columns", genTable.getColumns()); + velocityContext.put("table", genTable); + velocityContext.put("dicts", getDicts(genTable)); + setMenuVelocityContext(velocityContext, genTable); + if (GenConstants.TPL_TREE.equals(tplCategory)) { + setTreeVelocityContext(velocityContext, genTable); + } + if (GenConstants.TPL_SUB.equals(tplCategory)) { + setSubVelocityContext(velocityContext, genTable); + } + return velocityContext; + } + + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String parentMenuId = getParentMenuId(paramsObj); + context.put("parentMenuId", parentMenuId); + } + + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String treeCode = getTreecode(paramsObj); + String treeParentCode = getTreeParentCode(paramsObj); + String treeName = getTreeName(paramsObj); + + context.put("treeCode", treeCode); + context.put("treeParentCode", treeParentCode); + context.put("treeName", treeName); + context.put("expandColumn", getExpandColumn(genTable)); + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); + } + } + + public static void setSubVelocityContext(VelocityContext context, GenTable genTable) { + GenTable subTable = genTable.getSubTable(); + String subTableName = genTable.getSubTableName(); + String subTableFkName = genTable.getSubTableFkName(); + String subClassName = genTable.getSubTable().getClassName(); + String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); + + context.put("subTable", subTable); + context.put("subTableName", subTableName); + context.put("subTableFkName", subTableFkName); + context.put("subTableFkClassName", subTableFkClassName); + context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); + context.put("subClassName", subClassName); + context.put("subclassName", StringUtils.uncapitalize(subClassName)); + context.put("subImportList", getImportList(genTable.getSubTable())); + } + + /** + * 获取模板信息 + * + * @return 模板列表 + */ + public static List getTemplateList(String tplCategory) { + List templates = new ArrayList(); + templates.add("vm/java/domain.java.vm"); + templates.add("vm/java/mapper.java.vm"); + templates.add("vm/java/service.java.vm"); + templates.add("vm/java/serviceImpl.java.vm"); + templates.add("vm/java/controller.java.vm"); + templates.add("vm/xml/mapper.xml.vm"); + templates.add("vm/sql/sql.vm"); + templates.add("vm/js/api.js.vm"); + if (GenConstants.TPL_CRUD.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + } else if (GenConstants.TPL_TREE.equals(tplCategory)) { + templates.add("vm/vue/index-tree.vue.vm"); + } else if (GenConstants.TPL_SUB.equals(tplCategory)) { + templates.add("vm/vue/index.vue.vm"); + templates.add("vm/java/sub-domain.java.vm"); + } + return templates; + } + + /** + * 获取文件名 + */ + public static String getFileName(String template, GenTable genTable) { + // 文件名称 + String fileName = ""; + // 包路径 + String packageName = genTable.getPackageName(); + // 模块名 + String moduleName = genTable.getModuleName(); + // 大写类名 + String className = genTable.getClassName(); + // 业务名称 + String businessName = genTable.getBusinessName(); + + String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); + String mybatisPath = MYBATIS_PATH + "/" + moduleName; + String vuePath = "vue"; + + if (template.contains("domain.java.vm")) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); + } + if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) { + fileName = StringUtils.format("{}/domain/{}.java", javaPath, genTable.getSubTable().getClassName()); + } else if (template.contains("mapper.java.vm")) { + fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); + } else if (template.contains("service.java.vm")) { + fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); + } else if (template.contains("serviceImpl.java.vm")) { + fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); + } else if (template.contains("controller.java.vm")) { + fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); + } else if (template.contains("mapper.xml.vm")) { + fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); + } else if (template.contains("sql.vm")) { + fileName = businessName + "Menu.sql"; + } else if (template.contains("api.js.vm")) { + fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); + } else if (template.contains("index.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } else if (template.contains("index-tree.vue.vm")) { + fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); + } + return fileName; + } + + /** + * 获取包前缀 + * + * @param packageName 包名称 + * @return 包前缀名称 + */ + public static String getPackagePrefix(String packageName) { + int lastIndex = packageName.lastIndexOf("."); + String basePackage = StringUtils.substring(packageName, 0, lastIndex); + return basePackage; + } + + /** + * 根据列类型获取导入包 + * + * @param genTable 业务表对象 + * @return 返回需要导入的包列表 + */ + public static HashSet getImportList(GenTable genTable) { + List columns = genTable.getColumns(); + GenTable subGenTable = genTable.getSubTable(); + HashSet importList = new HashSet(); + if (StringUtils.isNotNull(subGenTable)) { + importList.add("java.util.List"); + } + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { + importList.add("java.util.Date"); + importList.add("com.fasterxml.jackson.annotation.JsonFormat"); + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { + importList.add("java.math.BigDecimal"); + } + } + return importList; + } + + /** + * 根据列类型获取字典组 + * + * @param genTable 业务表对象 + * @return 返回字典组 + */ + public static String getDicts(GenTable genTable) { + List columns = genTable.getColumns(); + Set dicts = new HashSet(); + for (GenTableColumn column : columns) { + if (!column.isSuperColumn() && StringUtils.isNotEmpty(column.getDictType()) && StringUtils.equalsAny( + column.getHtmlType(), + new String[]{GenConstants.HTML_SELECT, GenConstants.HTML_RADIO, GenConstants.HTML_CHECKBOX})) { + dicts.add("'" + column.getDictType() + "'"); + } + } + return StringUtils.join(dicts, ", "); + } + + /** + * 获取权限前缀 + * + * @param moduleName 模块名称 + * @param businessName 业务名称 + * @return 返回权限前缀 + */ + public static String getPermissionPrefix(String moduleName, String businessName) { + return StringUtils.format("{}:{}", moduleName, businessName); + } + + /** + * 获取上级菜单ID字段 + * + * @param paramsObj 生成其他选项 + * @return 上级菜单ID字段 + */ + public static String getParentMenuId(JSONObject paramsObj) { + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) + && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) { + return paramsObj.getString(GenConstants.PARENT_MENU_ID); + } + return DEFAULT_PARENT_MENU_ID; + } + + /** + * 获取树编码 + * + * @param paramsObj 生成其他选项 + * @return 树编码 + */ + public static String getTreecode(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_CODE)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树父编码 + * + * @param paramsObj 生成其他选项 + * @return 树父编码 + */ + public static String getTreeParentCode(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); + } + return StringUtils.EMPTY; + } + + /** + * 获取树名称 + * + * @param paramsObj 生成其他选项 + * @return 树名称 + */ + public static String getTreeName(JSONObject paramsObj) { + if (paramsObj.containsKey(GenConstants.TREE_NAME)) { + return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); + } + return StringUtils.EMPTY; + } + + /** + * 获取需要在哪一列上面显示展开按钮 + * + * @param genTable 业务表对象 + * @return 展开按钮列序号 + */ + public static int getExpandColumn(GenTable genTable) { + String options = genTable.getOptions(); + JSONObject paramsObj = JSONObject.parseObject(options); + String treeName = paramsObj.getString(GenConstants.TREE_NAME); + int num = 0; + for (GenTableColumn column : genTable.getColumns()) { + if (column.isList()) { + num++; + String columnName = column.getColumnName(); + if (columnName.equals(treeName)) { + break; + } + } + } + return num; + } +} diff --git a/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityUtils_bak.java b/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityUtils_bak.java new file mode 100644 index 0000000..209c402 --- /dev/null +++ b/common-generator-starter/src/main/java/com/mosty/common/generator/util/VelocityUtils_bak.java @@ -0,0 +1,333 @@ +//package com.mosty.common.generator.util; +// +//import com.alibaba.fastjson.JSONObject; +//import com.mosty.common.base.constant.GenConstants; +//import com.mosty.common.base.util.DateUtils; +//import com.mosty.common.base.util.StringUtils; +//import com.mosty.common.generator.config.GenConfig; +//import com.mosty.common.generator.domain.GenTable; +//import com.mosty.common.generator.domain.GenTableColumn; +//import org.apache.velocity.VelocityContext; +// +//import java.util.ArrayList; +//import java.util.HashSet; +//import java.util.List; +// +//public class VelocityUtils { +// /** +// * 项目空间路径 +// */ +// private static final String PROJECT_PATH = "main/java"; +// +// /** +// * mybatis空间路径 +// */ +// private static final String MYBATIS_PATH = "main/resources/mapper"; +// +// /** +// * html空间路径 +// */ +// private static final String TEMPLATES_PATH = "main/resources/templates"; +// +// /** +// * 默认上级菜单,系统工具 +// */ +// private static final String DEFAULT_PARENT_MENU_ID = "3"; +// +// /** +// * 设置模板变量信息 +// * +// * @return 模板列表 +// */ +// public static VelocityContext prepareContext(GenTable genTable) { +// String moduleName = genTable.getModuleName(); +// String businessName = genTable.getBusinessName(); +// String packageName = genTable.getPackageName(); +// String tplCategory = genTable.getTplCategory(); +// String functionName = genTable.getFunctionName(); +// +// VelocityContext velocityContext = new VelocityContext(); +// velocityContext.put("tplCategory", genTable.getTplCategory()); +// velocityContext.put("tableName", genTable.getTableName()); +// velocityContext.put("functionName", StringUtils.isNotEmpty(functionName) ? functionName : "【请填写功能名称】"); +// velocityContext.put("ClassName", genTable.getClassName()); +// velocityContext.put("className", StringUtils.uncapitalize(genTable.getClassName())); +// velocityContext.put("moduleName", genTable.getModuleName()); +// velocityContext.put("businessName", genTable.getBusinessName()); +// velocityContext.put("basePackage", getPackagePrefix(packageName)); +// velocityContext.put("packageName", packageName); +// velocityContext.put("author", genTable.getFunctionAuthor()); +// velocityContext.put("datetime", DateUtils.getDate()); +// velocityContext.put("pkColumn", genTable.getPkColumn()); +// velocityContext.put("importList", getImportList(genTable)); +// velocityContext.put("permissionPrefix", getPermissionPrefix(moduleName, businessName)); +// velocityContext.put("columns", genTable.getColumns()); +// velocityContext.put("table", genTable); +// setMenuVelocityContext(velocityContext, genTable); +// if (GenConstants.TPL_TREE.equals(tplCategory)) { +// setTreeVelocityContext(velocityContext, genTable); +// } +// if (GenConstants.TPL_SUB.equals(tplCategory)) { +// setSubVelocityContext(velocityContext, genTable); +// } +// return velocityContext; +// } +// +// public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) { +// String options = genTable.getOptions(); +// JSONObject paramsObj = JSONObject.parseObject(options); +// String parentMenuId = getParentMenuId(paramsObj); +// context.put("parentMenuId", parentMenuId); +// } +// +// public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) { +// String options = genTable.getOptions(); +// JSONObject paramsObj = JSONObject.parseObject(options); +// String treeCode = getTreecode(paramsObj); +// String treeParentCode = getTreeParentCode(paramsObj); +// String treeName = getTreeName(paramsObj); +// +// context.put("treeCode", treeCode); +// context.put("treeParentCode", treeParentCode); +// context.put("treeName", treeName); +// context.put("expandColumn", getExpandColumn(genTable)); +// if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { +// context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); +// } +// if (paramsObj.containsKey(GenConstants.TREE_NAME)) { +// context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); +// } +// } +// +// public static void setSubVelocityContext(VelocityContext context, GenTable genTable) { +// GenTable subTable = genTable.getSubTable(); +// String subTableName = genTable.getSubTableName(); +// String subTableFkName = genTable.getSubTableFkName(); +// String subClassName = genTable.getSubTable().getClassName(); +// String subTableFkClassName = StringUtils.convertToCamelCase(subTableFkName); +// +// context.put("subTable", subTable); +// context.put("subTableName", subTableName); +// context.put("subTableFkName", subTableFkName); +// context.put("subTableFkClassName", subTableFkClassName); +// context.put("subTableFkclassName", StringUtils.uncapitalize(subTableFkClassName)); +// context.put("subClassName", subClassName); +// context.put("subclassName", StringUtils.uncapitalize(subClassName)); +// context.put("subImportList", getImportList(genTable.getSubTable())); +// } +// +// /** +// * 获取模板信息 +// * +// * @return 模板列表 +// */ +// public static List getTemplateList(String tplCategory) { +// List templates = new ArrayList(); +// templates.add("vm/java/domain.java.vm"); +// templates.add("vm/java/mapper.java.vm"); +// templates.add("vm/java/service.java.vm"); +// templates.add("vm/java/serviceImpl.java.vm"); +// templates.add("vm/java/controller.java.vm"); +// templates.add("vm/xml/mapper.xml.vm"); +// if (GenConstants.TPL_CRUD.equals(tplCategory)) { +// templates.add("vm/html/list.html.vm"); +// } else if (GenConstants.TPL_TREE.equals(tplCategory)) { +// templates.add("vm/html/tree.html.vm"); +// templates.add("vm/html/list-tree.html.vm"); +// } else if (GenConstants.TPL_SUB.equals(tplCategory)) { +// templates.add("vm/html/list.html.vm"); +// templates.add("vm/java/sub-domain.java.vm"); +// } +// templates.add("vm/html/add.html.vm"); +// templates.add("vm/html/edit.html.vm"); +// templates.add("vm/sql/sql.vm"); +// return templates; +// } +// +// /** +// * 获取文件名 +// */ +// public static String getFileName(String template, GenTable genTable) { +// // 文件名称 +// String fileName = ""; +// // 包路径 +// String packageName = genTable.getPackageName(); +// // 模块名 +// String moduleName = genTable.getModuleName(); +// // 大写类名 +// String className = genTable.getClassName(); +// // 业务名称 +// String businessName = genTable.getBusinessName(); +// +// String javaPath = PROJECT_PATH + "/" + StringUtils.replace(packageName, ".", "/"); +// String mybatisPath = MYBATIS_PATH + "/" + moduleName; +// String htmlPath = TEMPLATES_PATH + "/" + moduleName + "/" + businessName; +// +// if (template.contains("domain.java.vm")) { +// fileName = String.format("%s/domain/%s.java", javaPath, className); +// } +// if (template.contains("sub-domain.java.vm") && StringUtils.equals(GenConstants.TPL_SUB, genTable.getTplCategory())) { +// fileName = String.format("%s/domain/%s.java", javaPath, genTable.getSubTable().getClassName()); +// } else if (template.contains("mapper.java.vm")) { +// fileName = String.format("%s/mapper/%sMapper.java", javaPath, className); +// } else if (template.contains("service.java.vm")) { +// fileName = String.format("%s/service/I%sService.java", javaPath, className); +// } else if (template.contains("serviceImpl.java.vm")) { +// fileName = String.format("%s/service/impl/%sServiceImpl.java", javaPath, className); +// } else if (template.contains("controller.java.vm")) { +// fileName = String.format("%s/controller/%sController.java", javaPath, className); +// } else if (template.contains("mapper.xml.vm")) { +// fileName = String.format("%s/%sMapper.xml", mybatisPath, className); +// } else if (template.contains("list.html.vm")) { +// fileName = String.format("%s/%s.html", htmlPath, businessName); +// } else if (template.contains("list-tree.html.vm")) { +// fileName = String.format("%s/%s.html", htmlPath, businessName); +// } else if (template.contains("tree.html.vm")) { +// fileName = String.format("%s/tree.html", htmlPath); +// } else if (template.contains("add.html.vm")) { +// fileName = String.format("%s/add.html", htmlPath); +// } else if (template.contains("edit.html.vm")) { +// fileName = String.format("%s/edit.html", htmlPath); +// } else if (template.contains("sql.vm")) { +// fileName = businessName + "Menu.sql"; +// } +// return fileName; +// } +// +// /** +// * 获取项目文件路径 +// * +// * @return 路径 +// */ +// public static String getProjectPath() { +// String packageName = GenConfig.getPackageName(); +// StringBuffer projectPath = new StringBuffer(); +// projectPath.append("main/java/"); +// projectPath.append(packageName.replace(".", "/")); +// projectPath.append("/"); +// return projectPath.toString(); +// } +// +// /** +// * 获取包前缀 +// * +// * @param packageName 包名称 +// * @return 包前缀名称 +// */ +// public static String getPackagePrefix(String packageName) { +// int lastIndex = packageName.lastIndexOf("."); +// String basePackage = StringUtils.substring(packageName, 0, lastIndex); +// return basePackage; +// } +// +// /** +// * 根据列类型获取导入包 +// * +// * @param genTable 业务表对象 +// * @return 返回需要导入的包列表 +// */ +// public static HashSet getImportList(GenTable genTable) { +// List columns = genTable.getColumns(); +// GenTable subGenTable = genTable.getSubTable(); +// HashSet importList = new HashSet(); +// if (StringUtils.isNotNull(subGenTable)) { +// importList.add("java.util.List"); +// } +// for (GenTableColumn column : columns) { +// if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) { +// importList.add("java.util.Date"); +// importList.add("com.fasterxml.jackson.annotation.JsonFormat"); +// } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) { +// importList.add("java.math.BigDecimal"); +// } +// } +// return importList; +// } +// +// /** +// * 获取权限前缀 +// * +// * @param moduleName 模块名称 +// * @param businessName 业务名称 +// * @return 返回权限前缀 +// */ +// public static String getPermissionPrefix(String moduleName, String businessName) { +// return String.format("%s:%s", moduleName, businessName); +// } +// +// /** +// * 获取上级菜单ID字段 +// * +// * @param paramsObj 生成其他选项 +// * @return 上级菜单ID字段 +// */ +// public static String getParentMenuId(JSONObject paramsObj) { +// if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID) +// && StringUtils.isNotEmpty(paramsObj.getString(GenConstants.PARENT_MENU_ID))) { +// return paramsObj.getString(GenConstants.PARENT_MENU_ID); +// } +// return DEFAULT_PARENT_MENU_ID; +// } +// +// /** +// * 获取树编码 +// * +// * @param paramsObj 生成其他选项 +// * @return 树编码 +// */ +// public static String getTreecode(JSONObject paramsObj) { +// if (paramsObj.containsKey(GenConstants.TREE_CODE)) { +// return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); +// } +// return StringUtils.EMPTY; +// } +// +// /** +// * 获取树父编码 +// * +// * @param paramsObj 生成其他选项 +// * @return 树父编码 +// */ +// public static String getTreeParentCode(JSONObject paramsObj) { +// if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) { +// return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); +// } +// return StringUtils.EMPTY; +// } +// +// /** +// * 获取树名称 +// * +// * @param paramsObj 生成其他选项 +// * @return 树名称 +// */ +// public static String getTreeName(JSONObject paramsObj) { +// if (paramsObj.containsKey(GenConstants.TREE_NAME)) { +// return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); +// } +// return StringUtils.EMPTY; +// } +// +// /** +// * 获取需要在哪一列上面显示展开按钮 +// * +// * @param genTable 业务表对象 +// * @return 展开按钮列序号 +// */ +// public static int getExpandColumn(GenTable genTable) { +// String options = genTable.getOptions(); +// JSONObject paramsObj = JSONObject.parseObject(options); +// String treeName = paramsObj.getString(GenConstants.TREE_NAME); +// int num = 0; +// for (GenTableColumn column : genTable.getColumns()) { +// if (column.isList()) { +// num++; +// String columnName = column.getColumnName(); +// if (columnName.equals(treeName)) { +// break; +// } +// } +// } +// return num; +// } +//} \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/META-INF/spring.factories b/common-generator-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..7fab0be --- /dev/null +++ b/common-generator-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.generator.GeneratorAutoConfiguration \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/generator.yml b/common-generator-starter/src/main/resources/generator.yml new file mode 100644 index 0000000..f70a072 --- /dev/null +++ b/common-generator-starter/src/main/resources/generator.yml @@ -0,0 +1,11 @@ + +# 代码生成 +gen: + # 作者 + author: kevin + # 默认生成包路径 system 需改成自己的模块名称 如 system monitor tool + packageName: com.mosty.base + # 自动去除表前缀,默认是false + autoRemovePre: false + # 表前缀(生成类名不会包含表前缀,多个用逗号分隔) + tablePrefix: sys_ \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/mapper/GenTableColumnMapper.xml_bak b/common-generator-starter/src/main/resources/mapper/GenTableColumnMapper.xml_bak new file mode 100644 index 0000000..1b3c411 --- /dev/null +++ b/common-generator-starter/src/main/resources/mapper/GenTableColumnMapper.xml_bak @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + insert into gen_table_column ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/mapper/GenTableMapper.xml_bak b/common-generator-starter/src/main/resources/mapper/GenTableMapper.xml_bak new file mode 100644 index 0000000..b53664d --- /dev/null +++ b/common-generator-starter/src/main/resources/mapper/GenTableMapper.xml_bak @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + ${sql} + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/mapper/generator/GenTableColumnMapper.xml b/common-generator-starter/src/main/resources/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..7b2c6cc --- /dev/null +++ b/common-generator-starter/src/main/resources/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + insert into gen_table_column ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/mapper/generator/GenTableMapper.xml b/common-generator-starter/src/main/resources/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..167a8c3 --- /dev/null +++ b/common-generator-starter/src/main/resources/mapper/generator/GenTableMapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/templates/tool/gen/createTable.html b/common-generator-starter/src/main/resources/templates/tool/gen/createTable.html new file mode 100644 index 0000000..c9b9dcf --- /dev/null +++ b/common-generator-starter/src/main/resources/templates/tool/gen/createTable.html @@ -0,0 +1,30 @@ + + + + + + +

+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/templates/tool/gen/edit.html b/common-generator-starter/src/main/resources/templates/tool/gen/edit.html new file mode 100644 index 0000000..56ededc --- /dev/null +++ b/common-generator-starter/src/main/resources/templates/tool/gen/edit.html @@ -0,0 +1,607 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/common-generator-starter/src/main/resources/templates/tool/gen/gen.html b/common-generator-starter/src/main/resources/templates/tool/gen/gen.html new file mode 100644 index 0000000..a0150f1 --- /dev/null +++ b/common-generator-starter/src/main/resources/templates/tool/gen/gen.html @@ -0,0 +1,218 @@ + + + + + + +
+
+
+
+
+
    +
  • + 表名称: +
  • +
  • + 表描述: +
  • +
  • + + + - + +
  • +
  • +  搜索 +  重置 +
  • +
+
+
+
+ + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/templates/tool/gen/importTable.html b/common-generator-starter/src/main/resources/templates/tool/gen/importTable.html new file mode 100644 index 0000000..91562e7 --- /dev/null +++ b/common-generator-starter/src/main/resources/templates/tool/gen/importTable.html @@ -0,0 +1,95 @@ + + + + + + +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/vm/html/add.html.vm b/common-generator-starter/src/main/resources/vm/html/add.html.vm new file mode 100644 index 0000000..b7f1781 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/html/add.html.vm @@ -0,0 +1,381 @@ + + + + +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "datetime") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "upload") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "summernote") + +#break +#end +#end + + +
+
+#if($table.sub) +

${functionName}信息

+#end +#foreach($column in $columns) +#set($field=$column.javaField) +#if($column.insert && !$column.pk) +#if(($column.usableColumn) || (!$column.superColumn)) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#set($dictType=$column.dictType) +#if("" != $treeParentCode && $column.javaField == $treeParentCode) +
+ +
+
+#set($BusinessName=$businessName.substring(0,1).toUpperCase() + ${businessName.substring(1)}) +#set($treeId = "${className}?.${treeCode}") + + + +
+
+
+#elseif($column.htmlType == "input") +
+ +
+ +
+
+#elseif($column.htmlType == "upload") +
+ +
+ +
+ +
+
+
+#elseif($column.htmlType == "summernote") +
+ +
+ +
+
+
+#elseif($column.htmlType == "select" && "" != $dictType) +
+ +
+ +
+
+#elseif($column.htmlType == "select" && $dictType) +
+ +
+ + 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "checkbox" && "" != $dictType) +
+ +
+ +
+
+#elseif($column.htmlType == "checkbox" && $dictType) +
+ +
+ + 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "radio" && "" != $dictType) +
+ +
+
+ + +
+
+
+#elseif($column.htmlType == "radio" && $dictType) +
+ +
+
+ + +
+ 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "datetime") +
+ +
+
+ + +
+
+
+#elseif($column.htmlType == "textarea") +
+ +
+ +
+
+#end +#end +#end +#end +#if($table.sub) +

${subTable.functionName}信息

+
+
+ + +
+
+
+
+
+#end +
+
+ +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "datetime") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "upload") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "summernote") + +#break +#end +#end + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/vm/html/edit.html.vm b/common-generator-starter/src/main/resources/vm/html/edit.html.vm new file mode 100644 index 0000000..53e0451 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/html/edit.html.vm @@ -0,0 +1,392 @@ + + + + +#foreach($column in $columns) +#if($column.edit && !$column.superColumn && !$column.pk && $column.htmlType == "datetime") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "upload") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "summernote") + +#break +#end +#end + + +
+
+#if($table.sub) +

${functionName}信息

+#end + +#foreach($column in $columns) +#if($column.edit && !$column.pk) +#if(($column.usableColumn) || (!$column.superColumn)) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#set($field=$column.javaField) +#set($dictType=$column.dictType) +#if("" != $treeParentCode && $column.javaField == $treeParentCode) +
+ +
+
+#set($BusinessName=$businessName.substring(0,1).toUpperCase() + ${businessName.substring(1)}) + + + +
+
+
+#elseif($column.htmlType == "input") +
+ +
+ +
+
+#elseif($column.htmlType == "upload") +
+ +
+ +
+ +
+
+
+#elseif($column.htmlType == "summernote") +
+ +
+ +
+
+
+#elseif($column.htmlType == "select" && "" != $dictType) +
+ +
+ +
+
+#elseif($column.htmlType == "select" && $dictType) +
+ +
+ + 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "checkbox" && "" != $dictType) +
+ +
+ +
+
+#elseif($column.htmlType == "checkbox" && $dictType) +
+ +
+ + 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "radio" && "" != $dictType) +
+ +
+
+ + +
+
+
+#elseif($column.htmlType == "radio" && $dictType) +
+ +
+
+ + +
+ 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "datetime") +
+ +
+
+ + +
+
+
+#elseif($column.htmlType == "textarea") +
+ +
+ +
+
+#end +#end +#end +#end +#if($table.sub) +

${subTable.functionName}信息

+
+
+ + +
+
+
+
+
+#end +
+
+ +#foreach($column in $columns) +#if($column.edit && !$column.superColumn && !$column.pk && $column.htmlType == "datetime") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "upload") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "summernote") + +#break +#end +#end + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/vm/html/list-tree.html.vm b/common-generator-starter/src/main/resources/vm/html/list-tree.html.vm new file mode 100644 index 0000000..f7f797d --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/html/list-tree.html.vm @@ -0,0 +1,156 @@ + + + + + + +
+
+
+
+
+
    +#foreach($column in $columns) +#if($column.query) +#set($dictType=$column.dictType) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($column.htmlType == "input") +
  • + + +
  • +#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType) +
  • + + +
  • +#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType) +
  • + + +
  • +#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN") +
  • + + +
  • +#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") +
  • + + + - + +
  • +#end +#end +#end +
  • +  搜索 +  重置 +
  • +
+
+
+
+ + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/vm/html/list.html.vm b/common-generator-starter/src/main/resources/vm/html/list.html.vm new file mode 100644 index 0000000..f2e9c5a --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/html/list.html.vm @@ -0,0 +1,154 @@ + + + + + + +
+
+
+
+
+
    +#foreach($column in $columns) +#if($column.query) +#set($dictType=$column.dictType) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($column.htmlType == "input") +
  • + + +
  • +#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType) +
  • + + +
  • +#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType) +
  • + + +
  • +#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN") +
  • + + +
  • +#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") +
  • + + + - + +
  • +#end +#end +#end +
  • +  搜索 +  重置 +
  • +
+
+
+
+ + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/vm/html/tree.html.vm b/common-generator-starter/src/main/resources/vm/html/tree.html.vm new file mode 100644 index 0000000..80364ad --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/html/tree.html.vm @@ -0,0 +1,51 @@ + + + + + + + + +#set($treeId = "${className}?." + $treeCode) +#set($treeName = "${className}?." + $treeName) + + +
+ + +
+ +
+ 展开 / + 折叠 +
+
+
+ + + + + \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/vm/java/controller.java.vm b/common-generator-starter/src/main/resources/vm/java/controller.java.vm new file mode 100644 index 0000000..e826fd4 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/java/controller.java.vm @@ -0,0 +1,202 @@ +package ${packageName}.controller; + +import java.util.List; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.enums.BusinessType; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.ruoyi.common.core.page.TableDataInfo; +#elseif($table.tree) +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.domain.Ztree; +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@Controller +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + private String prefix = "${moduleName}/${businessName}"; + + @Autowired + private I${ClassName}Service ${className}Service; + + @RequiresPermissions("${permissionPrefix}:view") + @GetMapping() + public String ${businessName}() + { + return prefix + "/${businessName}"; + } + +#if($table.crud || $table.sub) + /** + * 查询${functionName}列表 + */ + @RequiresPermissions("${permissionPrefix}:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(${ClassName} ${className}) + { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } +#elseif($table.tree) + /** + * 查询${functionName}树列表 + */ + @RequiresPermissions("${permissionPrefix}:list") + @PostMapping("/list") + @ResponseBody + public List<${ClassName}> list(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return list; + } +#end + + /** + * 导出${functionName}列表 + */ + @RequiresPermissions("${permissionPrefix}:export") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + return util.exportExcel(list, "${functionName}数据"); + } + +#if($table.crud || $table.sub) + /** + * 新增${functionName} + */ + @GetMapping("/add") + public String add() + { + return prefix + "/add"; + } +#elseif($table.tree) + /** + * 新增${functionName} + */ + @GetMapping(value = { "/add/{${pkColumn.javaField}}", "/add/" }) + public String add(@PathVariable(value = "${pkColumn.javaField}", required = false) Long ${pkColumn.javaField}, ModelMap mmap) + { + if (StringUtils.isNotNull(${pkColumn.javaField})) + { + mmap.put("${className}", ${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + return prefix + "/add"; + } +#end + + /** + * 新增保存${functionName} + */ + @RequiresPermissions("${permissionPrefix}:add") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(${ClassName} ${className}) + { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + /** + * 修改${functionName} + */ + @RequiresPermissions("${permissionPrefix}:edit") + @GetMapping("/edit/{${pkColumn.javaField}}") + public String edit(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}, ModelMap mmap) + { + ${ClassName} ${className} = ${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + mmap.put("${className}", ${className}); + return prefix + "/edit"; + } + + /** + * 修改保存${functionName} + */ + @RequiresPermissions("${permissionPrefix}:edit") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(${ClassName} ${className}) + { + return toAjax(${className}Service.update${ClassName}(${className})); + } + +#if($table.crud || $table.sub) + /** + * 删除${functionName} + */ + @RequiresPermissions("${permissionPrefix}:remove") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(ids)); + } +#elseif($table.tree) + /** + * 删除 + */ + @RequiresPermissions("${permissionPrefix}:remove") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @GetMapping("/remove/{${pkColumn.javaField}}") + @ResponseBody + public AjaxResult remove(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } +#end +#if($table.tree) + + /** + * 选择${functionName}树 + */ +#set($BusinessName=$businessName.substring(0,1).toUpperCase() + ${businessName.substring(1)}) + @GetMapping(value = { "/select${BusinessName}Tree/{${pkColumn.javaField}}", "/select${BusinessName}Tree/" }) + public String select${BusinessName}Tree(@PathVariable(value = "${pkColumn.javaField}", required = false) Long ${pkColumn.javaField}, ModelMap mmap) + { + if (StringUtils.isNotNull(${pkColumn.javaField})) + { + mmap.put("${className}", ${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + return prefix + "/tree"; + } + + /** + * 加载${functionName}树列表 + */ + @GetMapping("/treeData") + @ResponseBody + public List treeData() + { + List ztrees = ${className}Service.select${ClassName}Tree(); + return ztrees; + } +#end +} diff --git a/common-generator-starter/src/main/resources/vm/java/domain.java.vm b/common-generator-starter/src/main/resources/vm/java/domain.java.vm new file mode 100644 index 0000000..bd51c17 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/java/domain.java.vm @@ -0,0 +1,105 @@ +package ${packageName}.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +#if($table.crud || $table.sub) +import com.ruoyi.common.core.domain.BaseEntity; +#elseif($table.tree) +import com.ruoyi.common.core.domain.TreeEntity; +#end + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end +public class ${ClassName} extends ${Entity} +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#if($table.sub) + /** $table.subTable.functionName信息 */ + private List<${subClassName}> ${subclassName}List; + +#end +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + +#if($table.sub) + public List<${subClassName}> get${subClassName}List() + { + return ${subclassName}List; + } + + public void set${subClassName}List(List<${subClassName}> ${subclassName}List) + { + this.${subclassName}List = ${subclassName}List; + } + +#end + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end +#if($table.sub) + .append("${subclassName}List", get${subClassName}List()) +#end + .toString(); + } +} diff --git a/common-generator-starter/src/main/resources/vm/java/mapper.java.vm b/common-generator-starter/src/main/resources/vm/java/mapper.java.vm new file mode 100644 index 0000000..ebee538 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/java/mapper.java.vm @@ -0,0 +1,91 @@ +package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(String[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}s(String[] ${pkColumn.javaField}s); + + /** + * 批量新增${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}列表 + * @return 结果 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 通过${functionName}主键删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/common-generator-starter/src/main/resources/vm/java/service.java.vm b/common-generator-starter/src/main/resources/vm/java/service.java.vm new file mode 100644 index 0000000..765c9d6 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/java/service.java.vm @@ -0,0 +1,73 @@ +package ${packageName}.service; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.tree) +import com.ruoyi.common.core.domain.Ztree; +#end + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(String ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +#if($table.tree) + + /** + * 查询${functionName}树列表 + * + * @return 所有${functionName}信息 + */ + public List select${ClassName}Tree(); +#end +} diff --git a/common-generator-starter/src/main/resources/vm/java/serviceImpl.java.vm b/common-generator-starter/src/main/resources/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..242b1c7 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/java/serviceImpl.java.vm @@ -0,0 +1,213 @@ +package ${packageName}.service.impl; + +import java.util.List; +#if($table.tree) +import java.util.ArrayList; +import com.ruoyi.common.core.domain.Ztree; +#end +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.ruoyi.common.utils.DateUtils; +#break +#end +#end +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +#if($table.sub) +import java.util.ArrayList; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.ruoyi.common.core.text.Convert; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service +{ + @Autowired + private ${ClassName}Mapper ${className}Mapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) + { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int insert${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; +#else + return ${className}Mapper.insert${ClassName}(${className}); +#end + } + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int update${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); + insert${subClassName}(${className}); +#end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(String ${pkColumn.javaField}s) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(Convert.toStrArray(${pkColumn.javaField}s)); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(Convert.toStrArray(${pkColumn.javaField}s)); + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } +#if($table.tree) + + /** + * 查询${functionName}树列表 + * + * @return 所有${functionName}信息 + */ + @Override + public List select${ClassName}Tree() + { + List<${ClassName}> ${className}List = ${className}Mapper.select${ClassName}List(new ${ClassName}()); + List ztrees = new ArrayList(); + for (${ClassName} ${className} : ${className}List) + { + Ztree ztree = new Ztree(); +#if($treeCode.length() > 2 && $treeCode.substring(1,2).matches("[A-Z]")) +#set($TreeCode=$treeCode) +#else +#set($TreeCode=$treeCode.substring(0,1).toUpperCase() + ${treeCode.substring(1)}) +#end +#if($treeParentCode.length() > 2 && $treeParentCode.substring(1,2).matches("[A-Z]")) +#set($TreeParentCode=$treeParentCode) +#else +#set($TreeParentCode=$treeParentCode.substring(0,1).toUpperCase() + ${treeParentCode.substring(1)}) +#end +#if($treeName.length() > 2 && $treeName.substring(1,2).matches("[A-Z]")) +#set($TreeName=$treeName) +#else +#set($TreeName=$treeName.substring(0,1).toUpperCase() + ${treeName.substring(1)}) +#end + ztree.setId(${className}.get${TreeCode}()); + ztree.setpId(${className}.get${TreeParentCode}()); + ztree.setName(${className}.get${TreeName}()); + ztree.setTitle(${className}.get${TreeName}()); + ztrees.add(ztree); + } + return ztrees; + } +#end +#if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) + { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) + { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} : ${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) + { + ${className}Mapper.batch${subClassName}(list); + } + } + } +#end +} diff --git a/common-generator-starter/src/main/resources/vm/java/sub-domain.java.vm b/common-generator-starter/src/main/resources/vm/java/sub-domain.java.vm new file mode 100644 index 0000000..a3f53eb --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/java/sub-domain.java.vm @@ -0,0 +1,76 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/common-generator-starter/src/main/resources/vm/js/api.js.vm b/common-generator-starter/src/main/resources/vm/js/api.js.vm new file mode 100644 index 0000000..9295524 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/js/api.js.vm @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询${functionName}列表 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} diff --git a/common-generator-starter/src/main/resources/vm/sql/sql.vm b/common-generator-starter/src/main/resources/vm/sql/sql.vm new file mode 100644 index 0000000..d5121af --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/sql/sql.vm @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '/${moduleName}/${businessName}', 'C', '0', '${permissionPrefix}:view', '#', 'admin', sysdate(), '', null, '${functionName}菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}查询', @parentId, '1', '#', 'F', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}新增', @parentId, '2', '#', 'F', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}修改', @parentId, '3', '#', 'F', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}删除', @parentId, '4', '#', 'F', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}导出', @parentId, '5', '#', 'F', '0', '${permissionPrefix}:export', '#', 'admin', sysdate(), '', null, ''); diff --git a/common-generator-starter/src/main/resources/vm/vue/index-tree.vue.vm b/common-generator-starter/src/main/resources/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..bfb61b5 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/vue/index-tree.vue.vm @@ -0,0 +1,482 @@ + + + diff --git a/common-generator-starter/src/main/resources/vm/vue/index.vue.vm b/common-generator-starter/src/main/resources/vm/vue/index.vue.vm new file mode 100644 index 0000000..65620b4 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/vue/index.vue.vm @@ -0,0 +1,573 @@ + + + diff --git a/common-generator-starter/src/main/resources/vm/vue/v3/index-tree.vue.vm b/common-generator-starter/src/main/resources/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 0000000..5342e91 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,464 @@ + + + diff --git a/common-generator-starter/src/main/resources/vm/vue/v3/index.vue.vm b/common-generator-starter/src/main/resources/vm/vue/v3/index.vue.vm new file mode 100644 index 0000000..08bb071 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/vue/v3/index.vue.vm @@ -0,0 +1,564 @@ + + + diff --git a/common-generator-starter/src/main/resources/vm/vue/v3/readme.txt b/common-generator-starter/src/main/resources/vm/vue/v3/readme.txt new file mode 100644 index 0000000..10362d6 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/vue/v3/readme.txt @@ -0,0 +1 @@ +ʹõRuoYi-Cloud-Vue3ǰˣôҪһ´Ŀ¼ģindex.vue.vmindex-tree.vue.vmļϼvueĿ¼ \ No newline at end of file diff --git a/common-generator-starter/src/main/resources/vm/xml/mapper.xml.vm b/common-generator-starter/src/main/resources/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..9de59b5 --- /dev/null +++ b/common-generator-starter/src/main/resources/vm/xml/mapper.xml.vm @@ -0,0 +1,147 @@ + + + + + +#foreach ($column in $columns) + +#end +#if($table.tree) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + + + + + + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) + + +#end + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/META-INF/spring.factories b/common-generator-starter/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..7fab0be --- /dev/null +++ b/common-generator-starter/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.generator.GeneratorAutoConfiguration \ No newline at end of file diff --git a/common-generator-starter/target/classes/com/mosty/common/generator/GeneratorAutoConfiguration.class b/common-generator-starter/target/classes/com/mosty/common/generator/GeneratorAutoConfiguration.class new file mode 100644 index 0000000000000000000000000000000000000000..9aeedbdc75e9d35c5d5f6adb84a89a6c224564ef GIT binary patch literal 555 zcmbVJyH3L}6g{RdD5Wh01}4-EI>ZZ)0fbalf+c`NQ5PmBxWT2dE5|AHvzU+=_y9f% zaT7{~kXW##`|`Qh=h*KbuWtbMu~kI@tqL|O*kmZ5D6QNnLt%Gsz)X$;2uh4Xudf zqp=S}M?3lCxL82>Zw{TjF`fl9DVY!WiN6q&iM0JtWQ0poF;0nVn{;})V(&|_w@~cG zc|#3Flo$^F^)w94Ofeq|9r3GRBtwTbmgwWM#c0!TvSrG6o&%-M3)nLimQW#ErZP~+ fGTB-lm#~6re!iO98rI0S2wx}PAWZWXEW!FG-%Ok( literal 0 HcmV?d00001 diff --git a/common-generator-starter/target/classes/com/mosty/common/generator/config/BaseEntity.class b/common-generator-starter/target/classes/com/mosty/common/generator/config/BaseEntity.class new file mode 100644 index 0000000000000000000000000000000000000000..f0f092dbe1ce5cd5fa04817748cab4868ad11963 GIT binary patch literal 2444 zcma)-eNP)l5Qk@N@EgVshCq|PC287%6S%&mp+IN?hC0Mf5C+srt<=T7m;>LPb+@kS zeyUbV6seW^Z>4^ys=v8A+vm$!!qV-|?#|9UJF~O?_rE{?CZezCFh_Z+WNC)>xY_6C zJ8r7nJmuzqn`ddNxn+?y6us$Ixmq}GvETWcuCu-cn~GEGO9O5f=V%K754Vd`+@EBBPq z(JD}Y>W!nGrLcHvxW-vWe_~m-k_sTMpw(K_Hno@1Rl4)5+0ia!^U}2~O%9c`1B~}= z$CL`T(p{;bY6+U} zmtEM-HjK6&OEga((cL`F(?XuE zbF)ZGd3ukf_gVUYr4Q+rpgFIiy=+vadk$hj_qh_Udh1Z=qesEN|AH30DZ|zp-g9I8 z#&?@;<59{JUK`5LO)5|k@-@6O37W$PSWgD8*8>^r??9eGe*@o5m)?aUj^QcbB=HJ3 zou_~ULgBV2-|@U5Dwz2gGa7n#Bcuf>8SqacrC zL9}>~WE7+Vki7{YoFWGKj6O#jjmT6Kq#6tI1$`N89*f9S6r=`_`UDXFjtKlI#-(OD z3UU|=@*qAU(@~IPfSgPK;XBC@`8qZtsVKIM%7(4vh UPvMQc1Ka)+@&wWj))KV)KQ6nn#Q*>R literal 0 HcmV?d00001 diff --git a/common-generator-starter/target/classes/com/mosty/common/generator/config/GenConfig.class b/common-generator-starter/target/classes/com/mosty/common/generator/config/GenConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..26446769e5d1e9e443f0bb351dd025834e1333e2 GIT binary patch literal 1309 zcmb7CT~8B16ur|=x0DtUP{c1prKQ4{Xrc*z5u&^_NWk#G+qMqNKzC*{J4N_UKBzpH z_}~xlM;Xs-3zW4y_%e6yoiq2$Id^{l`T2{8o)Irmk!l_lsP2{pw=~@HxJZjdT4Gf2 zyLL|-M&r$W|Ip_hUj=;28mWS1MkA5mKJWvv?uUZWD6o1{g!)iy802gR2ml<$z#;`j~T+i^RM@z zwJ+M1X7NXh_`*5zTz~95N0CIZBoRbOgl|+ObV0@u8Df6n2eEJ1Waui^LQ)*1aqP=I z09~UAWFAe@6e{lWt>grx-zoDIIUBe;hwM7t=p$btW`M{yPAGFuQ%Z{Scy%qIn(Bf2 zRDdU1@MURw7-=?5+5pYXp`_U~DF^A3OGuq@j&vqbm{OYil2ZB<*xPgmt3#eCojIXg zn)EqHUtB`!rsPQP4pW*>D_sWm-cY6aH0c|VzP*IheF-<2S-d<$_h}BXiroXmhd6l@ G)BInP{PC6m literal 0 HcmV?d00001 diff --git a/common-generator-starter/target/classes/com/mosty/common/generator/config/GenConstants.class b/common-generator-starter/target/classes/com/mosty/common/generator/config/GenConstants.class new file mode 100644 index 0000000000000000000000000000000000000000..94a4a4a119d0099f59e02daf9b1797df6f32102f GIT binary patch literal 2700 zcmb7_*`L!?6vt0yI_;TKhN0ks-~uWFDg%g!f@qg8MACL>(~*K&Gi|05Xwxxmk#XO5 z#eLs*aYa-V1=lB^{Db`X@pqE;GXeF%m)!e3`#tw0`Teh>$BAe?{T8KlbW4P8Wx9>& zcBVU+?i{4GbQjazO!qL|%XFUz?q_;{=|QH4m>w3vBTSDnJ;wAn(-TYwn4V;Mis@;l zXPBN9ljoS8XL^C@MW&ZT@G{dYOs~rJHKx~PeS_&urni{hW_m{i?=ro|^gh!EOdpEi zqX-?0(8mg~F{YPO`C?k3xW32SXO7fOr#4b(yS7u?q|n?{(`mI$r#)`gI~LO?T^A#- zs!X3M6p;XhVv^}Ig$6}jPUX_jeXh{3hhvGnnl-x8FM3AVLCs+7IcP4=^u3haZLXFbW%@y(m?zM(hB~UktQ_o4NWcnHB^7>WQwe8?vFhqHEM^VcIepM*E*>>#q z7KQp(tQ=P;lxkKjgw<`w%61wPmTQ<3bx7iRvtriAP1hFg3PbHFyQRJpXvHLc4oKT-MSd5v=#ZrE40;cBzv^*U0uDmH?}NRt$Ob`>Eju7wK96Em2C?%uDAt5&@{SvPAj zx<g7|z;>oPa)~ko2w|d8EvxRO9dOO6-Gr_( zWmWc0H232Ma6L7vIE{-#wCE&ew+CU270wNR|Fe!O*LqhT(lKVxq`Ma#P1?1zf7dux z+MBSDyr&8&YiTKd9qaIuTSklM68!2Ex)jt$8^D(Zcq91o0AByVL^D+9a*d{uz2 z1}6fX1g8R=2ID0{?nUx;cq?Y#TQQ*Cipld;(=zAnJmgKr3M8GK`aP4Gm3E8uE?E%0Q3Yv8E>+u%I` z-V3e=xB+$o+{9ff@^!=0MR!K9Dp&_r9UGwcbO+Stc@1M1K|5Yx>)XJwi~ zkdU%5a*X;){qg=nDHIPCN(1qMLMa>%7YtX@$~oIDR^wk@zA!IerG7gYm`iUeXPGrZ}G^&S#7B zIZ!Pf4*P-sp+n$h68KzLoj3en5oWC<{rRw6&VIlPB-si{wo;Ox8qQ6-5 zt3^Ko)f(xy;`Mtu4Pw8Z7UQMbKwB`PDLQ~J@j-mZ{vd)56=T_@>cA4ocJcd}zB zZD~t^E>=n>qtF4JOeY}_pu2SMJ!l!-rF)P6_wFQ}EIEmr(qDdldiUHa9iSYC{#YiS?t=iY%RJwOL}!h_sAR6~d8VeUP`&7<6W zl$(!n^Kst%6WseGH=kk{pXT0YYUwfhY=k}+q0e*o3laKan7$OH4uD%<3Fnu>n-xE|nre}t=cuL=?TN6e?7qn_1VW!ozX**LYdTBGG zVvcTUj%lg3J4@}~Qo5{LP|Hv*;}~gu)UXZ6>&awHM{^7_V+&e6U|M6Uowbb2*ltTp z>yxH+ks8;vjIHk05|BKlYJ~-APtGwX4NFf#?EE~yjboNkN{5ilVTgdy<<-AVGZ$|nYb*ZK~((_w$__Koa_U#KS>xo+avXz=!twt4j1vO;Us zOC2pG3A{{DTWQo9)Hpghx>XXs&N^xv7}T8ce6+w`kt9rs$wgO9#ywkzCS)k{#(9cs z85O*AcH0z`K2`?H;{5EpF>x`Z0}jC@{M8%jtZ6yYZ+2=Eu=pN7EYAeyYT+@T&3GaN zMWsb=hkjtyO}i>hsgYA$Vn>e^hu@TYO*4gTB`x=q^3W!U(~6xF9SK_`|YaLkMJjJj>o**Rs8AnCI$>q*0LRh)e`lxlO zmv}sw^BuV|RS41s{0~KnKah{Qqq6*{ysi?(L;A%z-FAA-t5Il>9CS$D(wKigHIBV$>hCYcN z2R%$<6E4Y1ek|qb!yDmX6y3BZp=V`z8K&VQzSxHFxZZ+J@bw77!Ot7aiiSfR;pk~$UmQGOOnv)pck{2^i zEq(4f>SOHcWdfo*&776cHya#EV^VCsv_6e(XSUnLVSKb`pdmiv+$7jeNj1N8z%W&N zQX3mXsb9Rq*lJJKfSraMZOm3^9j#aB2i%-ZtHbm|g?>bjEA(UfNtm8c=t+7?p{MDm z3jK_Ju246v4bv|a`X&7eE?;zzt(rY9y(VO!lnm3a75WW5gH0@R5}W*%9v9Sc^jTe@ z-_h^G^aq9hNPkl3&-9lt{Z*mA(ccyN2mMo_fAQ;oD}sbjL_h=;5#pvwR4XDZB8sRH zQHA!>+Z9nO6oqc&=1DP+U(|&~y&@V2cdRBR4B4@(&%hPMHrQ(gEz=xFON^)SqI=nH zXg31`T-Rph%qiovON?xrA{s?ZP+flYfSwt1#sw`bW(e0$dUHl9sat|b5ly0*oB4`Z zAQmcO5lc7~i7#a&+&FJ09Np=%9ZT2J-OCc=nq}+Gx{=|{U8@z*f&+-fVo6vmRm5@P zctK~D(Fud`E>4NUt*-QrCul|4Dt~F!i(6aKhQN6T(oI!02W`8&o zvt7yIEH=V%!hy>Sb7XSMqV;pk-9_u;^{{9KH<>;}6e&{>x z&^zVbJ5DYsw(?TSRa@s)*m>W}hjD*hi^B{LjUW{_`H0Qeyzn!xIMp|y?#4A?Zhp(0 z=Ca8AdJ#fXQkG}=0k(E1q`BloZh?x`wO(1{)&i}5?z|$ls500M2Znq>;VxO=Uy>(^ zYmj*bBX=jxuQU+|RJcr0&FJx`NPiqHbLWL6NAd4@3WGgz4TjGrmJVa%=&L(hbxo#~ zN`~W8S$-ctu12QOGw?jG$Wf)f^ApO}c!>+#Ep6}j;)8ER@pVMnF+QfSy2>X)K#i76 z=JD16yO%WGD<(ejIy-U>92-!O_XM5nNhwm|RiplC5PKY7Ftsf5w2s?9Yrs}zq8f3G z6pW{8(lQ+Q>5}$cz3%bwwnWDAQEJ79?6dHZJ%E2Ge+YpOPu2KcBS%s0%owY~GfF13 z8!$t~FOoY|b?hT?w_I`#S{6XmMm=a1cLMd&Mm*u;7Hy)ST%5(GL5wZxn5IC-eH2`A zfI%(SDF(&`%R<&(qoV&aP={?u1h23%X*O7Ic=VWdX<_5F7!yO`vrVXgm=_GU5(b zW{mh#V{cutpB759gIz5O zNV^LHc1wWnp~WSjV{$H@W3wt+N(NnsjT)$tE-C@+jiRa!fs7VQm=aholLsMAG23w13HC=+vrT7!{GP=w|#*u-MHF|iC zE5{R+6D|Xum;10Z7O*s8{1p)DVtJ*+ay-_QV!51NRUqiqGo9!)Fx4szuAtY`8$9OXz{!RgW2CUj6WAtKbnT;M#mMhQ>g$2^23Xc!pB2Umcw_WN zdJ`l=5?up(3}AMcuBGcBzlf6)Q8}sC`(pMD5^o(Vvw-*-boavgT`Qca>(<$HeG_zj z^DMe%hO)2N3zF9&|4}Zc`Fp^M#)M1a(ul0eXkj;yb;F5Tu)+c{fDfOt;|Ot$2Qy IEI7>n0RJZLjsO4v literal 0 HcmV?d00001 diff --git a/common-generator-starter/target/classes/com/mosty/common/generator/domain/GenTable.class b/common-generator-starter/target/classes/com/mosty/common/generator/domain/GenTable.class new file mode 100644 index 0000000000000000000000000000000000000000..30335d2c29d8309122207704b58769f4af5074cf GIT binary patch literal 7777 zcmbW5Yjhn|6@d5Tbsw1|&7*Bg+C{u37$*9LU^9UVG>73yg=eb5c$vhHNt`AzLE;q>lO$dx@slKqGchlnNngZCtuVX3C3WH+d$r5XDAo>dY^w@OgeY3P=% z==KIBn^((mob)G25VMt`tlBe-EqgaBTa;8*(KD%DL(jBHkYF$Sl$ND&P>}wReiRDzw zQZm@d%!`MPOzqxz;qdWu6FVML?DIShiEK)r?_|OHetc zq(^Z8Zp#Z#960~T?x`KyE}lL%b@rj)P?9-gIPVe6bxhA6IW+a`)7VeYR36G(nvQc5 z@Oy4z@6`4~VdG7CJxx;|FrM0e0H-lzT0#MM1_X5Yp8w*~u;WmKJ}8dnIP z`W1Ubg80~Ir;*L)bO{#srj1-GXIS<)u52!6=qWT)O~p3M)Uc7mbxy5D4>aLU8(izS zH|G*uGmZANOVX@g+*$5U&D&Zw)vH-H?bHD+qbqjaMA%i%PA$A%K8=1{&K2mgF}!~< zc(h?cF~;0Y9=A;u2RDq}R?}m@V&V>T6zrX|8uA#^uTk|pg<5s7>b$R5uIZY+LW0t! z<_!{*ISy)iarOK1xgphLlSn~mq%pV^3~`)PS6OC{XgDj$jA}Ct^-$N;?2A`7oRgN% zqP~eYpq^#ViNnmJr&Gfr+jmTMz=d2KzHD1G_25klcQAsvIO|8$y3)Nbm zm8T>4&SC@;rLS5|H2$cqCYXQ%E&BbDOcnt}6ADw=fg<~o)4!+ zf#J0Gav*K`poaP>YMge|53eiNEL?S#D>vdPeW?Jpmvgo_YJMR{eFB$HDjWR5P zlnmFxbuwH};xi;}B+*9VCK4-1+)Sc_#3~ZqByJ(mL*iEWtPH)dMut9EE5iWk21%?Z zv4OCVh*VHK+4@ak#f?Q22EoQ;!(i?dMc@uq-7tUxG*9+vo5H-H;8jAmTv z%E5JAU3Yi&4fYJ)Awj)=$c2-!vZH;VXmhn;W>N}X4o7I(>4s#n`}LAkyJ;%p9+omZ z+@8%!(AMPlxpru?nzq{ns%C)>ft=B`>*GBc-7wWooFWO9Mh?~QBrpff8(}_vX*A&n zLL+`>G(!vEX2MztT!a6(o!K+)Xsj*9=SqCP1pk*>unazpiYk!mp{OdMjUTqXA#8gC zT48)J{}>{y#3%{3T^??`9IY^zSR0I|aGRCkHY?Ez!!B&w9=2^qD~!&tZD-iF6Rj|a z!?s;v+b*=iSP$E-4%@CqD@+M&jF=TziHU)gm>XD$=>bZipFQ8k)~5p3W*ydPY2s{Y zs8&Kbgq4^^Sc#d0m6%LeiTQ+;m{PF39=%{bLwP6GQdmk@mbaV+=>#*o3ng_0Pz#?& zDLV%61qLR;-S9=!1RI}%lH*+CVPRthhTO(0ki3MtYH58LN{U@4nO1{x*vvf4a;)6$ z35|9xQKw;808+|>=t2+`Hi@t^B@O>AY)>XI1ln1f;=AqLOGQ{?h%3{c#s!` zAf^~3!Gjz_kmC^`l++2t5`rXokW)esTMUxqL0&` zd=vpf2PuJkMF>*OgZxDZ@>MZNH4pMv1o>M82%XXda<34ih6gz>1i4QPQp1D%9YOvP z0YcXV0{I%;kCH!qXYe5Z6oPym9&j56PTv_k$iEQe-w_~mPa%*8;UNJ?Ef4Y^A;>oP zh6tpV2l*eA<3)sSA>nHPU6csqVLXjWLNijwfk>qSkbZV&`6fEq4&QQ}^kZ4Lm(&qZ zDbSUO-Akl60wp4V=*A|&4zzWyOcnTvcN=P)UUuTsw}rc?o=2?`ph~byyo>6&Ig{!T zu|5Kku8K5gyM-VPJjiSz$fIJA1|H-J1eq5BLU&aHc}xg0lLwhE1bJKxGLr{cfFKJa zKMozFA{G8fB&53XQdEl1 zm5}OS!Rt+Kc1_R>v z9l_!r3BFD}-=LmD)N`1uZ<6&bvW}2-l&m5Z$EZ0%*1cpMC+j{cPEc`@ic|F9+ai2N zg8L=-t_0tc;QJChAi;wY{6K;qO7IXZd78%kNP-_r@G!N1BEnB2FcbDu<7W~)5`mw? zFR1t>6^}~rD|-BEDt;ruV-h@0=5ML^9TiWA@Ou&dAV965<~1eVujUOctM|p12_UQ# zpt>Wg8>XV0{Ytu^22nQpCkP-Vv*|)ckEd{I*Cu7F5=$%kP^>Gf4=ofxG?l@$N)IFU zxNaq*3J_&RCd|BMjjgsvbYwFbRX5!ky~8=2A(3m_43oKBQ`6|Rv8SM$T1M^H3=J1r zs_R)(F%h^Sz;tVo?Xj&&T1#1-u_TemE1GT^vF@zdj!-uf%8Y6l$`CFyZYBCYdwAc| z*B&@Cvgg@dC(n!=f9BwE0j88LL`X^&3uwlg%>qE6M!|AOQwVP#F?NZK5U!##N9Zh{qkC2>zN(6Ve5%wTm5z%+x@mpTNxh> z>xebMiE&cKGHuyN8Kz0AUhW1yAu4Sxb58<|^jf4}!a5q`*w7d~8x$KPtUaWmBq~P7 zpro3SDCE?<9m)dKXhxqwM`X04Hm@ovOom(WB&+$(?KwQzm>BaWMpkKJTRpf*O`3Ej zRXt@r4Pq)P;NcT7K`8mnc+@J4K>;Q($H0!y_QHk@c$}@A{3ND!5uU=Mk;oSENp-nK z=eMr(0M6QkaU{cg;Jq?*z%m&+saOsxWVoD)I29|Yco(b?;g2%>3C_r{mU`C04$Seh zWjG5@%g{qzJ+MQD1X&5Pddcb~tBYRY;E`3rrjU1MZ?iKC66x%`*cfogR+H` z&8O5nW;slv3NB$_x-w*V2A-AS69lF5#S=GKh-uXkuZyQdJ>5?+8qu5s$O0 zl(4}lcDc|ipk$=$Fr?&im|ie|co@#1=_D54a3@o-Q0xWV;i0su51AXSYeifDIi;pm zQzg7hk^dwfICrjOW^HdU6)&xe@Y+}h6JasD69ia-tqNF*f0(r_8xxmRWA3tQOkY-w z8O*9NiCHz~F`U(fb`|E)dZVWG@$p$p<3&f!vNj_LTub$%B9t zxIiR7kUO|Qwz`w&Sk3^X<|81DK-fS3PG-L39{+88A`w54gGl7AGDIk|5s~dK7B<); zejxWSK!PriwJ?k>C=boWWI<^n+>A^jMX0(P8*KhK%s2=$4t6*WdT=x)vbvTBp*AYF zj6n5X5CaDwP)V*TnN)O?p;YH)v^pzU3-Ep%9fXRpONiYExa?~D?Cxd2dF-y{%Ut7^ z`6RA)ioq0eF@@+-j4%YOxk}X(VT@m?`x!8vQh2dOHzf6WDD?n?idD)+Rie~RKG|A7 z*@uwqX~r!}mfns;_8PA0wSLtfW{7&KC-_R$7GbPksYe(Go>KVXasEm@%1~mJvMH4) zbuC}1s9&kaP^rfmx2#fhe;}o<<0=*PEA<3J)KjXLuT-=Mb$+FuVjOr%;fLAzD|MEk z#42S|DpBf#e5LCBNN!fi#5nMj>U%Rv zz06Qzm9i<7D0MwwsRqANucA_~F>YC<=nhIs-N03Q}_$6 zcQy5t>VFeT2|RZMQgllvr9Q+}YP?S=p_(D;DYcHT z)c7Jy@GCWzao{P1zkVQw^ULT$14D^b%BEDJ)J=S)8vRN&qEZtXx2#h19Yad(<|@_b zS857F)Klui+{qLDlc#bge}vCsqMyaZ$YNR<7W5THEI!KjHOcR*34Jw}@kL*9VZP73O z*K!fGMB$tr5y^x3W-VML=B<+BSi5U-*jI$ROn950EQ&s3ny;v@yk()Qb9Cal@=O z)YFm)MY~+hF=}7qnB$DC{*@w-fg~ob5DU=cJN-JVGjc9ho7& z69G!2vAD=R8;`j;O9V#X@&`r8v@oZL3{9Xq6X@e$gi0KF&FJ-alU709@jvh@&Eo3F-kCe5CHUd}2ev4JS|p-L^6ETs5{`7&lJRmr2KgZ(>CT(ge-;wq@MCNba{dL%c%4;FCBJDMV_Ev(Kdo3y5pAM`@ z=}5c?z2QaJGe}R+T-=|SSAt%99jlotR~#8|Kiy0Mnr)E=1eI`NF~t*l2^yB(_IY5& zf!=}Ug0?XWI=gIop+Dlcj?i1&NQ&IE$%OmoGu8+$en8|#57TcF=Mhxrd_NAy`s)=4 z2y*&Y0;N2`2J+h9)Lsq+?H8B)EtJyxvcBKOPU`P!zk)qL+bU|2t)mgy=9k^afv!z( I7_6UZN9>x$d2`pjRn#a~W8Nmu1 zyLuYOvp81cSYw!|3H6?rU9qp-&{MB@y)Jx)twKe6j;90DaA@Ue35+r(i0^aNW$G!N*ivZR)K}pe$5H$zErgXpL^n1`=6Y$;3{wqc!j_l4nHe! zc0;3&r7x-kJGdj2G&zR8bf(16zptx;VYDEXcoTYM;YTbO#tXW_-4geuWz`J!n~##V z&-G#z2>(b{L+T&7naLVTB1QSvb;|?ke8|kaV zW%3NEb{#RSULA)H71pcVi1z-Hq^i{R&hTC%U!|E&wl=6}tg^E9Kz-7F9dGGw^CQDZ zQHOp-yp%3Ac(#4BmU*w(F*2mPYBn&!7uq!H!fBRdlNiNV5(y;ZSWjXKHH1)#IIMH@HV^I&V2fX!jP n3AWdyn~LcEz~Bku=kanac&RhSDLlYK!iixaBJ=2MCX2vdL7cP; literal 0 HcmV?d00001 diff --git a/common-generator-starter/target/classes/com/mosty/common/generator/service/GenTableServiceImpl.class b/common-generator-starter/target/classes/com/mosty/common/generator/service/GenTableServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..3aa6d661121e097200356567aefbcf3213657e85 GIT binary patch literal 15933 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 wHPIPXhubm=1{`p}Vr?wQOt$ZUmDyQwt W`kaT@;sU$#`3|tdHNx(yWA7cfgc5Pe%pL)$d;D{Uzsr9h?h!XDt(s-mG#RSIx0;?mQ`UWKjJyOHgr%3tHa z58y{3#_QTiod__T#&33JcHYeM{`mRrJAl_XsNs1HFBsNisimKsOY>QDwd|-kVK`}Z zd>iu6#>t4&S7;6INh2eX*oX%<6w2^C<>;_;C5D0z5~X>Xf5fopsh$zZAd(FFzlt4K z>Ewj2Udsrbbtm}jO!?ZQk0O*Y!$IpZYhMe~<6aUe)0@S}`Oh99v z;SS~r-z7AM1;VuwzK6x)e2LDNQ7`Zc;RfylWLL4~>^e4_-9)p9+oJPr>=gI`;axm* YagXrW*(W!47kdsrP3uv{zU%DSFKbVdkN^Mx literal 0 HcmV?d00001 diff --git a/common-generator-starter/target/classes/com/mosty/common/generator/util/CharsetKit.class b/common-generator-starter/target/classes/com/mosty/common/generator/util/CharsetKit.class new file mode 100644 index 0000000000000000000000000000000000000000..098febfab85d9bc13fa8522307e1750a2a2630e9 GIT binary patch literal 1842 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 literal 0 HcmV?d00001 diff --git a/common-generator-starter/target/classes/com/mosty/common/generator/util/StringUtils.class b/common-generator-starter/target/classes/com/mosty/common/generator/util/StringUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..86096e05eb200efb53db2275fa5d69cbe60573c6 GIT binary patch literal 7016 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 CY|WNE_|iyXtd{^{crw%N&@OIwHnUR{e~N#= zXI{ieqVN7F^~|=E229*!XU}EM_nq7R`u+U}fHgeIU5{AphQYEQikHnsMW|g~3CNN! zOOFS8T=_u`q2}S_GL&{S;R2j@+E+;m5hYazKF@0+tJ*6|AI$J zTGR-tlOeMso5~YgzDa-LoTe)S$53T4j6B0=LVF3CVM>WOL2&}ft3o*kgywhwkE!gE zR5gc3+^Y-cs9m6=nxXa^!nqt+GBFX?_3budIRVV#0Uk2U5|rD5a?hbik2;NGnCu`{ z#Q|>y`ke?pS@pvjL*YvQD?Ao7i!jza)NZLQP}03`cDGhGvRK6$!^l6HO+{Z=w_DY8 zCSkg@&airg@Bi~=7`niHRXG%%W*CTtZjbVqVWZGB{T;2Sw#}=S#V%6|hgKkMR*9O_ zMz}P{O|#k)-RQe@B|n%=CKu)~NPm!dQeb8u=o}%4!Un;Me< literal 0 HcmV?d00001 diff --git a/common-generator-starter/target/classes/com/mosty/common/generator/util/VelocityUtils.class b/common-generator-starter/target/classes/com/mosty/common/generator/util/VelocityUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..7186eaeabd1b4eeae58af98ed068cbbcb58f78f4 GIT binary patch literal 10529 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + insert into gen_table_column ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/mapper/GenTableMapper.xml_bak b/common-generator-starter/target/classes/mapper/GenTableMapper.xml_bak new file mode 100644 index 0000000..b53664d --- /dev/null +++ b/common-generator-starter/target/classes/mapper/GenTableMapper.xml_bak @@ -0,0 +1,193 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + ${sql} + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/mapper/generator/GenTableColumnMapper.xml b/common-generator-starter/target/classes/mapper/generator/GenTableColumnMapper.xml new file mode 100644 index 0000000..7b2c6cc --- /dev/null +++ b/common-generator-starter/target/classes/mapper/generator/GenTableColumnMapper.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select column_id, table_id, column_name, column_comment, column_type, java_type, java_field, is_pk, is_increment, is_required, is_insert, is_edit, is_list, is_query, query_type, html_type, dict_type, sort, create_by, create_time, update_by, update_time from gen_table_column + + + + + + + + insert into gen_table_column ( + table_id, + column_name, + column_comment, + column_type, + java_type, + java_field, + is_pk, + is_increment, + is_required, + is_insert, + is_edit, + is_list, + is_query, + query_type, + html_type, + dict_type, + sort, + create_by, + create_time + )values( + #{tableId}, + #{columnName}, + #{columnComment}, + #{columnType}, + #{javaType}, + #{javaField}, + #{isPk}, + #{isIncrement}, + #{isRequired}, + #{isInsert}, + #{isEdit}, + #{isList}, + #{isQuery}, + #{queryType}, + #{htmlType}, + #{dictType}, + #{sort}, + #{createBy}, + sysdate() + ) + + + + update gen_table_column + + column_comment = #{columnComment}, + java_type = #{javaType}, + java_field = #{javaField}, + is_insert = #{isInsert}, + is_edit = #{isEdit}, + is_list = #{isList}, + is_query = #{isQuery}, + is_required = #{isRequired}, + query_type = #{queryType}, + html_type = #{htmlType}, + dict_type = #{dictType}, + sort = #{sort}, + update_by = #{updateBy}, + update_time = sysdate() + + where column_id = #{columnId} + + + + delete from gen_table_column where table_id in + + #{tableId} + + + + + delete from gen_table_column where column_id in + + #{item.columnId} + + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/mapper/generator/GenTableMapper.xml b/common-generator-starter/target/classes/mapper/generator/GenTableMapper.xml new file mode 100644 index 0000000..167a8c3 --- /dev/null +++ b/common-generator-starter/target/classes/mapper/generator/GenTableMapper.xml @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select table_id, table_name, table_comment, sub_table_name, sub_table_fk_name, class_name, tpl_category, package_name, module_name, business_name, function_name, function_author, gen_type, gen_path, options, create_by, create_time, update_by, update_time, remark from gen_table + + + + + + + + + + + + + + + + + + insert into gen_table ( + table_name, + table_comment, + class_name, + tpl_category, + package_name, + module_name, + business_name, + function_name, + function_author, + gen_type, + gen_path, + remark, + create_by, + create_time + )values( + #{tableName}, + #{tableComment}, + #{className}, + #{tplCategory}, + #{packageName}, + #{moduleName}, + #{businessName}, + #{functionName}, + #{functionAuthor}, + #{genType}, + #{genPath}, + #{remark}, + #{createBy}, + sysdate() + ) + + + + update gen_table + + table_name = #{tableName}, + table_comment = #{tableComment}, + sub_table_name = #{subTableName}, + sub_table_fk_name = #{subTableFkName}, + class_name = #{className}, + function_author = #{functionAuthor}, + gen_type = #{genType}, + gen_path = #{genPath}, + tpl_category = #{tplCategory}, + package_name = #{packageName}, + module_name = #{moduleName}, + business_name = #{businessName}, + function_name = #{functionName}, + options = #{options}, + update_by = #{updateBy}, + remark = #{remark}, + update_time = sysdate() + + where table_id = #{tableId} + + + + delete from gen_table where table_id in + + #{tableId} + + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/templates/tool/gen/createTable.html b/common-generator-starter/target/classes/templates/tool/gen/createTable.html new file mode 100644 index 0000000..c9b9dcf --- /dev/null +++ b/common-generator-starter/target/classes/templates/tool/gen/createTable.html @@ -0,0 +1,30 @@ + + + + + + +
+ +
+ +
+
+ + + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/templates/tool/gen/edit.html b/common-generator-starter/target/classes/templates/tool/gen/edit.html new file mode 100644 index 0000000..56ededc --- /dev/null +++ b/common-generator-starter/target/classes/templates/tool/gen/edit.html @@ -0,0 +1,607 @@ + + + + + + + + +
+
+
+
+
+ +
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + diff --git a/common-generator-starter/target/classes/templates/tool/gen/gen.html b/common-generator-starter/target/classes/templates/tool/gen/gen.html new file mode 100644 index 0000000..a0150f1 --- /dev/null +++ b/common-generator-starter/target/classes/templates/tool/gen/gen.html @@ -0,0 +1,218 @@ + + + + + + +
+
+
+
+
+
    +
  • + 表名称: +
  • +
  • + 表描述: +
  • +
  • + + + - + +
  • +
  • +  搜索 +  重置 +
  • +
+
+
+
+ + + +
+
+
+
+
+ + + + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/templates/tool/gen/importTable.html b/common-generator-starter/target/classes/templates/tool/gen/importTable.html new file mode 100644 index 0000000..91562e7 --- /dev/null +++ b/common-generator-starter/target/classes/templates/tool/gen/importTable.html @@ -0,0 +1,95 @@ + + + + + + +
+
+
+
+
+ +
+
+
+ +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/vm/html/add.html.vm b/common-generator-starter/target/classes/vm/html/add.html.vm new file mode 100644 index 0000000..b7f1781 --- /dev/null +++ b/common-generator-starter/target/classes/vm/html/add.html.vm @@ -0,0 +1,381 @@ + + + + +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "datetime") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "upload") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "summernote") + +#break +#end +#end + + +
+
+#if($table.sub) +

${functionName}信息

+#end +#foreach($column in $columns) +#set($field=$column.javaField) +#if($column.insert && !$column.pk) +#if(($column.usableColumn) || (!$column.superColumn)) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#set($dictType=$column.dictType) +#if("" != $treeParentCode && $column.javaField == $treeParentCode) +
+ +
+
+#set($BusinessName=$businessName.substring(0,1).toUpperCase() + ${businessName.substring(1)}) +#set($treeId = "${className}?.${treeCode}") + + + +
+
+
+#elseif($column.htmlType == "input") +
+ +
+ +
+
+#elseif($column.htmlType == "upload") +
+ +
+ +
+ +
+
+
+#elseif($column.htmlType == "summernote") +
+ +
+ +
+
+
+#elseif($column.htmlType == "select" && "" != $dictType) +
+ +
+ +
+
+#elseif($column.htmlType == "select" && $dictType) +
+ +
+ + 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "checkbox" && "" != $dictType) +
+ +
+ +
+
+#elseif($column.htmlType == "checkbox" && $dictType) +
+ +
+ + 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "radio" && "" != $dictType) +
+ +
+
+ + +
+
+
+#elseif($column.htmlType == "radio" && $dictType) +
+ +
+
+ + +
+ 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "datetime") +
+ +
+
+ + +
+
+
+#elseif($column.htmlType == "textarea") +
+ +
+ +
+
+#end +#end +#end +#end +#if($table.sub) +

${subTable.functionName}信息

+
+
+ + +
+
+
+
+
+#end +
+
+ +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "datetime") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "upload") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "summernote") + +#break +#end +#end + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/vm/html/edit.html.vm b/common-generator-starter/target/classes/vm/html/edit.html.vm new file mode 100644 index 0000000..53e0451 --- /dev/null +++ b/common-generator-starter/target/classes/vm/html/edit.html.vm @@ -0,0 +1,392 @@ + + + + +#foreach($column in $columns) +#if($column.edit && !$column.superColumn && !$column.pk && $column.htmlType == "datetime") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "upload") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "summernote") + +#break +#end +#end + + +
+
+#if($table.sub) +

${functionName}信息

+#end + +#foreach($column in $columns) +#if($column.edit && !$column.pk) +#if(($column.usableColumn) || (!$column.superColumn)) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#set($field=$column.javaField) +#set($dictType=$column.dictType) +#if("" != $treeParentCode && $column.javaField == $treeParentCode) +
+ +
+
+#set($BusinessName=$businessName.substring(0,1).toUpperCase() + ${businessName.substring(1)}) + + + +
+
+
+#elseif($column.htmlType == "input") +
+ +
+ +
+
+#elseif($column.htmlType == "upload") +
+ +
+ +
+ +
+
+
+#elseif($column.htmlType == "summernote") +
+ +
+ +
+
+
+#elseif($column.htmlType == "select" && "" != $dictType) +
+ +
+ +
+
+#elseif($column.htmlType == "select" && $dictType) +
+ +
+ + 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "checkbox" && "" != $dictType) +
+ +
+ +
+
+#elseif($column.htmlType == "checkbox" && $dictType) +
+ +
+ + 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "radio" && "" != $dictType) +
+ +
+
+ + +
+
+
+#elseif($column.htmlType == "radio" && $dictType) +
+ +
+
+ + +
+ 代码生成请选择字典属性 +
+
+#elseif($column.htmlType == "datetime") +
+ +
+
+ + +
+
+
+#elseif($column.htmlType == "textarea") +
+ +
+ +
+
+#end +#end +#end +#end +#if($table.sub) +

${subTable.functionName}信息

+
+
+ + +
+
+
+
+
+#end +
+
+ +#foreach($column in $columns) +#if($column.edit && !$column.superColumn && !$column.pk && $column.htmlType == "datetime") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "upload") + +#break +#end +#end +#foreach($column in $columns) +#if($column.insert && !$column.superColumn && !$column.pk && $column.htmlType == "summernote") + +#break +#end +#end + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/vm/html/list-tree.html.vm b/common-generator-starter/target/classes/vm/html/list-tree.html.vm new file mode 100644 index 0000000..f7f797d --- /dev/null +++ b/common-generator-starter/target/classes/vm/html/list-tree.html.vm @@ -0,0 +1,156 @@ + + + + + + +
+
+
+
+
+
    +#foreach($column in $columns) +#if($column.query) +#set($dictType=$column.dictType) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($column.htmlType == "input") +
  • + + +
  • +#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType) +
  • + + +
  • +#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType) +
  • + + +
  • +#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN") +
  • + + +
  • +#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") +
  • + + + - + +
  • +#end +#end +#end +
  • +  搜索 +  重置 +
  • +
+
+
+
+ + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/vm/html/list.html.vm b/common-generator-starter/target/classes/vm/html/list.html.vm new file mode 100644 index 0000000..f2e9c5a --- /dev/null +++ b/common-generator-starter/target/classes/vm/html/list.html.vm @@ -0,0 +1,154 @@ + + + + + + +
+
+
+
+
+
    +#foreach($column in $columns) +#if($column.query) +#set($dictType=$column.dictType) +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($column.htmlType == "input") +
  • + + +
  • +#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && "" != $dictType) +
  • + + +
  • +#elseif(($column.htmlType == "select" || $column.htmlType == "radio") && $dictType) +
  • + + +
  • +#elseif($column.htmlType == "datetime" && $column.queryType != "BETWEEN") +
  • + + +
  • +#elseif($column.htmlType == "datetime" && $column.queryType == "BETWEEN") +
  • + + + - + +
  • +#end +#end +#end +
  • +  搜索 +  重置 +
  • +
+
+
+
+ + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/vm/html/tree.html.vm b/common-generator-starter/target/classes/vm/html/tree.html.vm new file mode 100644 index 0000000..80364ad --- /dev/null +++ b/common-generator-starter/target/classes/vm/html/tree.html.vm @@ -0,0 +1,51 @@ + + + + + + + + +#set($treeId = "${className}?." + $treeCode) +#set($treeName = "${className}?." + $treeName) + + +
+ + +
+ +
+ 展开 / + 折叠 +
+
+
+ + + + + \ No newline at end of file diff --git a/common-generator-starter/target/classes/vm/java/controller.java.vm b/common-generator-starter/target/classes/vm/java/controller.java.vm new file mode 100644 index 0000000..e826fd4 --- /dev/null +++ b/common-generator-starter/target/classes/vm/java/controller.java.vm @@ -0,0 +1,202 @@ +package ${packageName}.controller; + +import java.util.List; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; +import com.ruoyi.common.annotation.Log; +import com.ruoyi.common.enums.BusinessType; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.ruoyi.common.core.controller.BaseController; +import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.poi.ExcelUtil; +#if($table.crud || $table.sub) +import com.ruoyi.common.core.page.TableDataInfo; +#elseif($table.tree) +import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.core.domain.Ztree; +#end + +/** + * ${functionName}Controller + * + * @author ${author} + * @date ${datetime} + */ +@Controller +@RequestMapping("/${moduleName}/${businessName}") +public class ${ClassName}Controller extends BaseController +{ + private String prefix = "${moduleName}/${businessName}"; + + @Autowired + private I${ClassName}Service ${className}Service; + + @RequiresPermissions("${permissionPrefix}:view") + @GetMapping() + public String ${businessName}() + { + return prefix + "/${businessName}"; + } + +#if($table.crud || $table.sub) + /** + * 查询${functionName}列表 + */ + @RequiresPermissions("${permissionPrefix}:list") + @PostMapping("/list") + @ResponseBody + public TableDataInfo list(${ClassName} ${className}) + { + startPage(); + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return getDataTable(list); + } +#elseif($table.tree) + /** + * 查询${functionName}树列表 + */ + @RequiresPermissions("${permissionPrefix}:list") + @PostMapping("/list") + @ResponseBody + public List<${ClassName}> list(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + return list; + } +#end + + /** + * 导出${functionName}列表 + */ + @RequiresPermissions("${permissionPrefix}:export") + @Log(title = "${functionName}", businessType = BusinessType.EXPORT) + @PostMapping("/export") + @ResponseBody + public AjaxResult export(${ClassName} ${className}) + { + List<${ClassName}> list = ${className}Service.select${ClassName}List(${className}); + ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class); + return util.exportExcel(list, "${functionName}数据"); + } + +#if($table.crud || $table.sub) + /** + * 新增${functionName} + */ + @GetMapping("/add") + public String add() + { + return prefix + "/add"; + } +#elseif($table.tree) + /** + * 新增${functionName} + */ + @GetMapping(value = { "/add/{${pkColumn.javaField}}", "/add/" }) + public String add(@PathVariable(value = "${pkColumn.javaField}", required = false) Long ${pkColumn.javaField}, ModelMap mmap) + { + if (StringUtils.isNotNull(${pkColumn.javaField})) + { + mmap.put("${className}", ${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + return prefix + "/add"; + } +#end + + /** + * 新增保存${functionName} + */ + @RequiresPermissions("${permissionPrefix}:add") + @Log(title = "${functionName}", businessType = BusinessType.INSERT) + @PostMapping("/add") + @ResponseBody + public AjaxResult addSave(${ClassName} ${className}) + { + return toAjax(${className}Service.insert${ClassName}(${className})); + } + + /** + * 修改${functionName} + */ + @RequiresPermissions("${permissionPrefix}:edit") + @GetMapping("/edit/{${pkColumn.javaField}}") + public String edit(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}, ModelMap mmap) + { + ${ClassName} ${className} = ${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + mmap.put("${className}", ${className}); + return prefix + "/edit"; + } + + /** + * 修改保存${functionName} + */ + @RequiresPermissions("${permissionPrefix}:edit") + @Log(title = "${functionName}", businessType = BusinessType.UPDATE) + @PostMapping("/edit") + @ResponseBody + public AjaxResult editSave(${ClassName} ${className}) + { + return toAjax(${className}Service.update${ClassName}(${className})); + } + +#if($table.crud || $table.sub) + /** + * 删除${functionName} + */ + @RequiresPermissions("${permissionPrefix}:remove") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @PostMapping( "/remove") + @ResponseBody + public AjaxResult remove(String ids) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}s(ids)); + } +#elseif($table.tree) + /** + * 删除 + */ + @RequiresPermissions("${permissionPrefix}:remove") + @Log(title = "${functionName}", businessType = BusinessType.DELETE) + @GetMapping("/remove/{${pkColumn.javaField}}") + @ResponseBody + public AjaxResult remove(@PathVariable("${pkColumn.javaField}") ${pkColumn.javaType} ${pkColumn.javaField}) + { + return toAjax(${className}Service.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } +#end +#if($table.tree) + + /** + * 选择${functionName}树 + */ +#set($BusinessName=$businessName.substring(0,1).toUpperCase() + ${businessName.substring(1)}) + @GetMapping(value = { "/select${BusinessName}Tree/{${pkColumn.javaField}}", "/select${BusinessName}Tree/" }) + public String select${BusinessName}Tree(@PathVariable(value = "${pkColumn.javaField}", required = false) Long ${pkColumn.javaField}, ModelMap mmap) + { + if (StringUtils.isNotNull(${pkColumn.javaField})) + { + mmap.put("${className}", ${className}Service.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField})); + } + return prefix + "/tree"; + } + + /** + * 加载${functionName}树列表 + */ + @GetMapping("/treeData") + @ResponseBody + public List treeData() + { + List ztrees = ${className}Service.select${ClassName}Tree(); + return ztrees; + } +#end +} diff --git a/common-generator-starter/target/classes/vm/java/domain.java.vm b/common-generator-starter/target/classes/vm/java/domain.java.vm new file mode 100644 index 0000000..bd51c17 --- /dev/null +++ b/common-generator-starter/target/classes/vm/java/domain.java.vm @@ -0,0 +1,105 @@ +package ${packageName}.domain; + +#foreach ($import in $importList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +#if($table.crud || $table.sub) +import com.ruoyi.common.core.domain.BaseEntity; +#elseif($table.tree) +import com.ruoyi.common.core.domain.TreeEntity; +#end + +/** + * ${functionName}对象 ${tableName} + * + * @author ${author} + * @date ${datetime} + */ +#if($table.crud || $table.sub) +#set($Entity="BaseEntity") +#elseif($table.tree) +#set($Entity="TreeEntity") +#end +public class ${ClassName} extends ${Entity} +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#if($table.sub) + /** $table.subTable.functionName信息 */ + private List<${subClassName}> ${subclassName}List; + +#end +#foreach ($column in $columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + +#if($table.sub) + public List<${subClassName}> get${subClassName}List() + { + return ${subclassName}List; + } + + public void set${subClassName}List(List<${subClassName}> ${subclassName}List) + { + this.${subclassName}List = ${subclassName}List; + } + +#end + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end +#if($table.sub) + .append("${subclassName}List", get${subClassName}List()) +#end + .toString(); + } +} diff --git a/common-generator-starter/target/classes/vm/java/mapper.java.vm b/common-generator-starter/target/classes/vm/java/mapper.java.vm new file mode 100644 index 0000000..ebee538 --- /dev/null +++ b/common-generator-starter/target/classes/vm/java/mapper.java.vm @@ -0,0 +1,91 @@ +package ${packageName}.mapper; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.sub) +import ${packageName}.domain.${subClassName}; +#end + +/** + * ${functionName}Mapper接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface ${ClassName}Mapper +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 删除${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(String[] ${pkColumn.javaField}s); +#if($table.sub) + + /** + * 批量删除${subTable.functionName} + * + * @param ${pkColumn.javaField}s 需要删除的数据主键集合 + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}s(String[] ${pkColumn.javaField}s); + + /** + * 批量新增${subTable.functionName} + * + * @param ${subclassName}List ${subTable.functionName}列表 + * @return 结果 + */ + public int batch${subClassName}(List<${subClassName}> ${subclassName}List); + + + /** + * 通过${functionName}主键删除${subTable.functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}ID + * @return 结果 + */ + public int delete${subClassName}By${subTableFkClassName}(${pkColumn.javaType} ${pkColumn.javaField}); +#end +} diff --git a/common-generator-starter/target/classes/vm/java/service.java.vm b/common-generator-starter/target/classes/vm/java/service.java.vm new file mode 100644 index 0000000..765c9d6 --- /dev/null +++ b/common-generator-starter/target/classes/vm/java/service.java.vm @@ -0,0 +1,73 @@ +package ${packageName}.service; + +import java.util.List; +import ${packageName}.domain.${ClassName}; +#if($table.tree) +import com.ruoyi.common.core.domain.Ztree; +#end + +/** + * ${functionName}Service接口 + * + * @author ${author} + * @date ${datetime} + */ +public interface I${ClassName}Service +{ + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName}集合 + */ + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}); + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int insert${ClassName}(${ClassName} ${className}); + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ + public int update${ClassName}(${ClassName} ${className}); + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键集合 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}s(String ${pkColumn.javaField}s); + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}); +#if($table.tree) + + /** + * 查询${functionName}树列表 + * + * @return 所有${functionName}信息 + */ + public List select${ClassName}Tree(); +#end +} diff --git a/common-generator-starter/target/classes/vm/java/serviceImpl.java.vm b/common-generator-starter/target/classes/vm/java/serviceImpl.java.vm new file mode 100644 index 0000000..242b1c7 --- /dev/null +++ b/common-generator-starter/target/classes/vm/java/serviceImpl.java.vm @@ -0,0 +1,213 @@ +package ${packageName}.service.impl; + +import java.util.List; +#if($table.tree) +import java.util.ArrayList; +import com.ruoyi.common.core.domain.Ztree; +#end +#foreach ($column in $columns) +#if($column.javaField == 'createTime' || $column.javaField == 'updateTime') +import com.ruoyi.common.utils.DateUtils; +#break +#end +#end +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +#if($table.sub) +import java.util.ArrayList; +import com.ruoyi.common.utils.StringUtils; +import org.springframework.transaction.annotation.Transactional; +import ${packageName}.domain.${subClassName}; +#end +import ${packageName}.mapper.${ClassName}Mapper; +import ${packageName}.domain.${ClassName}; +import ${packageName}.service.I${ClassName}Service; +import com.ruoyi.common.core.text.Convert; + +/** + * ${functionName}Service业务层处理 + * + * @author ${author} + * @date ${datetime} + */ +@Service +public class ${ClassName}ServiceImpl implements I${ClassName}Service +{ + @Autowired + private ${ClassName}Mapper ${className}Mapper; + + /** + * 查询${functionName} + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return ${functionName} + */ + @Override + public ${ClassName} select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { + return ${className}Mapper.select${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } + + /** + * 查询${functionName}列表 + * + * @param ${className} ${functionName} + * @return ${functionName} + */ + @Override + public List<${ClassName}> select${ClassName}List(${ClassName} ${className}) + { + return ${className}Mapper.select${ClassName}List(${className}); + } + + /** + * 新增${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int insert${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'createTime') + ${className}.setCreateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + int rows = ${className}Mapper.insert${ClassName}(${className}); + insert${subClassName}(${className}); + return rows; +#else + return ${className}Mapper.insert${ClassName}(${className}); +#end + } + + /** + * 修改${functionName} + * + * @param ${className} ${functionName} + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int update${ClassName}(${ClassName} ${className}) + { +#foreach ($column in $columns) +#if($column.javaField == 'updateTime') + ${className}.setUpdateTime(DateUtils.getNowDate()); +#end +#end +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${className}.get${pkColumn.capJavaField}()); + insert${subClassName}(${className}); +#end + return ${className}Mapper.update${ClassName}(${className}); + } + + /** + * 批量删除${functionName} + * + * @param ${pkColumn.javaField}s 需要删除的${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}s(String ${pkColumn.javaField}s) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}s(Convert.toStrArray(${pkColumn.javaField}s)); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}s(Convert.toStrArray(${pkColumn.javaField}s)); + } + + /** + * 删除${functionName}信息 + * + * @param ${pkColumn.javaField} ${functionName}主键 + * @return 结果 + */ +#if($table.sub) + @Transactional +#end + @Override + public int delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaType} ${pkColumn.javaField}) + { +#if($table.sub) + ${className}Mapper.delete${subClassName}By${subTableFkClassName}(${pkColumn.javaField}); +#end + return ${className}Mapper.delete${ClassName}By${pkColumn.capJavaField}(${pkColumn.javaField}); + } +#if($table.tree) + + /** + * 查询${functionName}树列表 + * + * @return 所有${functionName}信息 + */ + @Override + public List select${ClassName}Tree() + { + List<${ClassName}> ${className}List = ${className}Mapper.select${ClassName}List(new ${ClassName}()); + List ztrees = new ArrayList(); + for (${ClassName} ${className} : ${className}List) + { + Ztree ztree = new Ztree(); +#if($treeCode.length() > 2 && $treeCode.substring(1,2).matches("[A-Z]")) +#set($TreeCode=$treeCode) +#else +#set($TreeCode=$treeCode.substring(0,1).toUpperCase() + ${treeCode.substring(1)}) +#end +#if($treeParentCode.length() > 2 && $treeParentCode.substring(1,2).matches("[A-Z]")) +#set($TreeParentCode=$treeParentCode) +#else +#set($TreeParentCode=$treeParentCode.substring(0,1).toUpperCase() + ${treeParentCode.substring(1)}) +#end +#if($treeName.length() > 2 && $treeName.substring(1,2).matches("[A-Z]")) +#set($TreeName=$treeName) +#else +#set($TreeName=$treeName.substring(0,1).toUpperCase() + ${treeName.substring(1)}) +#end + ztree.setId(${className}.get${TreeCode}()); + ztree.setpId(${className}.get${TreeParentCode}()); + ztree.setName(${className}.get${TreeName}()); + ztree.setTitle(${className}.get${TreeName}()); + ztrees.add(ztree); + } + return ztrees; + } +#end +#if($table.sub) + + /** + * 新增${subTable.functionName}信息 + * + * @param ${className} ${functionName}对象 + */ + public void insert${subClassName}(${ClassName} ${className}) + { + List<${subClassName}> ${subclassName}List = ${className}.get${subClassName}List(); + ${pkColumn.javaType} ${pkColumn.javaField} = ${className}.get${pkColumn.capJavaField}(); + if (StringUtils.isNotNull(${subclassName}List)) + { + List<${subClassName}> list = new ArrayList<${subClassName}>(); + for (${subClassName} ${subclassName} : ${subclassName}List) + { + ${subclassName}.set${subTableFkClassName}(${pkColumn.javaField}); + list.add(${subclassName}); + } + if (list.size() > 0) + { + ${className}Mapper.batch${subClassName}(list); + } + } + } +#end +} diff --git a/common-generator-starter/target/classes/vm/java/sub-domain.java.vm b/common-generator-starter/target/classes/vm/java/sub-domain.java.vm new file mode 100644 index 0000000..a3f53eb --- /dev/null +++ b/common-generator-starter/target/classes/vm/java/sub-domain.java.vm @@ -0,0 +1,76 @@ +package ${packageName}.domain; + +#foreach ($import in $subImportList) +import ${import}; +#end +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.ruoyi.common.annotation.Excel; +import com.ruoyi.common.core.domain.BaseEntity; + +/** + * ${subTable.functionName}对象 ${subTableName} + * + * @author ${author} + * @date ${datetime} + */ +public class ${subClassName} extends BaseEntity +{ + private static final long serialVersionUID = 1L; + +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) + /** $column.columnComment */ +#if($column.list) +#set($parentheseIndex=$column.columnComment.indexOf("(")) +#if($parentheseIndex != -1) +#set($comment=$column.columnComment.substring(0, $parentheseIndex)) +#else +#set($comment=$column.columnComment) +#end +#if($parentheseIndex != -1) + @Excel(name = "${comment}", readConverterExp = "$column.readConverterExp()") +#elseif($column.javaType == 'Date') + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "${comment}", width = 30, dateFormat = "yyyy-MM-dd") +#else + @Excel(name = "${comment}") +#end +#end + private $column.javaType $column.javaField; + +#end +#end +#foreach ($column in $subTable.columns) +#if(!$table.isSuperColumn($column.javaField)) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + public void set${AttrName}($column.javaType $column.javaField) + { + this.$column.javaField = $column.javaField; + } + + public $column.javaType get${AttrName}() + { + return $column.javaField; + } +#end +#end + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) +#foreach ($column in $subTable.columns) +#if($column.javaField.length() > 2 && $column.javaField.substring(1,2).matches("[A-Z]")) +#set($AttrName=$column.javaField) +#else +#set($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) +#end + .append("${column.javaField}", get${AttrName}()) +#end + .toString(); + } +} diff --git a/common-generator-starter/target/classes/vm/js/api.js.vm b/common-generator-starter/target/classes/vm/js/api.js.vm new file mode 100644 index 0000000..9295524 --- /dev/null +++ b/common-generator-starter/target/classes/vm/js/api.js.vm @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询${functionName}列表 +export function list${BusinessName}(query) { + return request({ + url: '/${moduleName}/${businessName}/list', + method: 'get', + params: query + }) +} + +// 查询${functionName}详细 +export function get${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'get' + }) +} + +// 新增${functionName} +export function add${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'post', + data: data + }) +} + +// 修改${functionName} +export function update${BusinessName}(data) { + return request({ + url: '/${moduleName}/${businessName}', + method: 'put', + data: data + }) +} + +// 删除${functionName} +export function del${BusinessName}(${pkColumn.javaField}) { + return request({ + url: '/${moduleName}/${businessName}/' + ${pkColumn.javaField}, + method: 'delete' + }) +} diff --git a/common-generator-starter/target/classes/vm/sql/sql.vm b/common-generator-starter/target/classes/vm/sql/sql.vm new file mode 100644 index 0000000..d5121af --- /dev/null +++ b/common-generator-starter/target/classes/vm/sql/sql.vm @@ -0,0 +1,22 @@ +-- 菜单 SQL +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}', '${parentMenuId}', '1', '/${moduleName}/${businessName}', 'C', '0', '${permissionPrefix}:view', '#', 'admin', sysdate(), '', null, '${functionName}菜单'); + +-- 按钮父菜单ID +SELECT @parentId := LAST_INSERT_ID(); + +-- 按钮 SQL +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}查询', @parentId, '1', '#', 'F', '0', '${permissionPrefix}:list', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}新增', @parentId, '2', '#', 'F', '0', '${permissionPrefix}:add', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}修改', @parentId, '3', '#', 'F', '0', '${permissionPrefix}:edit', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}删除', @parentId, '4', '#', 'F', '0', '${permissionPrefix}:remove', '#', 'admin', sysdate(), '', null, ''); + +insert into sys_menu (menu_name, parent_id, order_num, url, menu_type, visible, perms, icon, create_by, create_time, update_by, update_time, remark) +values('${functionName}导出', @parentId, '5', '#', 'F', '0', '${permissionPrefix}:export', '#', 'admin', sysdate(), '', null, ''); diff --git a/common-generator-starter/target/classes/vm/vue/index-tree.vue.vm b/common-generator-starter/target/classes/vm/vue/index-tree.vue.vm new file mode 100644 index 0000000..bfb61b5 --- /dev/null +++ b/common-generator-starter/target/classes/vm/vue/index-tree.vue.vm @@ -0,0 +1,482 @@ + + + diff --git a/common-generator-starter/target/classes/vm/vue/index.vue.vm b/common-generator-starter/target/classes/vm/vue/index.vue.vm new file mode 100644 index 0000000..65620b4 --- /dev/null +++ b/common-generator-starter/target/classes/vm/vue/index.vue.vm @@ -0,0 +1,573 @@ + + + diff --git a/common-generator-starter/target/classes/vm/vue/v3/index-tree.vue.vm b/common-generator-starter/target/classes/vm/vue/v3/index-tree.vue.vm new file mode 100644 index 0000000..5342e91 --- /dev/null +++ b/common-generator-starter/target/classes/vm/vue/v3/index-tree.vue.vm @@ -0,0 +1,464 @@ + + + diff --git a/common-generator-starter/target/classes/vm/vue/v3/index.vue.vm b/common-generator-starter/target/classes/vm/vue/v3/index.vue.vm new file mode 100644 index 0000000..08bb071 --- /dev/null +++ b/common-generator-starter/target/classes/vm/vue/v3/index.vue.vm @@ -0,0 +1,564 @@ + + + diff --git a/common-generator-starter/target/classes/vm/vue/v3/readme.txt b/common-generator-starter/target/classes/vm/vue/v3/readme.txt new file mode 100644 index 0000000..10362d6 --- /dev/null +++ b/common-generator-starter/target/classes/vm/vue/v3/readme.txt @@ -0,0 +1 @@ +ʹõRuoYi-Cloud-Vue3ǰˣôҪһ´Ŀ¼ģindex.vue.vmindex-tree.vue.vmļϼvueĿ¼ \ No newline at end of file diff --git a/common-generator-starter/target/classes/vm/xml/mapper.xml.vm b/common-generator-starter/target/classes/vm/xml/mapper.xml.vm new file mode 100644 index 0000000..9de59b5 --- /dev/null +++ b/common-generator-starter/target/classes/vm/xml/mapper.xml.vm @@ -0,0 +1,147 @@ + + + + + +#foreach ($column in $columns) + +#end +#if($table.tree) + +#end + +#if($table.sub) + + + + + + +#foreach ($column in $subTable.columns) + +#end + +#end + + + select#foreach($column in $columns) $column.columnName#if($foreach.count != $columns.size()),#end#end from ${tableName} + + + + + + + + insert into ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + $column.columnName, +#end +#end + + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName || !$pkColumn.increment) + #{$column.javaField}, +#end +#end + + + + + update ${tableName} + +#foreach($column in $columns) +#if($column.columnName != $pkColumn.columnName) + $column.columnName = #{$column.javaField}, +#end +#end + + where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} = #{${pkColumn.javaField}} + + + + delete from ${tableName} where ${pkColumn.columnName} in + + #{${pkColumn.javaField}} + + +#if($table.sub) + + + delete from ${subTableName} where ${subTableFkName} in + + #{${subTableFkclassName}} + + + + + delete from ${subTableName} where ${subTableFkName} = #{${subTableFkclassName}} + + + + insert into ${subTableName}(#foreach($column in $subTable.columns) $column.columnName#if($foreach.count != $subTable.columns.size()),#end#end) values + + (#foreach($column in $subTable.columns) #{item.$column.javaField}#if($foreach.count != $subTable.columns.size()),#end#end) + + +#end + + \ No newline at end of file diff --git a/common-generator-starter/target/common-generator-starter-1.0.0-SNAPSHOT.jar b/common-generator-starter/target/common-generator-starter-1.0.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..405e9dee5e16ee583025275736947cf746447b53 GIT binary patch literal 103432 zcmbrl1C(XUvMyYC z%*YJPh?yDkQotZk0DnBhU2fI?tMS(x zs3xIN^$@$aW=b+SNjhgyR-%+qdbDOnDk4iMD)o2|2M!!WDT8hg)Gcs>8u2jk5QUwg z=u{_J$AO}Gg58RWhID9mXaoF~F{Ms_y;oBRKc_+#pSAZ+ZMoIU;l zhxi}3FA5tw+kb=qeeJOSZ*VgcTN6hEXFJD#ASC=}LL)m{Qwy_ypeOww>75{wW6NLCL&xZ^wmD%;RKv7?AkMXOs|Kk+?GWP!?=D&Zc)`m#d0)7nNrv7R7w=$^}2FMSRZ`#+?CREKEB`ILd4`=0#JiIfkbgfj@tgS$WzfGt#tqej<1ytQYMRS|h zXKo#*As_bSAMXfXDUHx*ZnbWm;XBdOX;%-#oxa~!Qb;a84@1;rvQesHia!hBYim!ENWyq0jja@^%@RQbh*YUK)e#LIG zt+tn^_IueFYr@f)psFXAYb$;AxyDrF2`MzX36vKKAY1##pv8&DnCo)j*b!H&r&jjk zs|fPortvB6@WvQnT^N!_)>&gy8Q*yltb7m(}uarW_&KyFC zmZ^ECFq7m~sv1sXuYpy$jK{yEHn;$R^V@SA&u)Zbk@i-8(atkae!3Wamg)Ye+E*My zpp=tnljOh(;)(Gx4Wr$KR^QHsF~c|dU|Pvft={ok%%85MM}{&5hddGl)J2#&@AB!N z4k^>`fQ$`DGr-k&;lIeDYyHk}#Wj4wIwXz%6KJx0JPz$->icB({ES`vju)ls7gbb z!L{Pl95XEZ(Qb<78?r)O-=7a&l9aK6k-vJKQp07*1xOE1E5IE%rE89?G-$BHm-k>siZr2D10N@)a z006`PCvPBTVk`7t7w12nL2`nW9Wn#L@UVyLy(PI#ZqjqP#|#!EaokvWguj$>Uej1^ zvy6R{ZT-{OdD0V?1Ar(0UJv+=5W&#YT=3;l&mrHFJ9l?lt>4GzEiynh5Dh=BCEUSJ z+X90EivtDRrTZEI{NtF10A&!gwa}|tsnDvMlPXnh_Y9DTfOS4co~Fy!D1J<%L%91x zhI8_bM4zY`TRZb6VBf%1UHjfgDxg!%PAUBP1Uv@Yu1U~!++RFJPtpwmqg`AVZ4nth z2NNg2xJc@D&xLY6m}g26RC-Wn482L^g@U0N_OV@Nc_wP=`TGo=s4TVWDd5H;Y=kV=x~gUAKenqMc~E>pZnw&WASJ8ZX41+9k-T4 zO5=ORro_#!>S^IQbk~psE!CVT>}8{ylyPB!=X?1LzULHh=H;43NcdpUuO;~6gCb** z-LNvWkQK5LEnW!E^N;#dOlpV^vqU9{xJ-SdlA#N`6yM57$_M;Hng~z|42&mCl9UGv z<-h0KLI7v?h==bKT3WUT|80)jZ4ZW%h^H1KpdN{0H9ni2$|zsnl5Y;VX1&i9SKT7s zOR|vZl41bZ$PDK{USnQO*X!u~tBptCgiYK>K&t3!OQ;h_Eq~;Pxe}?=J&Yo7WhlE&n!=QnkUz@q&b(z8Zkb56KI2p?`>&9I;4XlOyEyu&}`3DBU)mb=btPo}f6!PbX9HVjr@xdoLDBY3AhrT6sJpDe>xfrjePAufyR^aWh*ttF zKTw|uHezo8`hp zcTIxT)V)!6S+?}V+<|vxf}0VxOb59jt_eFrZ+QE_D_-b#6NW$vc(kYBb zpVC0`fg(#2GM9ZWkAaK5DaG970};2g6Ymep5=34Cfr2=v?-4vqp)5ImEK`ZJmYtG7 zqFujMC!m9EID3TpW{QrEB2hz`-yLde9$9C{#FigHd#X%PzIHd3<;A;>I;@S>X_tx9 z^JUE)P^wg&NbltVM?{}Ol z4jYXcPYZW80PkZ1R$(n1|D5bFax7(N)ub)^j^gs5bygy8r?kLv8Q&Y=Ju3*g%SF3t zSCxP#^r9QsB2Vt2gPS;dNY006wE)D0gDq?feb^vb{Q%6OMLsvCt~w=;N!b@0gkOcU zOV;+|1pU!5@Wl)(FM(S_RT89I9AV3HRrOjDGDNjHEdf8t0gJRyg=T%?d7Wi`FKh3ah9Y!d_?iRhL>9l1emnXJWNu#u~PCIg_!&8*K;rJ2G zX49-CB*WPu+FhJ_f0H@sFXVKYls=Yn3hVxPnqmE%ka={QXy%DFk-}xZQJ` z)+_GE7dL%_^afZ?cXDmJhv21lU@sveMHHfo5m>9oTGULY8s4-|M{qo!492e>ej$25 zjF`&jx0y=ea9v=*j_>MDratnpnBhGpXBS(fa6Q;3(Xh(YbNSQr@aRMY_hyPF^(KZY zhobIQ{GO?8Se)>*lNqW=twHcBMiR%?2mNriF2HL|u0f&A%i)BiB}fO)2&03&G2I&n z^5(cr0k9+KBJ5E^(nH-T4_5+|MK%M<5M)ljix<>x2di9#xzW>yP zIG{n218Whk097ZW1$U2lNe8&buL5xgyqyBLChTJESw_^u+o8OL1!N7g0<1!21F}Yv z18^PPKP{LeqpflRbG!+>oL&l|6dN+z?ZQ?io2} zs@Kf^CJo0MElo8lL{2|{fQsXG^}uE7B%E==a95e^!>Ps}9LT%?g(wYep z_6;J!s9qjPe1D)fCTk!(p{0x5r8>Ex7M-|qMQ4?P*~UUDKv!PeLQ3oB46vsoCqn>0 zr_}WuuQ`Y3k1e)KzWVZH9Y`@>HQ`tNZPTyjXXTe-0!=`ez1RLUQ zD@E_Susr#E{JVYWg_~zD-yelKe$oGajmLT=_o3#;gI9pvL@MC2Jdtgq5_bc)2!`H7 z{^=!za`f8AtRp0LLVi6Ne8S5)1bTHm3B2f>iF?o)>V8je$J?7BcXy=ZeJgjrW#)db z0k`ke@%#(RGq?+(fDY_bs^jet--m=>4_1LH^p558ozt$XH^a^`+z#|~{r%UsEpImA z?fh%-6L7#+g8ViH7M_BEgtMQP(&i4yvqR?Ea-$TR4MoNeik_MwQI_N>wj)I}B+r-B z*-O187Wf%W4N07NX;{3@h4XEN>gn06m^Kk-L#fuLFf=@_J@SfY1-9D6!^$K!W8g{b z%yOdC6FaL3BWBna;8ca=%!*C^pT`OR*Psfl^R)5l!WJ^7{8j&Ax|nI zEiGL1SW%T=86p+f%Z8H=!VJydH!&Zy_S1jC2oF9sn4F9jSdR46Z2I)C0g8*T%o{Re zrOAm1%28-)PTAxd>6F?_Gc0Cq_*XPXscT4$EtQT*oYJV%8q=snPA>;k78Y?VzMKUj-{gl54RLksP&Oo>~VdCs=U;LaXnWxT&vIzfA!W4niZV%-1*eyAWit z4fjAM6YWniYoyj|5$#$~ObF}|iqedzSMBbTu`U%=c;z(f<(;Wk-)}wHAxQP7TCK%R zLS`677jzKFVam4em}HVXev%O_MK-CK5Qi9Ny(0WPYfu(tqkf~7C*5(^iC5H0I^W$@ zMExn_{=ho}pU52J8LkYCn6VO%Jg9J@wAq$DU_s)p&J~J;8WWsbFjZ*~nrC_|pM=Zh zdY;Ip_jItEk==5K)iG2@I)yoZaGDtZK5^CtO?uN`ZfE!VGk^fs3;Ic_WSWdjg0==L zpQR9j`h$>#<~q9pta!pe2}etSC0FAsT%I=ZeIo6&Z0RnxDrwI2-pHX@sbfirN>&1B}kszMtJ||pWTZyLv!W7DyS&(>epIaZFF06}zHwzAee#DI`$BfSbe#rlQ z?XcHZQ=eB)KonUi-5c^^o& zS)D(ELe<;bOm>p6^`+CNcOB#M2qYNnu>w)e%{&j6jN{}H zB!%-nIhXKHaX+Y;9FkY)50$*`*=^tl`0!7O-w7w%4|w6(M>)T#7!0Kic~uD*`0OY( zk_UjO$!jgq5>Dth@oTY2C7gNeaLpoLLe~Jw6V-WkV-`ms`yH0H@_XxwhJG0|Xx37b z@Miag#w>#CZ!)`YuNfLYQd~w!HAqJeV5z4n*x0%%%fxEzN2N^0BwkgdNSA;SC8!f= zO=OTDX^o{wSaU4fb53L}>@@*CwiIe!7MYYtmKnKtYcohMu5ofV?GHwJpqIZv2$D4_F)Q_+HYNeE&=YBKZcSsVfKa(!*qidg{HZAdr z&@1CacTAda^RXpgT1%ETEDQrrp7vYfGoZJm)irMSDm=-?8qQog;H#+%}wz!fwEjr|<4 zrS-GS=HTha+|QkqGRXz%Wy!^QFETk5N7M<)l_r37*MZ=!MjV%No#8p$;F67WpSaO) zT&k*ZYvb!>PD0UGnV9LJkJ%HA1%h!nLMgVSJG0eB9*fkPvS95mJ|b_@R zJhntMaD}2YY3@y)QGn}XZ|ETyqH8a2&G<#gDcy!qlUZo<3pgZ=dsYyoZ zP@$|1c$+e~OOt>sF=wiPlT+$M$7b5);cg3V4f4Z9S*E=NzRiuRe4WUP9tjoVIRf@J z`lA2$r-C8rWBxM`Ru2@;s?v?Nn7D@4x>ClD z5}Oc9suOSL^YnMy?k=8Xnl&Y8&{^9ethf#kX11UuRfKj#h&Fsgk@4qM3nGVS4*no! zkOr2OOZrcr)XrqlntiAfcBzX^co{^_99@VlH!kf}MKA4AXzfyTfiY9lg`hO_c`16d z9arB{`knD37X5y1u#ISv=N_Ed;~sxHF*!gE);g=(hkZ;AQG=CY2fHoPx3#rm3kU3| zy5QNv`G$r{h*QNl0ep4{M{I!=M}!72VaI{WCRucc0R|BSuW$vN5iEgwT7w82SFZ!0 zsFf9D+!d7vxS7*(Ge?m>H)tGpYTJ`nVIK|I z67o&pI5J7FVa_2knb*;?9BTIss$<^}O5oJ6f3dVfDDwpb`i#cKzbj$ z+X|L;`6-e!E$WD_Kq!u}4_qA>__Rc!yP)6>LUuKE&)kloMbAsQHgz?cx-4z4BWC9i z$w^~<(20xvqGSNsE{H;B(6RB0TdmZZeHH(Jo(2N@BW%@%#9-!6C@x+PsOQngOEGg7-uv~U4m2t~@N_tI zcY~Ed>>{>#t$|X6qVnBXUUBdfEKjPVBL~k!PaD9kbC4~~9Q*|VZx-Cp-H)v%+wAeB z>)!hz4r`xAh_pWaRJ^5iN%MoBRc`xUp}=KJfQx(i`3#X70`~A;@gv-kMy7KC)dMU}<;dG&=U=28oIg>or*kN3-YzsGQH>XS}rTliA43;8Q zdU!*p^INXo=~Jns9wAc)+f(Ve$G=Ko6Q@k|y@Y&?s0MC5`PRS@#D`0xaR-WU`)c3p z1!`=Z*jgqxcUWuF`eyEC+k?N2Ibk1?Z0!hhi_78MkKt)ZctLxLdA z08tbYub22KUzs>rgIULwF*QM`prxf{JxKVVg8)%N(_rWkFDdz5Rm-Zf$+EoZ^+f~^ z$OHFd2mNCQ{4q1F-OlYwo?trB={oaQj+39;6_1HU(5nb3 zB?OfjSX%h}EY|@#b%hk1ZLrmhu!W@@jnagh${`MzRt!n7T&5RwwNq)Lh%d+^Biyv$ znWYx!=~~S%P=>UGvK^)tss~+uFmaZWDh*06&8<^eo=-8{?I{Aezx2P1w~<*Ty;4e35QN>FT&$?Gq}4bJf4=MFLuxT zysh1a9$ z?wdQ<@UDF*V^L8#2cej^f#deVRKM+QN)&GKumVi26A%lngNo`#dadXjSk={cr?=wk zZH06=i^@VS8#e}5|7Sa1-MT#vwrC&MYL~8XS6*Jmrnk*FP_CdV*^bljmZ`U(qSQ=>JraWRT0y3r zF_vPsZu4n4vZ@o29M9;szhV~|zhXyEW**l@r0YfPieRi_hEAlmX}QB`5TJxcQw{vC z7Tkw_w;N9tP!n2ghBApu*&0E?t;(r0Rn9GK4(cdmB1OlCG&@0AWuq;^TFcV$UWQSJ zteeBr20`H_KsB4gHFnZ_RNZ%>ySs|Uy4ht7X9jKNbin3gH;bumbC+!&PpWs+QLWA7 zuy|STm^i!}^eI2lH>Oh@Ra>l{n-*;3mM01}46TsOusCwH2XJ`0ut2<(K{rB)ONJq3 z7S*y=I*XrsVWcOniFp+)!$=(*2E*1*!$?i!gq?P1oIYAXJTGXf~!s^6y^P43^oFju*z>rl;%^T7f8BHi>WBR=mFW!Ca^}h+AO#MSoqR= z5u`VMgZ)wo15P1;>El02Z}7bTGGWXPvK_z62xJ#Qgc23r!D(mPquKMw4(Zgz2;Y{=)uq6zB{@OWI8th;5(W#*{0b8}pjTO7*~7eo}*z-Q&xkNPGJl=i-F?LaD28q$&Erpa8UsAZ~=4VAVwRAp$^*? zKg*N~boQ631Qs<}hiRAgdi9&#SyyOq;pL$^U4O%InSp{m8%UkLySDMZ*+!Y1m|X%` zforq}G-6-6Vw(2e!(5tnMCel)Xl=QJ6(lxY(6XZNWAH|*x`NzrU`q$K@7`DK%*#6l zLgS)=QPB?sYRT&eo(&cK_({y?Jo99UQNK7vKdw*fgXj2>80BLbp0 z7L{yJ(4dNSAbCv2<`!6g!>GjF~zSah=2!w*MK059`xcKXJ<6w3m<0+mVg%c z;t?k#7{|a6mILmAW|VyopfSpSg%}9p9)})`AA&*L6NEFIij0d-12cdU2;vbpFNh!o zgLELEJCs_Fi(if@E()PI8kC71XpJ1Ce1~6cG=YtaZv%4xEr^f??jZ$HrvpQHkAJN{ z(TZ)4#$5 z{~1c4%p)#RFz#&tf027+oBrq;7hebFfXcobz!(hv4xV5H*!=;T-}DCm_du$jhyRQh z6zn@bH!%R@J^pXBzzhHCaQ;5-5x-m<;6eO{JYitIs2oue+BhsYVMJHNK21}xSO;~wCg<0t27Cg zF!l2Q45N1QScHNY@H83_4`~?1;UMi$d?#-HSIm)p!MHT;5p9AIWWzri+#qS!fQ&u- z*(iY%djjdf_;TR_rnmTPL?bk~_(3oS76c>KxW=Uj2bc_hG&lm8z5K29@wbrz7w+-P zgYmrv@gKRxxdNTt{jH7h-)=z1M;pTeUQQP+kg7O_YMoJQUNnjTJ|g<|mh;lD7FoL> znJlYpGK0^b0;?||l9F-9QQH#Bit$xw-UK~+vJEBNSrl*{^3wa29wAHNJmr1f9hI?p zBP{zO&ycwnbp*>G;mgkH#0tGp7IU?ilC9Z5!pba=j_%a8pjd_Qn=ygxSGHgPUk@V+ zB?*8_A#A2}ORP9S*)jvM$#xT~dy7d8wrWY=EOoP8(U1a|p?E1kRTAJ_R+glUK#6px zPfCxY+9vY2i z{2HaXh9Z>tqH3gSrDo$|naYWjRi&oQdGS}2Hhy(<^{or5i|#nv>nPjl_x-lh^n~M6 zH`z2mkD&V`xYVvZs5YP;{;dd-Tfz%cct3HM^j;YJRbX|TYcu>H52JT7wI0#9LLCm# z<#~ZmP=l8Qm#k*Y0AzYhoGYFMnM8Ze00mO9L}o7d_CsH@u{(c=-T2Kn%r2__AVzND z{%7NtE*SXv6f=uWc;lB`nAn+jG2NG1_@f?z^mpM9F`pZy7tHXSM0e>By_tQzgqLKP z*zp^X(r(gQY$Q3)-DcgFERe;Jl-Wi1oD_x!u?ZVrEgJI4>M-f=ZeVbAOU&F22A-{Rv%9h zP0ED1B$FLt#%fqR#*Q_MP>O2jnmGAO&&G*G*)y-sLc`Ij#EBG2EQl=xz1CKVS-l1< zRbn(o_F)MlC7yH4fjSgUBtR>&m$OEkG5` zbU<&V4GS3y#4X4&D6H|vLUdU~-^cB_D0{{d;}Zckq;`~wt>yZAD@Dz*f zw4wI!Xa=Lb)+k%+bMR&hA<|6=8qCJ*w$M@!LKtp1milkinrRH=y#)#LI%%7Apu6fk zzn)jtI&V-EF=S1cgw`yxV%kg}Kr^KfQQXNoqykvg3;DUi7i&ZV8i@soImNXhtvYVN zK|djmQBFvu*e-@}`Q!rbZyJDjjL!l#p@Jo#6VV801U2a_e42VJ_$)pOY=~|A2S|}J zcE3SweC6jTj#lesrhV#`nvP+dSZIZomQYp$^}Seo;eV3Dg` zn{_<7UlsPBuqH`l^tQXc1YX}9O zRwj7{9mE|h?i?7E)u|YA)r;RijUZ9Ntc1N!($6)jm_&zGwJ`>VeWPZ%r<4)0N zK#ZhU^Df*E74jmKDc)h7b2#&_7mUl2?>pAo>VKULu=k#r$9h@G* zN`)EUxy0{v%uMcudhf3?IlZ(V*fNQ>TE#Fl0>`e6&AkxrMB1IY+f5hx1? zER9;rJe=kuFWDx3|D z*p_5Ki#z@@bO7-n{|0v)_Uth!IKCBTToOW926&ws1ThWR-fqB!P>vRke=tVeH$i+{ z+>zm6envxlUEC3}nPXOP{BJN}1R#5d0XPUi41@f}xFeS*PBVZb$uQ!o5W+_R8w4PX znQqzBnI?|70Z?1NrwIKxuKkkP5%F?H5I62=LxtNk2)Vw8zqsQ+Lm;0Ht($Yv^(;PA zT2FH}yHD-9`p z(1kWweK|~;d<$Mxxn12Po4B%Mm{j4OES^1%0-ofFI>Kd8QsKZDW_t9GE6uK@fBXro z#8W7(LnPajF85^M%yAxPol4?W8TV+J{U{b(5jrTXa;(oiy^t?h)MsRH#sFT__XQ_2 zrR-sPWN+i%?NJV9aOsRI1(;q)6f7b%ECS*v*-i7598or=mdnyp!e$ zrJd%YUmQaF*^e#Q0g=+vILdxBsMN{qn7Tx=ux(#P+|*9E89==MAgxC(l3i; zaLJD=<;*Vq4Uu++%%t)o2ogsr;R|mEBQ0SIUi2!N)+RBrARI$c3bc_h9Z>2!v;ZC~ zEpw2X@Ge;NIw&nO(Mz0Ndi&KL?o-YJR{AKE-lR4y%Qh>+O-sM%Sr8ps&?QiM|V~-s5Mq^@#)PU1~siEejj$!#8yBJoRj$>$JSo;K-nBGUmB9^*9 zbAyN&SIQmd0b$$)jPOb!f$fLF*De(xeHfrk3*ughjqYt>Mr*Ie0P2bbK2ie`py$3rL5jPIl4iaA33y4X<6S!V}EMRpP z(R{~ETeHEa{Bc(%?3s(e_TXdvd)V_aVzqG?8HIl zDJGpI=-ShaT?4-oK(&L^@dv%x4#o_CVKL?y& z_XGbdP!Mo&w)^umqsv#pf`#3`qE3ZzSs(@!p2N~G{}O1mkgU2?TW@M+(qLh>d{V=e zma{0(NNFj~Z%NaRCVPGGH~CR+V8lZM(Ke1b$6J~6zTRD(!0bJ)pdQTQE7V4jxz1$` zj%F~wIzM=Ya;>gNgf`VQbx9QPFDoI2lr3IKQTDrPC@0Ye1HI%K`fKsh!^B8knPe4= zneilPD(#2vBCksl+2>h2e}+IFj-4QfNKO;8CLL35HodVeV279Lue3@uD8*ltt0M-) zEDf3X5IP)Sa~<3cQ1alYBaV_8;f2Sz-mN;+2H$PttgY%ZLzf`Xp}i02MT`os>5?nj zJ5UZmI@rX^(kWd`qIyXU>L$S|EAYqf-ss8o&xoVm*W%MI_lk$W(HxxY&-I_oIo6Sk zxu*aRK2fbegK{K|rqmh2QW=*!0jMgBzFMVK8fJMX=3)KfG{ADxXJGC6+mX{}e2xr> zFF6T(9YW{+XF2^QIaR7^B+2*Mn!`%?8s)>^md%#(jA|TV!`lR}Ekflq;dn zw+D!~TE5GJ4fd`GUaPFY)@qV~%ZW~mS0{yJ8Su9Z#BMY|-{_@|yO8e$Y{R7yJ*)6p#;$R+ipV8CgWDJM~UjE}Eno+(VYKT;8>0KO~D# zu?dWKte0=eaONkso`V)8Cd4K9#vRWtId5TuTy(BGBKKU(xRGy0t~qBD5+@XK&>LOt zIQ0RXh8h|0=0o@7y!M#OFnnJkLBGVg$KDB)iIWm|Or4sH@n_Lh^`xxRa+MUiMP*I5 zrljeUW{b1iMty=*u@a^)qY{`-$WWeT$8yWI%KBJ=wyQFEP#Pof^i!NCF=8}zt_h_= zbICe0;j@v8!TT(fLnrsLJ1IdM>ZOZM)2Xh=sv-1I#LW$C<;pLqGY zzWxZoXM{%x%K>CH@|Z!8y#b(I9(zAYpVmtD?zcXZ3m_D#64KfbPb6$T2lzMTar-#> z^ql{cnfJB3O!b%R%l@iI5&UPf`d4Amf7+GOpXEjpU&T9r8dqVGjvTT8O2{?^9%vid zKww^;KOqfyzBeRADIk(eVp%v#=dI-$oJ$SY{DmyRhn%jtVV?Ug{EZmqv@O+M3jA#3 z)K^8tbp7!JNBg#)_Xn6hD7FxWuqOiW2r+%^cl}m8YWR>E2;2+Yp2R4*jGcsXQOj2EzMwKdR3ccCW zl%*l4@~9`^id)MKJ9o)tSDxK5;Qh{h6N-juH<9lr<3$~WEn7maqPJiKnIDqRmxDk7p|luex; z%?icDMLrroP~VCRetNfWLVf#1*)QEzL-qt(4Xv{ens2o#y*}GeHU-QOu=n)Co4Cvr zgSspot?5+ZsL;tG!wgl0rAnStQHfOyUV=gfRZP-AT}BV*$0!rA72?d?AV-pNy#lJL zXkvQFT%*|LdZl-=C#UOsU<7Mw1${0qYG#Zp9wQ8@%zXJsF(pQ{R`HV;1B8iq4tsr9 zayE0*Vq6Duf(v~VA~+K-0qC*9zdcP6)yt>)Sdk#lI+Ap1j@jF~t z;{G8$gnKeV%%#su9kWy}BKpkfZ~4y_BN#|aApPx!9(jZGUW(IO&fO5D&OewEi?MNj z%HcG|`_}HXjq2vv>G7=+ukzL{Kx)#>^U0=wZvC3p$Fo50Hy49J(#~D9fR5|K&_HvJ zQ5LvCu4AYR|0NejgOf)V0*^Rg9EM>x&Kaif28-FB#t*I`DcswHmY{Y6F;k(B&iw2NK)%04 z1FFj!8xU9k06e_^<5lMG=J4MQK@;3tS>=iM*ffDHja!hBATBrGpWu6~ypUZ0Ii&cB zdMYuUfiWYp87W8&m7!j3q>dVFRkgOSI5)f=Z`S+gtj4}XGaOv&B;Oz?V&^5BvQ#yy4b`+hX`)j zM|s4Yqg@GZ4N0W}+p?sh!x_!&?0!^kAzUVwY?3+C;~Si8s?H+`i>^@gn?7sZfn+SY z6bC78?ZINHP^N-@MUTo9#pt1NX5FgWG+eBH5?ft@?nYd!L8`)rF`;~q#vvWijDFwCHI!r-exdw&Bf639 z5hFLsZ++@A-*}v9tI@vUAw1$H4GZ19s(5fyoB9!l;vKq1Kezm1fX|xHyT93gcVR;x zy+$Uym0;sLG|kC)Zu2O~$Z@@AGORY+e9wI6y*`42KfLGlI874!5w%9w_APE1{oqlA zqB40{>h85JBed0{rNd7Mw|Zn>#lu?(cROLYdGr0->6;Fl-*o@>@p7F()AHs!aM~p- z;%}kbp^Uqi_=OL3T)y~Wxx-r~k9X~TJ@*%y&%&YZxtC>W%v^EgL^liKwS(C2SY%np zdRP{gjCo9{ju}xmWBfWJC2$Q57z#y7KbFMOKPKbVy)*C%kHlAEX+@b4Vue2@P04=m zB{9V9Y0YBAfM-N6_NpU1-uLZ_b0ffu_AwM$EH%)~>bI0KV41V75zbD2auOlL{K5u) zL};JHvj=-QZX6=A=`EQBs0~6IqX`Sv%;<+iEq)XlJcy4=WnsdA8#3!B9z<4UYDE*q zf+-4+3NpwqYHXbfOAnIPS_Bs?2cG@ev7TJ@Qlx)DK0h3FlA_#_R+k*47`1rT-nM$o zcRG1}Z4My}JMtU-ueW2ai~5b%q)T^{lv9FUEMSoa@yJPvE$5V}FwwPC1bhpA8*ce- z%#1A@yO8E>dX)l_Ja-gf5GqWpN2-ardyj$BKG?ZuOO!3jO=4clBWH6&CQ@K@bIFvNT{S@t?-+cwY&}}N&q>(v4 zDzkQC{J&M^1}TNxX-NgXqxnK&tm2~3PkuU@3mXgJ`X4}?!q0bPyPg*_*E-5dEvz6h zuT_ZClft6A$pH#OZVs&t$eOy)8}8f5Fk`S0NsD%XdN~w?H}XsU^iAB|HVh_w6eww! zHl!jkd0-#S+I-I=d z^z&Q}Yae=Iv`@Fi>W+?**>_7t!<+OS=C0pDuz(IF3;-Kv2#TDqISKi7f^HGr+%TkI z0+OC4%Hf;VO=CL|DGI!vLgIn|ZUf)M{vq8czpIC5eL8FBAA}kBey!yDp6f@?}UA(*xb%m*aydkOP?@rv^ZPo zt-bCdzIM`R&?QQ@!|z`YFkisz$`Ro(X#JYPPfqS&q9BCubIKOdKf!4H4BsKDlq&rk z$OZ5qtoFr&;l#`HvJR_(=%TlxyMHPg^Y$qoo<1UH>(2cs7`}-L z_*IJbV%9mVN;b-%y`4N}$R}Y1|5A3F%-DeJXmK3CNjvzoTqUl{*;4^e@qITJ&xGtb z4~WjPd8daC*{r*hybsP!VY>5oug{<%zlC2sye0PpuY$#DFFsj(aZP-;Iq?Q3@93Z9 zQ-1s1Oj#S-gXa$rJY~0`oWFy9m(F9q$4~vxOU??0MFMbJkamv~gO0M3>*Gd1J@ zE1(!BdLIdQnC@bdmfC8Am=dneA-Rqku&{6yp?~x7#mM9wsQFK#k2M4xqg#IVD?NSm z9{99!Rn-)^`2~KR!&2{?ma2|2ezhQFg84Ased)Xpag;ET@?K7#DPR^BVKotV1zr|q zwf+TrkoK!Z>J^l*C9LCStXz`qo)3g^Toh_mj(x zyL9ccN<_{qiqUf(AhE)~gO8SE&!FXtUh{xn?xXazmGWI!M6=?0WGrihmYhoN(}bS4 z9nGhMLa%%{cCXL*-0i1(b=Xp4_!OeQS09NH-eTNcrC1VmQOqG=rxp$!mfiw0ogQ(! zBveH#g2*JFlqvg;JF8TYT8>qhC!(I%@IKZa(zAI#Wz!EfFaFx~c6 zZ^X84^VyH*zPWZRd-V5`U2(flY~JmHJ_GAW>u9lEhy@!lw;lAFzV2N zZK%&}Ie8FqR?%oF|!DT%=?H50FR5>5Oz`rvH z#cetLK)3b#9WV~Z>oA;4mNPuZ*RnVG%=z5?d&Tz_QM3Ar-4PrU&aZR3i%rK045++{ z^`;nN9=zK7DQMi5=VgGl_D+Y3nvcwFc~N7|p<;3HEG7mVuj@munRm7PdbKY*XyE0z z#L1;mVG{7M)W7OXxii(fvkJ?&AKP3$T3>&WI9BEkVr-wA8^B>=#J6_JG&puC6)|fC zAvDR-JFH!w=!f`Mi7EWxB9l+lV?H>AHY^oQu+>0CtH93RWL zI@)y>rLO?;U$<-%O&GY8-$as_NcCCZ5g+-idh6PD2O5xPIBzpCA0EvPCA<8BXp(lD zy71X%l22*~Q3Z=efFljqxA*j;y8|nvB?)Mz4lu&tOv2OnwN<(cW2L7;6b~YNFo7y@ zao!a++aMS?Ql|eMzs0bfUm87wSo7yZEmZACc4U1h&J~Vh#pN-{W9{bn0hF$mAaspg z2H~vD(T6U#Ka!I%}@A797H8|vN>>l5VHgFJo6k(j2eVX*N3 z>YU{5Yds8@OODwvtkx%GA~$?}SSWa~wy0~HsyGZ~#KR_`?amz{6EYvBSL_SGAgS`_ zu!R}DywcxUZ=+f6$HJ2Dq^%KdUrSI9v9$V^4t)!C_@@ngn5Eq9==&U;5@F99#mVtc!i5jLF=A7nU92MC zGOMSDm|dNVQsW&dW&amr?-(Rn5M}9B)h*k$ZQHhO+qP}nwr$(4Tej`0ccZ)Ci#Ht; z(-V=u&YyE4<78y!{?=N%q0s}++EoZtbvrG(nRP9&L1c!eQBdze-z&KStv_Xfx+-h+ z^&%D;c#j0P;mz8ZvzxfCi5^E&)$7dG<=(-R322SK2U{k?_C|?cFVDJf_*+dAev+WJ zWdqtr(}=he91G1lZ*@>sO+!-ivl{JF+cEnkA)DED*z;iQ<0Dx%?^vOTK;3R6qIy(+ zyjvzCSM~X()~8?yDSActfE5;MsU*FjId8PGdXH?{MBz2kd7$oBFHLDfSnMbP_%HV? z)ZugQ5^I+9t8pgr6!T@cLAx2Vlw3W?&TuxeA`_NS4a45Bktmy1L3gg-bbzlYGi6v} zVsBDFN>*V4D_PN$AUj0*eYr@j2jW=ggcx*~&(4&VSyyvdQ}0dNlCP$Q9f@cQ1={<& z1WQU*4W}A?t9MgK#LXOF(qax%>`w#-RJwIa+?QVHZ!H%7fr){j{C0q=(H|fh%JMv{PP(ykSLD^SKaw+Y~iphm!j@%xS3+{|j zy6hP)8noTO!gAm8m%F0P@Sm873dhW@U1k>)Wj)LYYg-ZVm8wDiaE>DHiBEw>+*a;O zOJ@oEZFojQqnZGpQwxeeBhX`O<}w?v>kvI!XuyI6n)ImCE-chu(w73d^KN{YLT*bv z!_Ign^YR_cB!nb**7C0^$xU~k^%}3>Jex(f;J#ZHaJg~&GjV#OcBT`&2W2w^dQDtN zDT{~h7ph<%oIC+~skZ_zdo5=<0eW^5PQ{X4~sYg>IPEXvvCaD~6DsM9lW)sTIZDEBfrRxK#Y+}~26wwt! zS252MZB<0zGZ!?@#|)6yh2LWEmCvZ2HweMF`DoY$bcIidJ=Rb;#$Mw@f?eY?J;tC( z+eZy1nu)yuooZ()T8nXaSs}X@i?EY7#Bwea-YN4cYRq24KF*k%pw0@kN+DCH7li@R zT^7a359kLERE!I|ms3}TKq6L~aKEbbNd}ZoKppqiBTi5-`K*+MHO$$q1GiiI`B3H* zI>wZo5bBvAE`1Waf)E$%rsb_Rm!%?4HXpFdG=&pSIv=>EZ@imei64Qoi)SpWXU}pL z)j^kd>HXe8zUFn!tFFWFUJgO|RcA4V1d%)JZSx*1*!D2ljy8!-q3oJ41#AYKHw+tb z=Va(n6K^t(16RUvE{l7o=Hf0D7QLB{TkZ>vTdpF83$PC=#vj@yIn2t=NJFqn%p_Ix zm%N(E^w;(xD4B9i+j}n^HWG)$#$5zkY1d9Ji{MV;u4pmLJ@=}g`x zn{4rN_IMhCMpND9*}t6U-+Y`Gry5t7HzP>m0xt|h-`6vR+X`P?+wWmB`P~9BT#dH= ziaeg-RswD@2iY9#Wl9aOs`*>E25Qv?DAa;fT>(yopU)OrKT+l94Yq8cvt;;+@`Wu! zH0SyPhM5W;7%mlPq?7U64eZd0qf7J^>t)osPcwWPJy}Jg$lw+3rt751nkm;*of_g7&~Ie8x8**#G+f7<<|Q zePg(yQR$tz9}9j&NvzoF@7F!CsTTtvj>KW4+pv7+@CNJpS|9uMdu7DVRsZ}7Pgs6} z+Z;486vHktFG{O@Nfr5J`F_X^%H#q0rgHs6N${1*U5z)PEOihkV&|XJYl=JrW;WDX z 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≻X#Kk;ObdF{!3l79u@A93{fuT76I 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 z zh10`U7aHS|kk*hiP z*G(QbN{h4lR?ilnkD)(HfsUK`QNe2Ga6^n)s-U8tLpi~y1RH z({=aE4dz=qIIwP8^6+JwRP@lL6|8S@5!H>fG+{qt+8#_NT{AAm2pZ@6pB?u=Mg9bc zuu&tg7≺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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common-log-base-starter/pom.xml b/common-log-base-starter/pom.xml new file mode 100644 index 0000000..17188d2 --- /dev/null +++ b/common-log-base-starter/pom.xml @@ -0,0 +1,98 @@ + + + + com.mosty + mosty-common + 1.0.0-SNAPSHOT + + 4.0.0 + + common-log-base-starter + + + 8 + 8 + + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-dependencies.version} + true + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.0 + true + + + org.springframework.boot + spring-boot-starter-aop + ${spring-boot-dependencies.version} + true + + + com.alibaba + fastjson + ${fastjson.version} + + + org.apache.commons + commons-lang3 + 3.12.0 + + + com.google.guava + guava + 29.0-jre + + + com.mosty + common-token-starter + 1.0.0-SNAPSHOT + + + com.mosty + common-base-starter + 1.0.0-SNAPSHOT + + + + + + + + + + + + + + + + + + mosty-nexus-releases + release version + http://47.108.232.77:8181/repository/maven-releases/ + + + mosty-nexus-snapshots + snapshots version + http://47.108.232.77:8181/repository/maven-snapshots/ + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + + \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/BaseController.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/BaseController.java new file mode 100644 index 0000000..322799a --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/BaseController.java @@ -0,0 +1,219 @@ +package com.mosty.operation.log; + +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.time.DateUtils; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; + +import java.beans.PropertyEditorSupport; +import java.text.ParseException; +import java.util.Date; +//import com.github.pagehelper.PageHelper; +//import com.github.pagehelper.PageInfo; +//import com.ruoyi.common.core.domain.AjaxResult; +//import com.ruoyi.common.core.domain.AjaxResult.Type; +//import com.ruoyi.common.core.domain.entity.SysUser; +//import com.ruoyi.common.core.page.PageDomain; +//import com.ruoyi.common.core.page.TableDataInfo; +//import com.ruoyi.common.core.page.TableSupport; +//import com.ruoyi.common.utils.DateUtils; +//import com.ruoyi.common.utils.PageUtils; +//import com.ruoyi.common.utils.ServletUtils; +//import com.ruoyi.common.utils.ShiroUtils; +//import com.ruoyi.common.utils.StringUtils; +//import com.ruoyi.common.utils.sql.SqlUtil; + +/** + * web层通用数据处理 + * + * @author ruoyi + */ +@Slf4j +public class BaseController { + + /** + * 将前台传递过来的日期格式的字符串,自动转化为Date类型 + */ + @InitBinder + public void initBinder(WebDataBinder binder) { + // Date 类型转换 + binder.registerCustomEditor(Date.class, new PropertyEditorSupport() { + @Override + public void setAsText(String text) { + try { + setValue(DateUtils.parseDate(text)); + } catch (ParseException e) { + e.printStackTrace(); + } + } + }); + } + + /** + * 设置请求分页数据 + */ +// protected void startPage() +// { +// PageUtils.startPage(); +// } +// +// /** +// * 设置请求排序数据 +// */ +// protected void startOrderBy() +// { +// PageDomain pageDomain = TableSupport.buildPageRequest(); +// if (StringUtils.isNotEmpty(pageDomain.getOrderBy())) +// { +// String orderBy = SqlUtil.escapeOrderBySql(pageDomain.getOrderBy()); +// PageHelper.orderBy(orderBy); +// } +// } +// +// /** +// * 获取request +// */ +// public HttpServletRequest getRequest() +// { +// return ServletUtils.getRequest(); +// } +// +// /** +// * 获取response +// */ +// public HttpServletResponse getResponse() +// { +// return ServletUtils.getResponse(); +// } +// +// /** +// * 获取session +// */ +// public HttpSession getSession() +// { +// return getRequest().getSession(); +// } +// +// /** +// * 响应请求分页数据 +// */ +// @SuppressWarnings({ "rawtypes", "unchecked" }) +// protected TableDataInfo getDataTable(List list) +// { +// TableDataInfo rspData = new TableDataInfo(); +// rspData.setCode(0); +// rspData.setRows(list); +// rspData.setTotal(new PageInfo(list).getTotal()); +// return rspData; +// } +// +// /** +// * 响应返回结果 +// * +// * @param rows 影响行数 +// * @return 操作结果 +// */ +// protected AjaxResult toAjax(int rows) +// { +// return rows > 0 ? success() : error(); +// } +// +// /** +// * 响应返回结果 +// * +// * @param result 结果 +// * @return 操作结果 +// */ +// protected AjaxResult toAjax(boolean result) +// { +// return result ? success() : error(); +// } +// +// /** +// * 返回成功 +// */ +// public AjaxResult success() +// { +// return AjaxResult.success(); +// } +// +// /** +// * 返回失败消息 +// */ +// public AjaxResult error() +// { +// return AjaxResult.error(); +// } +// +// /** +// * 返回成功消息 +// */ +// public AjaxResult success(String message) +// { +// return AjaxResult.success(message); +// } +// +// /** +// * 返回成功数据 +// */ +// public static AjaxResult success(Object data) +// { +// return AjaxResult.success("操作成功", data); +// } +// +// /** +// * 返回失败消息 +// */ +// public AjaxResult error(String message) +// { +// return AjaxResult.error(message); +// } +// +// /** +// * 返回错误码消息 +// */ +// public AjaxResult error(Type type, String message) +// { +// return new AjaxResult(type, message); +// } +// +// /** +// * 页面跳转 +// */ +// public String redirect(String url) +// { +// return StringUtils.format("redirect:{}", url); +// } +// +// /** +// * 获取用户缓存信息 +// */ +// public SysUser getSysUser() +// { +// return ShiroUtils.getSysUser(); +// } +// +// /** +// * 设置用户缓存信息 +// */ +// public void setSysUser(SysUser user) +// { +// ShiroUtils.setSysUser(user); +// } +// +// /** +// * 获取登录用户id +// */ +// public Long getUserId() +// { +// return getSysUser().getUserId(); +// } +// +// /** +// * 获取登录用户名 +// */ +// public String getLoginName() +// { +// return getSysUser().getLoginName(); +// } +} diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/BusinessStatus.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/BusinessStatus.java new file mode 100644 index 0000000..3eca628 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/BusinessStatus.java @@ -0,0 +1,18 @@ +package com.mosty.operation.log; + +/** + * 操作状态 + * + * @author ruoyi + */ +public enum BusinessStatus { + /** + * 成功 + */ + SUCCESS, + + /** + * 失败 + */ + FAIL, +} diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/LogAspect.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/LogAspect.java new file mode 100644 index 0000000..1d35c30 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/LogAspect.java @@ -0,0 +1,216 @@ +package com.mosty.operation.log; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.support.spring.PropertyPreFilters; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.entity.log.SysOperLog; +import com.mosty.common.base.threadpool.SimpleThreadPool; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.base.util.ServletUtils; +import com.mosty.common.base.util.SpringIocContext; +import com.mosty.common.base.util.StringUtils; +import com.mosty.common.token.JWTUtil; +import com.mosty.common.token.UserInfo; +import com.mosty.operation.log.service.SysOperLogService; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.annotation.AfterReturning; +import org.aspectj.lang.annotation.AfterThrowing; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.annotation.Pointcut; +import org.springframework.stereotype.Component; +import org.springframework.validation.BindingResult; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Collection; +import java.util.Map; + +import static com.mosty.common.base.constant.SystemConfigConstants.TOKEN_HEADER; +import static com.mosty.common.base.entity.log.LogConst.LOG_THREAD_POOL; + + +/** + * 操作日志记录处理 + * + * @author ruoyi + */ +@Slf4j +@Aspect +@Component +public class LogAspect extends LogSaveStrategy { + + // 排除敏感属性字段 + public static final String[] EXCLUDE_PROPERTIES = {"password", "oldPassword", "newPassword", "confirmPassword"}; + + // 配置织入点 + @Pointcut("@annotation(com.mosty.common.base.entity.log.Log)") + public void logPointCut() { + } + + // 处理完请求后执行 + @AfterReturning(pointcut = "@annotation(controllerLog)", returning = "jsonResult") + public void doAfterReturning(JoinPoint joinPoint, Log controllerLog, Object jsonResult) { + handleLog(joinPoint, controllerLog, null, jsonResult); + } + + // 拦截异常操作 + @AfterThrowing(value = "@annotation(controllerLog)", throwing = "e") + public void doAfterThrowing(JoinPoint joinPoint, Log controllerLog, Exception e) { + handleLog(joinPoint, controllerLog, e, null); + } + + protected void handleLog(final JoinPoint joinPoint, Log controllerLog, final Exception e, Object jsonResult) { + try { + String token = ServletUtils.getRequest().getHeader(TOKEN_HEADER); + // 获取当前的用户 从header中获取 + UserInfo userInfo = JWTUtil.getUserInfo(token); + String ipAddress = IpUtil.getIpAddress(ServletUtils.getRequest()); + // *========数据库日志=========*// + SysOperLog operLog = new SysOperLog(); + operLog.setStatus(BusinessStatus.SUCCESS.ordinal()); + // 请求的地址 + operLog.setOperIp(ipAddress); + String url = ServletUtils.getRequest().getRequestURI(); + operLog.setOperUrl(url); + // 添加服务名称 + if (url != null && url.length() >= 11) { + String[] s = url.split("/"); + if (s.length >= 2 && s[1].contains("mosty-")) { + operLog.setMkmc(s[1]); + } + } + if (userInfo != null) { + operLog.setOperName(userInfo.getUserLoginName()); + operLog.setOperUserId(String.valueOf(userInfo.getUserId())); + operLog.setOperSfzh(userInfo.getIdEntityCard()); + if (StringUtils.isNotNull(userInfo.getDeptId()) + && StringUtils.isNotEmpty(userInfo.getDeptName())) { + operLog.setSsbm(userInfo.getDeptName()); + operLog.setSsbmid(String.valueOf(userInfo.getDeptId())); + operLog.setSsbmdm(userInfo.getDeptCode()); + } + } + if (e != null) { + operLog.setStatus(BusinessStatus.FAIL.ordinal()); + operLog.setErrorMsg(StringUtils.substring(e.getMessage(), 0, 2000)); + } + // 设置方法名称 + String className = joinPoint.getTarget().getClass().getName(); + String methodName = joinPoint.getSignature().getName(); + operLog.setMethod(className + "." + methodName + "()"); + // 设置请求方式 + operLog.setRequestMethod(ServletUtils.getRequest().getMethod()); + // 处理设置注解上的参数 + getControllerMethodDescription(joinPoint, controllerLog, operLog, jsonResult); + // 保存数据库 + SimpleThreadPool.execute(LOG_THREAD_POOL, () -> + SpringIocContext.getBean(SysOperLogService.class).insertOperlog(operLog)); + } catch (Exception exp) { + // 记录本地异常日志 + log.error("==前置通知异常=="); + log.error("异常信息:{}", exp.getMessage()); + exp.printStackTrace(); + } + } + + /** + * 获取注解中对方法的描述信息 用于Controller层注解 + * + * @param log 日志 + * @param operLog 操作日志 + * @throws Exception + */ + public void getControllerMethodDescription(JoinPoint joinPoint, Log log, SysOperLog operLog, Object jsonResult) throws Exception { + // 设置action动作 + operLog.setBusinessType(log.businessType().ordinal()); + // 设置标题 + operLog.setTitle(log.title()); + // 设置操作人类别 + operLog.setOperatorType(log.operatorType().ordinal()); + // 是否需要保存request,参数和值 + if (log.isSaveRequestData()) { + // 获取参数的信息,传入到数据库中。 + setRequestValue(joinPoint, operLog); + } + // 是否需要保存response,参数和值 + if (log.isSaveResponseData() && StringUtils.isNotNull(jsonResult)) { + operLog.setJsonResult(StringUtils.substring(JSONObject.toJSONString(jsonResult), 0, 2000)); + } + } + + /** + * 获取请求的参数,放到log中 + * + * @param operLog 操作日志 + * @throws Exception 异常 + */ + private void setRequestValue(JoinPoint joinPoint, SysOperLog operLog) throws Exception { + Map map = ServletUtils.getRequest().getParameterMap(); + if (StringUtils.isNotEmpty(map)) { + String params = JSONObject.toJSONString(map, excludePropertyPreFilter()); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } else { + Object args = joinPoint.getArgs(); + if (StringUtils.isNotNull(args)) { + String params = argsArrayToString(joinPoint.getArgs()); + operLog.setOperParam(StringUtils.substring(params, 0, 2000)); + } + } + } + + /** + * 忽略敏感属性 + */ + public PropertyPreFilters.MySimplePropertyPreFilter excludePropertyPreFilter() { + return new PropertyPreFilters().addFilter().addExcludes(EXCLUDE_PROPERTIES); + } + + /** + * 参数拼装 + */ + private String argsArrayToString(Object[] paramsArray) { + StringBuilder params = new StringBuilder(); + if (paramsArray != null && paramsArray.length > 0) { + for (Object o : paramsArray) { + if (StringUtils.isNotNull(o) && !isFilterObject(o)) { + try { + Object jsonObj = JSONObject.toJSONString(o, excludePropertyPreFilter()); + params.append(jsonObj.toString()).append(" "); + } catch (Exception e) { + e.printStackTrace(); + } + } + } + } + return params.toString().trim(); + } + + /** + * 判断是否需要过滤的对象。 + * + * @param o 对象信息。 + * @return 如果是需要过滤的对象,则返回true;否则返回false。 + */ + @SuppressWarnings("rawtypes") + public boolean isFilterObject(final Object o) { + Class clazz = o.getClass(); + if (clazz.isArray()) { + return clazz.getComponentType().isAssignableFrom(MultipartFile.class); + } else if (Collection.class.isAssignableFrom(clazz)) { + Collection collection = (Collection) o; + for (Object value : collection) { + return value instanceof MultipartFile; + } + } else if (Map.class.isAssignableFrom(clazz)) { + Map map = (Map) o; + for (Object value : map.entrySet()) { + Map.Entry entry = (Map.Entry) value; + return entry.getValue() instanceof MultipartFile; + } + } + return o instanceof MultipartFile || o instanceof HttpServletRequest || o instanceof HttpServletResponse + || o instanceof BindingResult; + } +} diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/LogSaveStrategy.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/LogSaveStrategy.java new file mode 100644 index 0000000..2127597 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/LogSaveStrategy.java @@ -0,0 +1,42 @@ +package com.mosty.operation.log; + +import com.google.common.collect.Sets; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.lang.NonNull; + +import java.util.Collections; +import java.util.Set; + +public class LogSaveStrategy implements ApplicationContextAware { + + @Value("${spring.application.name}") + private String applicationName; + + /** ioc 容器 */ + private static ApplicationContext applicationContext; + + private static final Set NATIVE_APP_NAME = Collections.unmodifiableSet(Sets.newHashSet("mosty", "mosty-base")); + +// private final FeignClient; + + + private Boolean nativeInvoke() { + return NATIVE_APP_NAME.contains(applicationName); + } + + @Override + public void setApplicationContext(@NonNull ApplicationContext applicationContext) throws BeansException { + LogSaveStrategy.applicationContext = applicationContext; + } + + protected void saveOperationLog() { + if (nativeInvoke()) { + + } +// remoteFeign(); + } + +} diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/OperationLogBaseAutoConfiguration.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/OperationLogBaseAutoConfiguration.java new file mode 100644 index 0000000..5778d62 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/OperationLogBaseAutoConfiguration.java @@ -0,0 +1,18 @@ +package com.mosty.operation.log; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; + +/** + * 代码生成自动装配 + * @author kevin + * @date 2022/2/3 3:34 PM + * @since 1.0.0 + */ +@Configuration +@ComponentScan(basePackages = "com.mosty.operation") +@MapperScan("com.mosty.operation.log.mapper") +public class OperationLogBaseAutoConfiguration { + +} diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/controller/SysOperlogController.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/controller/SysOperlogController.java new file mode 100644 index 0000000..f731296 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/controller/SysOperlogController.java @@ -0,0 +1,118 @@ +package com.mosty.operation.log.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.entity.log.SysOperLog; +import com.mosty.common.token.JwtSysUser; +import com.mosty.operation.log.BaseController; +import com.mosty.operation.log.entity.DeleteListVO; +import com.mosty.operation.log.entity.VO.OperlogPage; +import com.mosty.operation.log.service.SysOperLogService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * 操作日志记录 + * + * @author ruoyi + */ +@RestController +@AllArgsConstructor +@Api(tags = "操作日志") +@RequestMapping("/monitor/operlog") +public class SysOperlogController { + + + private final SysOperLogService operLogService; + + + @PostMapping("/list") + @ApiOperation("查询操作日志列表") + @Log(title = "查询操作日志详情", businessType = BusinessType.OTHER) + public ResponseResult> list(@RequestBody OperlogPage operLog) { + IPage sysOperLogPage = operLogService.selectByPage(operLog); + return ResponseResult.success(sysOperLogPage); + } + + + @Log(title = "删除操作日志", businessType = BusinessType.DELETE) + @ApiOperation("查询操作日志详情") + @PostMapping("/remove") + public ResponseResult remove(@RequestBody DeleteListVO deleteListVO) { + operLogService.deleteOperLogByIds(deleteListVO.getIds()); + return ResponseResult.success(Boolean.TRUE); + } + + @ApiOperation("查询操作日志详情") + @Log(title = "查询操作日志详情", businessType = BusinessType.OTHER) + @GetMapping("/detail/{id}") + public ResponseResult detail(@PathVariable("id") Long id) { + SysOperLog log = operLogService.getOne(new LambdaQueryWrapper() + .eq(SysOperLog::getOperId, id)); + return ResponseResult.success(log); + } + + @Log(title = "清空操作日志", businessType = BusinessType.CLEAN) + @ApiOperation("清空操作日志") + @PostMapping("/clean") + public ResponseResult clean() { + operLogService.cleanOperLog(); + return ResponseResult.success(Boolean.TRUE); + } + + @Log(title = "系统使用情况统计数字", businessType = BusinessType.OTHER) + @ApiOperation("系统使用情况统计数字") + @JwtSysUser + @PostMapping("/statistics") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "1.今天 2.7天 3.30天 4.90天", required = true, dataType = "String"), + }) + public ResponseResult> statistics(String type) { + return ResponseResult.success(operLogService.statistics(type)); + } + + @Log(title = "部门排名统计TOP10", businessType = BusinessType.OTHER) + @ApiOperation("部门排名统计TOP10") + @JwtSysUser + @PostMapping("/bmStatistics") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "1.今天 2.7天 3.30天 4.90天", required = true, dataType = "String"), + }) + public ResponseResult>> bmStatistics(String type) { + return ResponseResult.success(operLogService.bmStatistics(type)); + } + + @Log(title = "人员排名统计TOP10", businessType = BusinessType.OTHER) + @ApiOperation("人员排名统计TOP10") + @JwtSysUser + @PostMapping("/ryStatistics") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "1.今天 2.7天 3.30天 4.90天", required = true, dataType = "String"), + }) + public ResponseResult>> ryStatistics(String type) { + return ResponseResult.success(operLogService.ryStatistics(type)); + } + + @Log(title = "模块排名统计", businessType = BusinessType.OTHER) + @ApiOperation("模块排名统计") + @JwtSysUser + @PostMapping("/mkStatistics") + @ApiImplicitParams({ + @ApiImplicitParam(name = "type", value = "1.今天 2.7天 3.30天 4.90天", required = true, dataType = "String"), + }) + public ResponseResult>> mkStatistics(String type) { + return ResponseResult.success(operLogService.mkStatistics(type)); + } +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/controller/provider/SysOperlogProviderController.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/controller/provider/SysOperlogProviderController.java new file mode 100644 index 0000000..2ed997f --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/controller/provider/SysOperlogProviderController.java @@ -0,0 +1,38 @@ +package com.mosty.operation.log.controller.provider; + +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.SysOperLog; +import com.mosty.operation.log.BaseController; +import com.mosty.operation.log.service.SysOperLogService; +import io.swagger.annotations.Api; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +/** + * 操作日志记录 + * + * @author ruoyi + */ +@RestController +@Api(tags = "操作日志 for Feign调用") +@RequestMapping("/provider/monitor/operateLog") +public class SysOperlogProviderController extends BaseController { + + private String prefix = "monitor/operlog"; + + @Autowired + private SysOperLogService operLogService; + + // 添加操作日志 + @PostMapping("/save") + public ResponseResult save(@RequestBody SysOperLog sysOperLog) { + operLogService.insertOperlog(sysOperLog); + return ResponseResult.success(); + } + + @GetMapping() + public String operlog(){ + return prefix + "/operlog"; + } +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/BaseEntity.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/BaseEntity.java new file mode 100644 index 0000000..3e46bfb --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/BaseEntity.java @@ -0,0 +1,115 @@ +package com.mosty.operation.log.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +/** + * Entity基类 + * + * @author ruoyi + */ +public class BaseEntity implements Serializable +{ + private static final long serialVersionUID = 1L; + + /** 搜索值 */ + private String searchValue; + + /** 创建者 */ + private String createBy; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + /** 更新者 */ + private String updateBy; + + /** 更新时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + /** 备注 */ + private String remark; + + /** 请求参数 */ + private Map params; + + public String getSearchValue() + { + return searchValue; + } + + public void setSearchValue(String searchValue) + { + this.searchValue = searchValue; + } + + public String getCreateBy() + { + return createBy; + } + + public void setCreateBy(String createBy) + { + this.createBy = createBy; + } + + public Date getCreateTime() + { + return createTime; + } + + public void setCreateTime(Date createTime) + { + this.createTime = createTime; + } + + public String getUpdateBy() + { + return updateBy; + } + + public void setUpdateBy(String updateBy) + { + this.updateBy = updateBy; + } + + public Date getUpdateTime() + { + return updateTime; + } + + public void setUpdateTime(Date updateTime) + { + this.updateTime = updateTime; + } + + public String getRemark() + { + return remark; + } + + public void setRemark(String remark) + { + this.remark = remark; + } + + public Map getParams() + { + if (params == null) + { + params = new HashMap<>(); + } + return params; + } + + public void setParams(Map params) + { + this.params = params; + } +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/DeleteListVO.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/DeleteListVO.java new file mode 100644 index 0000000..c52d549 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/DeleteListVO.java @@ -0,0 +1,20 @@ +package com.mosty.operation.log.entity; + +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +import java.util.List; + +@Data +@EqualsAndHashCode(callSuper = false) +@Accessors(chain = true) +@ApiModel(value="DeleteListVO", description="DeleteList批量") +public class DeleteListVO { + /** + * ID集合 + */ + private List ids; +} diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/Excel.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/Excel.java new file mode 100644 index 0000000..0666716 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/Excel.java @@ -0,0 +1,175 @@ +package com.mosty.operation.log.entity; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.math.BigDecimal; + +/** + * 自定义导出Excel数据注解 + * + * @author ruoyi + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface Excel +{ + /** + * 导出时在excel中排序 + */ + public int sort() default Integer.MAX_VALUE; + + /** + * 导出到Excel中的名字. + */ + public String name() default ""; + + /** + * 日期格式, 如: yyyy-MM-dd + */ + public String dateFormat() default ""; + + /** + * 如果是字典类型,请设置字典的type值 (如: sys_user_sex) + */ + public String dictType() default ""; + + /** + * 读取内容转表达式 (如: 0=男,1=女,2=未知) + */ + public String readConverterExp() default ""; + + /** + * 分隔符,读取字符串组内容 + */ + public String separator() default ","; + + /** + * BigDecimal 精度 默认:-1(默认不开启BigDecimal格式化) + */ + public int scale() default -1; + + /** + * BigDecimal 舍入规则 默认:BigDecimal.ROUND_HALF_EVEN + */ + public int roundingMode() default BigDecimal.ROUND_HALF_EVEN; + + /** + * 导出类型(0数字 1字符串) + */ + public ColumnType cellType() default ColumnType.STRING; + + /** + * 导出时在excel中每个列的高度 单位为字符 + */ + public double height() default 14; + + /** + * 导出时在excel中每个列的宽 单位为字符 + */ + public double width() default 16; + + /** + * 文字后缀,如% 90 变成90% + */ + public String suffix() default ""; + + /** + * 当值为空时,字段的默认值 + */ + public String defaultValue() default ""; + + /** + * 提示信息 + */ + public String prompt() default ""; + + /** + * 设置只能选择不能输入的列内容. + */ + public String[] combo() default {}; + + /** + * 是否导出数据,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写. + */ + public boolean isExport() default true; + + /** + * 另一个类中的属性名称,支持多级获取,以小数点隔开 + */ + public String targetAttr() default ""; + + /** + * 是否自动统计数据,在最后追加一行统计数据总和 + */ + public boolean isStatistics() default false; + + /** + * 导出字段对齐方式(0:默认;1:靠左;2:居中;3:靠右) + */ + public Align align() default Align.AUTO; + + /** + * 自定义数据处理器 + */ + public Class handler() default ExcelHandlerAdapter.class; + + /** + * 自定义数据处理器参数 + */ + public String[] args() default {}; + + public enum Align + { + AUTO(0), LEFT(1), CENTER(2), RIGHT(3); + private final int value; + + Align(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + /** + * 字段类型(0:导出导入;1:仅导出;2:仅导入) + */ + Type type() default Type.ALL; + + public enum Type + { + ALL(0), EXPORT(1), IMPORT(2); + private final int value; + + Type(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } + + public enum ColumnType + { + NUMERIC(0), STRING(1), IMAGE(2); + private final int value; + + ColumnType(int value) + { + this.value = value; + } + + public int value() + { + return this.value; + } + } +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/ExcelHandlerAdapter.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/ExcelHandlerAdapter.java new file mode 100644 index 0000000..3e868e0 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/ExcelHandlerAdapter.java @@ -0,0 +1,19 @@ +package com.mosty.operation.log.entity; + +/** + * Excel数据格式处理适配器 + * + * @author ruoyi + */ +public interface ExcelHandlerAdapter +{ + /** + * 格式化 + * + * @param value 单元格数据值 + * @param args excel注解args参数组 + * + * @return 处理后的值 + */ + Object format(Object value, String[] args); +} diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/Excels.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/Excels.java new file mode 100644 index 0000000..a91694b --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/Excels.java @@ -0,0 +1,18 @@ +package com.mosty.operation.log.entity; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * Excel注解集 + * + * @author ruoyi + */ +@Target(ElementType.FIELD) +@Retention(RetentionPolicy.RUNTIME) +public @interface Excels +{ + Excel[] value(); +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/SysUser.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/SysUser.java new file mode 100644 index 0000000..197b694 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/SysUser.java @@ -0,0 +1,377 @@ +package com.mosty.operation.log.entity; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import java.util.Date; + +/** + * 用户对象 sys_user + * + * @author ruoyi + */ +public class SysUser extends BaseEntity +{ + private static final long serialVersionUID = 1L; + + /** 用户ID */ + @Excel(name = "用户序号", cellType = Excel.ColumnType.NUMERIC, prompt = "用户编号") + private Long userId; + + /** 部门ID */ + @Excel(name = "部门编号", type = Excel.Type.IMPORT) + private Long deptId; + + /** 部门父ID */ + private Long parentId; + + /** 角色ID */ + private Long roleId; + + /** 登录名称 */ + @Excel(name = "登录名称") + private String loginName; + + /** 用户名称 */ + @Excel(name = "用户名称") + private String userName; + + /** 用户类型 */ + private String userType; + + /** 用户邮箱 */ + @Excel(name = "用户邮箱") + private String email; + + /** 手机号码 */ + @Excel(name = "手机号码") + private String phonenumber; + + /** 用户性别 */ + @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知") + private String sex; + + /** 用户头像 */ + private String avatar; + + /** 密码 */ + private String password; + + /** 盐加密 */ + private String salt; + + /** 帐号状态(0正常 1停用) */ + @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用") + private String status; + + /** 删除标志(0代表存在 2代表删除) */ + private String delFlag; + + /** 最后登录IP */ + @Excel(name = "最后登录IP", type = Excel.Type.EXPORT) + private String loginIp; + + /** 最后登录时间 */ + @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Excel.Type.EXPORT) + private Date loginDate; + + /** 密码最后更新时间 */ + private Date pwdUpdateDate; + + /** 部门对象 */ + @Excels({ + @Excel(name = "部门名称", targetAttr = "deptName", type = Excel.Type.EXPORT), + @Excel(name = "部门负责人", targetAttr = "leader", type = Excel.Type.EXPORT) + }) +// private SysDept dept; +// +// private List roles; + + /** 角色组 */ + private Long[] roleIds; + + /** 岗位组 */ + private Long[] postIds; + + public SysUser() + { + + } + + public SysUser(Long userId) + { + this.userId = userId; + } + + public Long getUserId() + { + return userId; + } + + public void setUserId(Long userId) + { + this.userId = userId; + } + + public boolean isAdmin() + { + return isAdmin(this.userId); + } + + public static boolean isAdmin(Long userId) + { + return userId != null && 1L == userId; + } + + public Long getDeptId() + { + return deptId; + } + + public void setDeptId(Long deptId) + { + this.deptId = deptId; + } + + public Long getParentId() + { + return parentId; + } + + public void setParentId(Long parentId) + { + this.parentId = parentId; + } + + public Long getRoleId() + { + return roleId; + } + + public void setRoleId(Long roleId) + { + this.roleId = roleId; + } + +// @Xss(message = "登录账号不能包含脚本字符") +// @NotBlank(message = "登录账号不能为空") +// @Size(min = 0, max = 30, message = "登录账号长度不能超过30个字符") + public String getLoginName() + { + return loginName; + } + + public void setLoginName(String loginName) + { + this.loginName = loginName; + } + +// @Xss(message = "用户昵称不能包含脚本字符") +// @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符") + public String getUserName() + { + return userName; + } + + public void setUserName(String userName) + { + this.userName = userName; + } + + public String getUserType() + { + return userType; + } + + public void setUserType(String userType) + { + this.userType = userType; + } + +// @Email(message = "邮箱格式不正确") +// @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符") + public String getEmail() + { + return email; + } + + public void setEmail(String email) + { + this.email = email; + } + +// @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符") + public String getPhonenumber() + { + return phonenumber; + } + + public void setPhonenumber(String phonenumber) + { + this.phonenumber = phonenumber; + } + + public String getSex() + { + return sex; + } + + public void setSex(String sex) + { + this.sex = sex; + } + + public String getAvatar() + { + return avatar; + } + + public void setAvatar(String avatar) + { + this.avatar = avatar; + } + + @JsonIgnore + public String getPassword() + { + return password; + } + + public void setPassword(String password) + { + this.password = password; + } + + public String getSalt() + { + return salt; + } + + public void setSalt(String salt) + { + this.salt = salt; + } + + public String getStatus() + { + return status; + } + + public void setStatus(String status) + { + this.status = status; + } + + public String getDelFlag() + { + return delFlag; + } + + public void setDelFlag(String delFlag) + { + this.delFlag = delFlag; + } + + public String getLoginIp() + { + return loginIp; + } + + public void setLoginIp(String loginIp) + { + this.loginIp = loginIp; + } + + public Date getLoginDate() + { + return loginDate; + } + + public void setLoginDate(Date loginDate) + { + this.loginDate = loginDate; + } + + public Date getPwdUpdateDate() + { + return pwdUpdateDate; + } + + public void setPwdUpdateDate(Date pwdUpdateDate) + { + this.pwdUpdateDate = pwdUpdateDate; + } + +// public SysDept getDept() +// { +// if (dept == null) +// { +// dept = new SysDept(); +// } +// return dept; +// } +// +// public void setDept(SysDept dept) +// { +// this.dept = dept; +// } +// +// public List getRoles() +// { +// return roles; +// } +// +// public void setRoles(List roles) +// { +// this.roles = roles; +// } + + public Long[] getRoleIds() + { + return roleIds; + } + + public void setRoleIds(Long[] roleIds) + { + this.roleIds = roleIds; + } + + public Long[] getPostIds() + { + return postIds; + } + + public void setPostIds(Long[] postIds) + { + this.postIds = postIds; + } + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("userId", getUserId()) + .append("deptId", getDeptId()) + .append("loginName", getLoginName()) + .append("userName", getUserName()) + .append("userType", getUserType()) + .append("email", getEmail()) + .append("phonenumber", getPhonenumber()) + .append("sex", getSex()) + .append("avatar", getAvatar()) + .append("password", getPassword()) + .append("salt", getSalt()) + .append("status", getStatus()) + .append("delFlag", getDelFlag()) + .append("loginIp", getLoginIp()) + .append("loginDate", getLoginDate()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .append("remark", getRemark()) +// .append("dept", getDept()) +// .append("roles", getRoles()) + .toString(); + } +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/VO/OperlogPage.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/VO/OperlogPage.java new file mode 100644 index 0000000..4f92d5c --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/entity/VO/OperlogPage.java @@ -0,0 +1,42 @@ +package com.mosty.operation.log.entity.VO; + +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.mosty.common.base.entity.log.Excel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class OperlogPage extends Page { + + /** + * 操作模块 + */ + @ApiModelProperty(value = "操作模块") + private String title; + + /** + * 操作人员 + */ + @ApiModelProperty(value = "操作人员") + private String operName; + + /** + * 业务类型(0其它 1新增 2修改 3删除) + */ + @ApiModelProperty(value = "0=其它,1=新增,2=修改,3=删除,4=授权,5=导出,6=导入,7=强退,8=生成代码,9=清空数据") + private Integer businessType; + + /** + * 操作状态(0正常 1异常) + */ + @ApiModelProperty(value = "状态 0=正常,1=异常") + private Integer status; + + + +} + diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/mapper/SysOperLogMapper.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/mapper/SysOperLogMapper.java new file mode 100644 index 0000000..708e79a --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/mapper/SysOperLogMapper.java @@ -0,0 +1,61 @@ +package com.mosty.operation.log.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.base.entity.log.SysOperLog; +import org.apache.ibatis.annotations.Param; + +import java.util.List; +import java.util.Map; +import java.util.Objects; + +/** + * 操作日志 数据层 + * + * @author ruoyi + */ +public interface SysOperLogMapper extends BaseMapper { + + // 新增操作日志 + void insertOperlog(SysOperLog operLog); + + // 查询系统操作日志集合 + List selectOperLogList(SysOperLog operLog); + + // 批量删除系统操作日志 + int deleteOperLogByIds(String[] ids); + + // 查询操作日志详细 + SysOperLog selectOperLogById(Long operId); + + // 清空操作日志 + void cleanOperLog(); + + // 查询使用次数 + int getSycs(@Param("kssj") String kssj, + @Param("jssj") String jssj, + @Param("useSql") String useSql, + @Param("status") String status); + + // 查询访问人数 + int getFwrs(@Param("kssj") String kssj, + @Param("jssj") String jssj, + @Param("useSql") String useSql); + + // 部门排名统计 + List> bmStatistics(@Param("kssj") String kssj, + @Param("jssj") String jssj, + @Param("aUseSql") String aUseSql, + @Param("bUseSql") String bUseSql); + + // 人员排名统计 + List> ryStatistics(@Param("kssj") String kssj, + @Param("jssj") String jssj, + @Param("aUseSql") String aUseSql, + @Param("bUseSql") String bUseSql); + + // 模块排名统计 + List> mkStatistics(@Param("kssj") String kssj, + @Param("jssj") String jssj, + @Param("aUseSql") String aUseSql, + @Param("bUseSql") String bUseSql); +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/service/SysOperLogService.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/service/SysOperLogService.java new file mode 100644 index 0000000..69be0f7 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/service/SysOperLogService.java @@ -0,0 +1,53 @@ +package com.mosty.operation.log.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.base.entity.log.SysOperLog; +import com.mosty.operation.log.entity.VO.OperlogPage; +import com.mosty.operation.log.mapper.SysOperLogMapper; +import com.mosty.operation.log.util.Convert; +import io.swagger.annotations.ApiOperation; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * 操作日志 服务层处理 + * + * @author ruoyi + */ +@Service +public interface SysOperLogService extends IService { + + // 新增操作日志 + void insertOperlog(SysOperLog operLog); + + // 查询系统操作日志集合 + List selectOperLogList(SysOperLog operLog); + + // 批量删除系统操作日志 + void deleteOperLogByIds(List ids); + + // 查询操作日志详细 + SysOperLog selectOperLogById(Long operId); + + // 清空操作日志 + void cleanOperLog(); + + //分页查询 + IPage selectByPage(OperlogPage operLog); + + // 系统使用情况统计数字 + Map statistics(String type); + + // 部门排名统计TOP10 + List> bmStatistics(String type); + + // 人员排名统计TOP10 + List> ryStatistics(String type); + + // 模块排名统计 + List> mkStatistics(String type); +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/service/impl/SysOperLogServiceImpl.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/service/impl/SysOperLogServiceImpl.java new file mode 100644 index 0000000..229eb6d --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/service/impl/SysOperLogServiceImpl.java @@ -0,0 +1,173 @@ +package com.mosty.operation.log.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.base.entity.log.SysOperLog; +import com.mosty.common.base.util.DateUtils; +import com.mosty.common.token.UserInfo; +import com.mosty.common.token.UserInfoManager; +import com.mosty.common.util.PermissionsUtil; +import com.mosty.operation.log.entity.VO.OperlogPage; +import com.mosty.operation.log.mapper.SysOperLogMapper; +import com.mosty.operation.log.service.SysOperLogService; +import com.mosty.operation.log.util.Convert; +import org.apache.catalina.User; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; + +/** + * 操作日志 服务层处理 + */ + +@Service +public class SysOperLogServiceImpl extends ServiceImpl + implements SysOperLogService { + + @Resource + private SysOperLogMapper operLogMapper; + + // 新增操作日志 + @Override + public void insertOperlog(SysOperLog operLog) { + if (operLog.getOperTime() == null) { + operLog.setOperTime(new Date()); + } + operLogMapper.insertOperlog(operLog); + } + + // 查询系统操作日志集合 + @Override + public List selectOperLogList(SysOperLog operLog) { + return operLogMapper.selectOperLogList(operLog); + } + + // 批量删除系统操作日志 + @Override + public void deleteOperLogByIds(List ids) { + operLogMapper.delete(new LambdaQueryWrapper() + .in(SysOperLog::getOperId, ids)); + } + + // 查询操作日志详细 + @Override + public SysOperLog selectOperLogById(Long operId) { + return operLogMapper.selectOperLogById(operId); + } + + // 清空操作日志 + @Override + public void cleanOperLog() { + operLogMapper.cleanOperLog(); + } + + @Override + public IPage selectByPage(OperlogPage dto) { + LambdaQueryWrapper qw = new LambdaQueryWrapper<>(); + qw.like(StringUtils.isNotBlank(dto.getTitle()), SysOperLog::getTitle, dto.getTitle()) + .like(StringUtils.isNotBlank(dto.getOperName()), SysOperLog::getOperName, dto.getOperName()) + .eq(Objects.nonNull(dto.getBusinessType()), SysOperLog::getBusinessType, dto.getBusinessType()) + .eq(Objects.nonNull(dto.getStatus()), SysOperLog::getStatus, dto.getStatus()) + .orderByDesc(SysOperLog::getOperId); + return operLogMapper.selectPage(dto, qw); + } + + @Override + public Map statistics(String type) { + UserInfo user = UserInfoManager.get(); + String useSql = PermissionsUtil.createSql("", user); + String kssj = null, jssj; + jssj = DateUtils.getTime(); + if ("1".equals(type)) { + kssj = DateUtils.getDate() + " 00:00:00"; + } else if ("2".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -8)); + } else if ("3".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -31)); + } else if ("4".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -90)); + } + Map map = new HashMap<>(); + // 请求成功次数 + map.put("qqcgcs", this.operLogMapper.getSycs(kssj, jssj, useSql, "0")); + // 请求失败次数 + map.put("qqsbcs", this.operLogMapper.getSycs(kssj, jssj, useSql, "1")); + // 访问人数 + map.put("fwrs", this.operLogMapper.getFwrs(kssj, jssj, useSql)); + return map; + } + + @Override + public List> bmStatistics(String type) { + UserInfo user = UserInfoManager.get(); + String aUseSql = PermissionsUtil.createSql("a", user); + String bUseSql = PermissionsUtil.createSql("b", user); + String kssj = null, jssj; + jssj = DateUtils.getTime(); + if ("1".equals(type)) { + kssj = DateUtils.getDate() + " 00:00:00"; + } else if ("2".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -8)); + } else if ("3".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -31)); + } else if ("4".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -90)); + } + return this.baseMapper.bmStatistics(kssj, jssj, aUseSql, bUseSql); + } + + @Override + public List> ryStatistics(String type) { + UserInfo user = UserInfoManager.get(); + String aUseSql = PermissionsUtil.createSql("a", user); + String bUseSql = PermissionsUtil.createSql("b", user); + String kssj = null, jssj; + jssj = DateUtils.getTime(); + if ("1".equals(type)) { + kssj = DateUtils.getDate() + " 00:00:00"; + } else if ("2".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -8)); + } else if ("3".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -31)); + } else if ("4".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -90)); + } + return this.baseMapper.ryStatistics(kssj, jssj, aUseSql, bUseSql); + } + + @Override + public List> mkStatistics(String type) { + UserInfo user = UserInfoManager.get(); + String aUseSql = PermissionsUtil.createSql("a", user); + String bUseSql = PermissionsUtil.createSql("b", user); + String kssj = null, jssj; + jssj = DateUtils.getTime(); + if ("1".equals(type)) { + kssj = DateUtils.getDate() + " 00:00:00"; + } else if ("2".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -8)); + } else if ("3".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -31)); + } else if ("4".equals(type)) { + kssj = DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", + DateUtils.getNextDate(new Date(), "D", -90)); + } + return this.baseMapper.mkStatistics(kssj, jssj, aUseSql, bUseSql); + } +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/util/Convert.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/util/Convert.java new file mode 100644 index 0000000..a01e521 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/util/Convert.java @@ -0,0 +1,854 @@ +package com.mosty.operation.log.util; + +import org.apache.commons.lang3.ArrayUtils; + +import java.math.BigDecimal; +import java.math.BigInteger; +import java.nio.ByteBuffer; +import java.nio.charset.Charset; +import java.text.NumberFormat; +import java.util.Set; + +/** + * 类型转换器 + * + * @author ruoyi + */ +public class Convert { + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static String toStr(Object value, String defaultValue) { + if (null == value) { + return defaultValue; + } + if (value instanceof String) { + return (String) value; + } + return value.toString(); + } + + /** + * 转换为字符串
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static String toStr(Object value) { + return toStr(value, null); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Character toChar(Object value, Character defaultValue) { + if (null == value) { + return defaultValue; + } + if (value instanceof Character) { + return (Character) value; + } + + final String valueStr = toStr(value, null); + return StringUtils.isEmpty(valueStr) ? defaultValue : valueStr.charAt(0); + } + + /** + * 转换为字符
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Character toChar(Object value) { + return toChar(value, null); + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Byte toByte(Object value, Byte defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Byte) { + return (Byte) value; + } + if (value instanceof Number) { + return ((Number) value).byteValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Byte.parseByte(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为byte
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Byte toByte(Object value) { + return toByte(value, null); + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Short toShort(Object value, Short defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Short) { + return (Short) value; + } + if (value instanceof Number) { + return ((Number) value).shortValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Short.parseShort(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Short
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Short toShort(Object value) { + return toShort(value, null); + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Number toNumber(Object value, Number defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Number) { + return (Number) value; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return NumberFormat.getInstance().parse(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Number
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Number toNumber(Object value) { + return toNumber(value, null); + } + + /** + * 转换为int
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Integer toInt(Object value, Integer defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Integer) { + return (Integer) value; + } + if (value instanceof Number) { + return ((Number) value).intValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Integer.parseInt(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为int
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Integer toInt(Object value) { + return toInt(value, null); + } + + /** + * 转换为Integer数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String str) { + return toIntArray(",", str); + } + + /** + * 转换为Long数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String str) { + return toLongArray(",", str); + } + + /** + * 转换为Integer数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static Integer[] toIntArray(String split, String str) { + if (StringUtils.isEmpty(str)) { + return new Integer[]{}; + } + String[] arr = str.split(split); + final Integer[] ints = new Integer[arr.length]; + for (int i = 0; i < arr.length; i++) { + final Integer v = toInt(arr[i], 0); + ints[i] = v; + } + return ints; + } + + /** + * 转换为Long数组
+ * + * @param split 分隔符 + * @param str 被转换的值 + * @return 结果 + */ + public static Long[] toLongArray(String split, String str) { + if (StringUtils.isEmpty(str)) { + return new Long[]{}; + } + String[] arr = str.split(split); + final Long[] longs = new Long[arr.length]; + for (int i = 0; i < arr.length; i++) { + final Long v = toLong(arr[i], null); + longs[i] = v; + } + return longs; + } + + /** + * 转换为String数组
+ * + * @param str 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String str) { + return toStrArray(",", str); + } + + /** + * 转换为String数组
+ * + * @param split 分隔符 + * @param split 被转换的值 + * @return 结果 + */ + public static String[] toStrArray(String split, String str) { + return str.split(split); + } + + /** + * 转换为long
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Long toLong(Object value, Long defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Long) { + return (Long) value; + } + if (value instanceof Number) { + return ((Number) value).longValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).longValue(); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为long
+ * 如果给定的值为null,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Long toLong(Object value) { + return toLong(value, null); + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Double toDouble(Object value, Double defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Double) { + return (Double) value; + } + if (value instanceof Number) { + return ((Number) value).doubleValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + // 支持科学计数法 + return new BigDecimal(valueStr.trim()).doubleValue(); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为double
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Double toDouble(Object value) { + return toDouble(value, null); + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Float toFloat(Object value, Float defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Float) { + return (Float) value; + } + if (value instanceof Number) { + return ((Number) value).floatValue(); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Float.parseFloat(valueStr.trim()); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Float
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Float toFloat(Object value) { + return toFloat(value, null); + } + + /** + * 转换为boolean
+ * String支持的值为:true、false、yes、ok、no,1,0 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static Boolean toBool(Object value, Boolean defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof Boolean) { + return (Boolean) value; + } + String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + valueStr = valueStr.trim().toLowerCase(); + switch (valueStr) { + case "true": + return true; + case "false": + return false; + case "yes": + return true; + case "ok": + return true; + case "no": + return false; + case "1": + return true; + case "0": + return false; + default: + return defaultValue; + } + } + + /** + * 转换为boolean
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static Boolean toBool(Object value) { + return toBool(value, null); + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * + * @param clazz Enum的Class + * @param value 值 + * @param defaultValue 默认值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value, E defaultValue) { + if (value == null) { + return defaultValue; + } + if (clazz.isAssignableFrom(value.getClass())) { + @SuppressWarnings("unchecked") + E myE = (E) value; + return myE; + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return Enum.valueOf(clazz, valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为Enum对象
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * + * @param clazz Enum的Class + * @param value 值 + * @return Enum + */ + public static > E toEnum(Class clazz, Object value) { + return toEnum(clazz, value, null); + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value, BigInteger defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof BigInteger) { + return (BigInteger) value; + } + if (value instanceof Long) { + return BigInteger.valueOf((Long) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return new BigInteger(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为BigInteger
+ * 如果给定的值为空,或者转换失败,返回默认值null
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigInteger toBigInteger(Object value) { + return toBigInteger(value, null); + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @param defaultValue 转换错误时的默认值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value, BigDecimal defaultValue) { + if (value == null) { + return defaultValue; + } + if (value instanceof BigDecimal) { + return (BigDecimal) value; + } + if (value instanceof Long) { + return new BigDecimal((Long) value); + } + if (value instanceof Double) { + return new BigDecimal((Double) value); + } + if (value instanceof Integer) { + return new BigDecimal((Integer) value); + } + final String valueStr = toStr(value, null); + if (StringUtils.isEmpty(valueStr)) { + return defaultValue; + } + try { + return new BigDecimal(valueStr); + } catch (Exception e) { + return defaultValue; + } + } + + /** + * 转换为BigDecimal
+ * 如果给定的值为空,或者转换失败,返回默认值
+ * 转换失败不会报错 + * + * @param value 被转换的值 + * @return 结果 + */ + public static BigDecimal toBigDecimal(Object value) { + return toBigDecimal(value, null); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @return 字符串 + */ +// public static String utf8Str(Object obj) +// { +// return str(obj, CharsetKit.CHARSET_UTF_8); +// } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charsetName 字符集 + * @return 字符串 + */ + public static String str(Object obj, String charsetName) { + return str(obj, Charset.forName(charsetName)); + } + + /** + * 将对象转为字符串
+ * 1、Byte数组和ByteBuffer会被转换为对应字符串的数组 2、对象数组会调用Arrays.toString方法 + * + * @param obj 对象 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(Object obj, Charset charset) { + if (null == obj) { + return null; + } + + if (obj instanceof String) { + return (String) obj; + } else if (obj instanceof byte[]) { + return str((byte[]) obj, charset); + } else if (obj instanceof Byte[]) { + byte[] bytes = ArrayUtils.toPrimitive((Byte[]) obj); + return str(bytes, charset); + } else if (obj instanceof ByteBuffer) { + return str((ByteBuffer) obj, charset); + } + return obj.toString(); + } + + /** + * 将byte数组转为字符串 + * + * @param bytes byte数组 + * @param charset 字符集 + * @return 字符串 + */ + public static String str(byte[] bytes, String charset) { + return str(bytes, StringUtils.isEmpty(charset) ? Charset.defaultCharset() : Charset.forName(charset)); + } + + /** + * 解码字节码 + * + * @param data 字符串 + * @param charset 字符集,如果此字段为空,则解码的结果取决于平台 + * @return 解码后的字符串 + */ + public static String str(byte[] data, Charset charset) { + if (data == null) { + return null; + } + + if (null == charset) { + return new String(data); + } + return new String(data, charset); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, String charset) { + if (data == null) { + return null; + } + + return str(data, Charset.forName(charset)); + } + + /** + * 将编码的byteBuffer数据转换为字符串 + * + * @param data 数据 + * @param charset 字符集,如果为空使用当前系统字符集 + * @return 字符串 + */ + public static String str(ByteBuffer data, Charset charset) { + if (null == charset) { + charset = Charset.defaultCharset(); + } + return charset.decode(data).toString(); + } + + // ----------------------------------------------------------------------- 全角半角转换 + + /** + * 半角转全角 + * + * @param input String. + * @return 全角字符串. + */ + public static String toSBC(String input) { + return toSBC(input, null); + } + + /** + * 半角转全角 + * + * @param input String + * @param notConvertSet 不替换的字符集合 + * @return 全角字符串. + */ + public static String toSBC(String input, Set notConvertSet) { + char c[] = input.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { + // 跳过不替换的字符 + continue; + } + + if (c[i] == ' ') { + c[i] = '\u3000'; + } else if (c[i] < '\177') { + c[i] = (char) (c[i] + 65248); + + } + } + return new String(c); + } + + /** + * 全角转半角 + * + * @param input String. + * @return 半角字符串 + */ + public static String toDBC(String input) { + return toDBC(input, null); + } + + /** + * 替换全角为半角 + * + * @param text 文本 + * @param notConvertSet 不替换的字符集合 + * @return 替换后的字符 + */ + public static String toDBC(String text, Set notConvertSet) { + char c[] = text.toCharArray(); + for (int i = 0; i < c.length; i++) { + if (null != notConvertSet && notConvertSet.contains(c[i])) { + // 跳过不替换的字符 + continue; + } + + if (c[i] == '\u3000') { + c[i] = ' '; + } else if (c[i] > '\uFF00' && c[i] < '\uFF5F') { + c[i] = (char) (c[i] - 65248); + } + } + String returnString = new String(c); + + return returnString; + } + + /** + * 数字金额大写转换 先写个完整的然后将如零拾替换成零 + * + * @param n 数字 + * @return 中文大写数字 + */ + public static String digitUppercase(double n) { + String[] fraction = {"角", "分"}; + String[] digit = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; + String[][] unit = {{"元", "万", "亿"}, {"", "拾", "佰", "仟"}}; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) { + s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } +} diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/util/ServletUtils.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/util/ServletUtils.java new file mode 100644 index 0000000..e83e0b4 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/util/ServletUtils.java @@ -0,0 +1,155 @@ +package com.mosty.operation.log.util; + +import org.springframework.web.context.request.RequestAttributes; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.servlet.http.HttpSession; +import java.io.IOException; + +/** + * 客户端工具类 + * + * @author ruoyi + */ +public class ServletUtils { + /** + * 定义移动端请求的所有可能类型 + */ + private final static String[] agent = {"Android", "iPhone", "iPod", "iPad", "Windows Phone", "MQQBrowser"}; + + /** + * 获取String参数 + */ + public static String getParameter(String name) { + return getRequest().getParameter(name); + } + + /** + * 获取String参数 + */ + public static String getParameter(String name, String defaultValue) { + return Convert.toStr(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name) { + return Convert.toInt(getRequest().getParameter(name)); + } + + /** + * 获取Integer参数 + */ + public static Integer getParameterToInt(String name, Integer defaultValue) { + return Convert.toInt(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name) { + return Convert.toBool(getRequest().getParameter(name)); + } + + /** + * 获取Boolean参数 + */ + public static Boolean getParameterToBool(String name, Boolean defaultValue) { + return Convert.toBool(getRequest().getParameter(name), defaultValue); + } + + /** + * 获取request + */ + public static HttpServletRequest getRequest() { + return getRequestAttributes().getRequest(); + } + + /** + * 获取response + */ + public static HttpServletResponse getResponse() { + return getRequestAttributes().getResponse(); + } + + /** + * 获取session + */ + public static HttpSession getSession() { + return getRequest().getSession(); + } + + public static ServletRequestAttributes getRequestAttributes() { + RequestAttributes attributes = RequestContextHolder.getRequestAttributes(); + return (ServletRequestAttributes) attributes; + } + + /** + * 将字符串渲染到客户端 + * + * @param response 渲染对象 + * @param string 待渲染的字符串 + * @return null + */ + public static String renderString(HttpServletResponse response, String string) { + try { + response.setContentType("application/json"); + response.setCharacterEncoding("utf-8"); + response.getWriter().print(string); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 是否是Ajax异步请求 + * + * @param request + */ + public static boolean isAjaxRequest(HttpServletRequest request) { + String accept = request.getHeader("accept"); + if (accept != null && accept.indexOf("application/json") != -1) { + return true; + } + + String xRequestedWith = request.getHeader("X-Requested-With"); + if (xRequestedWith != null && xRequestedWith.indexOf("XMLHttpRequest") != -1) { + return true; + } + + String uri = request.getRequestURI(); + if (StringUtils.inStringIgnoreCase(uri, ".json", ".xml")) { + return true; + } + + String ajax = request.getParameter("__ajax"); + if (StringUtils.inStringIgnoreCase(ajax, "json", "xml")) { + return true; + } + return false; + } + + /** + * 判断User-Agent 是不是来自于手机 + */ + public static boolean checkAgentIsMobile(String ua) { + boolean flag = false; + if (!ua.contains("Windows NT") || (ua.contains("Windows NT") && ua.contains("compatible; MSIE 9.0;"))) { + // 排除 苹果桌面系统 + if (!ua.contains("Windows NT") && !ua.contains("Macintosh")) { + for (String item : agent) { + if (ua.contains(item)) { + flag = true; + break; + } + } + } + } + return flag; + } +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/java/com/mosty/operation/log/util/StringUtils.java b/common-log-base-starter/src/main/java/com/mosty/operation/log/util/StringUtils.java new file mode 100644 index 0000000..392b808 --- /dev/null +++ b/common-log-base-starter/src/main/java/com/mosty/operation/log/util/StringUtils.java @@ -0,0 +1,478 @@ +package com.mosty.operation.log.util; + +import org.springframework.util.AntPathMatcher; + +import java.util.*; + +/** + * 字符串工具类 + * + * @author ruoyi + */ +public class StringUtils extends org.apache.commons.lang3.StringUtils { + /** + * 空字符串 + */ + private static final String NULLSTR = ""; + + /** + * 下划线 + */ + private static final char SEPARATOR = '_'; + + /** + * 获取参数不为空值 + * + * @param value defaultValue 要判断的value + * @return value 返回值 + */ + public static T nvl(T value, T defaultValue) { + return value != null ? value : defaultValue; + } + + /** + * * 判断一个Collection是否为空, 包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Collection coll) { + return isNull(coll) || coll.isEmpty(); + } + + /** + * * 判断一个Collection是否非空,包含List,Set,Queue + * + * @param coll 要判断的Collection + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Collection coll) { + return !isEmpty(coll); + } + + /** + * * 判断一个对象数组是否为空 + * + * @param objects 要判断的对象数组 + * * @return true:为空 false:非空 + */ + public static boolean isEmpty(Object[] objects) { + return isNull(objects) || (objects.length == 0); + } + + /** + * * 判断一个对象数组是否非空 + * + * @param objects 要判断的对象数组 + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Object[] objects) { + return !isEmpty(objects); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:为空 false:非空 + */ + public static boolean isEmpty(Map map) { + return isNull(map) || map.isEmpty(); + } + + /** + * * 判断一个Map是否为空 + * + * @param map 要判断的Map + * @return true:非空 false:空 + */ + public static boolean isNotEmpty(Map map) { + return !isEmpty(map); + } + + /** + * * 判断一个字符串是否为空串 + * + * @param str String + * @return true:为空 false:非空 + */ + public static boolean isEmpty(String str) { + return isNull(str) || NULLSTR.equals(str.trim()); + } + + /** + * * 判断一个字符串是否为非空串 + * + * @param str String + * @return true:非空串 false:空串 + */ + public static boolean isNotEmpty(String str) { + return !isEmpty(str); + } + + /** + * * 判断一个对象是否为空 + * + * @param object Object + * @return true:为空 false:非空 + */ + public static boolean isNull(Object object) { + return object == null; + } + + /** + * * 判断一个对象是否非空 + * + * @param object Object + * @return true:非空 false:空 + */ + public static boolean isNotNull(Object object) { + return !isNull(object); + } + + /** + * * 判断一个对象是否是数组类型(Java基本型别的数组) + * + * @param object 对象 + * @return true:是数组 false:不是数组 + */ + public static boolean isArray(Object object) { + return isNotNull(object) && object.getClass().isArray(); + } + + /** + * 去空格 + */ + public static String trim(String str) { + return (str == null ? "" : str.trim()); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @return 结果 + */ + public static String substring(final String str, int start) { + if (str == null) { + return NULLSTR; + } + + if (start < 0) { + start = str.length() + start; + } + + if (start < 0) { + start = 0; + } + if (start > str.length()) { + return NULLSTR; + } + + return str.substring(start); + } + + /** + * 截取字符串 + * + * @param str 字符串 + * @param start 开始 + * @param end 结束 + * @return 结果 + */ + public static String substring(final String str, int start, int end) { + if (str == null) { + return NULLSTR; + } + + if (end < 0) { + end = str.length() + end; + } + if (start < 0) { + start = str.length() + start; + } + + if (end > str.length()) { + end = str.length(); + } + + if (start > end) { + return NULLSTR; + } + + if (start < 0) { + start = 0; + } + if (end < 0) { + end = 0; + } + + return str.substring(start, end); + } + + /** + * 格式化文本, {} 表示占位符
+ * 此方法只是简单将占位符 {} 按照顺序替换为参数
+ * 如果想输出 {} 使用 \\转义 { 即可,如果想输出 {} 之前的 \ 使用双转义符 \\\\ 即可
+ * 例:
+ * 通常使用:format("this is {} for {}", "a", "b") -> this is a for b
+ * 转义{}: format("this is \\{} for {}", "a", "b") -> this is \{} for a
+ * 转义\: format("this is \\\\{} for {}", "a", "b") -> this is \a for b
+ * + * @param template 文本模板,被替换的部分用 {} 表示 + * @param params 参数值 + * @return 格式化后的文本 + */ +// public static String format(String template, Object... params) +// { +// if (isEmpty(params) || isEmpty(template)) +// { +// return template; +// } +// return StrFormatter.format(template, params); +// } + + /** + * 是否为http(s)://开头 + * + * @param link 链接 + * @return 结果 + */ +// public static boolean ishttp(String link) +// { +// return StringUtils.startsWithAny(link, Constants.HTTP, Constants.HTTPS); +// } + + /** + * 字符串转set + * + * @param str 字符串 + * @param sep 分隔符 + * @return set集合 + */ + public static final Set str2Set(String str, String sep) { + return new HashSet(str2List(str, sep, true, false)); + } + + /** + * 字符串转list + * + * @param str 字符串 + * @param sep 分隔符 + * @param filterBlank 过滤纯空白 + * @param trim 去掉首尾空白 + * @return list集合 + */ + public static final List str2List(String str, String sep, boolean filterBlank, boolean trim) { + List list = new ArrayList(); + if (StringUtils.isEmpty(str)) { + return list; + } + + // 过滤空白字符串 + if (filterBlank && StringUtils.isBlank(str)) { + return list; + } + String[] split = str.split(sep); + for (String string : split) { + if (filterBlank && StringUtils.isBlank(string)) { + continue; + } + if (trim) { + string = string.trim(); + } + list.add(string); + } + + return list; + } + + /** + * 查找指定字符串是否包含指定字符串列表中的任意一个字符串同时串忽略大小写 + * + * @param cs 指定字符串 + * @param searchCharSequences 需要检查的字符串数组 + * @return 是否包含任意一个字符串 + */ + public static boolean containsAnyIgnoreCase(CharSequence cs, CharSequence... searchCharSequences) { + if (isEmpty(cs) || isEmpty(searchCharSequences)) { + return false; + } + for (CharSequence testStr : searchCharSequences) { + if (containsIgnoreCase(cs, testStr)) { + return true; + } + } + return false; + } + + /** + * 驼峰转下划线命名 + */ + public static String toUnderScoreCase(String str) { + if (str == null) { + return null; + } + StringBuilder sb = new StringBuilder(); + // 前置字符是否大写 + boolean preCharIsUpperCase = true; + // 当前字符是否大写 + boolean curreCharIsUpperCase = true; + // 下一字符是否大写 + boolean nexteCharIsUpperCase = true; + for (int i = 0; i < str.length(); i++) { + char c = str.charAt(i); + if (i > 0) { + preCharIsUpperCase = Character.isUpperCase(str.charAt(i - 1)); + } else { + preCharIsUpperCase = false; + } + + curreCharIsUpperCase = Character.isUpperCase(c); + + if (i < (str.length() - 1)) { + nexteCharIsUpperCase = Character.isUpperCase(str.charAt(i + 1)); + } + + if (preCharIsUpperCase && curreCharIsUpperCase && !nexteCharIsUpperCase) { + sb.append(SEPARATOR); + } else if ((i != 0 && !preCharIsUpperCase) && curreCharIsUpperCase) { + sb.append(SEPARATOR); + } + sb.append(Character.toLowerCase(c)); + } + + return sb.toString(); + } + + /** + * 是否包含字符串 + * + * @param str 验证字符串 + * @param strs 字符串组 + * @return 包含返回true + */ + public static boolean inStringIgnoreCase(String str, String... strs) { + if (str != null && strs != null) { + for (String s : strs) { + if (str.equalsIgnoreCase(trim(s))) { + return true; + } + } + } + return false; + } + + /** + * 删除最后一个字符串 + * + * @param str 输入字符串 + * @param spit 以什么类型结尾的 + * @return 截取后的字符串 + */ + public static String lastStringDel(String str, String spit) { + if (!StringUtils.isEmpty(str) && str.endsWith(spit)) { + return str.subSequence(0, str.length() - 1).toString(); + } + return str; + } + + /** + * 将下划线大写方式命名的字符串转换为驼峰式。如果转换前的下划线大写方式命名的字符串为空,则返回空字符串。 例如:HELLO_WORLD->HelloWorld + * + * @param name 转换前的下划线大写方式命名的字符串 + * @return 转换后的驼峰式命名的字符串 + */ + public static String convertToCamelCase(String name) { + StringBuilder result = new StringBuilder(); + // 快速检查 + if (name == null || name.isEmpty()) { + // 没必要转换 + return ""; + } else if (!name.contains("_")) { + // 不含下划线,仅将首字母大写 + return name.substring(0, 1).toUpperCase() + name.substring(1); + } + // 用下划线将原始字符串分割 + String[] camels = name.split("_"); + for (String camel : camels) { + // 跳过原始字符串中开头、结尾的下换线或双重下划线 + if (camel.isEmpty()) { + continue; + } + // 首字母大写 + result.append(camel.substring(0, 1).toUpperCase()); + result.append(camel.substring(1).toLowerCase()); + } + return result.toString(); + } + + /** + * 驼峰式命名法 + * 例如:user_name->userName + */ + public static String toCamelCase(String s) { + if (s == null) { + return null; + } + if (s.indexOf(SEPARATOR) == -1) { + return s; + } + s = s.toLowerCase(); + StringBuilder sb = new StringBuilder(s.length()); + boolean upperCase = false; + for (int i = 0; i < s.length(); i++) { + char c = s.charAt(i); + + if (c == SEPARATOR) { + upperCase = true; + } else if (upperCase) { + sb.append(Character.toUpperCase(c)); + upperCase = false; + } else { + sb.append(c); + } + } + return sb.toString(); + } + + /** + * 查找指定字符串是否匹配指定字符串列表中的任意一个字符串 + * + * @param str 指定字符串 + * @param strs 需要检查的字符串数组 + * @return 是否匹配 + */ + public static boolean matches(String str, List strs) { + if (isEmpty(str) || isEmpty(strs)) { + return false; + } + for (String pattern : strs) { + if (isMatch(pattern, str)) { + return true; + } + } + return false; + } + + /** + * 判断url是否与规则配置: + * ? 表示单个字符; + * * 表示一层路径内的任意字符串,不可跨层级; + * ** 表示任意层路径; + * + * @param pattern 匹配规则 + * @param url 需要匹配的url + * @return + */ + public static boolean isMatch(String pattern, String url) { + AntPathMatcher matcher = new AntPathMatcher(); + return matcher.match(pattern, url); + } + + @SuppressWarnings("unchecked") + public static T cast(Object obj) { + return (T) obj; + } +} \ No newline at end of file diff --git a/common-log-base-starter/src/main/resources/META-INF/spring.factories b/common-log-base-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..9a1327a --- /dev/null +++ b/common-log-base-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.operation.log.OperationLogBaseAutoConfiguration \ No newline at end of file diff --git a/common-log-base-starter/target/classes/META-INF/spring.factories b/common-log-base-starter/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..9a1327a --- /dev/null +++ b/common-log-base-starter/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.operation.log.OperationLogBaseAutoConfiguration \ No newline at end of file diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/BaseController$1.class b/common-log-base-starter/target/classes/com/mosty/operation/log/BaseController$1.class new file mode 100644 index 0000000000000000000000000000000000000000..d104fa1aaeeaeaee65fe7b7f9d73c6ee1a125512 GIT binary patch literal 1137 zcma)5T~8B16g|@}Y`ZSDf>p#X)C#2q21MfnhC~n(lOiNVeDG0sbiCoh>mzd}ueF-Fx@kbI+YK`|J1jp8%fXSrG+1@KD4<7mqwt@z|rxjEh+h zqo}!yR!6q(l-J+$S4cLr>NTsA;OPYPvanbNGj|Cqd zuK4h=$WZ>bn+xt^3Clj7V1;2ad;cHBK6y{|wc*UHE;CGLRBb8Zl<#P3y*b(JghuIB zKS`9P;b(?pqv`FzSP$cl)C|1VRJzO4#BTOSEqd}u=|g@b+q_K>{$93U2_pvZ%#3`^ zS~6>^L?VKH$*FNqkuYo93O8X-a;lNE=C??h|n_zhUAA>(!Hf?T@>Jvf6L=G3| znCywDPb3#k$#(ld1|}0$vNM>>?OiPbiD~+liu9qea@o2@PdWPg7z4vqdRn8{X1sdi z3t0Uta;F)lMC&MFfEvoQ-WZ^84HFa*K4YU}iR-AGa~&g37f`7;@;{LO2ImYTpHbMF zKZARkk@+YQZJt(3IYR3^iQyD4P@6>}Tguu^6Q&G@FgLTtmA{QEn8YpOnxa}4xosD> b9RlB>Fo(OiM|TJJY3^})@(5UMqL$s&0wCzmfxy%_VnMoPy9b;3TXNRpL-Z5z^?G{6ITWRI)6DD5YXBcmr1IaMm zQCdFf_Y!GeiX@{5C3i)(FRb$CVQ}2NQA8hix~9i_CU*mFj-?e&8O^CC-x0ZN8||#g zvZ7q*tL-R#AT0xrOGU?4>GaTwo;)%3EkBV7PYA+a$>gDMqJ(dGc~u|xsT=>3$*}Oe zubt}2eU&Sc|3GWw3YDb3^=~S1isgH!+Np7q+udx~y6}bR+pgSIzEQKk-+A*$yb}@5 zV~SzQ`@HW|#_3*!jYsR-%3V(o2Uw5LK$Br@w7dWt5$<3!!Z}0?Ge!AK=#)QAj%3#{ zG)Eqt?|!4$pOL1;aM8+C<&L(npF7igbfBCmXMQH5SkSFb5lE!aIe%vT0=Yp6FJ?af z=hp6uE>R5_YN>SPA~USUB~5X?l6U>@eW$;rN`DZ*aK$%;ybAd=9ePjGiIZhyCmNr? z-jg$i8G2WX;1Vv7AC&;qF-s@9C@vAoCqKpndBAkDKK2!r*TgaY5ff)LVevVpYWE7N zxe`94qD0JLo+vL9i7&Z8c9N9-Qny@`25R-{X9OQG>8WY3LpZQVgjeY_hHD7PhV->U GmY$zm{T1~9 literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/BusinessStatus.class b/common-log-base-starter/target/classes/com/mosty/operation/log/BusinessStatus.class new file mode 100644 index 0000000000000000000000000000000000000000..a15c068eeed8b5794a61a10eddb06619fde38a06 GIT binary patch literal 1051 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 literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/OperationLogBaseAutoConfiguration.class b/common-log-base-starter/target/classes/com/mosty/operation/log/OperationLogBaseAutoConfiguration.class new file mode 100644 index 0000000000000000000000000000000000000000..596185954a75caea19d4915c379a6d0d8f398e28 GIT binary patch literal 673 zcmbVKOG^VW5dLCcTC3K#UJ71BJ!~!_NJUV=)A~TA7f;zWUDNI+Wj9;x&+;UA@CW## z#A&P|B8Vn1nVHPvn=g5JeR>A4jg=}2Sgc^Ff@OyCp3=(hGZZ#9TMWe`b0ZmMe5K`S zo&++z5-rL&9p9u8&w8oS zQ9BihyfbN+helg@Z@Ksk<=>(FAu;J0Ew#N2g{B#50S$L9!mfxU0hlK~JjaLk$p^!h zgOv;d!kLZWeMNI3dPLW#VyQ3UoCsKG?kb9xCAsJi<}Cu^9Zvq43t>71dM P`ZZXFS@AQQ?RVu@= literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/controller/SysOperlogController.class b/common-log-base-starter/target/classes/com/mosty/operation/log/controller/SysOperlogController.class new file mode 100644 index 0000000000000000000000000000000000000000..8f4b26ec3d0dcc87ce8d4eed1e89feeaf5a008f1 GIT binary patch literal 7316 zcmcIodwdkt75-*PvSAq^EC^Dm1SJ|kG9W6_;DbPr=t7XhSYPO5cU;EI&MY&tK(zK{ zwU!o(uSQy}V8KGIimxD0#J*c??b}xEyCgv0{inZQ|LEhpGqbz1aTgP;`Ta8Y&YgSD z{mwbxIrrRs`9J$#1aL0?F&bxK(-?dbpNe5K?vCNp*dku<8I5~!UljMp5XA#=PJUSQ zJ|D#+;`6pBwu|;r@%Vyx>=2Kg;_+Avjd&o2FJe~=yYZ!3JTBTVi;*Y98wYjsD$!q6tADkUw`wJpQY?7UV4wxlq~4WnWK?IS^{D5bn=w5?OHlu%Ye zlP98EwK96j$|;%NZd%vL8aYQvTDGQSG*?ZjuBxUbE{*Bxz9ydf3VV zaN*pdQ=2cM+M_%4w5hr|o2U=It4{T?4c8_k)kNqrWp$3+%V=G?qmvtpP1ABcR+Ad% zB`llF&f2<}zR6ZI+6K$+Q8sAZO1EyN6tyr{S;dH0p=Pt3NSW2^RU=2+R4YF58xp#u zI2+V-np7&Ta+JkcUGUx8kLykud}Qa*ryd==Z}Z`U4-NM195~cBa97{a?YktL`SwmC z55?XLBtiKyvW`CW*x>DVNRYd84kN^II!T#Q>Q?Z7OK5@EqrG!^>uL$7m)dTXDs1Fx z_6ZtswYDy&Ic|%U>g6UiwwAHh6W?`j%dn-I!EF;vGF|N>P8xD5v|7TPkfBS{K@blm zn@L#rE}~nMxLIAVDu!yNl@`k~G}ZLtFFtVBwqsj&gn2@HEp1J-cD6DpDS6A)q?j^v zL&C+4AxQ~~BpqpLjp!)}bwi~{7{&BZYP1Rz3Z)PU<~zeP(m0oJ?yw{IQY{q7vf^7% zxm8cyCgJ>HOIfA5YxBpA2$-bs9Yd{gq;_9AvK18>Gx)+CM|SToWlZ&wMC;;}WR4QR zi#a0oIj){$@>?ACQHLvX;D}jM<$4(=9^y?PNy5f=DnHOQ=jw*S+#6Os*d(-Vd-u&+ z(q;6BoPXMpXAc}X@W|nVhmPF8iz#v7&gc1h^vUgm59}FuqEEsZp(GIS*|mB!Q@Lz| zOCn#%VuxbJC}DfeI!=;r%VZ5bsk>f=bhvcpa3^zamC39sVcNW=!v{7E?ATp@PSXO> z%x{`MSG4CgEflSUTAK+}x3$zL7LXF(MYZ7P_!{3LBKK!HLQdZF|8#;#z$fYy;g-qA zZr^pRZ`a`6_YQ2?>^r2hebv0V5>8S|Vas-JSc}Pr_wOIL=fScIOJ~ZNp76r>;I8ch z5BG%^ip@$V)hyCY-Mxt6UpduRu6}2BNtiGrrE!L?8u~3-Ld|ri)EN>Mgl(^z>q#)B zBR?zUPh-RtkAQ%~3|PaHA$VH+T1f&GqRPo0hKN`AM)4I1u?{O|C$(j|C>5pzxtXcF zSlu=W$r3IYcFJQF?iQERol}p)aY1WWO*75Nr8#LN`+3zuvFfVhy@ZakZ0}}5Wn|36 ztSAo3coB!9cuB@r@wF(vF5?^cri^dl+fjT+#&_{DvmL{nmy1fZH?IOIUEFmXg}d6l zitnB)ME@$Ag`Z~2xCO89jO0P>IxfdnXzp4o<&3Mr_v-NMxN3aA4zG&PtQHT*cp5*D z@k9Jb!rWo+UfAr%_=$wsVx4~*3(}N#KPp?f%lIi?k#Qq_CL@d2WVqt70k1{za~Z$D z>m-JZH}EFw`?ThYy0k4NZ<=v}!E2)42?- z(7G|HWySW)`E4evay?b=$4-4QBE9Ncc<*qaUb*Wn32?l-ApKqh;j2gdLTK+&1C^=1nFvYLwiLH6@WQJG#6d(^alf(`Oy=FFrPrG|As}6GqR7zWi{1+g zZ6>JB)mO5do)98jz6fXC+c>i;h5-!5a1xGqx|dh9Y%G>f>&-!}SJ_n+!;9KRv~^6^ zWkM>1zu=Ujy1|fd%XX8;!7`s>mz$*Wng|DR$**Gg%(6}zJ{Y3Gu~!a z;M?g%4JsUbbgEznD=$A0uk@;@i6sdnK*3UJt?I1xe?6jS+h`4zQmR2_ogBuKx8F5G zgO=m+7d$*;Za}yYZzU_@uq}+bddwi0?CttS6@_UUJ3ZT z$-AOBD&rXbBI9xNm!!|Yl>XsHX)59KK<(wPRjT2J2BP>IZIrOAo?Mn0s?9Vt+XJIf z(L2K?3q<_ltM}()F6Qx#D{&6yQ|1^{^QYqTDDQlZ%7u{y9Jzoa5iG>}*q+7p z&HTFPT1XBq#6_a-;9^|DDT^JnV2OsMXvH#4j!OJ`DLWFDqbrza;8x>lhskW~X^o<>8w#Ksuo@i% zT~A|o;!3LI!|y7<56s!}7IR+3Wxmbd@4=UaX|EQ84uwj%2G)3*Y#-bZZe)mD7JP<2rtpJ3UXIEe+4L5P4A|KOO%f-S@mq4deZgwb-7V3d< z4KgqtSp1%?2(_*()HTC^x^5^`dk9o}2vlcSP~D19$Crhwp9s|45U9B!P}dI&>V}F? z<7J_`Cjxcj5U3l6KXY2XKo&(+why_hg-_VbXQCZYVO_IX+#f*C9DH0Gsa zsV;^O;I=^4tK`2(9$RMhV`3t5A#=vbkMn&h|E0z^{`p_F<7dYw^<(l@-o`GRDn9aW z4gW;|ioc0mdrIv#w6dKNe@{P7-HL_mPmRCV>(62TwD>fyKb`&h_;jy-GW(~;&+z)A zy^OWz0A^erZ`g}74^ggv82B1Z^EC2w|(ALVES zw|mq+jWRyQ_dAI7PA~a?9CxwrC#6r|&-^A1r$6Ga_!Fk!GkmY(dmp3sL2Sim@i{#7 EKe&X4O#lD@ literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/controller/provider/SysOperlogProviderController.class b/common-log-base-starter/target/classes/com/mosty/operation/log/controller/provider/SysOperlogProviderController.class new file mode 100644 index 0000000000000000000000000000000000000000..99092158933261c2810f01a734c25c2018b98e18 GIT binary patch literal 2087 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 I`)nri2jOljfB*mh literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excel$ColumnType.class b/common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excel$ColumnType.class new file mode 100644 index 0000000000000000000000000000000000000000..49e0e3b6302b3ddfc8dd6c9a126f29db0f21e7ca GIT binary patch literal 1389 zcmbVL-%k@k5dOBk>$S&Out2d0h+4HR$_W;KwL(d)*rY&0frR+tQO|nhdPmwTk^hGH zpg!=RMa5_|Jo`r(XO{*_^g+0Xotv3&=bLYK_t)=lKLMnX3qiuT3LUo<#1u@b=*Ats zqWnpE$uvE-5sCn0J)|}<-O_M<@I*wV-+eV{d zHW(&K6}P6>+=jQUyPIa+@GRHSZMUkMj%QJ@@Va8!@#6{^hCq3Fskku5AQ$In=L%%E z47*9SS&?YttFxt*LYZOm*;#6fQq)*Fkvz+ODeu0ZPP$8$V=gpn>t=n~Shp#nh{B66 z848KghOuSnw&7IuvRAj9Y9@JxRwE_1V%V!j-Qo;w8p$zg#1{FRg65XB9Lt+#82CpA z#bR=mLGoT%BtBHOs*d3`>r_fgh>Smxr0E8;6}w%80<wd|>dOw);~Ww%+c zm`^M|DODW#IG>S*3;goMG-Qxf@Q6V_<#o|8f@uv`F{2@h0sa@)(1TtLeSGOhFGKkF zJh%qBP!-#CsFl7%vP0kE`i5EYsNMMgG{G>{Ic9O=Gac2APW~i0m5+ArYs2Uaauf8n zy6JVwxfoXfkR=hqk`Bs5xJIC7kk5@H5yBuYf?*%g3eDZ8TF zVQX@`To6g5+MA!#aQOH5JEXNp(C^n()ravhc!z9|ZNc=(es&EokL6 oxrK0f4~$DX9HT1Qe?u%gM@^66Cgpv&MaM(KC!~Z4oX^Gn01-ws+5i9m literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excel$Type.class b/common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excel$Type.class new file mode 100644 index 0000000000000000000000000000000000000000..e203723faaee9f868cc889f72e3c8076639a57d6 GIT binary patch literal 1344 zcmb7DT~8B16g|`3?Y7HWut2d0h+4HR$clnrEl`3rHmPDP5{WM^b*)RbyQJL``4_|o z^}(OugBBH|(eUh#GTxasP@)fXALh=Td+s^+-kJUV=ld@JGsuM@V@iX8D=OkDu4?GT zHNMR7$ZQCG8rkdIxe>wuw>Lu=sFm%qFDB- zM%AnP+lIGk)lA>^T*L7yhUNM;9p+z^EhoWqGYrA}lZVTXR%lbW-`Xf!rqdu=R$x#Q ztBb|Q`4YqA)9z>m2~{(dOm&wjFL}>Ny|-w))`LcM-Kwpa>kgf$f^zu7KJ@Dt;L9NT86t<%=XEnEWyf== zh=F9Pqo?Kd4Xf-^p^4+jGt735Ry^lS2iw6t9~CG1SZ7`vMsv?i)9=ztKb(?_^9}&A z)P%6q2SuX1N1$(*PmCiG#xPEUVT8PMWcjBx!M-A}59uR$45PFLMQn%gV>r{s&mbU9 zwWyr_24x>I#|Mt!$LU0Gp>UQIc$`K|D_6V+iE1W9dSYY`!Sv`CsGkIeYepyvydmwk z=)pUTlNX~*&Uiue!*{$R2^Z-!fJ>wlL$Y0;L6&!(v&t`2q~o7 z$(<`NqY$ILK9w(EDKK;-U&q!UL^RFpi-0G>6+YxURqO{h?I80cuTD@ eYNGttq_T5R^aLg;9>8U~9vVI&WlZB_F8&uSFd}pS literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excel.class b/common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excel.class new file mode 100644 index 0000000000000000000000000000000000000000..8724aef7250a7641b04c80c8801a136d24b2d4a5 GIT binary patch literal 1803 zcmbVMT~pIQ6unD70*DIop@0Z#2PqT+f}bF^(gM{24lO*u(~>N0m^9l-wg^xDFCY8? z{wVRJr8ZV(%-EUEHYexad+ynL`{U=g??kjhdm806`l!(-jS7r6#!I;G2+VAPj) z9N})*-1CH|(GH`i|3af(MzM@-l^r0SbQPn>Oft`CAmcbvab-y-D^7XcR*|n)S65&; zyo!WFGs(gkKj*s5ow8n3uH}?h84>E5T!~HTRymS&o0g%P68c@i%?;_C3s(s@cTr>1 z3Yi?iQnXMOfuZ)1quVoq{HOAp47Ds!BY)*aG5S z{q)qjKo4fqyF+f*VOqTA%4!V>Vo-h}84b@Qk8iTE+wx#g>pG77?irj_+${^0Q3`(b zSzghZFU``D6H^ssK$8Dhi%xO9YoKCQkJ-8M=}L}pNg{X z8e-G3p{utsTMPaMFdE&jW8kXd(DJMkTeLR^0;dAk%YUzwzAuzNq|$+y*m-k0rvE|x zEN#oUM1Zz`uv^OS*-(LH@lQUsp zoG05*pvSfkjPx+M1FOm?87jhWfzfOzZex0<@lQit`1&g|5@mFY`tWocPmw&`0dSZ4 zTYyIc0Pb}HgPp)oComiY{3`c@RUQBs4FY2T#_8d8*_faSdIV^ardmp}^ccX?Admns z9jxPPebx!gbOK45Z6!S>LdYDYTEG#_16b$`(SwXdFqY_fTkA5d0D3_$VQa%igI>{V z_}N8o@ZxP}y;WLk2fw3r+{F6^J53p!ZUs79PMui3wN)u^EQP z%;(SR{dfXcU=SgS&?kf^>q_Yf%gL^gS1GhKnb;o-Rz5zoP~u%~vUu7;-xOh(*o#xV z$u$$k>ziV|l_u5fR;jE!yIFIZFjuw|r9Jz*uoXM$b8CdQnPB7d8vbb#M!#=`1VX2t Q0Z>5bB4`|XwRRAG0O%D#?f?J) literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excels.class b/common-log-base-starter/target/classes/com/mosty/operation/log/entity/Excels.class new file mode 100644 index 0000000000000000000000000000000000000000..8cbf8139fc281420e37ea63b1a21faf43e33cbdd GIT binary patch literal 447 zcma)(O-sW-5Qg8WsnOPt>PsxqJNx!v$-L3o^4gcJWP!|>^5q7HPZ`CI2u>NX8f9#>D2ITo?F+{DG4Xxl2JzI ziPAp_73m^jCuPsq=L5r;G!WHu7N|WO1>qgxY&|??w`|ttg7*JFo~%jZT0npN@(_*g z1H#3BCLmUND<_ZB8OM%rx{`jGTMeL3Ahcv{$RChL@X(f93!BaEV@u9siMNIECLl%! MUF<9)#xC~00U=O<-~a#s literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/entity/SysUser.class b/common-log-base-starter/target/classes/com/mosty/operation/log/entity/SysUser.class new file mode 100644 index 0000000000000000000000000000000000000000..f6ca66395548e8c29a0bab48c84d6b9afd12582c GIT binary patch literal 7140 zcmb7|33ye-701tnf+XLtQ8+0)p69tgUphi?+3kw$&ui#V*>`F4F$bo%9zhd!g7O%2+jm2+R{FcSp0GMY#O4Mk~4ei$*an|Ekd{F8`)cip#e&vbcO(Bb&>=Yt+r< zKQvmy`s3#v>hf5 z+>++vbDN%xF|n_qv1vhbE7q4ZQg8&%;7cW(5U;lUF32;-EjHdD5ls$Y{7Gu4^4K57be+G&gGZ8hnDgsIeX?t$VKOLIxGMdt>(akW8`^D?{NT*>@e-ww$1+J zLn$|Wm^3@Ff5(aaJKs2b7@mk?e|R(fNd#R(7(~7+BJqel6B}Ap-G)7=O@uMSuuvp! z&Ubdc)j-(7IiW;5Qi6fRfV%s!(C&<2jHfv)yoH*Q9mnnsjtdbT)apVIi{D#G=6!aIck!2aQZd z4_=9SLq|N3;%JhtO!xNltWJ3Qd0I!~d9h1Qtn<8SJ%I0Z>9`J{AzML<<5G@uZpl!!1zIB zuvo^Tox(aTXVJ+b!eS+h7>iXbQY@-0W5~;bT4huMVTnq=}XXPCq1N7 zAB(TDc!b4cEWXBKAB!hg9AI&X#bFjtvv`KSj-1zyd&f5C^ys339)ibYy%o<6T~s<2 zT~0b?i{XxitV@d#Y~f4c5=^bs#Yi6ZI2%nk%j?A53PIIpF`Q#qX1(*G@rzM{*k@;b z_2fK8&OU+jP8u)sLh0#GFz3k-?{J=MPR7JT?$UGKzZScPPhDB#!cc3&(onT{pNJ+7R+ z5Sg{^slsKFsqu+%bGCb;WUIXHWvg>-IHyU__;cB7x&Tk|xp-iVp!4VxG>-%|pjJRv z;y~+DZ=l;Oy4~%T`MQz6-jN*)SrUUyL}w&u$X?W@ zq7*2LY7Uav2c>}SfefG|r0GJeVQFUWIB zkVn-ZC0>vh0CGGJh`gBuKOGeyx)2_P@$0g*SM;ODCXWT+S96(z`C zHONpe$g2Q(Ef0vic?CbA6(FTvkk^$UkE=mSy&xw5axxDHU-EoL@QlZu(d!A{VP23o z6(IZo;{3fIrJyI(P{X`XZvpDF@d7<7>KnXgi1}XD`ybF+1c|iEd z!yx!+qW~%QfQSMm$Wv;Nau0~`Q<2c}fXFwO;Gb6tkP0t|t^_%v2C49Zlmnz94+uZ+ z*dzFfrvRz+f{avx994r9FDGvz0lX+{Nqi-oZGSUkYQi42B-&T2Kq!;8W zfHda;kq>o2-%)~$@`AJ}L0(XUjPimk0mwCZK=`rG9>L!X`=NY*m2prmVC92QKE%p+C>OFa0m?Q?%4AliK$*(QWl%oM%15AF&dNuje2kT8P^PnT1(X@A%!KlBR%St&&B`1owNMUF zUDl1);`b+s>!?&1G)gR^aiX27MVO`tlctO1R3|#9QFKz9h|p58f;z=YS|y@%y@=6z z5vMyuf;NjJ-7i*ApGeVOVbN2<#@}AL=~;}M{qb|meM}e7caiK1=zFvfWd*br;iJ}B MW9U;TubnmK|H|g%7ytkO literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/entity/VO/OperlogPage.class b/common-log-base-starter/target/classes/com/mosty/operation/log/entity/VO/OperlogPage.class new file mode 100644 index 0000000000000000000000000000000000000000..31d894eb26d6fdc4dc4ae90b17b492aba1cb75d7 GIT binary patch literal 3342 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 JGWx1F`d?*l(^>!k literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/util/Convert.class b/common-log-base-starter/target/classes/com/mosty/operation/log/util/Convert.class new file mode 100644 index 0000000000000000000000000000000000000000..5f7de316d8ce7d433aef0702cc82aa93fe8fc036 GIT binary patch literal 13652 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 literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/util/ServletUtils.class b/common-log-base-starter/target/classes/com/mosty/operation/log/util/ServletUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..68aebf35579013348e32ca60263b1742ca226bcf GIT binary patch literal 4531 zcmbtX>t7Vt8GdG&WrlSCT}1;FgVZQ2m$j)?BSb|dg@#phQAC^CVRu*tmzmAXtYX?+ zn%MN3i%ELXUecx)d$FxaS^{Zf(=YwdZ~YtkPxM26X`eGQ3k$4Bf87sf&YXGQ=e@u0 z*?)Ze{#^ij@wXWEz=|OWdjkr1G6n~(SUj;5#d29JR|Lsy40W)@a#avN6~mYCWd%>G zcxD5h#d9jYBA(BS<%Jlo;j0Q>jG+NvQ*lvnd_9I1d_%=IReVdle_O#zDqdFcN(`^! zx{B9SysqL672gq*-&OHF72mI+=o>0-s`!D5AFB9~iXW?ZQ^8LZ{8U0z&l#2{Ve^II zY5lUE%!?~O{yffUpl&Iwl zZ$x+W8N)Li3A@@?tJSgkh^kp+5sFl>;y?wE)pQkMwX89z7xUg(JzpgJrgH5@?IGd0 z-4)Qwu}Ea(42QNItUy_&M~Sd9^X3Yaw0F5eM{PTQe~ko{pM|< zX^a}3Hl8dRE`8I{9KLVPtXnL5hU<3^3AJfY&s<9B1-~D#neoVU`=|BU&`=R&U-Vk$_?gt( zabAKFdY%csPA)2=XM{Zx>PkY5?3n3Iv7;3olWjw%I_#sYq|B6&xzsPZ;gFlMCrr`T z8Y)z*P(?O9V@5)xsB=G=*K-o2^9mlO&-ya?uxG~7cG1ZgkNHTO%KKc8Xi^$JjlCKM zF{I!v4F}Py;Aa|sj$df_C2oo3R~mke--zY68cyJ(hR@+~4Z}z&xGhe8C*jEdo39c! z>V-ny%mj^j+O;hOzt`{w+~IgAdXwD;G`x*F8s5RX3jV0!PvXmFztJww84Yv7r1#LP zVIB)aKGz+_+Q@bXey=;18W!~*o@;m?e~nmW?EVMirac(RKs8KAw$QhQ=mzlN4>47^w2=-BRzYV)HNwRV_Kf=PHFg* zh?vrEWgXkh651S@vMq*PHb-o}^P%%mTfz>%#!{zF9d#&745*HE54UATo}8FAGEB>d zgx&W|e+fI+6m!hBE*lQvqMpslmauH%1+seA*$@b^daQ*IwfVr zHQYMa@O;^pH+r>juU5o6*%m=K#T!$G7p4I#V`n+JnC2XCV-DLCmEIOk#3ZYAgo7>o zz+zY|;<96Ak(hqWrh5PBckxl;Qwf1OXz0Ex6jq!udvfv~U2=$pvovJSoaXzMk{-)1 zneA)lb}*^@>mi%8X$9{?Im>p8W4gF1v{z`-6>hVlZ>wU6>!!s~-(1cm9GDh!-O3o8 zHQ2#R^B!LDB{Yd9!CgJ~?AKgB!?z@#5}(n;dywAdCW3ujtNp`G*w4Kd5a0kF;aiR9 z?>rIAdr2*rWAlh47El$z9ln(#G?yX7(1%AughL_1QBp^ER=0@IIS+XyN}G?eHJ}Vp z$b-YgV<>S1{UP3d(g=-e7xCs1T?yAwrc~{sQb%xfEv2egqU^b+QpbFyj$>dArIeL$ z`ztDS9FMJ~l)4h-&^?v&?qh<~<0VI`$et>S}h^|PyVI}b}i8;zc z;vFG!4P&qXP4bhX96L>N-T^}L{d@{lNM8GR;zQIe*%b35J_Z@*7QG`QiV>U=3^vh-}{ug=-cn z3~aEVJfYycOyw@%^MP{G zR;nE3M=ufIwtxpB81DQ#>O150b7+jbiKu)#5pVK8q`LT_E8e{HVF91uUAa5@0b0hZ z;@i{Xa{R&cJX&uAY&-m_J195GAw`>@_~ar*)oscRjNFG>?pZp1>D~QG-jk=$qWe5PXrl2)TQqb5}*) zCQNWA`wnS>{1F-zWInNGtRHF30`NhzDDz3r}=L%tFBY|8;fxtV6T~^Ng{|Bm=~gpMMyElJPG0+ z7iP9dAEQ~pv?MkDo3tw3RBE$_=??MRy|FroWQT}TB0V0Bcc#ay<6Y@-CElGLSK~eD TchN2yae2iw@GZ}?2xk5Z@5Xu( literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/classes/com/mosty/operation/log/util/StringUtils.class b/common-log-base-starter/target/classes/com/mosty/operation/log/util/StringUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..a08b7e1b4a637ddec2d4c5fc75ebf6b9cc3abfd2 GIT binary patch literal 7864 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 UGqMh!(_OVA;OBY6>0-X{zuu0e00000 literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/common-log-base-starter-1.0.0-SNAPSHOT.jar b/common-log-base-starter/target/common-log-base-starter-1.0.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..ae5efd8476720fcdb56a796a6fb55fe000ed610c GIT binary patch literal 44782 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 s#ExIghCIDhO#AAGWlNKh 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 literal 0 HcmV?d00001 diff --git a/common-log-base-starter/target/maven-archiver/pom.properties b/common-log-base-starter/target/maven-archiver/pom.properties new file mode 100644 index 0000000..c8ed89d --- /dev/null +++ b/common-log-base-starter/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Thu Apr 18 12:45:11 CST 2024 +version=1.0.0-SNAPSHOT +groupId=com.mosty +artifactId=common-log-base-starter diff --git a/common-log-base-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/common-log-base-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..0cd5280 --- /dev/null +++ b/common-log-base-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,24 @@ +com\mosty\operation\log\BusinessStatus.class +com\mosty\operation\log\mapper\SysOperLogMapper.class +com\mosty\operation\log\util\StringUtils.class +com\mosty\operation\log\entity\DeleteListVO.class +com\mosty\operation\log\util\ServletUtils.class +com\mosty\operation\log\entity\Excels.class +com\mosty\operation\log\entity\VO\OperlogPage.class +com\mosty\operation\log\entity\SysUser.class +com\mosty\operation\log\entity\Excel$Type.class +com\mosty\operation\log\entity\Excel$ColumnType.class +com\mosty\operation\log\entity\BaseEntity.class +com\mosty\operation\log\controller\SysOperlogController.class +com\mosty\operation\log\entity\ExcelHandlerAdapter.class +com\mosty\operation\log\entity\Excel$Align.class +com\mosty\operation\log\controller\provider\SysOperlogProviderController.class +com\mosty\operation\log\OperationLogBaseAutoConfiguration.class +com\mosty\operation\log\BaseController.class +com\mosty\operation\log\service\impl\SysOperLogServiceImpl.class +com\mosty\operation\log\BaseController$1.class +com\mosty\operation\log\service\SysOperLogService.class +com\mosty\operation\log\LogAspect.class +com\mosty\operation\log\util\Convert.class +com\mosty\operation\log\entity\Excel.class +com\mosty\operation\log\LogSaveStrategy.class diff --git a/common-log-base-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/common-log-base-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..a31c541 --- /dev/null +++ b/common-log-base-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,20 @@ +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\service\impl\SysOperLogServiceImpl.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\LogSaveStrategy.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\util\ServletUtils.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\util\StringUtils.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\LogAspect.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\OperationLogBaseAutoConfiguration.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\entity\BaseEntity.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\entity\SysUser.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\entity\DeleteListVO.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\entity\Excel.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\entity\Excels.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\entity\VO\OperlogPage.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\BusinessStatus.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\util\Convert.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\entity\ExcelHandlerAdapter.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\mapper\SysOperLogMapper.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\controller\SysOperlogController.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\service\SysOperLogService.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\BaseController.java +C:\tools\dy外网\mosty-common\common-log-base-starter\src\main\java\com\mosty\operation\log\controller\provider\SysOperlogProviderController.java diff --git a/common-magic-api-starter/common-magic-api-starter.iml b/common-magic-api-starter/common-magic-api-starter.iml new file mode 100644 index 0000000..4a33f39 --- /dev/null +++ b/common-magic-api-starter/common-magic-api-starter.iml @@ -0,0 +1,143 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common-magic-api-starter/pom.xml b/common-magic-api-starter/pom.xml new file mode 100644 index 0000000..091070c --- /dev/null +++ b/common-magic-api-starter/pom.xml @@ -0,0 +1,38 @@ + + + + mosty-common + com.mosty + 1.0.0-SNAPSHOT + + 4.0.0 + + common-magic-api-starter + + + 8 + 8 + + + + + com.mosty + common-base-starter + 1.0.0-SNAPSHOT + + + + org.ssssssss + magic-api-spring-boot-starter + 2.0.1 + + + org.ssssssss + magic-api-plugin-swagger + 2.0.1 + + + + \ No newline at end of file diff --git a/common-magic-api-starter/src/main/java/com/mosty/common/magic/api/MagicApiAutoConfiguration.java b/common-magic-api-starter/src/main/java/com/mosty/common/magic/api/MagicApiAutoConfiguration.java new file mode 100644 index 0000000..bf73fb7 --- /dev/null +++ b/common-magic-api-starter/src/main/java/com/mosty/common/magic/api/MagicApiAutoConfiguration.java @@ -0,0 +1,15 @@ +package com.mosty.common.magic.api; + +import org.springframework.context.annotation.Configuration; + +/** + * 自动装配启动类型 + * @author kevin + * @date 2022/2/3 7:28 PM + * @since 1.0.0 + */ +@Configuration +@SuppressWarnings("unused") +public class MagicApiAutoConfiguration { + +} diff --git a/common-magic-api-starter/src/main/java/com/mosty/common/magic/api/config/CustomJsonValueProvider.java b/common-magic-api-starter/src/main/java/com/mosty/common/magic/api/config/CustomJsonValueProvider.java new file mode 100644 index 0000000..6af9c0d --- /dev/null +++ b/common-magic-api-starter/src/main/java/com/mosty/common/magic/api/config/CustomJsonValueProvider.java @@ -0,0 +1,60 @@ +package com.mosty.common.magic.api.config; + +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Component; +import org.ssssssss.magicapi.core.context.RequestEntity; +import org.ssssssss.magicapi.core.interceptor.ResultProvider; + +/** + * magic 全局结果包装 + * @author kevin + * @date 2022/5/29 6:06 下午 + * @since 1.0.0 + * @see ResponseResult + * @see com.mosty.common.base.exception.MostyExceptionHandler + */ +@Slf4j +@Component +@Qualifier("globalResultHandler") +public class CustomJsonValueProvider implements ResultProvider { + /** + * 定义返回结果,默认返回JsonBean + */ + @Override + public Object buildResult(RequestEntity requestEntity, int code, String message, Object data) { + // 如果对分页格式有要求的话,可以对data的类型进行判断,进而返回不同的格式 + return new ResponseResult(code, message, data); + } + + @Override + public Object buildException(RequestEntity requestEntity, Throwable throwable) { + throwable.printStackTrace(); + log.warn("业务异常:message={}", throwable.getMessage()); + Throwable cause = throwable.getCause(); + if (cause instanceof BusinessException) { + BusinessException businessException = (BusinessException) cause; + return businessException.getCode() != null ? + ResponseResult.fail(businessException.getCode(), businessException.getMessage()) : + ResponseResult.fail(businessException.getMessage()); + } + + return ResponseResult.fail(500, "系统异常,请稍后重试"); + } + + /** + * 定义分页返回结果,该项会被封装在Json结果内, + * 此方法可以不覆盖,默认返回PageResult + */ +// @Override +// public Object buildPageResult(RequestEntity requestEntity, Page page, long total, List> data) { +// return new HashMap(){ +// { +// put("total", total); +// put("list", data); +// } +// }; +// } +} \ No newline at end of file diff --git a/common-magic-api-starter/src/main/java/com/mosty/common/magic/api/config/TokenParseInterceptor.java b/common-magic-api-starter/src/main/java/com/mosty/common/magic/api/config/TokenParseInterceptor.java new file mode 100644 index 0000000..712d077 --- /dev/null +++ b/common-magic-api-starter/src/main/java/com/mosty/common/magic/api/config/TokenParseInterceptor.java @@ -0,0 +1,46 @@ +package com.mosty.common.magic.api.config; + +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; +import org.ssssssss.magicapi.core.interceptor.RequestInterceptor; +import org.ssssssss.magicapi.core.model.ApiInfo; +import org.ssssssss.script.MagicScriptContext; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 泛解析jwt 信息,实现类似 {@code JwtSysUser} 的效果 + */ +@Component +@Order(1) //拦截器顺序,可选 +public class TokenParseInterceptor implements RequestInterceptor { + + /* + * 当返回对象时,直接将此对象返回到页面,返回null时,继续执行后续操作 + */ + @Override + public Object preHandle(ApiInfo info, MagicScriptContext context, HttpServletRequest request, HttpServletResponse response) { + System.out.println("请求前:" + info.getPath()); + // 拦截请求并直接返回结果,不继续后续代码 + // 需要注意的是,拦截器返回的结果不会被包裹一层json值,也不会走ResultProvider + // return new JsonBean<>(100,"拦截器返回"); + // 放开请求,执行后续代码 + return null; + } + /** + * 执行完毕之后执行 + * @param value 即将要返回到页面的值 + * @return 返回到页面的对象,当返回null时执行后续拦截器,否则直接返回该值,不执行后续拦截器 + */ + @Override + public Object postHandle(ApiInfo info, MagicScriptContext context, Object value, HttpServletRequest request, HttpServletResponse response) { + System.out.println("请求后:" + info.getPath()); + System.out.println("返回结果:" + value); + // 拦截请求并直接返回结果,不继续后续代码 + // 需要注意的是,拦截器返回的结果不会被包裹一层json值,也不会走ResultProvider + // return new JsonBean<>(100,"拦截器返回"); + // 放开请求,执行后续代码 + return null; + } +} \ No newline at end of file diff --git a/common-magic-api-starter/src/main/resources/META-INF/spring.factories b/common-magic-api-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..541f2f5 --- /dev/null +++ b/common-magic-api-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,4 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.magic.api.MagicApiAutoConfiguration,\ +com.mosty.common.magic.api.config.CustomJsonValueProvider,\ +com.mosty.common.magic.api.config.TokenParseInterceptor \ No newline at end of file diff --git a/common-magic-api-starter/target/classes/META-INF/spring.factories b/common-magic-api-starter/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..541f2f5 --- /dev/null +++ b/common-magic-api-starter/target/classes/META-INF/spring.factories @@ -0,0 +1,4 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.magic.api.MagicApiAutoConfiguration,\ +com.mosty.common.magic.api.config.CustomJsonValueProvider,\ +com.mosty.common.magic.api.config.TokenParseInterceptor \ No newline at end of file diff --git a/common-magic-api-starter/target/classes/com/mosty/common/magic/api/MagicApiAutoConfiguration.class b/common-magic-api-starter/target/classes/com/mosty/common/magic/api/MagicApiAutoConfiguration.class new file mode 100644 index 0000000000000000000000000000000000000000..19cff8c2f644c3d6e71aa1a5ff4e1c14dc35d5cb GIT binary patch literal 451 zcmbVIO-lnY6r8l(uGVU6Z(am%>cL!!7e!bKo>m2w-qST*U)>}noAu*oc@jMM1N>3q z+f@V)UQA$^nK!%)dH;BQ12D#@hc*T=hA}n;y2oTGoCvgc_of1!iM!DPgOsd3ugpyQ zYc(s_8Ko{$#Z-B!^|#pxw^RxorkOL+xH3FRX2w}*R8E;xOOj_bOO}*W!A+c^xp|gM;wD@!DBlz-e#x5(_Xdv2ufp})4 dg_yC+Hn5Hr#(u*itfJS<*Bb2e^eeXkd;){kc$NSF literal 0 HcmV?d00001 diff --git a/common-magic-api-starter/target/classes/com/mosty/common/magic/api/config/CustomJsonValueProvider.class b/common-magic-api-starter/target/classes/com/mosty/common/magic/api/config/CustomJsonValueProvider.class new file mode 100644 index 0000000000000000000000000000000000000000..8163e46c89d2592f03ccbac566725c8b19149a03 GIT binary patch literal 2376 zcmbVOOH&+G6#gzVlOBd9gdsps5?@IeNJyK6Xu^<0Kwfbm;UOBM(K|hNCJjB^V|NdP zvfQ|_$}*N47iMF*(p{pd0+f`c8yEfwH&Vov8&_6od2aVGOkl7Qq3C<=?Q_rbJ74q5 zKi~fVpa;1anvhh`7efus$8Z4`Yte|8qUe{KfjSK0Who6Q7>*%^kr+lXCZz#+<&u27 z5=BbEcnlM`tl)}*NrsSV=NRHC+sSFJneCa=Qg$vUoFv1ZKEpD+3#60ioMi|P+8M#n zkTNVWQOu`>GsDv+ozP{So3q?8TBcw4;-1M|5 z@orJL-jL-P-coWbHOCjYW^ya1O?!@E<&qUAm(z1X_mZ7Ej~MEmN<$2%9^X0DO!sTX z#u${ma9y7B>$M{$(#&v=%UW)|D@Dh!*Du4+OsEL?y|a&L?g~w82Bi&bzeEVC^)@{*G*=CPA)@o5OI4|#_P9Pj&I>+(6igA2 z38W0sKHV$s{NK_dt8=}P}vpqvLNx0 zb$DJZ+RnV@dcqO5w^R_?pq($+masfZ;%rsrwBVMjWx4Lz&XUH<*0sqZH;t^}<2SM( z0nN~qGwn1t10aubD`N^rMJo<49NRG;eqA$mo*Nc{*`+vK5!{qlrl~S2W^h17Gg>Ik z-&Sw0fAr=0{SVexSO2(wyM(gy@4c_$Rm>`QO~vcDs^Se?V>nse+kbRX#hZ9b!F3gH z;~frp3PK}Ll@mSNxa zX<#_xGgWmCFo*&O9|h`(EFH1NCYewVwoH}r&yYww8bc8OHAuL4K1ydCu2WlMIpK|O zPWApoC5@E0hBDYrtTgJ2+@T@vNK{P3?%YJ4qvU5Wn3C3qyp$6mm?~1qXPf4SbjGMA z0iQQ+RiJc8rYR+#b$ym6nhIyRVKNL-PE$2O~%1LJ0@o zDuyGKo(4_sxL_6-R&qzLTs z4_ojg$!eg0b{wP~4FaB`r@VX}5&9*KHPl>f?`{jPAas}Zl{OCgHhKcRk_~C|X$np{ zR`D#JqZ?8>j3Ws7(ouByfhN#d^7Sjdk-jF6FC+XdBJn*WDBmF(0tvMf-9I7rIl8-l zM65U57G6f(&uH=2WvFtkU&Y?9P*)Ng?l!VNMuHr;&izyL1}>6c;hPK_YjetkuBWpOcR;xpqQB-}ncJGrNluJ55?4{IGXE?#H=z&b|KQ@7uouIE}?3 z_F;AcuV5~ZQ$=JjTYz-()goTQ>u&W%k&0&uc(Z_t+rO2^**xCPqbe|dPW#%P7s!;S zmj$vl(^3LY)U~fZ?sZpGc*R@k@MN-XnqFtw3$@#)hgrL(BZ0H^rs>MAiR^~ts%w1N z_1d~Ay+HH8U)61S#avVVk{3p5(YGpWs=%6%@h5^%EqH#*#rU~gH(^^w=`V4T_y`sK zw^T>Y2YS(8HPvCws2S?O%8y*sM!c>WhPiI5^{d{xcU?v*T<<6=*Q^cX0zZx9;IjI( zr=mwtivr_EsyZF}lO4}*%S$U)RnszutR^CXnPE(E33fp*kY`;SK!K5@cTa^zVFFj+ zs>G14priUD8q-*@?a1ma$q4cB1zWOml^q2T_9m&&bsonFjlSBa5l zEH+G!#Js2-7mq%Wu&11vz>&*6-|DVf){$m6%=^Bvp4DW?fCWLQ{q}0;b=7Akye1=Z zUKzU)C|NUIa!L7)IkQQ*MwFX|boT~M<)yHt!fJ;7E=t&s19_Y);T^DPpV~^JVO_)v zJ>8+QKo zqqLDrEQDn_l-G3w&Ik~>K$ zD04HL5VyD(!$E$>9?hN
0AlqZmvD4pCRr(+9%TS72?eT2N77HzQP3xTCGJ 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 literal 0 HcmV?d00001 diff --git a/common-magic-api-starter/target/maven-archiver/pom.properties b/common-magic-api-starter/target/maven-archiver/pom.properties new file mode 100644 index 0000000..ad27fa6 --- /dev/null +++ b/common-magic-api-starter/target/maven-archiver/pom.properties @@ -0,0 +1,5 @@ +#Generated by Maven +#Thu Apr 18 12:45:24 CST 2024 +version=1.0.0-SNAPSHOT +groupId=com.mosty +artifactId=common-magic-api-starter diff --git a/common-magic-api-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/common-magic-api-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..61d01e3 --- /dev/null +++ b/common-magic-api-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,3 @@ +com\mosty\common\magic\api\config\CustomJsonValueProvider.class +com\mosty\common\magic\api\config\TokenParseInterceptor.class +com\mosty\common\magic\api\MagicApiAutoConfiguration.class diff --git a/common-magic-api-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/common-magic-api-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..492ffe4 --- /dev/null +++ b/common-magic-api-starter/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,3 @@ +C:\tools\dy外网\mosty-common\common-magic-api-starter\src\main\java\com\mosty\common\magic\api\config\TokenParseInterceptor.java +C:\tools\dy外网\mosty-common\common-magic-api-starter\src\main\java\com\mosty\common\magic\api\MagicApiAutoConfiguration.java +C:\tools\dy外网\mosty-common\common-magic-api-starter\src\main\java\com\mosty\common\magic\api\config\CustomJsonValueProvider.java diff --git a/common-redis-starter/common-redis-starter.iml b/common-redis-starter/common-redis-starter.iml new file mode 100644 index 0000000..367c443 --- /dev/null +++ b/common-redis-starter/common-redis-starter.iml @@ -0,0 +1,73 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common-redis-starter/pom.xml b/common-redis-starter/pom.xml new file mode 100644 index 0000000..a582c6e --- /dev/null +++ b/common-redis-starter/pom.xml @@ -0,0 +1,69 @@ + + + + com.mosty + mosty-common + 1.0.0-SNAPSHOT + + 4.0.0 + + common-redis-starter + + + common-redis-starter缓存服务 + + + + + + + org.springframework.boot + spring-boot-starter-data-redis + ${starter-data-redis.version} + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-dependencies.version} + true + + + com.alibaba + fastjson + ${fastjson.version} + true + + + + + + mosty-nexus-releases + release version + http://47.108.232.77:8181/repository/maven-releases/ + + + mosty-nexus-snapshots + snapshots version + http://47.108.232.77:8181/repository/maven-snapshots/ + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + org.apache.maven.plugins + maven-compiler-plugin + + 6 + 6 + + + + + \ No newline at end of file diff --git a/common-redis-starter/src/main/java/com/mosty/common/redis/RedisAutoConfiguration.java b/common-redis-starter/src/main/java/com/mosty/common/redis/RedisAutoConfiguration.java new file mode 100644 index 0000000..0da5998 --- /dev/null +++ b/common-redis-starter/src/main/java/com/mosty/common/redis/RedisAutoConfiguration.java @@ -0,0 +1,17 @@ +package com.mosty.common.redis; + +import com.mosty.common.redis.configure.RedisConfig; +import com.mosty.common.redis.service.RedisService; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; + +/** + * 代码生成自动装配 + * @author kevin + * @date 2022/2/3 3:34 PM + * @since 1.0.0 + */ +@Configuration +@Import({RedisService.class, RedisConfig.class}) +public class RedisAutoConfiguration { +} diff --git a/common-redis-starter/src/main/java/com/mosty/common/redis/configure/FastJson2JsonRedisSerializer.java b/common-redis-starter/src/main/java/com/mosty/common/redis/configure/FastJson2JsonRedisSerializer.java new file mode 100644 index 0000000..e2ba7e7 --- /dev/null +++ b/common-redis-starter/src/main/java/com/mosty/common/redis/configure/FastJson2JsonRedisSerializer.java @@ -0,0 +1,64 @@ +package com.mosty.common.redis.configure; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.parser.ParserConfig; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.type.TypeFactory; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; +import org.springframework.util.Assert; + +import java.nio.charset.Charset; + +/** + * Redis使用FastJson序列化 + * + * @author ruoyi + */ +public class FastJson2JsonRedisSerializer implements RedisSerializer { + + @SuppressWarnings("unused") + private ObjectMapper objectMapper = new ObjectMapper(); + + public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); + + private Class clazz; + + static { + ParserConfig.getGlobalInstance().setAutoTypeSupport(true); + } + + public FastJson2JsonRedisSerializer(Class clazz) { + super(); + this.clazz = clazz; + } + + @Override + public byte[] serialize(T t) throws SerializationException { + if (t == null) { + return new byte[0]; + } + return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); + } + + @Override + public T deserialize(byte[] bytes) throws SerializationException { + if (bytes == null || bytes.length <= 0) { + return null; + } + String str = new String(bytes, DEFAULT_CHARSET); + + return JSON.parseObject(str, clazz); + } + + public void setObjectMapper(ObjectMapper objectMapper) { + Assert.notNull(objectMapper, "'objectMapper' must not be null"); + this.objectMapper = objectMapper; + } + + protected JavaType getJavaType(Class clazz) { + return TypeFactory.defaultInstance().constructType(clazz); + } +} diff --git a/common-redis-starter/src/main/java/com/mosty/common/redis/configure/RedisConfig.java b/common-redis-starter/src/main/java/com/mosty/common/redis/configure/RedisConfig.java new file mode 100644 index 0000000..450d6a5 --- /dev/null +++ b/common-redis-starter/src/main/java/com/mosty/common/redis/configure/RedisConfig.java @@ -0,0 +1,48 @@ +package com.mosty.common.redis.configure; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.StringRedisSerializer; + +/** + * redis配置 + * + * @author ruoyi + */ +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport { + @Bean + @SuppressWarnings(value = {"unchecked", "rawtypes"}) + public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) { + RedisTemplate template = new RedisTemplate(); + template.setConnectionFactory(connectionFactory); + + FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class); + + ObjectMapper mapper = new ObjectMapper(); + mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); + serializer.setObjectMapper(mapper); + + // 使用StringRedisSerializer来序列化和反序列化redis的key值 + template.setKeySerializer(new StringRedisSerializer()); + template.setValueSerializer(serializer); + + // Hash的key也采用StringRedisSerializer的序列化方式 + template.setHashKeySerializer(new StringRedisSerializer()); + template.setHashValueSerializer(serializer); + + template.afterPropertiesSet(); + return template; + } +} diff --git a/common-redis-starter/src/main/java/com/mosty/common/redis/service/RedisService.java b/common-redis-starter/src/main/java/com/mosty/common/redis/service/RedisService.java new file mode 100644 index 0000000..4cb24fa --- /dev/null +++ b/common-redis-starter/src/main/java/com/mosty/common/redis/service/RedisService.java @@ -0,0 +1,232 @@ +package com.mosty.common.redis.service; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.BoundSetOperations; +import org.springframework.data.redis.core.HashOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.ValueOperations; +import org.springframework.stereotype.Component; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * spring redis 工具类 + * + * @author ruoyi + **/ +@SuppressWarnings(value = {"unchecked", "rawtypes"}) +@Component +public class RedisService { + @Autowired + public RedisTemplate redisTemplate; + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + */ + public void setCacheObject(final String key, final T value) { + redisTemplate.opsForValue().set(key, value); + } + + /** + * 缓存基本的对象,Integer、String、实体类等 + * + * @param key 缓存的键值 + * @param value 缓存的值 + * @param timeout 时间 + * @param timeUnit 时间颗粒度 + */ + public void setCacheObject(final String key, final T value, final Long timeout, final TimeUnit timeUnit) { + redisTemplate.opsForValue().set(key, value, timeout, timeUnit); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout) { + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public boolean expire(final String key, final long timeout, final TimeUnit unit) { + return redisTemplate.expire(key, timeout, unit); + } + + /** + * 获取有效时间 + * + * @param key Redis键 + * @return 有效时间 + */ + public long getExpire(final String key) { + return redisTemplate.getExpire(key); + } + + /** + * 判断 key是否存在 + * + * @param key 键 + * @return true 存在 false不存在 + */ + public Boolean hasKey(String key) { + return redisTemplate.hasKey(key); + } + + /** + * 获得缓存的基本对象。 + * + * @param key 缓存键值 + * @return 缓存键值对应的数据 + */ + public T getCacheObject(final String key) { + ValueOperations operation = redisTemplate.opsForValue(); + return operation.get(key); + } + + /** + * 删除单个对象 + * + * @param key + */ + public boolean deleteObject(final String key) { + return redisTemplate.delete(key); + } + + /** + * 删除集合对象 + * + * @param collection 多个对象 + * @return + */ + public long deleteObject(final Collection collection) { + return redisTemplate.delete(collection); + } + + /** + * 缓存List数据 + * + * @param key 缓存的键值 + * @param dataList 待缓存的List数据 + * @return 缓存的对象 + */ + public long setCacheList(final String key, final List dataList) { + Long count = redisTemplate.opsForList().rightPushAll(key, dataList); + return count == null ? 0 : count; + } + + /** + * 获得缓存的list对象 + * + * @param key 缓存的键值 + * @return 缓存键值对应的数据 + */ + public List getCacheList(final String key) { + return redisTemplate.opsForList().range(key, 0, -1); + } + + /** + * 缓存Set + * + * @param key 缓存键值 + * @param dataSet 缓存的数据 + * @return 缓存数据的对象 + */ + public BoundSetOperations setCacheSet(final String key, final Set dataSet) { + BoundSetOperations setOperation = redisTemplate.boundSetOps(key); + Iterator it = dataSet.iterator(); + while (it.hasNext()) { + setOperation.add(it.next()); + } + return setOperation; + } + + /** + * 获得缓存的set + * + * @param key + * @return + */ + public Set getCacheSet(final String key) { + return redisTemplate.opsForSet().members(key); + } + + /** + * 缓存Map + * + * @param key + * @param dataMap + */ + public void setCacheMap(final String key, final Map dataMap) { + if (dataMap != null) { + redisTemplate.opsForHash().putAll(key, dataMap); + } + } + + /** + * 获得缓存的Map + * + * @param key + * @return + */ + public Map getCacheMap(final String key) { + return redisTemplate.opsForHash().entries(key); + } + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public void setCacheMapValue(final String key, final String hKey, final T value) { + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public T getCacheMapValue(final String key, final String hKey) { + HashOperations opsForHash = redisTemplate.opsForHash(); + return opsForHash.get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public List getMultiCacheMapValue(final String key, final Collection hKeys) { + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + /** + * 获得缓存的基本对象列表 + * + * @param pattern 字符串前缀 + * @return 对象列表 + */ + public Collection keys(final String pattern) { + return redisTemplate.keys(pattern); + } +} diff --git a/common-redis-starter/src/main/resources/META-INF/spring.factories b/common-redis-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..f90f55a --- /dev/null +++ b/common-redis-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,4 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.redis.RedisAutoConfiguration + + diff --git a/common-redis-starter/target/classes/META-INF/spring.factories b/common-redis-starter/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..f90f55a --- /dev/null +++ b/common-redis-starter/target/classes/META-INF/spring.factories @@ -0,0 +1,4 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.redis.RedisAutoConfiguration + + diff --git a/common-redis-starter/target/classes/com/mosty/common/redis/RedisAutoConfiguration.class b/common-redis-starter/target/classes/com/mosty/common/redis/RedisAutoConfiguration.class new file mode 100644 index 0000000000000000000000000000000000000000..06c6a8c8205e47d800d2b2ada920c02135f9baae GIT binary patch literal 604 zcmb7B!Ab)$5PfO8t=4L5wSsu^rh*N4@KO;${vdma0 z?9@<#M_v9kP=-b}D;^0Q^6Sx51`hiu&^Kp`(Wat=W%79L1K!aK*fRwRs1TMZ3^cGp gSj*2IR#DCG*K(|3ootKv8)WOmY22a^U^77T6Dz%}lK=n! literal 0 HcmV?d00001 diff --git a/common-redis-starter/target/classes/com/mosty/common/redis/configure/FastJson2JsonRedisSerializer.class b/common-redis-starter/target/classes/com/mosty/common/redis/configure/FastJson2JsonRedisSerializer.class new file mode 100644 index 0000000000000000000000000000000000000000..916ebd8eb4b41d487bd2a7880fe712671551cccc GIT binary patch literal 3304 zcmbtWYj@K|5WO4Q$aVw?X$XWi#L!3V7*K#x9x;K$#6aot{bNZutIxESxNL*;>mzA_LJ9BsL-C6zh_ph%2oW%EW>_<+*l{k8k zi(v>?#c)l+TnxMLc^rAniDp?ixRlZ zxJCDE3?V8k!|nnnqDcgPVdAro%36c#mgz_+F-S>ra|88OwAb>j%%r-7jg;28My2f$ z$wLk&X$8|4xUHKtN-QNQfD56IloAvd!$fjNVidLLt!aFYyc9k{JOadqiE$!Ml%{}`v%BV=tWK>a;@jgC~u?n4`zaw5xJp$UAjC(K`M#ro` zUm8o)n+{Ky7EhG4gxNF<33VAJEC~%6_hHL$Kqn${tC%}>Rzg$813Z-QNX9xgWPFS7 z7%m9x@7xq#1MCsXaPFPyW4QF+*S3nPiUZs}$qajL+d9`=DKC(C7*4sTVMqMX0T}K| z>RjRa0$nHE5-%P@49mf@;>&vF9g+rnOuKhP>9EguZRU`lr`xULwyja>Gv0CP>LOZ4 zLtIuZrp^R``xyhrvDHjEn)EkEQtZZ4lk0{u?U3+EbrK14fkeqL7R=&D2xRf|iVh*} zr8iy6oEn}Yx?WB#bIV?*E3l$f)uzF(nGRRYvS2&;)+V(z46(hNEdu^e(kJ#rPCh>iRX%8 zl~kisprd|)wjGEr5vVc)bYo37xh3jSXf_&_AUB*`PAyVr8lpcqh64!E9~|{V`mGxl z&5WKsqBW9j)O}CT{~R@99HIFSY39DW0@yeH0&M&xdX`=w^bFzg^fN?$B8Lz@qHzFW z8jsL8gg#n0NV6Z)%n*g4#rOnc^b~JivLwBCY^k;_(FQV3Z)qH*_yWcch`5nP(tkn< z{T6+a4*!l_OQENb3Y&;NMeI4^PslOs!r4R1fFymT5T!63C?jnsBRGcRl%xYi*gPo0 zrjTudqJ+SrIN^q7^e^m{=@c11#c3biV@f0vCenW(ntt^oBJ9aa^e&|d*9*w=N5_9b zWD~nP0KIxmAV!gUaf-+}?Sf2raoQjg_zY(#*M9Omi*r;10avCO%I3orAj9a1(e>uO zbx@usze!|h6g6C?)q)Kr zQxsj~x#Q=FZlXW^9DBvCJ(UP)f&4mjMBA~W+ms<}9v#AVk=A;(zeJQyW5(argu5r8 ne_&t}@BNI}CI-XLu}|!b1;j8+s}7MiN6Fudlf`B7>A~zjk7#5z literal 0 HcmV?d00001 diff --git a/common-redis-starter/target/classes/com/mosty/common/redis/configure/RedisConfig.class b/common-redis-starter/target/classes/com/mosty/common/redis/configure/RedisConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..f4787c36f66588b766bf5e0d62017d4fed90c7b2 GIT binary patch literal 3645 zcmc&%e^V1j7=DgKE=iB7RHdl3wxty$aQ-T-2Em9#(HM|WEd6Dduz|zmF1@>`@w>F2 zq2-S_BQyN~{Sf^ko$2)1BMC7k9!@*c%w+F&@7-tL_j!Np?jL`@{2jn0JWJptrgVIf zKp&=5^QDffI<6&f2q_)Y3B)iJ$92raF^e0jn~viq=Hj@8`8YDTt;X&s`2`(!6ByjX zxu?Lgs=2S4oN5+zEa`Zlp?})4Eq_KsWOQs*Lv+sBkQxqWEnDWQ<#p+Tg+|hRJNfDVt@-^J^yG%8qTia>Mf2v5VGb)s^P5>dyt;l!k%e^NK82 zO2Q}j)6uNsZkk@jwd~EJE6Vbz<32VwgfI4yY+3LvLN}or{fsF1j$2EOg+ny;Xf8}m zj#9-}fi&C)T}dejv_?Cth`YtmxH>8qAh52ZU_hd%W6Quc9vdj3Y`})Ylnb$XKRwO7uj*Du&KaoSCj+i( zJk|KBsVYK~p}e$to-}sTq|oWQhSQpkmu|jVsW`5$;g~0V4tJKh`TruXxMdt0ZOh@g zlJLBg+DR^UcT!u-FS!mYl3z;~3exi&)}}~0o7Hf+M}>OBRPK*YG+YZ^Qq{(E)pu@5 zpEYhINLj07`8B3qd&gKHU2b5EWEw}(xit;b;d=GNX9^C`4ee|EG8&H8Nl_|%N^cd$ zdQ4W^Y`4n4(4Eef_%_M(xgVGo_i-~TEYFkAGs1FZzPi4`53Ah1D6Kpjvuw{7c7bK> zUYHsO$0e&*LzHaa%|>p?qNtX9>c)JfM>_iP++yxgW+9hm5cXoaWqog82IEr=7rHCf z7R1U^ilzm-=!~QpW__xOEiErD%`dMo;4bxGsy7A+InMKt^@PW&4&(mp6>cqyTD&hg zrCQl>D_d6K6*vAHPTt;>w++|B%&&H*&;_9;x621r>j**a$=d$WNyAKNoow3*IyQj- zb5JF|C{<-Usw&ENgtyhP*onsQYx0Al$OBuW9$3=LOICJu+U~LucErbi!Q+ACKr@gnEV%_ zyrKY`yXaecfyn*jcpcGQ99kRfe*rzWix`LF*P_GG9VB+}P94TW^**qJcXx2Ojw25z zhNE>HP3~flqVLslEICof@%{b@)gMaM@qY4GE){`NZwdo!Pw|p;nr~+?MCFuvNh+73 zdTD%yEY9Hp&hw}+&J)4}PY08MIal^nZkR*mF@jHNRt%3g>m2zR!V*R?#7J|n#TsnN^9sJfnAVgGafzvcfVzt7@pd~;)%7rhuZ L_{?y9>&Eau|I?6} literal 0 HcmV?d00001 diff --git a/common-redis-starter/target/classes/com/mosty/common/redis/service/RedisService.class b/common-redis-starter/target/classes/com/mosty/common/redis/service/RedisService.class new file mode 100644 index 0000000000000000000000000000000000000000..77be5d996a5301053032ff911aabb0016b7e0aab GIT binary patch literal 8003 zcmbVRd3;<|75-jkn#oLFv$ZKyiWGs;G)+gAlqIFK4YW|w6i5g{MVL$;$+VMsapp}+ zRRmm6P}~v3T~S=v#b8iyr6?+kxQh!esJO3xsra4y?!37(dGqUQ+u!fKdH0?BopZi> z&bjBlJo>)}9s+PY{++_1cv})j*gfhgIiL3`(Anbz7*b% z56G_%%H=~M@?rV)5xIO+F1NPgWBB-j=k-5%x=qGE(TY#vQ?2+kZcpG2x!>7}yKuL> zyQdZR;xqE=zE*q|vvRp#E}xUjoLnA|x1Ueo3l$%0f=}a&oy|L`Mdver8*yeS)Le5)nA-1w-%tCz7ouG;BL%D)8 zT%I0xilZ57v(PoicMo7ujT_7 zBSUWBU)js$$yp&=E*71FmmcK`U%&-XzzJDzw@iXM>StSMk(VNB;Rye2Lo5rI9EeZ# zy7q%E6f`?m%rKzHa|jn(doH$MZMD!J_HuvdoEtAIHmoNq5F6svM+mp($9O)MFB&+bgq5)IM}D^VS*G z=yYK$t|weyqpJ&>#^b82)sci5pd8U%DUe1DD z$@!sNi6MJT2*<`$5mMkS!k|Az=YWD%@0s#hmqpP+ciq%=nvI1cUM9P1TV_Vps{|gj zupu%*p_t;ZT?rW9uA@U-(UE4_dU|BV^^+^!v{on_ap?1o5VeNMlo{xW6kD6f;RMBN z!ZIPeD?ROXp#D+@!i_ec`p6H}(j?Vuv7z8>PZG*4GLp?<8d4!)`$78DIAxZG==ZfH z@K6F@v~WY@r8A%cn-6vs8e8022|%?#M}-7}8A22yo$Dj}P&cI}r1u_5slCC% zDIv@0`?de>C_bh3z5}gsCa~^lIw~PnHSFX_hH2LoWUx`D+?mp5w|G{jG-ct$NEs}$ zL6MP-@{)s?7DD`dD)n9wy*|%}@b}Vga<;9U_j0P6s1kQ-L*nYUNi%LLTbwK@d+b$4 zY*#m6)4@ukO0IH|BQ-i|y=|4c5NAg&_JufUPN~{V`w}x5kCnc_vJ`om>8kE|q~S@8 zxaDHj*_@L@N~bzB>4U}^=|qIMu+vtF>K)hPIUqggPS3anHs1p_da%mIF<6nnmu!3) zUrFGrHok_3**e(Rhezb$>j`|r#-mtoV*>`|^34RkW#ij;%*L5`+{P9>VdF`B$Hr6g z>nVKK#`p031b$%Shxn0=ALA!Bp2klT_?eBL;}_gzY&?U<*yz`vU2Oakzv4z@c7l~{-NJEE&}xpptkr(?(Dm`8mC-iT`K|T|QFPZ$3D>z_4TeM2 z<56cdAoL(Rz;XZdRCSYQgqoJ1LWlvWPQBqwnwv&dbBy(rZ9)ipro7g~qo042v9MCl zXi#0%)})Qm8Z>>v+)gvvv=KQXIvp(5`-AHA+>3+LF^alk31Rzzh8j^r2QL;1a#AFiYy;PqHOHS@lb_r<)k zRp7OkPifvQ-WRO8AJ#qm(S+5!im-_G@oM`5SVLg}eKC%sluXVd#{WS3s{7D1i&*dK zImBZSn3#e|Q4lx+ZCI|LmiyuwiWB)w`~(HxjuX*O>9v&i70Sp-966aIO*lmj z@s%`i0q@;`;=WldSQ?*0bMrj)z4T+XQh%a9DNx@XsPES535fx$Q)YJKG^|J5FiE7U zCY?@`Hee&KV$xZ}j`N;c)w}#&BxccaJD*H8*BTV00vl3+4Jm5g#2JD*s8KH@syM0` z?p?k#K8xfmQuWZA6!a=(Kzjgfvg<<&<7X(REOvXFwUP}~D(hqmo4vDWC6{;989$^n zEb-+64YoF(do~I1i8xK8B{iCTcOBH20hJ7(k^$7&*h&cDbb@z@uMWM;+gA6^VPO*l z(G0N5(1MJ?ZbyLHp;22XaSn!vR|znGWE)5P02`+H+i`9KO4>q5-)Z<^2O6uCY{z*G z(Aq-?_8Op_j}f9+7{vvemFwxdMA|Z+l@7_e&KQRK9zh~`8xoQVvV3tP1+U`5U#&Fw zL9#5ccUcgB%P@uusiPeW@e-8-6|Sg@?=IrIi;2sm{tpgGV8>uwbN5o(cL`pm?c2=c zlyK^**q2<4t~o4jR_kVF#Px>HU4cbi+9H2lE+zJ5TwOmR9@qKMuY;?5n9eU@xr|Hl zA7b$jXovO1AH<;-#bjWqg^@YDpa~b=_WUz_5;i_5OH@+bh$R2?)`^>N7;a`Ax<#4e z7m5DBoc@5IevGr^HF4HzhNi=1=wzk69Fs&9s{HCEQd5CcE|A(uDWT6s(|^&Kz^(-H zM`{A6>0|+}c2bIf5ZLAuco>6znIH5fdAAzmwFTC;)sQzs+?S)MaXs21>9lC|K6Lun zhfDCh&@b6OHEl}dP8xd`x>!qP2k;$R6ew8~P_hUmc!aM;ij0&wBCf_@b!iWG(~>>7 zLR(Vj;o3Plx#hgBW-f zV?x%ULv0Q*!$}!AiSGF!dL?amHLlV&xEvQ7DhvZ)`QN0P03Y(r1iOLsHQ_Bm+wxZ6|G(!;00000 literal 0 HcmV?d00001 diff --git a/common-redis-starter/target/common-redis-starter-1.0.0-SNAPSHOT.jar b/common-redis-starter/target/common-redis-starter-1.0.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..1615cc9d469c5430c3eb631486a9ab9b7a20ef85 GIT binary patch literal 8978 zcmb7q1zeQd^FGbeoq{w-$I_wF9n#(1urx?WcT1ymBS@owbT>$clyrln{6Vi5uUGH? z_dV?U?($*gnVEAq^Uj%P1Y;KA<3x$?g1w-0~a;BMcgg%$bf#brbo<^B=_fSuin zxv=1{ncx1|`}V^8SxlN=MqET#L6JdPz_I8XH z+JFzpM;5e+sr4q#G71{o4dy^ZB;dW~drhz(zJY;d8pZr01gKlz3~a3a_Ws`zccI@& zSlNIaT>nE3?H_Wt8df&eKZ*Z3cR0Tjw>L601O0~*$)A-BY^;sVOdRcv{zIMU&*~r} zdnYr4du714#lCh&z?Xpr16xM~0~7qS^1W>lJ&=P0$i|xG?k0a1je?QAnVzMYn~^<( zfu$Y@l%s5+fgy_N8A!fOS)7SkK1n*PEf!RtZ`I&UER;C{_$Y*FYQd2rtvb8iF&7Nq z;IZAb?)AEwM%L7oJH;XO9_xdfk~^`LlHaV%!duJyTU`52pY(-v2?`dF89rWbWk@p8&o+KU3c?Ih z(61#y2Ep*FtpyMT_$VKrY*zbA?!h$doa(03GzZ&qZCZt5L>ku-D=l}&7PANJI=m^A*Rand!FtCi=B3QXGYy zy4TlpV7(aiN{q{L0z=wqU9W5+mkckJKic&cs$ezK)~UCU+eQK{$k}HrzmBHKPixxvHCfI=zs`Wc;LKUa zCn6InS@IF>85j|bs(*LcUi&86*hkD+|8^$ck=YKBrTFB|wI!OUxA0$x$ zrDi@CPU)z)GA7PxM8jd+H2tgCYa7ljgyjI1wzAm_qLTOi!-jeDB%?;J z;HLXNwe{X`d(PnJK0bm+8|E(5Z%8Wu20MikCW{9SaLiK6vRSKdR*F7GuNLy>k`?Y| z8X@7`af0SKVZ(`1FnK2I-fhb5JnOibC!Cc%PUks(T5G&TIuks>UVx+5_Qq#3?ZR35 zGrxi~2goTrMmYO{t2>D=HG4aXHVyGGlYJ!12Q%#v*ud6i+YK`ju8_E4HnWJQG=@W}xG5;gbW zQ8?r}MZ4$pwVx9Vgpo%G+6Nuz4s?2x?hdv0{DyJL)C6Q6{L55A9vc~BPof08dQuAZ zb=I}v`Ci1$yto1kQw3SYJe|y|NEmx6(gH<~(T5zL0TWL`&>4(PBZx$^B$ZRayueSn zoQ=}IPESzABfT}a@0vC@=s=0sq2MJb!*>IXR(+1hCrQ0@g4t7Lkkv%?)}N0D%GV{F zM52q&&nc=5s@uhTlo+oQhf}Z`Ic7yIm8|zgsQ{0U;)p0(zSgsk9f!Onoy`1Mx^+@K zEz%U@HO>ePq`sfh5MfAoL^qzuhIOO}xHt|Bj zUBN%XEmg%ObqFqlpK#@R>h4Phdb2W*|^Lj7rIj)xv5l5cJ7Era|$df?L~v*dqj(C#D(gDvTaN zx2`&Npe}fwU*=CRDmOFUkV(R{YH5!YZl`x7#8A;ZXH*?cDGr(~S9SBR6F7j@duoj! zE2uMT&tlwhu#zF}jMvGo)kw{&za2N(Q#Y$Ae-$?vVQRWh#CRmd-cSB%+qs?4x%c>O zX<3atL+}3c&N()YBtslA_L^+sbznXOk-?w#VF9ms zBX>76T(M6%SGnouZB<%b&JjBksdQW;_+AI0yyS%?uDw9)HO5kWgAz|_wfoR;WDU8( z$;^LmFrbX1-#?rX-gsUm&%Y!A!7GuE_N)4dUU-M|&A8W$_phbosw0tq9QfcKyjKqch;CO zTL=_R0yehE%a;Y8U}%b*&|oN57{YTWv!rXuYn!aiYl>WT97Y21I{U2=w(RR|qGLA& z3#zpqm^Fq7E53M3qVq!Toic_`-$Cn=f@$&gV>JiNxJDQ1K4Z2sy0qo?d~*fQ?)N+B z1|`r3Sl7lcGl}6ZeHIOUot!Fq=DfAV3TYr83-COT&(}d>Jz;-(47ns#Z|+dy?t!?& zadRM;dD2*hM1;;JgEhoY{Q5HT0M7in-HYt0z3vtin?+}STIBHx8YlmpI_R4DxDD+hyAVJj{D&F4GHRrzz1`VZ&H*zexgR1jyW>E=gzSx`RYRc z#FbraVsPVz{(5it$j&3&hH`pCkTFQQzN4!#(ewuApLua#aC1-w91Kho0t^iJ=e+nW z8}d6k*nH23j`n&EW;WK}6Jz|dUI|EMOuh{Ti>fMhe$6_CW*E)d0zeKiz*m5Fu2v#% zBau5cPAYfPqz+y44BRu$#U!^D6!ZB@b$z7Rt#MvY1HZqKNR5I#@tTpzT z`j5rR6F5gX+zMZ`!RLkTvWx{#mN&kaGmCF{WtNtt3J93v&rAzh5o-@gKCNVD2vt~C z7@YL(1Qj_jRguP^bj*(ern^Nu+i~K(_6Bc~UGVzD9pj#92Qg*nMS9J!y>!a(NZRA= zL+aVO>iCjCMh`rMd*>J@m&&;#xHhF>FL+TqRo^0ytQO^!Ue+bq8Qt3CGWh8kfqP#?Ctmf1E1C|fTn?>*xv{2r zF2>soz$9n!#(^niNm0R>o|X(vC+l-cZi)x?W7%OHtXjdlAnQ%6q4$g_EMwU$8OCGX zes9U*M-ZpvsuV>&V9Q3thNSigq4Y8fj+$h>Z6K*9voP&cj1jh^y%>u#KSlslR>=YY z$mR;!`u%0e@*;1$#f6Cy#FM=*^yn$6C=IoY7Ccx?rHaTK-8pk9vc%~P`eJsw$%D%f zyB}RVW9zWOt9UGC>?pzvvpQMH!tE*)j0eGB`rt7sQG6C07gl5hUSF7YXPEHE-eZKm zM-@^@y!PO$qN_s6-C8R=(5$P4Pg1m*NSGeW^ky)#rN@L9%K*17J8D)d*1yO_SF@y1 zdYJ7c;(fFXDbAn-R4CFFZAtV5MZ^ZaAq`9n6JE2SmjoNHcSgu(|2nk$y-QIE?~84S+g!p~qg9aradl?UU1FcCzORe^@*%F4SI`TKB>~NJXrQ zCl`j5p8vc#lX*9!<0#a!%9kcP2Ww7>`fb08ylfdNq1I$P$-~y1?X9C@jVI+>r#tIT z!2KL*iVWQ9jr6h@*yI@kYy2^ExJ*i6sjgP$%aqk5DndB*u5&#$!50IxiNG~w5krd z0n-zCac4ct;Skxa^KoXm43lwgT}DThgb}-QZdskmONbkEf+T%*zg+uv;!4bU4Rk-r zWaTX|#};#)YKA#!x+y~Fy#5NCI<|qVyn^u0)Ya`1o`b$D#W}!ttk*1DKziNSHy*l` zTvbbQa5KE#jO*|>Cv`(=(_)D`-IR#q(6iM!WaF->ZUlCHIb#OSF1zbTLy7DKIfhbb zrT#KGi(xrB(X3r&Fm08VaydDzS*oWlwC!+7XZwjS#|?TI;@OTI2SPjCLJ-1iDULHu0&cY&Psw7#LxKBV{IY4P!B}myjosSTtR!q z?{i$GiGL0B^IFnDxBdWv;7+jP%ChFHImaohs~ip8)jRJj^hQW{ev+eZrG%0$jZ<~b zBX^{+6HZ~7g`h8Dw;*?9;}C&QAc1PBsZy_?&{R7!F`tP;vee)vj^0yLp5~iHmJs3E zOGndua zrA*c|Wn##@nfhV6>`KcoqqHM0ykV;EI6|n!QEUY&7zNnlcp>+`93TIXQ;9UzsU?P{ zH61l!c3frkIMN|dVdvP!97MCcekxpF6Zxn!m^+b02gxd32DwW?Vf)l&NTt}H?n|=z z@!4_d489IluhKq5AbK~2#K6PV{A?`O5*9&Hrsb)>3vxUn55QaC6b z=!K6{!H#UpDr-Df;@iWoZ`Y|hfsg7T-}>MLjAZ1=!3IKElq1uE1CFyiz0+}qRG=GX z*5{tum}9L^iR(Ozg@3f?0@h-NAD0n|0UWV*lfVZ5h{0@dp|2^XXbD0DzW`?={E}sf z>@!g63I(Za2|<~{ga%%6@5m8T(39!7HD0t) z3?)f}sm?O2%?hNZIP|oew=~ljR=`gcGjyUlA7M7&saMVRyVrAnex?+lz<{C?D$#}P zU}05Sm1;q8T}n)b4cV7GW#A6-TN5d-0V5xO_?n0sqWe)P-G`D6NZl;3n&-H{y6|P1 zh@NmmGLS>4zXW}6eLa{+J&_MCH(YrN2!$Kf4T0Go;<1G=A&0|*{UeqV>+D%6*(OQzwT8b$X3tFZb zrSu!RWVGeis79O817&-=m?D5cj_ zgc4&@-(GeUG}Ngwi&e-J#Yq!W67SR3=Dj)WDN4KflB7ABx(Z(S?~e-0u5J}vt)%x% zEK55LdjR|Ao|Zo+IRKRNA z)_2ag7vAmlH+2BAwKuaiVKCM+aImpAGXfcfGQ)c_p+a5yUNz&)qRV(=BigZnYh>(!snoiQ_zSG;X>pjT%mXRTN=<>W{N5mhk8r{`z*fcP*(-8Z+QlD+M zM;ZZ&bmTuBtlBUc=9?kT{c!5vdm}od!Gu!-({Kk6VyU&Zi!G4*Fz*Kz*=$oe zL8IB*OvHgS=U10suNu7=xYdmcoTdG;Qwc9xbr;?Jgn4u6xQ=yncwsSa9?i}O*Db1$ z%clnbxwORH)^%v&Wl1y{5}NIwERy?0Z@rk%F(UFKR1YU86xp_(qBNX;h-b>s}H}w30F>^OD3au_4VlVY$azFrL?E z9+%g>gKu70Kk=+6FSX#H1hweT$;EYzj7G%ziGsOQXs(O6chnvB4Z3c$Lw=A}HdyY6 zE*%$9VTBWtEwxNuR2oL@Ikkp^1-FmMBAlabi*QQT2MsXY(?40oHlf{ zy+DylFl_YC>>YaM6j~pjSKcfwxyY)RNep0rg%TZM|Hw|_vrEKYtPk|dO^MS8qtLg) zHxwZe`S{2@EQ&PzpM}kqp@6AT#Z@s--F4X^q2cf4-g)AxVaYq|OO%nn%sg1P6pTwrjlYbI3WHhfV$I570@5HfU7QG%?L1;l?y+{0}>cOT(Y5kG8vK)S4_d8N+0x+dEyH-x-s!X1OT)~$uTj*u>$>zs)27Kf8o>KL%xZiFI z@7s&__WC=={JKMbyVdTthpoMht&zRMZ5pEJeh1%5j0rZRwNJ!gs63V{2Z1LLSS?8O z`iXAr%twAC6^yQhnxT`_HNV?#dg@|b^Z1)YPK#L+A3e$;*r8mDFKN@w!`w_gm8m6S z6f0vE1=;AQ?7Z9OyPWO{+H1XIkz75Al5?C#imknoCvTXk_&NPaC9aXsO?2cW!67gq z|IE7HMs_<;!FKrX-v18rUhVfR?49u4$o8SSz5lKD6DNC*@NXvcwzK@#xHH^(`}uYf zZ`0GgtG}|V-vhW)y3<(wOXEk1{IlL2m->C&=^@>=Ztg67*ZaP3|1kS&j=ken@6~yK zr~WO){wD~@4~%cV+x;2jp8foJDt`6pj(hz+?m{a2Gu)3h$358Zx!50Y**-ge2D|s| z|If_+YVcP!;oe{>>~9w2`;6Wj{MM!s{E1um75~?++&zBfE#3UD1^HlU(;X5n-z0347{O`({dw3q)pElR8#mzm;?+cLcFsNWRH$y+e z{3u86H_fmAVRr?|z4G + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common-task-starter/pom.xml b/common-task-starter/pom.xml new file mode 100644 index 0000000..34e0196 --- /dev/null +++ b/common-task-starter/pom.xml @@ -0,0 +1,116 @@ + + + + mosty-common + com.mosty + 1.0.0-SNAPSHOT + + 4.0.0 + + common-task-starter + 1.0.0-SNAPSHOT + + + 8 + 8 + + + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-dependencies.version} + true + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + 2.2.0 + + + org.springframework.boot + spring-boot-starter-aop + ${spring-boot-dependencies.version} + true + + + + org.springframework.boot + spring-boot-starter-validation + ${spring-boot-dependencies.version} + + + com.alibaba + fastjson + ${fastjson.version} + + + org.apache.commons + commons-lang3 + 3.12.0 + + + com.google.guava + guava + 29.0-jre + + + + com.mosty + common-base-starter + 1.0.0-SNAPSHOT + + + com.mosty + common-core-starter + 1.0.0-SNAPSHOT + + + com.mosty + common-redis-starter + 1.0.0-SNAPSHOT + + + + com.mosty + common-token-starter + 1.0.0-SNAPSHOT + + + + org.projectlombok + lombok + 1.16.18 + provided + + + org.apache.shiro + shiro-core + ${shiro.version} + + + + + + mosty-nexus-releases + release version + http://47.108.232.77:8181/repository/maven-releases/ + + + mosty-nexus-snapshots + snapshots version + http://47.108.232.77:8181/repository/maven-snapshots/ + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + + \ No newline at end of file diff --git a/common-task-starter/src/main/java/com/mosty/common/task/TaskAutoConfiguration.java b/common-task-starter/src/main/java/com/mosty/common/task/TaskAutoConfiguration.java new file mode 100644 index 0000000..31c068f --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/TaskAutoConfiguration.java @@ -0,0 +1,16 @@ +package com.mosty.common.task; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Configuration; + +/** + * + * @author kevin + * @date 2022/2/3 7:28 PM + * @since 1.0.0 + */ +@Configuration +@MapperScan("com.mosty.common.task.mapper") +public class TaskAutoConfiguration { + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/ExecuteStatusEnum.java b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/ExecuteStatusEnum.java new file mode 100644 index 0000000..c8ebc88 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/ExecuteStatusEnum.java @@ -0,0 +1,26 @@ +package com.mosty.common.task.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 执行状态 + * @author liyan + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum ExecuteStatusEnum { + + /** 1。未完成 */ + UNFINISH(1, "未完成"), + + /** 2。已执行 */ + FINISH(2, "已完成"); + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/ExecuteTypeEnum.java b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/ExecuteTypeEnum.java new file mode 100644 index 0000000..ab1a4bc --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/ExecuteTypeEnum.java @@ -0,0 +1,26 @@ +package com.mosty.common.task.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 执行类型 + * @author liyan + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum ExecuteTypeEnum { + + /** 1用户 */ + USER(1, "用户"), + + /** 2。部门 */ + DEPT(2, "部门"); + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/GroupCountTypeEnum.java b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/GroupCountTypeEnum.java new file mode 100644 index 0000000..2a4b73d --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/GroupCountTypeEnum.java @@ -0,0 +1,32 @@ +package com.mosty.common.task.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 执行类型 + * @author liyan + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum GroupCountTypeEnum { + + /** 1。今天 */ + TODAY(1, "今天"), + + /** 2。七天 */ + WEEK(2, "七天"), + + + /** 3。30天 */ + MONTH(3, "30天"), + /** 4。全部 */ + ALL(4, "全部"); + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/LineChartTypeEnum.java b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/LineChartTypeEnum.java new file mode 100644 index 0000000..20aa39b --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/LineChartTypeEnum.java @@ -0,0 +1,26 @@ +package com.mosty.common.task.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 折线图类型 + * @author liyan + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum LineChartTypeEnum { + + /** 1 日 */ + DAY(1, "日"), + + /** 2 月 */ + MONTH(2, "月"); + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/RuleTypeEnum.java b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/RuleTypeEnum.java new file mode 100644 index 0000000..925f953 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/RuleTypeEnum.java @@ -0,0 +1,26 @@ +package com.mosty.common.task.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 执行类型 + * @author liyan + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum RuleTypeEnum { + + /** 1 单人 */ + ONE(1, "单人"), + + /** 2 多人 */ + MORE(2, "多人"); + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskItemStatusEnum.java b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskItemStatusEnum.java new file mode 100644 index 0000000..547990f --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskItemStatusEnum.java @@ -0,0 +1,28 @@ +package com.mosty.common.task.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 执行类型 + * @author liyan + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum TaskItemStatusEnum { + + /** 0未查看 */ + NOTVIEWED(0, "未查看"), + + /** 1。已查看 */ + VIEWED(1, "已查看"), + /** 2。完成 */ + FINISH(2, "完成"); + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskLogStatusEnum.java b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskLogStatusEnum.java new file mode 100644 index 0000000..86b980a --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskLogStatusEnum.java @@ -0,0 +1,43 @@ +package com.mosty.common.task.constant.enums; + +import lombok.AllArgsConstructor; + +/** + * 执行状态 + * @author liyan + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum TaskLogStatusEnum { + + /** 0未查看 */ + NOTVIEWED(0, "下发"), + + /** 1。已查看 */ + VIEWED(1, "查看"), + /** 2。完成 */ + FINISH(2, "完成"); + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + /** + * 根据编码匹配菜单类型 + * @param code 编码 + * @return 菜单类型枚举 + */ + public static TaskLogStatusEnum valueOf(Integer code) { + if (code == null) { + return null; + } + for (TaskLogStatusEnum taskTypeEnum : TaskLogStatusEnum.values()) { + if (taskTypeEnum.code.equals(code)) { + return taskTypeEnum; + } + } + return null; + } +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskTypeEnum.java b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskTypeEnum.java new file mode 100644 index 0000000..3769b74 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/constant/enums/TaskTypeEnum.java @@ -0,0 +1,42 @@ +package com.mosty.common.task.constant.enums; + +import com.mosty.common.base.constant.enums.MenuTypeEnum; +import lombok.AllArgsConstructor; +import org.jetbrains.annotations.Contract; + +/** + * 执行状态 + * @author liyan + * @date 2022/2/16 11:06 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum TaskTypeEnum { + + /** 1。核实任务 */ + VERIFY("1", "核实任务"), + + /** 2。预警指令 */ + EARLY("2", "预警指令"), + OTHER("3", "其他") + ; + + /** 编码 */ + public final String code; + + /** 描述 */ + public final String desc; + /** + * 根据编码匹配菜单类型 + * @param code 编码 + * @return 菜单类型枚举 + */ + public static TaskTypeEnum getEnum(String code) { + for (TaskTypeEnum taskTypeEnum : TaskTypeEnum.values()) { + if (taskTypeEnum.code.equals(code)) { + return taskTypeEnum; + } + } + return TaskTypeEnum.OTHER; + } +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/controller/SysTaskController.java b/common-task-starter/src/main/java/com/mosty/common/task/controller/SysTaskController.java new file mode 100644 index 0000000..992f3be --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/controller/SysTaskController.java @@ -0,0 +1,110 @@ +package com.mosty.common.task.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.task.entity.SysTask; +import com.mosty.common.task.entity.vo.*; +import com.mosty.common.task.service.SysTaskService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; + +@Slf4j +@SuppressWarnings("unused") +@RestController +@CrossOrigin +@AllArgsConstructor +@RequestMapping("/sysTask") +@Api(tags = "任务接口") +public class SysTaskController { + @Resource + private SysTaskService sysTaskService; + + /** + * 添加任务并下发 + * @param addSysTaskVO 添加任务并下发 + * @return 添加结果 + */ + @PostMapping("addSysTask") + @ApiOperation(value = "添加任务并下发", httpMethod = "POST", response = Boolean.class) + @Log(title = "添加任务并下发",businessType = BusinessType.INSERT) + public ResponseResult addSysTask(@RequestBody @Valid AddSysTaskVO addSysTaskVO, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysTaskService.saveInfo(addSysTaskVO,ipAddress); + return ResponseResult.success(Boolean.TRUE); + } + + /** + * 查看回调 + * @return 添加结果 + */ + @PostMapping("detail") + @ApiOperation(value = "查看回调", httpMethod = "POST", response = SysTask.class) + @Log(title = "查看回调",businessType = BusinessType.UPDATE) + public ResponseResult detail(@RequestBody DetailSysTaskVO detailSysTaskVO, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + SysTask task= sysTaskService.detail(detailSysTaskVO,ipAddress); + return ResponseResult.success(task); + } + + /** + * 完成回调 + * @return 添加结果 + */ + @PostMapping("finish") + @ApiOperation(value = "完成回调", httpMethod = "POST", response = Boolean.class) + @Log(title = "完成回调",businessType = BusinessType.UPDATE) + public ResponseResult finish(@RequestBody FinishSysTaskVO finishSysTaskVO, HttpServletRequest servletRequest) { + String ipAddress = IpUtil.getIpAddress(servletRequest); + sysTaskService.finish(finishSysTaskVO,ipAddress); + return ResponseResult.success(true); + } + + /** + * 查询当前登陆用户的任务 + * @return 当前登陆用户的任务 + */ + @PostMapping("findByList") + @ApiOperation(value = "查询当前登陆用户的任务", httpMethod = "POST", response = SysTaskItemVO.class) + public ResponseResult> findByList(@RequestBody QueryTaskVO queryTaskVO, HttpServletRequest servletRequest) { + IPage page = sysTaskService.findByList(queryTaskVO); + return ResponseResult.success(page); + } + + + + /** + * 查询当前登陆用户的任务日志 + * @return 当前登陆用户的任务 + */ + @PostMapping("findLogByList") + @ApiOperation(value = "查询当前登陆用户的任务日志", httpMethod = "POST", response = SysTaskLogVO.class) + public ResponseResult> findLogByList(@RequestBody QueryTaskLogVO queryTaskLogVO, HttpServletRequest servletRequest) { + List page = sysTaskService.findLogByList(queryTaskLogVO); + return ResponseResult.success(page); + } + /** + * 查询任务数量 + * @return 查询任务数量 + */ + @PostMapping("countByQuery") + @ApiOperation(value = "查询任务数量", httpMethod = "POST", response = Long.class) + public ResponseResult countByQuery(@RequestBody QueryTaskVO queryTaskVO, HttpServletRequest servletRequest) { + Long count = sysTaskService.countByQuery(queryTaskVO); + return ResponseResult.success(count); + } + + + + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/controller/SysTaskReportController.java b/common-task-starter/src/main/java/com/mosty/common/task/controller/SysTaskReportController.java new file mode 100644 index 0000000..f4a2d54 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/controller/SysTaskReportController.java @@ -0,0 +1,84 @@ +package com.mosty.common.task.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.base.domain.ResponseResult; +import com.mosty.common.base.entity.log.BusinessType; +import com.mosty.common.base.entity.log.Log; +import com.mosty.common.base.util.IpUtil; +import com.mosty.common.task.entity.SysTask; +import com.mosty.common.task.entity.vo.*; +import com.mosty.common.task.service.SysTaskService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; +import java.util.List; + +@Slf4j +@SuppressWarnings("unused") +@RestController +@AllArgsConstructor +@CrossOrigin +@RequestMapping("/sysTaskReport") +@Api(tags = "任务数量报表接口") +public class SysTaskReportController { + @Resource + private SysTaskService sysTaskService; + + /** + * 查询今日数据 + * @param + * @return 添加结果 + */ + @PostMapping("todayCount") + @ApiOperation(value = "查询今日统计数据", httpMethod = "POST", response = SysTaskCountToday.class) + public ResponseResult todayCount() { + SysTaskCountToday today= sysTaskService.todayCount(); + return ResponseResult.success(today); + } + + /** + * 查询全部统计数据 + * @param + * @return 添加结果 + */ + @PostMapping("allCount") + @ApiOperation(value = "查询全部统计数据", httpMethod = "POST", response = SysTaskCountToday.class) + public ResponseResult allCount() { + SysTaskCountToday today= sysTaskService.allCount(); + return ResponseResult.success(today); + } + + /** + * 查询分类条数 + * @param + * @return 添加结果 + */ + @PostMapping("groupCount/{countType}") + @ApiOperation(value = "查询全部统计数据 1.今日 2.七日 3。 30天 4。 全部。", httpMethod = "POST", response = SysTaskCountGroup.class) + public ResponseResult> groupCount(@PathVariable("countType") Integer countType) { + List groups = sysTaskService.groupCount(countType); + return ResponseResult.success(groups); + } + + /** + * 查询折线图数据 + * @param + * @return 添加结果 + */ + @PostMapping("lineChart/{lineChartType}") + @ApiOperation(value = "查询折线图数据 1 按日统计 2 按月统计", httpMethod = "POST", response = SysTaskLineChartVO.class) + public ResponseResult> lineChart(@PathVariable("lineChartType") Integer lineChartType) { + List lineCharts= sysTaskService.lineChart(lineChartType); + return ResponseResult.success(lineCharts); + } + + + + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/SysTask.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/SysTask.java new file mode 100644 index 0000000..f52747e --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/SysTask.java @@ -0,0 +1,261 @@ +package com.mosty.common.task.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.Date; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 任务表 + * @TableName sys_task + */ +@TableName(value ="sys_task") +@Data +public class SysTask implements Serializable { + /** + * id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 任务类型 + */ + @TableField(value = "rwlx") + private String rwlx; + + /** + * 执行类型 + */ + @TableField(value = "zxlx") + private Integer zxlx; + + /** + * 任务紧急程度 + */ + @TableField(value = "rwjjcd") + private String rwjjcd; + + /** + * 任务名称 + */ + @TableField(value = "rwmc") + private String rwmc; + + /** + * 任务内容 + */ + @TableField(value = "rwnr") + private String rwnr; + + /** + * 任务制定时间 + */ + @TableField(value = "rwzdsj") + private LocalDateTime rwzdsj; + + /** + * 任务完成时间 + */ + @TableField(value = "rwwcsj") + private LocalDateTime rwwcsj; + + /** + * 任务要求完成时间 + */ + @TableField(value = "rwyqwcsj") + private LocalDateTime rwyqwcsj; + + /** + * 任务创建人身份证号 + */ + @TableField(value = "rwcjrsfzh") + private String rwcjrsfzh; + + /** + * 任务创建人姓名 + */ + @TableField(value = "rwcjrxm") + private String rwcjrxm; + + /** + * 任务创建人单位 + */ + @TableField(value = "rwcjrdw") + private String rwcjrdw; + + /** + * 任务创建人部门id + */ + @TableField(value = "rwcjrbm_id") + private Long rwcjrbmId; + + /** + * 任务创建人部门名称 + */ + @TableField(value = "rwcjrbmmc") + private String rwcjrbmmc; + + /** + * 任务创建人单位id + */ + @TableField(value = "rwcjrdw_id") + private Long rwcjrdwId; + + + /** + * 任务创建人电话 + */ + @TableField(value = "rwcjrdh") + private String rwcjrdh; + + /** + * 任务创建规则 1.单人任务 2.多人任务 + */ + @TableField(value = "rwcjrgz") + private Integer rwcjrgz; + + /** + * 任务执行状态 1,未完成 2.已完成 + */ + @TableField(value = "rwzxzt") + private Integer rwzxzt; + + /** + * 任务来源系统 + */ + @TableField(value = "rwlyxt") + private String rwlyxt; + + /** + * 任务来源id + */ + @TableField(value = "rwly_id") + private String rwlyId; + + /** + * 任务url + */ + @TableField(value = "rw_url") + private String rwUrl; + + /** + * 任务终端 + */ + @TableField(value = "rwzd") + private String rwzd; + + + /** + * 应用id + */ + @TableField(value = "yy_id") + private Long yyId; + + /** + * 备注 + */ + @TableField(value = "bz") + private String bz; + + /** + * 注销标志0正常 1.注销 + */ + @TableField(value = "xt_zxbz") + private Integer xtZxbz; + + /** + * 注销原因 + */ + @TableField(value = "xt_zxyy") + private String xtZxyy; + + /** + * 采集时间 + */ + @TableField(value = "xt_cjsj") + private LocalDateTime xtCjsj; + + /** + * 录入时间 + */ + @TableField(value = "xt_lrsj") + private LocalDateTime xtLrsj; + + /** + * 录入人姓名 + */ + @TableField(value = "xt_lrrxm") + private String xtLrrxm; + + /** + * 录入人id + */ + @TableField(value = "xt_lrrid") + private Long xtLrrid; + + /** + * 录入人部门 + */ + @TableField(value = "xt_lrrbm") + private String xtLrrbm; + + /** + * 录入人部门id + */ + @TableField(value = "xt_lrrbmid") + private Long xtLrrbmid; + + /** + * 录入人部门id + */ + @TableField(value = "xt_lrip") + private String xtLrip; + + /** + * 最后修改时间 + */ + @TableField(value = "xt_zhxgsj") + private LocalDateTime xtZhxgsj; + + /** + * 最后修改人姓名 + */ + @TableField(value = "xt_zhxgrxm") + private String xtZhxgrxm; + + /** + * 最后修改人id + */ + @TableField(value = "xt_zhxgid") + private Long xtZhxgid; + + /** + * 最后修改人部门 + */ + @TableField(value = "xt_zhxgrbm") + private String xtZhxgrbm; + + /** + * 最后修改人部门id + */ + @TableField(value = "xt_zhxgrbmid") + private Long xtZhxgrbmid; + + /** + * 最后修改人ip + */ + @TableField(value = "xt_zhxgrip") + private String xtZhxgrip; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + +} \ No newline at end of file diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/SysTaskItem.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/SysTaskItem.java new file mode 100644 index 0000000..9196758 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/SysTaskItem.java @@ -0,0 +1,200 @@ +package com.mosty.common.task.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * 任务下发表 + * @TableName sys_task_item + */ +@TableName(value ="sys_task_item") +@Data +public class SysTaskItem implements Serializable { + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 任务id + */ + @TableField(value = "rw_id") + private Long rwId; + + /** + * 任务接受人id + */ + @TableField(value = "rwjsr_id") + private Long rwjsrId; + + /** + * 任务接受人身份证号 + */ + @TableField(value = "rwjsrsfzh") + private String rwjsrsfzh; + + /** + * 任务接受人姓名 + */ + @TableField(value = "rwjsrxm") + private String rwjsrxm; + + /** + * 任务接受人单位id + */ + @TableField(value = "rwjsrdw_id") + private Long rwjsrdwId; + + /** + * 任务接受人单位 + */ + @TableField(value = "rwjsrdw") + private String rwjsrdw; + + /** + * 任务接受人部门id + */ + @TableField(value = "rwjsrbm_id") + private Long rwjsrbmId; + + /** + * 任务接受人部门名称 + */ + @TableField(value = "rwjsrbmmc") + private String rwjsrbmmc; + + /** + * 任务状态 0.未查看 1.已查看 2.已完成 + */ + @TableField(value = "rwzt") + private Integer rwzt; + + /** + * 任务制定时间 + */ + @TableField(value = "rwzdsj") + private LocalDateTime rwzdsj; + + /** + * 任务查看时间 + */ + @TableField(value = "rwcksj") + private LocalDateTime rwcksj; + + /** + * 任务完成时间 + */ + @TableField(value = "rwwcsj") + private LocalDateTime rwwcsj; + + /** + * 备注 + */ + @TableField(value = "bz") + private String bz; + + /** + * 注销标志0正常 1.注销 + */ + @TableField(value = "xt_zxbz") + private Integer xtZxbz; + + /** + * 注销原因 + */ + @TableField(value = "xt_zxyy") + private String xtZxyy; + + /** + * 采集时间 + */ + @TableField(value = "xt_cjsj") + private LocalDateTime xtCjsj; + + /** + * 录入时间 + */ + @TableField(value = "xt_lrsj") + private LocalDateTime xtLrsj; + + /** + * 录入人姓名 + */ + @TableField(value = "xt_lrrxm") + private String xtLrrxm; + + /** + * 录入人id + */ + @TableField(value = "xt_lrrid") + private Long xt_lrrid; + + /** + * 录入人部门 + */ + @TableField(value = "xt_lrrbm") + private String xtLrrbm; + + /** + * 录入人部门id + */ + @TableField(value = "xt_lrrbmid") + private String xtLrrbmid; + + /** + * 录入人部门id + */ + @TableField(value = "xt_lrip") + private String xtLrip; + + /** + * 最后修改时间 + */ + @TableField(value = "xt_zhxgsj") + private LocalDateTime xtZhxgsj; + + /** + * 最后修改人姓名 + */ + @TableField(value = "xt_zhxgrxm") + private String xtZhxgrxm; + + /** + * 最后修改人id + */ + @TableField(value = "xt_zhxgid") + private Long xtZhxgid; + + /** + * 最后修改人部门 + */ + @TableField(value = "xt_zhxgrbm") + private String xtZhxgrbm; + + /** + * 最后修改人部门id + */ + @TableField(value = "xt_zhxgrbmid") + private Long xtZhxgrbmid; + + /** + * 最后修改人ip + */ + @TableField(value = "xt_zhxgrip") + private String xtZhxgrip; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + + + + + +} \ No newline at end of file diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/SysTaskLog.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/SysTaskLog.java new file mode 100644 index 0000000..b45567b --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/SysTaskLog.java @@ -0,0 +1,58 @@ +package com.mosty.common.task.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import java.io.Serializable; +import java.time.LocalDateTime; +import lombok.Data; + +/** + * 任务日志表 + * @TableName sys_task_log + */ +@TableName(value ="sys_task_log") +@Data +public class SysTaskLog implements Serializable { + /** + * 主键id + */ + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + /** + * 任务下发处置表id + */ + @TableField(value = "task_item_id") + private Long taskItemId; + + /** + * 任务id + */ + @TableField(value = "rw_id") + private Long rwId; + + /** + * 任务接受人id + */ + @TableField(value = "rwjsr_id") + private Long rwjsrId; + + /** + * 任务处置时间 + */ + @TableField(value = "rwczsj") + private LocalDateTime rwczsj; + + /** + * 任务处置状态 + */ + @TableField(value = "rwczzt") + private Integer rwczzt; + + @TableField(exist = false) + private static final long serialVersionUID = 1L; + + +} \ No newline at end of file diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskDeptVO.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskDeptVO.java new file mode 100644 index 0000000..700b444 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskDeptVO.java @@ -0,0 +1,30 @@ +package com.mosty.common.task.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +@Accessors(chain = true) +public class AddSysTaskDeptVO implements Serializable { + + @ApiModelProperty("任务接受部门编码, 执行类型为部门时 必传" ) + private Long deptCode; + + /** + * 任务接受部门单位id + */ + @ApiModelProperty("任务接受人单位id 执行类型为部门时 必传") + private Long companyId; + + /** + * 任务接受部门单位名称 + */ + @ApiModelProperty("任务接受人单位名称 执行类型为部门时 必传") + private String companyName; + + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskUserInfoVO.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskUserInfoVO.java new file mode 100644 index 0000000..35293a0 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskUserInfoVO.java @@ -0,0 +1,41 @@ +package com.mosty.common.task.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Accessors(chain = true) +public class AddSysTaskUserInfoVO implements Serializable { + + + + + /** + * 身份证号 + */ + @ApiModelProperty("身份证号") + @NotNull(message = "身份证号") + private String idCardNo; + + + /** + * 任务接受人单位id + */ + @ApiModelProperty("任务接受人单位id") + @NotNull(message = "任务接受人单位id") + private Long companyId; + + /** + * 任务接受人单位名称 + */ + @ApiModelProperty("任务接受人单位名称") + private String companyName; + + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskVO.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskVO.java new file mode 100644 index 0000000..685a5ea --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/AddSysTaskVO.java @@ -0,0 +1,166 @@ +package com.mosty.common.task.entity.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@Accessors(chain = true) +public class AddSysTaskVO implements Serializable { + /** + * 应用id + */ + @ApiModelProperty("应用id") + @NotNull(message = "应用id不能为空") + private Long appId; + + /** + * 任务类型 + */ + @ApiModelProperty("任务类型 1, 核实任务 2。预警指令") + @NotNull(message = "任务类型不能为空") + private String rwlx; + + /** + * 执行类型 + */ + @ApiModelProperty("执行类型 1用户 2部门") + @NotNull(message = "执行类型不能为空") + private Integer zxlx; + + /** + * 任务紧急程度 + */ + @ApiModelProperty("任务紧急程度") + @NotNull(message = "任务紧急程度不能为空") + private String rwjjcd; + + /** + * 任务名称 + */ + @ApiModelProperty("任务名称") + @NotBlank(message = "任务名称不能为空") + private String rwmc; + + /** + * 任务内容 + */ + @ApiModelProperty("任务内容") + @NotBlank(message = "任务内容不能为空") + private String rwnr; + + /** + * 任务制定时间 + */ + @ApiModelProperty("任务制定时间") + private LocalDateTime rwzdsj; + + /** + * 任务要求完成时间 + */ + @ApiModelProperty("任务要求完成时间") + private LocalDateTime rwyqwcsj; + /** + * 任务创建人ID + */ + @ApiModelProperty("任务创建人ID") + private Long rwcjrId; + /** + * 任务创建人身份证号 + */ + @ApiModelProperty("任务创建人身份证号") + private String rwcjrsfzh; + + /** + * 任务创建人姓名 + */ + @ApiModelProperty("任务创建人姓名") + private String rwcjrxm; + + /** + * 任务创建人单位 + */ + @ApiModelProperty("任务创建人单位") + private String rwcjrdw; + + /** + * 任务创建人部门id + */ + @ApiModelProperty("任务创建人部门id") + private Long rwcjrbmId; + + /** + * 任务创建人部门名称 + */ + @ApiModelProperty("任务创建人部门名称") + private String rwcjrbmmc; + + /** + * 任务创建人单位id + */ + @ApiModelProperty("任务创建人单位id") + private Long rwcjrdwId; + + + /** + * 任务创建人电话 + */ + @ApiModelProperty("任务创建人电话") + private String rwcjrdh; + + /** + * 任务创建规则 1.单人任务 2.多人任务 + */ + @ApiModelProperty("任务创建规则 1.单人任务 2.多人任务") + private Integer rwcjrgz; + + /** + * 任务来源系统 + */ + @ApiModelProperty("任务来源系统 1 智能安防,2。公共安全监管 3。三级指挥") + @NotNull(message = "任务来源系统不能为空 1 智能安防,2。公共安全监管 3。三级指挥" ) + private String rwlyxt; + + /** + * 任务来源id + */ + @ApiModelProperty("任务来源id ") + private String rwlyId; + + + /** + * 任务url + */ + @ApiModelProperty("任务url") + private String rwUrl; + + /** + * 任务终端 + */ + @ApiModelProperty("任务终端 1,安卓 2 H5 ") + @NotNull(message = "任务终端不能为空 1") + private String rwzd; + + /** + * 备注 + */ + private String bz; + /** + * 执行类型为用户时 必穿 + */ + @ApiModelProperty("执行类型为用户时 必传 任务接受人信息") + private List UserInfos; + + /** + * 执行类型为用户时 必穿 + */ + @ApiModelProperty("执行类型为部门时 必传 任务接受部门信息") + private List deptVOS; +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/DetailSysTaskVO.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/DetailSysTaskVO.java new file mode 100644 index 0000000..d7b95ed --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/DetailSysTaskVO.java @@ -0,0 +1,15 @@ +package com.mosty.common.task.entity.vo; + +import com.mosty.common.token.UserInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +@Data +public class DetailSysTaskVO implements Serializable { + @ApiModelProperty(value = "下发任务id",required = true) + private Long taskItemId; + @ApiModelProperty(value ="操作人身份证",required = true) + private String idCardNo; +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/FinishSysTaskVO.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/FinishSysTaskVO.java new file mode 100644 index 0000000..9c37543 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/FinishSysTaskVO.java @@ -0,0 +1,25 @@ +package com.mosty.common.task.entity.vo; + +import com.mosty.common.token.UserInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +@Data +public class FinishSysTaskVO implements Serializable { + @ApiModelProperty(value = "下发任务id") + private Long taskItemId; + @ApiModelProperty(value ="操作人身份证",required = true) + @NotBlank(message="操作人身份证不能为空") + private String idCardNo; + @ApiModelProperty(value = "来源任务id",required = true) + @NotBlank(message = "来源系统id不能为空") + private String lyxtId; + @ApiModelProperty(value ="部门编码") + private String deptCode; + + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/QueryTaskLogVO.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/QueryTaskLogVO.java new file mode 100644 index 0000000..fa27525 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/QueryTaskLogVO.java @@ -0,0 +1,28 @@ +package com.mosty.common.task.entity.vo; + +import cn.hutool.db.Page; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +@Data +@Accessors(chain = true) +public class QueryTaskLogVO implements Serializable { + /** + * 身份证号 + */ + @ApiModelProperty(value = "用户id",required = true) + private Long userId; + /** + * 任务id + */ + @ApiModelProperty("任务id") + private Long rwId; + /** + * 下发任务id + */ + @ApiModelProperty("下发任务id") + private Long taskItemId; +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/QueryTaskVO.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/QueryTaskVO.java new file mode 100644 index 0000000..d547dc9 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/QueryTaskVO.java @@ -0,0 +1,69 @@ +package com.mosty.common.task.entity.vo; + +import cn.hutool.db.Page; +import com.mosty.common.token.UserInfo; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +@Accessors(chain = true) +public class QueryTaskVO extends Page implements Serializable { + /** + * 身份证号 + */ + @ApiModelProperty(value = "身份证号",required = true) + @NotBlank(message = "身份证号不能为空") + private String idCardNo; + /** + * 部门编码 + */ + @ApiModelProperty(value = "部门编码(获取不到部门id传编码)",required = true) + private Long deptCode; + + /** + * 部门id + */ + @ApiModelProperty(value = "部门编码",required = true) + private Long deptId; + /** + * 任务名称 + */ + @ApiModelProperty("任务名称") + private String taskName; + /** + * 任务状态 0 未查看 1已查看 2已完成 + */ + @ApiModelProperty("任务状态 0 未查看 1已查看 2已完成") + private Integer taskStatus; + + /** + * 任务来源 + */ + @ApiModelProperty("任务来源 01_智能安防社区 02_公共安全监管 03_三级指挥") + private Integer source; + + /** + * 任务类型 + */ + @ApiModelProperty("任务类型 01 核实任务 02 预警指令") + private Integer taskType; + + /** + * 任务开始时间 + */ + @ApiModelProperty("任务开始时间") + private LocalDateTime startTime; + + /** + * 任务结束时间 + */ + @ApiModelProperty("任务结束时间") + private LocalDateTime endTime; + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskCountGroup.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskCountGroup.java new file mode 100644 index 0000000..61478ec --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskCountGroup.java @@ -0,0 +1,14 @@ +package com.mosty.common.task.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SysTaskCountGroup implements Serializable { + @ApiModelProperty("任务类型") + private String rwlx; + @ApiModelProperty("数量") + private Long count; +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskCountToday.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskCountToday.java new file mode 100644 index 0000000..80702b6 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskCountToday.java @@ -0,0 +1,14 @@ +package com.mosty.common.task.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SysTaskCountToday implements Serializable { + @ApiModelProperty("完成数量") + private Long finishCount; + @ApiModelProperty("未完成数量") + private Long unFinishCount; +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskItemVO.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskItemVO.java new file mode 100644 index 0000000..f1762a4 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskItemVO.java @@ -0,0 +1,78 @@ +package com.mosty.common.task.entity.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.experimental.Accessors; +import org.springframework.data.annotation.Transient; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.time.LocalDateTime; +import java.util.List; + +@Data +@Accessors(chain = true) +public class SysTaskItemVO implements Serializable { + private Long id; + + /** + * 任务来源id + */ + @ApiModelProperty("任务来源id") + private String rwlyId; + + + /** + * 任务类型 + */ + @ApiModelProperty("任务类型") + private String rwlx; + /** + * 任务类型描述 + */ + @ApiModelProperty("任务类型描述") + private String rwlxDesc; + + /** + * 任务名称 + */ + @ApiModelProperty("任务名称") + private String rwmc; + + /** + * 任务内容 + */ + @ApiModelProperty("任务内容") + private String rwnr; + /** + * 任务Url + */ + @ApiModelProperty("任务Url") + private String rwurl; + /** + * 身份证号 + */ + @ApiModelProperty("身份证号") + private String idCardNo; + + /** + * 任务内容 + */ + @ApiModelProperty("任务来源系统") + private String rwlyxt; + + + /** + * 任务要求完成时间 + */ + @ApiModelProperty(value = "任务要求完成时间") + private LocalDateTime rwyqwcsj; + /** + * 任务日志 + */ + @ApiModelProperty("任务日志") + private List logs; + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskLineChartVO.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskLineChartVO.java new file mode 100644 index 0000000..7d44d0f --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskLineChartVO.java @@ -0,0 +1,16 @@ +package com.mosty.common.task.entity.vo; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; + +@Data +public class SysTaskLineChartVO implements Serializable { + @ApiModelProperty("序号:月 1 -12 日期 近七天 例子:4-11") + private String no; + + @ApiModelProperty("数量") + private Long count; + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskLogVO.java b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskLogVO.java new file mode 100644 index 0000000..a59bfb1 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/entity/vo/SysTaskLogVO.java @@ -0,0 +1,29 @@ +package com.mosty.common.task.entity.vo; + +import com.baomidou.mybatisplus.annotation.TableField; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +import java.io.Serializable; +import java.time.LocalDateTime; + +@Data +public class SysTaskLogVO implements Serializable { + /** + * 任务处置时间 + */ + @ApiModelProperty(value = "任务处置时间") + private LocalDateTime rwczsj; + + /** + * 任务处置状态 + */ + @ApiModelProperty(value = "rwczzt") + private Integer rwczzt; + + /** + * 任务处置状态 + */ + @ApiModelProperty(value = "任务处置状态") + private String rwczztDesc; +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskItemMapper.java b/common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskItemMapper.java new file mode 100644 index 0000000..b283df1 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskItemMapper.java @@ -0,0 +1,17 @@ +package com.mosty.common.task.mapper; + +import com.mosty.common.task.entity.SysTaskItem; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author liyan +* @description 针对表【sys_task_item(任务下发表)】的数据库操作Mapper +* @createDate 2022-04-21 21:34:04 +*/ +public interface SysTaskItemMapper extends BaseMapper { + +} + + + + diff --git a/common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskLogMapper.java b/common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskLogMapper.java new file mode 100644 index 0000000..99a340c --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskLogMapper.java @@ -0,0 +1,17 @@ +package com.mosty.common.task.mapper; + +import com.mosty.common.task.entity.SysTaskLog; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; + +/** +* @author liyan +* @description 针对表【sys_task_log(任务日志表)】的数据库操作Mapper +* @createDate 2022-04-21 21:34:09 +*/ +public interface SysTaskLogMapper extends BaseMapper { + +} + + + + diff --git a/common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskMapper.java b/common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskMapper.java new file mode 100644 index 0000000..2773761 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/mapper/SysTaskMapper.java @@ -0,0 +1,40 @@ +package com.mosty.common.task.mapper; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.task.entity.SysTask; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.mosty.common.task.entity.vo.QueryTaskVO; +import com.mosty.common.task.entity.vo.SysTaskItemVO; +import org.apache.ibatis.annotations.Param; + +/** +* @author liyan +* @description 针对表【sys_task(任务表)】的数据库操作Mapper +* @createDate 2022-04-21 21:31:14 +*/ +public interface SysTaskMapper extends BaseMapper { + /** + * 分页查询 + * @param queryTaskVO + * @return + */ + IPage findByList(IPage page,@Param("param") QueryTaskVO queryTaskVO); + + /** + * 根据条件查询 执行类型为用户的任务数量 + * @param queryTaskVO + * @return + */ + Long countByUser(@Param("param") QueryTaskVO queryTaskVO); + + /** + * 执行类型为部门 查询对应条件的数量 + * @param queryTaskVO + * @return + */ + Long countByDept(@Param("param") QueryTaskVO queryTaskVO); +} + + + + diff --git a/common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskItemService.java b/common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskItemService.java new file mode 100644 index 0000000..846abe8 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskItemService.java @@ -0,0 +1,13 @@ +package com.mosty.common.task.service; + +import com.mosty.common.task.entity.SysTaskItem; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author liyan +* @description 针对表【sys_task_item(任务下发表)】的数据库操作Service +* @createDate 2022-04-21 21:34:04 +*/ +public interface SysTaskItemService extends IService { + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskLogService.java b/common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskLogService.java new file mode 100644 index 0000000..b59446c --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskLogService.java @@ -0,0 +1,13 @@ +package com.mosty.common.task.service; + +import com.mosty.common.task.entity.SysTaskLog; +import com.baomidou.mybatisplus.extension.service.IService; + +/** +* @author liyan +* @description 针对表【sys_task_log(任务日志表)】的数据库操作Service +* @createDate 2022-04-21 21:34:09 +*/ +public interface SysTaskLogService extends IService { + +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskService.java b/common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskService.java new file mode 100644 index 0000000..d0b92e1 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/service/SysTaskService.java @@ -0,0 +1,84 @@ +package com.mosty.common.task.service; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.mosty.common.task.entity.SysTask; +import com.baomidou.mybatisplus.extension.service.IService; +import com.mosty.common.task.entity.vo.*; + +import java.util.List; + +/** +* @author liyan +* @description 针对表【sys_task(任务表)】的数据库操作Service +* @createDate 2022-04-21 21:31:14 +*/ +public interface SysTaskService extends IService { + /** + * 保存下发任务 + * @param addSysTaskVO + * @param ipAddress + */ + void saveInfo(AddSysTaskVO addSysTaskVO, String ipAddress); + + /** + * 查看任务详情 + * @param detailSysTaskVO + * @param ipAddress + * @return + */ + SysTask detail(DetailSysTaskVO detailSysTaskVO, String ipAddress); + + /** + * 完成回调 + * @param finishSysTaskVO + * @param ipAddress + */ + void finish(FinishSysTaskVO finishSysTaskVO, String ipAddress); + + /** + * 分页查询 + * @param queryTaskVO + * @return + */ + IPage findByList(QueryTaskVO queryTaskVO); + + /** + * 查询对应的日志 + * @param queryTaskLogVO + * @return + */ + List findLogByList(QueryTaskLogVO queryTaskLogVO); + + /** + * 查询任务数量根据条件 + * @param queryTaskVO + * @return + */ + Long countByQuery(QueryTaskVO queryTaskVO); + + /** + * 查询当天的任务数据 + * @return + */ + SysTaskCountToday todayCount(); + + /** + * 查询全部统计数据 + * @return + */ + SysTaskCountToday allCount(); + + /** + * 根据类型统计数据 + * @param countType + * @return + */ + List groupCount(Integer countType); + + /** + * 获取折线图数据 + * @param lineChartType + * @return + */ + List lineChart(Integer lineChartType); +} diff --git a/common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskItemServiceImpl.java b/common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskItemServiceImpl.java new file mode 100644 index 0000000..aeb9359 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskItemServiceImpl.java @@ -0,0 +1,22 @@ +package com.mosty.common.task.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.task.entity.SysTaskItem; +import com.mosty.common.task.service.SysTaskItemService; +import com.mosty.common.task.mapper.SysTaskItemMapper; +import org.springframework.stereotype.Service; + +/** +* @author liyan +* @description 针对表【sys_task_item(任务下发表)】的数据库操作Service实现 +* @createDate 2022-04-21 21:34:04 +*/ +@Service +public class SysTaskItemServiceImpl extends ServiceImpl + implements SysTaskItemService{ + +} + + + + diff --git a/common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskLogServiceImpl.java b/common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskLogServiceImpl.java new file mode 100644 index 0000000..9a82633 --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskLogServiceImpl.java @@ -0,0 +1,22 @@ +package com.mosty.common.task.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.mosty.common.task.entity.SysTaskLog; +import com.mosty.common.task.service.SysTaskLogService; +import com.mosty.common.task.mapper.SysTaskLogMapper; +import org.springframework.stereotype.Service; + +/** +* @author liyan +* @description 针对表【sys_task_log(任务日志表)】的数据库操作Service实现 +* @createDate 2022-04-21 21:34:09 +*/ +@Service +public class SysTaskLogServiceImpl extends ServiceImpl + implements SysTaskLogService{ + +} + + + + diff --git a/common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskServiceImpl.java b/common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskServiceImpl.java new file mode 100644 index 0000000..5a5d6df --- /dev/null +++ b/common-task-starter/src/main/java/com/mosty/common/task/service/impl/SysTaskServiceImpl.java @@ -0,0 +1,515 @@ +package com.mosty.common.task.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollectionUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.google.common.collect.Lists; +import com.mosty.common.base.constant.enums.DeletedEnum; +import com.mosty.common.base.exception.Asserts; +import com.mosty.common.base.util.DateUtils; +import com.mosty.common.base.util.LocalDateTimeUtils; +import com.mosty.common.base.util.StringUtils; +import com.mosty.common.core.business.entity.SysDept; +import com.mosty.common.core.business.entity.SysUser; +import com.mosty.common.core.business.service.SysDeptService; +import com.mosty.common.core.business.service.SysUserService; +import com.mosty.common.core.login.dto.DeptDTO; +import com.mosty.common.task.constant.enums.*; +import com.mosty.common.task.entity.SysTask; +import com.mosty.common.task.entity.SysTaskItem; +import com.mosty.common.task.entity.SysTaskLog; +import com.mosty.common.task.entity.vo.*; +import com.mosty.common.task.service.SysTaskItemService; +import com.mosty.common.task.service.SysTaskLogService; +import com.mosty.common.task.service.SysTaskService; +import com.mosty.common.task.mapper.SysTaskMapper; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.*; +import java.util.stream.Collectors; + +/** + * @author liyan + * @description 针对表【sys_task(任务表)】的数据库操作Service实现 + * @createDate 2022-04-21 21:31:14 + */ +@Service +public class SysTaskServiceImpl extends ServiceImpl + implements SysTaskService { + @Resource + private SysTaskMapper sysTaskMapper; + @Resource + private SysTaskItemService sysTaskItemService; + @Resource + private SysTaskLogService sysTaskLogService; + @Resource + private SysUserService userService; + @Resource + private SysDeptService sysDeptService; + + @Override + public IPage findByList(QueryTaskVO queryTaskVO) { + String idCardNo = queryTaskVO.getIdCardNo(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id_entity_card", idCardNo); + SysUser sysUser = userService.getBaseMapper().selectOne(queryWrapper); + Asserts.check(sysUser == null, "身份证 %s 对应的用户不存在!", idCardNo); + List deptList = sysDeptService.selectUserDeptList(sysUser.getId()); + Asserts.check(CollectionUtils.isEmpty(deptList), "身份证 %s 没有绑定部门!", idCardNo); + DeptDTO deptDTO = deptList.get(0); + if (Objects.nonNull(deptDTO)) { + queryTaskVO.setDeptId(deptDTO.getDeptId()); + } + IPage page = new Page<>(queryTaskVO.getPageNumber(), queryTaskVO.getPageSize()); + IPage result = sysTaskMapper.findByList(page, queryTaskVO); + if (CollectionUtils.isNotEmpty(result.getRecords())) { + List records = result.getRecords(); + records.forEach(sysTaskItemVO -> { + sysTaskItemVO.setRwlxDesc(TaskTypeEnum.getEnum(sysTaskItemVO.getRwlx()).desc); + }); + getLogs(records); + result.setRecords(records); + } + return result; + } + + @Override + public List findLogByList(QueryTaskLogVO queryTaskLogVO) { + LambdaQueryWrapper logQueryWrapper = new LambdaQueryWrapper<>(); + if (Objects.nonNull(queryTaskLogVO.getTaskItemId())) { + logQueryWrapper.eq(SysTaskLog::getTaskItemId, queryTaskLogVO.getTaskItemId()); + } + if (Objects.nonNull(queryTaskLogVO.getRwId())) { + logQueryWrapper.eq(SysTaskLog::getRwId, queryTaskLogVO.getRwId()); + } + if (Objects.nonNull(queryTaskLogVO.getUserId())) { + logQueryWrapper.eq(SysTaskLog::getRwjsrId, queryTaskLogVO.getUserId()); + } + List list = sysTaskLogService.list(logQueryWrapper); + List sysTaskLogVOS = BeanUtil.copyToList(list, SysTaskLogVO.class); + return sysTaskLogVOS; + } + + @Override + public Long countByQuery(QueryTaskVO queryTaskVO) { + String idCardNo = queryTaskVO.getIdCardNo(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id_entity_card", idCardNo); + queryWrapper.eq("xt_zxbz",DeletedEnum.NATURE.code); + SysUser sysUser = userService.getBaseMapper().selectOne(queryWrapper); + Asserts.check(sysUser == null, "身份证 %s 对应的用户不存在!", idCardNo); + List deptList = sysDeptService.selectUserDeptList(sysUser.getId()); + Asserts.check(CollectionUtils.isEmpty(deptList), "身份证 %s 没有绑定部门!", idCardNo); + DeptDTO deptDTO = deptList.get(0); + if (Objects.nonNull(deptDTO)) { + queryTaskVO.setDeptId(deptDTO.getDeptId()); + } + //查询 + Long count = sysTaskMapper.countByUser(queryTaskVO); + Long deptCount = sysTaskMapper.countByDept(queryTaskVO); + return deptCount + count; + } + + @Override + public SysTaskCountToday todayCount() { + long unFinish = this.count(new LambdaQueryWrapper() + .eq(SysTask::getRwzxzt, ExecuteStatusEnum.UNFINISH.code).between(SysTask::getRwzdsj, + LocalDateTimeUtils.todayStart(), LocalDateTimeUtils.todayEnd())); + long finish = this.count(new LambdaQueryWrapper() + .eq(SysTask::getRwzxzt, ExecuteStatusEnum.FINISH.code).between(SysTask::getRwzdsj, + LocalDateTimeUtils.todayStart(), LocalDateTimeUtils.todayEnd())); + SysTaskCountToday today = new SysTaskCountToday(); + today.setFinishCount(finish); + today.setUnFinishCount(unFinish); + return today; + } + + @Override + public SysTaskCountToday allCount() { + long unFinish = this.count(new LambdaQueryWrapper() + .eq(SysTask::getRwzxzt, ExecuteStatusEnum.UNFINISH.code)); + long finish = this.count(new LambdaQueryWrapper() + .eq(SysTask::getRwzxzt, ExecuteStatusEnum.FINISH.code)); + SysTaskCountToday today = new SysTaskCountToday(); + today.setFinishCount(finish); + today.setUnFinishCount(unFinish); + return today; + } + + @Override + public List groupCount(Integer countType) { + List groupList = new ArrayList<>(); + initGroupList(groupList); + if (GroupCountTypeEnum.ALL.code.equals(countType)) { + List list = this.list(new LambdaQueryWrapper()); + Map> typeMap = list.stream().collect(Collectors.groupingBy(SysTask::getRwlx)); + groupList.forEach(item -> { + if (typeMap.containsKey(item.getRwlx())){ + item.setCount( Long.valueOf(typeMap.get(item.getRwlx()).size())); + } + }); + } + if (GroupCountTypeEnum.TODAY.code.equals(countType)) { + List list = this.list(new LambdaQueryWrapper().between(SysTask::getRwzdsj, + LocalDateTimeUtils.todayStart(), LocalDateTimeUtils.todayEnd())); + Map> typeMap = list.stream().collect(Collectors.groupingBy(SysTask::getRwlx)); + groupList.forEach(item -> { + if (typeMap.containsKey(item.getRwlx())){ + item.setCount( Long.valueOf(typeMap.get(item.getRwlx()).size())); + } + + }); + } + if (GroupCountTypeEnum.WEEK.code.equals(countType)) { + List list = this.list(new LambdaQueryWrapper().between(SysTask::getRwzdsj, + LocalDateTimeUtils.daysStart(7), LocalDateTime.now())); + Map> typeMap = list.stream().collect(Collectors.groupingBy(SysTask::getRwlx)); + groupList.forEach(item -> { + if (typeMap.containsKey(item.getRwlx())){ + item.setCount( Long.valueOf(typeMap.get(item.getRwlx()).size())); + } + + }); + } + if (GroupCountTypeEnum.MONTH.code.equals(countType)) { + List list = this.list(new LambdaQueryWrapper().between(SysTask::getRwzdsj, + LocalDateTimeUtils.daysStart(30), LocalDateTime.now())); + Map> typeMap = list.stream().collect(Collectors.groupingBy(SysTask::getRwlx)); + groupList.forEach(item -> { + if (typeMap.containsKey(item.getRwlx())){ + item.setCount( Long.valueOf(typeMap.get(item.getRwlx()).size())); + } + + }); + } + return groupList; + } + + private void initGroupList(List groupList) { + TaskTypeEnum[] values = TaskTypeEnum.values(); + for (TaskTypeEnum value : values) { + SysTaskCountGroup group = new SysTaskCountGroup(); + group.setCount(0L); + group.setRwlx(value.code); + groupList.add(group); + } + + } + + @Override + public List lineChart(Integer lineChartType) { + if (LineChartTypeEnum.DAY.code.equals(lineChartType)) { + List sysTaskLineChartVOS = getDay(); + sysTaskLineChartVOS.sort(Comparator.comparing(SysTaskLineChartVO::getNo)); + return sysTaskLineChartVOS; + } else { + List sysTaskLineChartVOS = getMonth(); + sysTaskLineChartVOS.sort(Comparator.comparing(SysTaskLineChartVO::getNo)); + return sysTaskLineChartVOS; + } + } + + private List getMonth() { + List sysTaskLineChartVOS = new ArrayList<>(); + Map monthGroup = getMonthGroup(12); + //获取最近七天的数据 + LocalDateTime begin = LocalDateTimeUtils.todayStart().minusYears(1); + LocalDateTime after = LocalDateTimeUtils.todayEnd(); + List list = this.list(new LambdaQueryWrapper().between(SysTask::getRwzdsj, begin, after)); + Map> taskMap = list.stream().collect(Collectors.groupingBy(item -> DateUtils.parseDateToStr(DateUtils.YY_MM, DateUtils.LocalDateTimeToDate(item.getRwzdsj())))); + monthGroup.entrySet().forEach(item -> { + SysTaskLineChartVO chartVO = new SysTaskLineChartVO(); + if (taskMap.containsKey(item.getKey())) { + List sysTasks = taskMap.get(item.getKey()); + chartVO.setNo(item.getKey()); + chartVO.setCount(Long.valueOf(sysTasks.size())); + } else { + chartVO.setNo(item.getKey()); + chartVO.setCount(0L); + } + sysTaskLineChartVOS.add(chartVO); + }); + return sysTaskLineChartVOS; + } + + private List getDay() { + List sysTaskLineChartVOS = new ArrayList<>(); + //获取最近七天的数据 + Map dayMap = getDayGroup(7); + LocalDateTime begin = LocalDateTimeUtils.todayStart().minusDays(7); + LocalDateTime after = LocalDateTimeUtils.todayEnd(); + List list = this.list(new LambdaQueryWrapper().between(SysTask::getRwzdsj, begin, after)); + Map> taskMap = list.stream().collect(Collectors.groupingBy(item -> DateUtils.parseDateToStr(DateUtils.MM_DD, DateUtils.LocalDateTimeToDate(item.getRwzdsj())))); + dayMap.entrySet().forEach(item -> { + SysTaskLineChartVO chartVO = new SysTaskLineChartVO(); + if (taskMap.containsKey(item.getKey())) { + List sysTasks = taskMap.get(item.getKey()); + chartVO.setNo(item.getKey()); + chartVO.setCount(Long.valueOf(sysTasks.size())); + } else { + chartVO.setNo(item.getKey()); + chartVO.setCount(0L); + } + sysTaskLineChartVOS.add(chartVO); + }); + return sysTaskLineChartVOS; + + } + + private Map getDayGroup(Integer dayNum) { + Map map = new HashMap<>(); + for (int i = 1; i <= dayNum; i++) { + map.put(DateUtils.parseDateToStr(DateUtils.MM_DD, DateUtils.LocalDateTimeToDate(LocalDateTime.now().minusDays(i))), 0L); + } + return map; + } + + private Map getMonthGroup(Integer monthNum) { + Map map = new HashMap<>(); + for (int i = 1; i <= monthNum; i++) { + map.put(DateUtils.parseDateToStr(DateUtils.YY_MM, DateUtils.LocalDateTimeToDate(LocalDateTime.now().minusMonths(i))), 0L); + } + return map; + + } + + + /** + * 获取对应任务的日志 + * + * @param records + */ + private void getLogs(List records) { + List taskItemIds = records.stream().map(SysTaskItemVO::getId).collect(Collectors.toList()); + List list = sysTaskLogService.list(new LambdaQueryWrapper() + .in(SysTaskLog::getTaskItemId, taskItemIds).orderByDesc(SysTaskLog::getRwczsj)); + if (CollectionUtils.isNotEmpty(list)) { + Map> itemMap = + list.stream().collect(Collectors.groupingBy(SysTaskLog::getTaskItemId)); + records.forEach(item -> { + List sysTaskLogs = itemMap.get(item.getId()); + List sysTaskLogVOS = BeanUtil.copyToList(sysTaskLogs, SysTaskLogVO.class); + sysTaskLogVOS.forEach(log -> { + log.setRwczztDesc(TaskLogStatusEnum.valueOf(log.getRwczzt()).desc); + }); + item.setLogs(sysTaskLogVOS); + }); + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public void saveInfo(AddSysTaskVO addSysTaskVO, String ipAddress) { + //1.记录任务 如果是执行类型部门, + // 判断规则为单人且下发部门id 不能为空 + //如果是执行类型为 人 那么下发用户List不能为空 + validInfo(addSysTaskVO); + SysTask sysTask = BeanUtil.copyProperties(addSysTaskVO, SysTask.class); + sysTask.setXtZhxgsj(LocalDateTime.now()); + sysTask.setXtCjsj(LocalDateTime.now()); + sysTask.setXtLrip(ipAddress); + sysTask.setXtZhxgid(addSysTaskVO.getRwcjrId()); + sysTask.setXtZhxgrxm(addSysTaskVO.getRwcjrxm()); + sysTask.setXtZhxgrbmid(addSysTaskVO.getRwcjrbmId()); + sysTask.setXtZhxgrbm(addSysTaskVO.getRwcjrbmmc()); + + sysTask.setXtLrsj(LocalDateTime.now()); + sysTask.setXtLrrid(addSysTaskVO.getRwcjrId()); + sysTask.setXtLrrxm(addSysTaskVO.getRwcjrxm()); + sysTask.setXtLrrbmid(addSysTaskVO.getRwcjrbmId()); + sysTask.setXtLrrbm(addSysTaskVO.getRwcjrbmmc()); + sysTask.setYyId(addSysTaskVO.getAppId()); + this.save(sysTask); + //2。下发相关任务 + saveItems(addSysTaskVO, sysTask); + } + + @Override + @Transactional + public SysTask detail(DetailSysTaskVO detailSysTaskVO, String ipAddress) { + String idCardNo = detailSysTaskVO.getIdCardNo(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id_entity_card", idCardNo); + SysUser sysUser = userService.getBaseMapper().selectOne(queryWrapper); + Asserts.check(sysUser == null, "身份证 %s 对应的用户不存在!", idCardNo); + List deptList = sysDeptService.selectUserDeptList(sysUser.getId()); + DeptDTO deptDTO = deptList.get(0); + //1。更新对应任务下发表为已查看 + SysTaskItem taskItem = sysTaskItemService.getById(detailSysTaskVO.getTaskItemId()); + if (TaskItemStatusEnum.NOTVIEWED.code.equals(taskItem.getRwzt())) { + taskItem.setRwcksj(LocalDateTime.now()); + taskItem.setRwzt(TaskItemStatusEnum.VIEWED.code); + taskItem.setXtZxbz(DeletedEnum.NATURE.code); + taskItem.setXtZhxgsj(LocalDateTime.now()); + taskItem.setXtLrip(ipAddress); + taskItem.setXtZhxgid(sysUser.getId()); + taskItem.setXtZhxgrxm(sysUser.getUserName()); + taskItem.setXtZhxgrbmid(deptDTO.getDeptId()); + taskItem.setXtZhxgrbm(deptDTO.getDeptName()); + sysTaskItemService.updateById(taskItem); + } + //2。插入日志 + SysTaskLog log = new SysTaskLog(); + log.setRwId(taskItem.getRwId()); + log.setRwjsrId(sysUser.getId()); + log.setTaskItemId(taskItem.getId()); + log.setRwczsj(LocalDateTime.now()); + log.setRwczzt(TaskItemStatusEnum.VIEWED.code); + sysTaskLogService.save(log); + //返回任务详情 + SysTask task = this.getById(taskItem.getRwId()); + task.setId(detailSysTaskVO.getTaskItemId()); + return task; + } + + @Override + @Transactional + public void finish(FinishSysTaskVO finishSysTaskVO, String ipAddress) { + List list = this.list(new LambdaQueryWrapper().eq(SysTask::getRwlyId, finishSysTaskVO.getLyxtId())); + if (CollectionUtils.isEmpty(list)){ + Asserts.check(true, "没有查到对应任务", finishSysTaskVO.getLyxtId()); + } + SysTask sourceTask = list.get(0); + //1。更新对应任务下发表为完成 + String idCardNo = finishSysTaskVO.getIdCardNo(); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id_entity_card", idCardNo); + SysUser sysUser = userService.getBaseMapper().selectOne(queryWrapper); + Asserts.check(sysUser == null, "身份证 %s 对应的用户不存在!", idCardNo); + List deptList = sysDeptService.selectUserDeptList(sysUser.getId()); + DeptDTO deptDTO = deptList.get(0); + SysTaskItem taskItem =null; + if (ExecuteTypeEnum.USER.code.equals(sourceTask.getZxlx())){ + taskItem = sysTaskItemService.getOne(new LambdaQueryWrapper() + .eq(SysTaskItem::getRwId, sourceTask.getId()).eq(SysTaskItem::getRwjsrsfzh, idCardNo)); + }else{ + Asserts.check(StringUtils.isBlank(finishSysTaskVO.getDeptCode()), "任务类型为部门时部门编码不能为空", finishSysTaskVO.getDeptCode()); + SysDept sysDept = sysDeptService.getOne(new LambdaQueryWrapper() + .eq(SysDept::getOrgCode, finishSysTaskVO.getDeptCode()) + .eq(SysDept::getXtZxbz, DeletedEnum.NATURE.code)); + Asserts.check(sysDept == null, "部门编码 %s 对应的部门不存在!", finishSysTaskVO.getDeptCode()); + taskItem = sysTaskItemService.getOne(new LambdaQueryWrapper() + .eq(SysTaskItem::getRwId, sourceTask.getId()).eq(SysTaskItem::getRwjsrbmId,sysDept.getId())); + } + Asserts.check(TaskItemStatusEnum.FINISH.code.equals(taskItem.getRwzt()), "该任务已经完成,请勿重复完成"); + taskItem.setRwwcsj(LocalDateTime.now()); + taskItem.setRwzt(TaskItemStatusEnum.FINISH.code); + taskItem.setXtZhxgsj(LocalDateTime.now()); + taskItem.setXtLrip(ipAddress); + taskItem.setXtZhxgid(sysUser.getId()); + taskItem.setXtZhxgrxm(sysUser.getUserName()); + taskItem.setXtZhxgrbmid(deptDTO.getDeptId()); + taskItem.setXtZhxgrbm(deptDTO.getDeptName()); + sysTaskItemService.updateById(taskItem); + //2。插入日志 + SysTaskLog log = new SysTaskLog(); + log.setRwId(taskItem.getRwId()); + log.setRwjsrId(sysUser.getId()); + log.setTaskItemId(taskItem.getId()); + log.setRwczsj(LocalDateTime.now()); + log.setRwczzt(TaskItemStatusEnum.FINISH.code); + sysTaskLogService.save(log); + //3 判断任务是否执行完成 + SysTask task = this.getById(taskItem.getRwId()); + if (ExecuteTypeEnum.DEPT.code.equals(task.getZxlx()) || RuleTypeEnum.ONE.code.equals(task.getRwcjrgz())) { + task.setRwzxzt(2); + task.setXtZhxgsj(LocalDateTime.now()); + task.setXtLrip(ipAddress); + task.setXtZhxgid(sysUser.getId()); + task.setXtZhxgrxm(sysUser.getUserName()); + task.setXtZhxgrbmid(deptDTO.getDeptId()); + task.setXtZhxgrbm(deptDTO.getDeptName()); + this.updateById(task); + } else { + int count = sysTaskItemService.count(new LambdaQueryWrapper() + .ne(SysTaskItem::getId, finishSysTaskVO.getTaskItemId()).ne(SysTaskItem::getRwzt, TaskItemStatusEnum.FINISH.code)); + if (count == 0) { + task.setRwzxzt(2); + task.setXtZhxgsj(LocalDateTime.now()); + task.setXtLrip(ipAddress); + task.setXtZhxgid(sysUser.getId()); + task.setXtZhxgrxm(sysUser.getUserName()); + task.setXtZhxgrbmid(deptDTO.getDeptId()); + task.setXtZhxgrbm(deptDTO.getDeptName()); + this.updateById(task); + } + } + + } + + + private void saveItems(AddSysTaskVO addSysTaskVO, SysTask sysTask) { + List logs = new ArrayList<>(); + if (ExecuteTypeEnum.USER.code.equals(addSysTaskVO.getZxlx())) { + List userInfos = addSysTaskVO.getUserInfos(); + userInfos.forEach(item -> { + SysTaskItem taskItem = new SysTaskItem(); + taskItem.setRwId(sysTask.getId()); + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("id_entity_card", item.getIdCardNo()); + SysUser sysUser = userService.getBaseMapper().selectOne(queryWrapper); + Asserts.check(sysUser == null, "身份证 %s 对应的用户不存在!", item.getIdCardNo()); + taskItem.setRwjsrId(sysUser.getId()); + List deptList = sysDeptService.selectUserDeptList(sysUser.getId()); + DeptDTO deptDTO = deptList.get(0); + taskItem.setRwjsrbmId(deptDTO.getDeptId()); + taskItem.setRwjsrbmmc(deptDTO.getDeptName()); + taskItem.setRwjsrdw(item.getCompanyName()); + taskItem.setRwjsrdwId(item.getCompanyId()); + taskItem.setRwjsrxm(sysUser.getUserName()); + taskItem.setRwjsrsfzh(sysUser.getIdEntityCard()); + sysTaskItemService.save(taskItem); + SysTaskLog log = new SysTaskLog(); + log.setRwId(sysTask.getId()); + log.setRwjsrId(sysUser.getId()); + log.setTaskItemId(taskItem.getId()); + log.setRwczsj(LocalDateTime.now()); + log.setRwczzt(TaskItemStatusEnum.NOTVIEWED.code); + logs.add(log); + }); + } else { + List deptVOS = addSysTaskVO.getDeptVOS(); + deptVOS.forEach(item -> { + SysTaskItem taskItem = new SysTaskItem(); + taskItem.setRwId(sysTask.getId()); + SysDept one = sysDeptService.getOne(new LambdaQueryWrapper() + .eq(SysDept::getOrgCode, item.getDeptCode()) + .eq(SysDept::getXtZxbz, DeletedEnum.NATURE.code)); + taskItem.setRwjsrbmId(one.getId()); + taskItem.setRwjsrdw(item.getCompanyName()); + taskItem.setRwjsrdwId(item.getCompanyId()); + sysTaskItemService.save(taskItem); + SysTaskLog log = new SysTaskLog(); + log.setRwId(sysTask.getId()); + log.setTaskItemId(taskItem.getId()); + log.setRwczsj(LocalDateTime.now()); + log.setRwczzt(TaskItemStatusEnum.NOTVIEWED.code); + logs.add(log); + }); + + } + sysTaskLogService.saveBatch(logs); + + + } + + private void validInfo(AddSysTaskVO addSysTaskVO) { + Asserts.check(ExecuteTypeEnum.USER.code.equals(addSysTaskVO.getZxlx()) + && CollectionUtil.isEmpty(addSysTaskVO.getUserInfos()), "执行类型为用户用户信息为不能为空"); + + Asserts.check(ExecuteTypeEnum.DEPT.code.equals(addSysTaskVO.getZxlx()) + && CollectionUtil.isEmpty(addSysTaskVO.getDeptVOS()), "执行类型为部门,部门信息为不能为空"); + } +} + + + + diff --git a/common-task-starter/src/main/resources/META-INF/spring.factories b/common-task-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..dd70f63 --- /dev/null +++ b/common-task-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.task.TaskAutoConfiguration \ No newline at end of file diff --git a/common-task-starter/src/main/resources/mapper/SysTaskItemMapper.xml b/common-task-starter/src/main/resources/mapper/SysTaskItemMapper.xml new file mode 100644 index 0000000..63e8f2d --- /dev/null +++ b/common-task-starter/src/main/resources/mapper/SysTaskItemMapper.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,rw_id,rwjsr_id, + rwjsrsfzh,rwjsrxm,rwjsrdw_id, + rwjsrdw,rwjsrbm_id,rwjsrbmmc, + rwzt,rwzdsj,rwcksj, + rwwcsj,bz,xt_zxbz, + xt_zxyy,xt_cjsj,xt_lrsj, + xt_lrrxm,xt_lrrid,xt_lrrbm, + xt_lrrbmid,xt_lrip,xt_zhxgsj, + xt_zhxgrxm,xt_zhxgid,xt_zhxgrbm, + xt_zhxgrbmid,xt_zhxgrip + + diff --git a/common-task-starter/src/main/resources/mapper/SysTaskLogMapper.xml b/common-task-starter/src/main/resources/mapper/SysTaskLogMapper.xml new file mode 100644 index 0000000..b8158c5 --- /dev/null +++ b/common-task-starter/src/main/resources/mapper/SysTaskLogMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + id,rw_xfczb_id,rw_id, + rwjsr_id,rwczsj,rwczzt + + diff --git a/common-task-starter/src/main/resources/mapper/SysTaskMapper.xml b/common-task-starter/src/main/resources/mapper/SysTaskMapper.xml new file mode 100644 index 0000000..c0caa02 --- /dev/null +++ b/common-task-starter/src/main/resources/mapper/SysTaskMapper.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + ,rwlx,rwjjcd, + rwmc,rwnr,rwzdsj, + rwwcsj,rwyqwcsj,rwcjrsfzh, + rwcjrxm,rwcjrdw,rwcjrdw_id, + rwcjrdh,rwcjrgz,rwzxzt, + rwlyxt,rw_url,bz, + xt_zxbz,xt_zxyy,xt_cjsj, + xt_lrsj,xt_lrrxm,xt_lrrid, + xt_lrrbm,xt_lrrbmid,xt_lrip, + xt_zhxgsj,xt_zhxgrxm,xt_zhxgid, + xt_zhxgrbm,xt_zhxgrbmid,xt_zhxgrip + + + + + + + diff --git a/common-task-starter/target/classes/META-INF/spring.factories b/common-task-starter/target/classes/META-INF/spring.factories new file mode 100644 index 0000000..dd70f63 --- /dev/null +++ b/common-task-starter/target/classes/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +com.mosty.common.task.TaskAutoConfiguration \ No newline at end of file diff --git a/common-task-starter/target/classes/com/mosty/common/task/TaskAutoConfiguration.class b/common-task-starter/target/classes/com/mosty/common/task/TaskAutoConfiguration.class new file mode 100644 index 0000000000000000000000000000000000000000..34bf2f452da403562701f4f724e98d7b84b59628 GIT binary patch literal 525 zcmb7BO-lnY6rA)^Yi(=QgW|=TR@_{~iz1YQr&Yn0UOc61x~APtN;X^V&+;UA@CW## z#J6h^5ice%dGBR1FO$4~yuJZA!FCNrw5!;xVvC`2uC#I&48?=PAw#KW?j=LhS6W`D z@krW%7)4ZR`z8?4P*|1a%VNnrsD$Cz4@}Hsleh(^C^niqkxco3pqo0=GkUDT)C#AJ zK4Yl$O=<&qsWRc+KUv;H%mu^FZK|D$aBM{^AB~+- zf9>RxuPyUsd&7|!IBD-sOE~1pKxktvl+@kko(aS7)an7xy zgfhd?Kc0c1m09GG&>_DWO=RG(j{<#7HW*EkB&<-z^BgF5UcjEIP(YQiLS>+V6~cNR bm$8akzQ2}Z9qY8ViQk~LNu1UlSb~jDEJKfv literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/constant/enums/ExecuteStatusEnum.class b/common-task-starter/target/classes/com/mosty/common/task/constant/enums/ExecuteStatusEnum.class new file mode 100644 index 0000000000000000000000000000000000000000..7c4bb125a8c21d4dda03efb57b8e232d33584c5f GIT binary patch literal 1562 zcmbtU+fvg|6kTc4E8)^`(IN^WYFmVe0s=(@YZ>cwfHBe;o;CvK4QQT$Ig$V9(h_0_J7gh@LLk=@V)vQT1 z({^4=YFZq1hRuQb(lG}%!c*Ul4^ex}Lu4Z${rqX8!!{OZtGOxl3|$C06Mh> zhv7!TvZffelw;juxvFDYYnJ&^vm9Ns>3~C?b<}Y4YPG2+m|}H3@|DZlY5ue>E>M=Z zY`T`JE$i&G`cAa!IBQD*N%qb33s}Swhw0OGy?{a77jOkR0lnxGa1Q4qc);L1xqS5g z!{NubM{nLS%7_3F-GmI<*JHp zXMMERVf&!w_u1!vuSqK~^ApDfG|!)GOBMXdTYa%OK|hTI{eD7=NhSxNkyH?pU=DaA znE-V4Glyx-BZdnY0EdgT8m5t5@jAFK2pk~ziB=pg(KGDrwGn?1Lrwl90v;L{`OH^@ z4!|>h;4l7VLWBm3;!|$gC%+N&GOp1WB23JT4(ubG8QVi7ljQdh{rt~JL&PUGu6nB2 zjOl7%Oc{@B-h0=PqA@{v({yJx5wOu~QwKybiW>wmxlc(HyXL-w-wF|o^q_RXRp^Zc~3K_#VaRQM307UDB AjsO4v literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/constant/enums/ExecuteTypeEnum.class b/common-task-starter/target/classes/com/mosty/common/task/constant/enums/ExecuteTypeEnum.class new file mode 100644 index 0000000000000000000000000000000000000000..b29a0366d2571f59d2b3efae6343d3e98075ff2c GIT binary patch literal 1536 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 literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/constant/enums/TaskItemStatusEnum.class b/common-task-starter/target/classes/com/mosty/common/task/constant/enums/TaskItemStatusEnum.class new file mode 100644 index 0000000000000000000000000000000000000000..54f77d34b94469d0228c551ac07d0ef4c522cb59 GIT binary patch literal 1641 zcmbtV+iuf95IvhXiIW=IrlloNpxjClF6L6M4W*@|U0vJUl4GE(e9LI?i zwx@71gMOUi*J-w#;n$dqO&OGMR>pXS*5??UkTED@lBefoY?d*_(+eq-1=2IKb5*T; zvwT6|bj5V*YTfmN$12V0uA>Hqf1l=#9~e%cT27SX0cSr<5S zYdsk~G-?gY7bxWm>p4f73VC!_Y{!~u)E6vo&RD1svs4&h_Kv{S{NFqZ>qtFYaZRIE zH9VUmwZln{QKzWMlI_^RxWL#yf@+aGI$}qlw#0=h6(G24lQwDHUUaC89-W+z9{B&= zx$6xluPf@L_qI>oKyHO#>Eu6gbQ%L{DFry3_h?F8hK zS!?r&=Q*z{k#xDWN^6#JoWf*ux8a%Aw9WMz{JU`vac?Tv#@A`Pf@xe7IJw44pkOyH zDcA>1K@M9KY{gItml?i7La#2pT7B{I$I?@F$t&1|0YX=nn;mqJf#k~TXRA-1E7;7d zjlZuBYeBM^HP<03{rN&fr`d&jmKhM;c`-n*Kqko1ppH0W(ACbv+Ekk*S4I#8qk{Id^p`H-xO(Yn~ zhEQMf3+;?Iu|c1gn&{Ez6HWB#?;tq)mTp=!I9 Bmev3O literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/constant/enums/TaskLogStatusEnum.class b/common-task-starter/target/classes/com/mosty/common/task/constant/enums/TaskLogStatusEnum.class new file mode 100644 index 0000000000000000000000000000000000000000..f68a5a246c5261da5e56b2f548cafd5b4f0fa4ab GIT binary patch literal 1951 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 0, i; + for (i = 0; i < n; i++) if (i in t && e.call(this, t[i], i, t)) return true; + return false + }; + + function V(e) { + if (e._isValid == null) { + var t = c(e), n = W.call(t.parsedDateParts, function (e) { + return e != null + }), + i = !isNaN(e._d.getTime()) && t.overflow < 0 && !t.empty && !t.invalidEra && !t.invalidMonth && !t.invalidWeekday && !t.weekdayMismatch && !t.nullInput && !t.invalidFormat && !t.userInvalidated && (!t.meridiem || t.meridiem && n); + if (e._strict) i = i && t.charsLeftOver === 0 && t.unusedTokens.length === 0 && t.bigHour === undefined; + if (Object.isFrozen == null || !Object.isFrozen(e)) e._isValid = i; else return i + } + return e._isValid + } + + function G(e) { + var t = l(NaN); + if (e != null) z(c(t), e); else c(t).userInvalidated = true; + return t + } + + var J = h.momentProperties = [], q = false; + + function K(e, t) { + var n, i, r, a = J.length; + if (!o(t._isAMomentObject)) e._isAMomentObject = t._isAMomentObject; + if (!o(t._i)) e._i = t._i; + if (!o(t._f)) e._f = t._f; + if (!o(t._l)) e._l = t._l; + if (!o(t._strict)) e._strict = t._strict; + if (!o(t._tzm)) e._tzm = t._tzm; + if (!o(t._isUTC)) e._isUTC = t._isUTC; + if (!o(t._offset)) e._offset = t._offset; + if (!o(t._pf)) e._pf = c(t); + if (!o(t._locale)) e._locale = t._locale; + if (a > 0) for (n = 0; n < a; n++) { + i = J[n]; + r = t[i]; + if (!o(r)) e[i] = r + } + return e + } + + function X(e) { + K(this, e); + this._d = new Date(e._d != null ? e._d.getTime() : NaN); + if (!this.isValid()) this._d = new Date(NaN); + if (q === false) { + q = true; + h.updateOffset(this); + q = false + } + } + + function _(e) { + return e instanceof X || e != null && e._isAMomentObject != null + } + + function Z(e) { + if (h.suppressDeprecationWarnings === false && typeof console !== "undefined" && console.warn) console.warn("Deprecation warning: " + e) + } + + function e(a, s) { + var o = true; + return z(function () { + if (h.deprecationHandler != null) h.deprecationHandler(null, a); + if (o) { + var e = [], t, n, i, r = arguments.length; + for (n = 0; n < r; n++) { + t = ""; + if (typeof arguments[n] === "object") { + t += "\n[" + n + "] "; + for (i in arguments[0]) if (u(arguments[0], i)) t += i + ": " + arguments[0][i] + ", "; + t = t.slice(0, -2) + } else t = arguments[n]; + e.push(t) + } + Z(a + "\nArguments: " + Array.prototype.slice.call(e).join("") + "\n" + (new Error).stack); + o = false + } + return s.apply(this, arguments) + }, s) + } + + var $ = {}, Q; + + function ee(e, t) { + if (h.deprecationHandler != null) h.deprecationHandler(e, t); + if (!$[e]) { + Z(t); + $[e] = true + } + } + + function f(e) { + return typeof Function !== "undefined" && e instanceof Function || Object.prototype.toString.call(e) === "[object Function]" + } + + function te(e) { + var t, n; + for (n in e) if (u(e, n)) { + t = e[n]; + if (f(t)) this[n] = t; else this["_" + n] = t + } + this._config = e; + this._dayOfMonthOrdinalParseLenient = new RegExp((this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + "|" + /\d{1,2}/.source) + } + + function ne(e, t) { + var n = z({}, e), i; + for (i in t) if (u(t, i)) if (j(e[i]) && j(t[i])) { + n[i] = {}; + z(n[i], e[i]); + z(n[i], t[i]) + } else if (t[i] != null) n[i] = t[i]; else delete n[i]; + for (i in e) if (u(e, i) && !u(t, i) && j(e[i])) n[i] = z({}, n[i]); + return n + } + + function ie(e) { + if (e != null) this.set(e) + } + + if (h.suppressDeprecationWarnings = false, h.deprecationHandler = null, Object.keys) Q = Object.keys; else Q = function (e) { + var t, n = []; + for (t in e) if (u(e, t)) n.push(t); + return n + }; + var re = { + sameDay: "[Today at] LT", + nextDay: "[Tomorrow at] LT", + nextWeek: "dddd [at] LT", + lastDay: "[Yesterday at] LT", + lastWeek: "[Last] dddd [at] LT", + sameElse: "L" + }; + + function ae(e, t, n) { + var i = this._calendar[e] || this._calendar["sameElse"]; + return f(i) ? i.call(t, n) : i + } + + function a(e, t, n) { + var i = "" + Math.abs(e), r = t - i.length, a = e >= 0; + return (a ? n ? "+" : "" : "-") + Math.pow(10, Math.max(0, r)).toString().substr(1) + i + } + + var se = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, + oe = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, ue = {}, de = {}; + + function i(e, t, n, i) { + var r = i; + if (typeof i === "string") r = function () { + return this[i]() + }; + if (e) de[e] = r; + if (t) de[t[0]] = function () { + return a(r.apply(this, arguments), t[1], t[2]) + }; + if (n) de[n] = function () { + return this.localeData().ordinal(r.apply(this, arguments), e) + } + } + + function le(e) { + if (e.match(/\[[\s\S]/)) return e.replace(/^\[|\]$/g, ""); + return e.replace(/\\/g, "") + } + + function he(i) { + var r = i.match(se), e, a; + for (e = 0, a = r.length; e < a; e++) if (de[r[e]]) r[e] = de[r[e]]; else r[e] = le(r[e]); + return function (e) { + var t = "", n; + for (n = 0; n < a; n++) t += f(r[n]) ? r[n].call(e, i) : r[n]; + return t + } + } + + function ce(e, t) { + if (!e.isValid()) return e.localeData().invalidDate(); + t = _e(t, e.localeData()); + ue[t] = ue[t] || he(t); + return ue[t](e) + } + + function _e(e, t) { + var n = 5; + + function i(e) { + return t.longDateFormat(e) || e + } + + oe.lastIndex = 0; + while (n >= 0 && oe.test(e)) { + e = e.replace(oe, i); + oe.lastIndex = 0; + n -= 1 + } + return e + } + + var fe = { + LTS: "h:mm:ss A", + LT: "h:mm A", + L: "MM/DD/YYYY", + LL: "MMMM D, YYYY", + LLL: "MMMM D, YYYY h:mm A", + LLLL: "dddd, MMMM D, YYYY h:mm A" + }; + + function me(e) { + var t = this._longDateFormat[e], n = this._longDateFormat[e.toUpperCase()]; + if (t || !n) return t; + this._longDateFormat[e] = n.match(se).map(function (e) { + if (e === "MMMM" || e === "MM" || e === "DD" || e === "dddd") return e.slice(1); + return e + }).join(""); + return this._longDateFormat[e] + } + + var pe = "Invalid date"; + + function ye() { + return this._invalidDate + } + + var ve = "%d", ge = /\d{1,2}/; + + function Me(e) { + return this._ordinal.replace("%d", e) + } + + var Le = { + future: "in %s", + past: "%s ago", + s: "a few seconds", + ss: "%d seconds", + m: "a minute", + mm: "%d minutes", + h: "an hour", + hh: "%d hours", + d: "a day", + dd: "%d days", + w: "a week", + ww: "%d weeks", + M: "a month", + MM: "%d months", + y: "a year", + yy: "%d years" + }; + + function Se(e, t, n, i) { + var r = this._relativeTime[n]; + return f(r) ? r(e, t, n, i) : r.replace(/%d/i, e) + } + + function ke(e, t) { + var n = this._relativeTime[e > 0 ? "future" : "past"]; + return f(n) ? n(t) : n.replace(/%s/i, t) + } + + var be = {}; + + function t(e, t) { + var n = e.toLowerCase(); + be[n] = be[n + "s"] = be[t] = e + } + + function m(e) { + return typeof e === "string" ? be[e] || be[e.toLowerCase()] : undefined + } + + function we(e) { + var t = {}, n, i; + for (i in e) if (u(e, i)) { + n = m(i); + if (n) t[n] = e[i] + } + return t + } + + var De = {}; + + function n(e, t) { + De[e] = t + } + + function Te(e) { + var t = [], n; + for (n in e) if (u(e, n)) t.push({unit: n, priority: De[n]}); + t.sort(function (e, t) { + return e.priority - t.priority + }); + return t + } + + function Ee(e) { + return e % 4 === 0 && e % 100 !== 0 || e % 400 === 0 + } + + function p(e) { + if (e < 0) return Math.ceil(e) || 0; else return Math.floor(e) + } + + function y(e) { + var t = +e, n = 0; + if (t !== 0 && isFinite(t)) n = p(t); + return n + } + + function Ye(t, n) { + return function (e) { + if (e != null) { + Ce(this, t, e); + h.updateOffset(this, n); + return this + } else return Pe(this, t) + } + } + + function Pe(e, t) { + return e.isValid() ? e._d["get" + (e._isUTC ? "UTC" : "") + t]() : NaN + } + + function Ce(e, t, n) { + if (e.isValid() && !isNaN(n)) if (t === "FullYear" && Ee(e.year()) && e.month() === 1 && e.date() === 29) { + n = y(n); + e._d["set" + (e._isUTC ? "UTC" : "") + t](n, e.month(), at(n, e.month())) + } else e._d["set" + (e._isUTC ? "UTC" : "") + t](n) + } + + function Re(e) { + e = m(e); + if (f(this[e])) return this[e](); + return this + } + + function Ae(e, t) { + if (typeof e === "object") { + e = we(e); + var n = Te(e), i, r = n.length; + for (i = 0; i < r; i++) this[n[i].unit](e[n[i].unit]) + } else { + e = m(e); + if (f(this[e])) return this[e](t) + } + return this + } + + var xe = /\d/, r = /\d\d/, Oe = /\d{3}/, Ie = /\d{4}/, We = /[+-]?\d{6}/, v = /\d\d?/, He = /\d\d\d\d?/, + je = /\d\d\d\d\d\d?/, Fe = /\d{1,3}/, Be = /\d{1,4}/, Ne = /[+-]?\d{1,6}/, ze = /\d+/, + Ue = /[+-]?\d+/, Ve = /Z|[+-]\d\d:?\d\d/gi, Ge = /Z|[+-]\d\d(?::?\d\d)?/gi, + Je = /[+-]?\d+(\.\d{1,3})?/, + qe = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, + Ke; + + function g(e, n, i) { + Ke[e] = f(n) ? n : function (e, t) { + return e && i ? i : n + } + } + + function Xe(e, t) { + if (!u(Ke, e)) return new RegExp(Ze(e)); + return Ke[e](t._strict, t._locale) + } + + function Ze(e) { + return M(e.replace("\\", "").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (e, t, n, i, r) { + return t || n || i || r + })) + } + + function M(e) { + return e.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&") + } + + var Ke = {}, $e = {}; + + function L(e, n) { + var t, i = n, r; + if (typeof e === "string") e = [e]; + if (d(n)) i = function (e, t) { + t[n] = y(e) + }; + r = e.length; + for (t = 0; t < r; t++) $e[e[t]] = i + } + + function Qe(e, r) { + L(e, function (e, t, n, i) { + n._w = n._w || {}; + r(e, n._w, n, i) + }) + } + + function et(e, t, n) { + if (t != null && u($e, e)) $e[e](t, n._a, n, e) + } + + var S = 0, k = 1, b = 2, w = 3, D = 4, T = 5, tt = 6, nt = 7, it = 8, E; + + function rt(e, t) { + return (e % t + t) % t + } + + if (Array.prototype.indexOf) E = Array.prototype.indexOf; else E = function (e) { + var t; + for (t = 0; t < this.length; ++t) if (this[t] === e) return t; + return -1 + }; + + function at(e, t) { + if (isNaN(e) || isNaN(t)) return NaN; + var n = rt(t, 12); + e += (t - n) / 12; + return n === 1 ? Ee(e) ? 29 : 28 : 31 - n % 7 % 2 + } + + i("M", ["MM", 2], "Mo", function () { + return this.month() + 1 + }), i("MMM", 0, 0, function (e) { + return this.localeData().monthsShort(this, e) + }), i("MMMM", 0, 0, function (e) { + return this.localeData().months(this, e) + }), t("month", "M"), n("month", 8), g("M", v), g("MM", v, r), g("MMM", function (e, t) { + return t.monthsShortRegex(e) + }), g("MMMM", function (e, t) { + return t.monthsRegex(e) + }), L(["M", "MM"], function (e, t) { + t[k] = y(e) - 1 + }), L(["MMM", "MMMM"], function (e, t, n, i) { + var r = n._locale.monthsParse(e, i, n._strict); + if (r != null) t[k] = r; else c(n).invalidMonth = e + }); + var st = "January_February_March_April_May_June_July_August_September_October_November_December".split("_"), + ot = "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"), + ut = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, dt = qe, lt = qe; + + function ht(e, t) { + if (!e) return s(this._months) ? this._months : this._months["standalone"]; + return s(this._months) ? this._months[e.month()] : this._months[(this._months.isFormat || ut).test(t) ? "format" : "standalone"][e.month()] + } + + function ct(e, t) { + if (!e) return s(this._monthsShort) ? this._monthsShort : this._monthsShort["standalone"]; + return s(this._monthsShort) ? this._monthsShort[e.month()] : this._monthsShort[ut.test(t) ? "format" : "standalone"][e.month()] + } + + function _t(e, t, n) { + var i, r, a, s = e.toLocaleLowerCase(); + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + a = l([2e3, i]); + this._shortMonthsParse[i] = this.monthsShort(a, "").toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(a, "").toLocaleLowerCase() + } + } + if (n) if (t === "MMM") { + r = E.call(this._shortMonthsParse, s); + return r !== -1 ? r : null + } else { + r = E.call(this._longMonthsParse, s); + return r !== -1 ? r : null + } else if (t === "MMM") { + r = E.call(this._shortMonthsParse, s); + if (r !== -1) return r; + r = E.call(this._longMonthsParse, s); + return r !== -1 ? r : null + } else { + r = E.call(this._longMonthsParse, s); + if (r !== -1) return r; + r = E.call(this._shortMonthsParse, s); + return r !== -1 ? r : null + } + } + + function ft(e, t, n) { + var i, r, a; + if (this._monthsParseExact) return _t.call(this, e, t, n); + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = [] + } + for (i = 0; i < 12; i++) { + r = l([2e3, i]); + if (n && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp("^" + this.months(r, "").replace(".", "") + "$", "i"); + this._shortMonthsParse[i] = new RegExp("^" + this.monthsShort(r, "").replace(".", "") + "$", "i") + } + if (!n && !this._monthsParse[i]) { + a = "^" + this.months(r, "") + "|^" + this.monthsShort(r, ""); + this._monthsParse[i] = new RegExp(a.replace(".", ""), "i") + } + if (n && t === "MMMM" && this._longMonthsParse[i].test(e)) return i; else if (n && t === "MMM" && this._shortMonthsParse[i].test(e)) return i; else if (!n && this._monthsParse[i].test(e)) return i + } + } + + function mt(e, t) { + var n; + if (!e.isValid()) return e; + if (typeof t === "string") if (/^\d+$/.test(t)) t = y(t); else { + t = e.localeData().monthsParse(t); + if (!d(t)) return e + } + n = Math.min(e.date(), at(e.year(), t)); + e._d["set" + (e._isUTC ? "UTC" : "") + "Month"](t, n); + return e + } + + function pt(e) { + if (e != null) { + mt(this, e); + h.updateOffset(this, true); + return this + } else return Pe(this, "Month") + } + + function yt() { + return at(this.year(), this.month()) + } + + function vt(e) { + if (this._monthsParseExact) { + if (!u(this, "_monthsRegex")) Mt.call(this); + if (e) return this._monthsShortStrictRegex; else return this._monthsShortRegex + } else { + if (!u(this, "_monthsShortRegex")) this._monthsShortRegex = dt; + return this._monthsShortStrictRegex && e ? this._monthsShortStrictRegex : this._monthsShortRegex + } + } + + function gt(e) { + if (this._monthsParseExact) { + if (!u(this, "_monthsRegex")) Mt.call(this); + if (e) return this._monthsStrictRegex; else return this._monthsRegex + } else { + if (!u(this, "_monthsRegex")) this._monthsRegex = lt; + return this._monthsStrictRegex && e ? this._monthsStrictRegex : this._monthsRegex + } + } + + function Mt() { + function e(e, t) { + return t.length - e.length + } + + var t = [], n = [], i = [], r, a; + for (r = 0; r < 12; r++) { + a = l([2e3, r]); + t.push(this.monthsShort(a, "")); + n.push(this.months(a, "")); + i.push(this.months(a, "")); + i.push(this.monthsShort(a, "")) + } + t.sort(e); + n.sort(e); + i.sort(e); + for (r = 0; r < 12; r++) { + t[r] = M(t[r]); + n[r] = M(n[r]) + } + for (r = 0; r < 24; r++) i[r] = M(i[r]); + this._monthsRegex = new RegExp("^(" + i.join("|") + ")", "i"); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp("^(" + n.join("|") + ")", "i"); + this._monthsShortStrictRegex = new RegExp("^(" + t.join("|") + ")", "i") + } + + function Lt(e) { + return Ee(e) ? 366 : 365 + } + + i("Y", 0, 0, function () { + var e = this.year(); + return e <= 9999 ? a(e, 4) : "+" + e + }), i(0, ["YY", 2], 0, function () { + return this.year() % 100 + }), i(0, ["YYYY", 4], 0, "year"), i(0, ["YYYYY", 5], 0, "year"), i(0, ["YYYYYY", 6, true], 0, "year"), t("year", "y"), n("year", 1), g("Y", Ue), g("YY", v, r), g("YYYY", Be, Ie), g("YYYYY", Ne, We), g("YYYYYY", Ne, We), L(["YYYYY", "YYYYYY"], S), L("YYYY", function (e, t) { + t[S] = e.length === 2 ? h.parseTwoDigitYear(e) : y(e) + }), L("YY", function (e, t) { + t[S] = h.parseTwoDigitYear(e) + }), L("Y", function (e, t) { + t[S] = parseInt(e, 10) + }), h.parseTwoDigitYear = function (e) { + return y(e) + (y(e) > 68 ? 1900 : 2e3) + }; + var St = Ye("FullYear", true); + + function kt() { + return Ee(this.year()) + } + + function bt(e, t, n, i, r, a, s) { + var o; + if (e < 100 && e >= 0) { + o = new Date(e + 400, t, n, i, r, a, s); + if (isFinite(o.getFullYear())) o.setFullYear(e) + } else o = new Date(e, t, n, i, r, a, s); + return o + } + + function wt(e) { + var t, n; + if (e < 100 && e >= 0) { + n = Array.prototype.slice.call(arguments); + n[0] = e + 400; + t = new Date(Date.UTC.apply(null, n)); + if (isFinite(t.getUTCFullYear())) t.setUTCFullYear(e) + } else t = new Date(Date.UTC.apply(null, arguments)); + return t + } + + function Dt(e, t, n) { + var i = 7 + t - n, r = (7 + wt(e, 0, i).getUTCDay() - t) % 7; + return -r + i - 1 + } + + function Tt(e, t, n, i, r) { + var a = (7 + n - i) % 7, s = Dt(e, i, r), o = 1 + 7 * (t - 1) + a + s, u, d; + if (o <= 0) { + u = e - 1; + d = Lt(u) + o + } else if (o > Lt(e)) { + u = e + 1; + d = o - Lt(e) + } else { + u = e; + d = o + } + return {year: u, dayOfYear: d} + } + + function Et(e, t, n) { + var i = Dt(e.year(), t, n), r = Math.floor((e.dayOfYear() - i - 1) / 7) + 1, a, s; + if (r < 1) { + s = e.year() - 1; + a = r + Y(s, t, n) + } else if (r > Y(e.year(), t, n)) { + a = r - Y(e.year(), t, n); + s = e.year() + 1 + } else { + s = e.year(); + a = r + } + return {week: a, year: s} + } + + function Y(e, t, n) { + var i = Dt(e, t, n), r = Dt(e + 1, t, n); + return (Lt(e) - i + r) / 7 + } + + function Yt(e) { + return Et(e, this._week.dow, this._week.doy).week + } + + i("w", ["ww", 2], "wo", "week"), i("W", ["WW", 2], "Wo", "isoWeek"), t("week", "w"), t("isoWeek", "W"), n("week", 5), n("isoWeek", 5), g("w", v), g("ww", v, r), g("W", v), g("WW", v, r), Qe(["w", "ww", "W", "WW"], function (e, t, n, i) { + t[i.substr(0, 1)] = y(e) + }); + var Pt = {dow: 0, doy: 6}; + + function Ct() { + return this._week.dow + } + + function Rt() { + return this._week.doy + } + + function At(e) { + var t = this.localeData().week(this); + return e == null ? t : this.add((e - t) * 7, "d") + } + + function xt(e) { + var t = Et(this, 1, 4).week; + return e == null ? t : this.add((e - t) * 7, "d") + } + + function Ot(e, t) { + if (typeof e !== "string") return e; + if (!isNaN(e)) return parseInt(e, 10); + e = t.weekdaysParse(e); + if (typeof e === "number") return e; + return null + } + + function It(e, t) { + if (typeof e === "string") return t.weekdaysParse(e) % 7 || 7; + return isNaN(e) ? null : e + } + + function Wt(e, t) { + return e.slice(t, 7).concat(e.slice(0, t)) + } + + i("d", 0, "do", "day"), i("dd", 0, 0, function (e) { + return this.localeData().weekdaysMin(this, e) + }), i("ddd", 0, 0, function (e) { + return this.localeData().weekdaysShort(this, e) + }), i("dddd", 0, 0, function (e) { + return this.localeData().weekdays(this, e) + }), i("e", 0, 0, "weekday"), i("E", 0, 0, "isoWeekday"), t("day", "d"), t("weekday", "e"), t("isoWeekday", "E"), n("day", 11), n("weekday", 11), n("isoWeekday", 11), g("d", v), g("e", v), g("E", v), g("dd", function (e, t) { + return t.weekdaysMinRegex(e) + }), g("ddd", function (e, t) { + return t.weekdaysShortRegex(e) + }), g("dddd", function (e, t) { + return t.weekdaysRegex(e) + }), Qe(["dd", "ddd", "dddd"], function (e, t, n, i) { + var r = n._locale.weekdaysParse(e, i, n._strict); + if (r != null) t.d = r; else c(n).invalidWeekday = e + }), Qe(["d", "e", "E"], function (e, t, n, i) { + t[i] = y(e) + }); + var Ht = "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"), + jt = "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"), Ft = "Su_Mo_Tu_We_Th_Fr_Sa".split("_"), Bt = qe, + Nt = qe, zt = qe; + + function Ut(e, t) { + var n = s(this._weekdays) ? this._weekdays : this._weekdays[e && e !== true && this._weekdays.isFormat.test(t) ? "format" : "standalone"]; + return e === true ? Wt(n, this._week.dow) : e ? n[e.day()] : n + } + + function Vt(e) { + return e === true ? Wt(this._weekdaysShort, this._week.dow) : e ? this._weekdaysShort[e.day()] : this._weekdaysShort + } + + function Gt(e) { + return e === true ? Wt(this._weekdaysMin, this._week.dow) : e ? this._weekdaysMin[e.day()] : this._weekdaysMin + } + + function Jt(e, t, n) { + var i, r, a, s = e.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + for (i = 0; i < 7; ++i) { + a = l([2e3, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(a, "").toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(a, "").toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(a, "").toLocaleLowerCase() + } + } + if (n) if (t === "dddd") { + r = E.call(this._weekdaysParse, s); + return r !== -1 ? r : null + } else if (t === "ddd") { + r = E.call(this._shortWeekdaysParse, s); + return r !== -1 ? r : null + } else { + r = E.call(this._minWeekdaysParse, s); + return r !== -1 ? r : null + } else if (t === "dddd") { + r = E.call(this._weekdaysParse, s); + if (r !== -1) return r; + r = E.call(this._shortWeekdaysParse, s); + if (r !== -1) return r; + r = E.call(this._minWeekdaysParse, s); + return r !== -1 ? r : null + } else if (t === "ddd") { + r = E.call(this._shortWeekdaysParse, s); + if (r !== -1) return r; + r = E.call(this._weekdaysParse, s); + if (r !== -1) return r; + r = E.call(this._minWeekdaysParse, s); + return r !== -1 ? r : null + } else { + r = E.call(this._minWeekdaysParse, s); + if (r !== -1) return r; + r = E.call(this._weekdaysParse, s); + if (r !== -1) return r; + r = E.call(this._shortWeekdaysParse, s); + return r !== -1 ? r : null + } + } + + function qt(e, t, n) { + var i, r, a; + if (this._weekdaysParseExact) return Jt.call(this, e, t, n); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = [] + } + for (i = 0; i < 7; i++) { + r = l([2e3, 1]).day(i); + if (n && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp("^" + this.weekdays(r, "").replace(".", "\\.?") + "$", "i"); + this._shortWeekdaysParse[i] = new RegExp("^" + this.weekdaysShort(r, "").replace(".", "\\.?") + "$", "i"); + this._minWeekdaysParse[i] = new RegExp("^" + this.weekdaysMin(r, "").replace(".", "\\.?") + "$", "i") + } + if (!this._weekdaysParse[i]) { + a = "^" + this.weekdays(r, "") + "|^" + this.weekdaysShort(r, "") + "|^" + this.weekdaysMin(r, ""); + this._weekdaysParse[i] = new RegExp(a.replace(".", ""), "i") + } + if (n && t === "dddd" && this._fullWeekdaysParse[i].test(e)) return i; else if (n && t === "ddd" && this._shortWeekdaysParse[i].test(e)) return i; else if (n && t === "dd" && this._minWeekdaysParse[i].test(e)) return i; else if (!n && this._weekdaysParse[i].test(e)) return i + } + } + + function Kt(e) { + if (!this.isValid()) return e != null ? this : NaN; + var t = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (e != null) { + e = Ot(e, this.localeData()); + return this.add(e - t, "d") + } else return t + } + + function Xt(e) { + if (!this.isValid()) return e != null ? this : NaN; + var t = (this.day() + 7 - this.localeData()._week.dow) % 7; + return e == null ? t : this.add(e - t, "d") + } + + function Zt(e) { + if (!this.isValid()) return e != null ? this : NaN; + if (e != null) { + var t = It(e, this.localeData()); + return this.day(this.day() % 7 ? t : t - 7) + } else return this.day() || 7 + } + + function $t(e) { + if (this._weekdaysParseExact) { + if (!u(this, "_weekdaysRegex")) tn.call(this); + if (e) return this._weekdaysStrictRegex; else return this._weekdaysRegex + } else { + if (!u(this, "_weekdaysRegex")) this._weekdaysRegex = Bt; + return this._weekdaysStrictRegex && e ? this._weekdaysStrictRegex : this._weekdaysRegex + } + } + + function Qt(e) { + if (this._weekdaysParseExact) { + if (!u(this, "_weekdaysRegex")) tn.call(this); + if (e) return this._weekdaysShortStrictRegex; else return this._weekdaysShortRegex + } else { + if (!u(this, "_weekdaysShortRegex")) this._weekdaysShortRegex = Nt; + return this._weekdaysShortStrictRegex && e ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex + } + } + + function en(e) { + if (this._weekdaysParseExact) { + if (!u(this, "_weekdaysRegex")) tn.call(this); + if (e) return this._weekdaysMinStrictRegex; else return this._weekdaysMinRegex + } else { + if (!u(this, "_weekdaysMinRegex")) this._weekdaysMinRegex = zt; + return this._weekdaysMinStrictRegex && e ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex + } + } + + function tn() { + function e(e, t) { + return t.length - e.length + } + + var t = [], n = [], i = [], r = [], a, s, o, u, d; + for (a = 0; a < 7; a++) { + s = l([2e3, 1]).day(a); + o = M(this.weekdaysMin(s, "")); + u = M(this.weekdaysShort(s, "")); + d = M(this.weekdays(s, "")); + t.push(o); + n.push(u); + i.push(d); + r.push(o); + r.push(u); + r.push(d) + } + t.sort(e); + n.sort(e); + i.sort(e); + r.sort(e); + this._weekdaysRegex = new RegExp("^(" + r.join("|") + ")", "i"); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + this._weekdaysStrictRegex = new RegExp("^(" + i.join("|") + ")", "i"); + this._weekdaysShortStrictRegex = new RegExp("^(" + n.join("|") + ")", "i"); + this._weekdaysMinStrictRegex = new RegExp("^(" + t.join("|") + ")", "i") + } + + function nn() { + return this.hours() % 12 || 12 + } + + function rn() { + return this.hours() || 24 + } + + function an(e, t) { + i(e, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), t) + }) + } + + function sn(e, t) { + return t._meridiemParse + } + + function on(e) { + return (e + "").toLowerCase().charAt(0) === "p" + } + + i("H", ["HH", 2], 0, "hour"), i("h", ["hh", 2], 0, nn), i("k", ["kk", 2], 0, rn), i("hmm", 0, 0, function () { + return "" + nn.apply(this) + a(this.minutes(), 2) + }), i("hmmss", 0, 0, function () { + return "" + nn.apply(this) + a(this.minutes(), 2) + a(this.seconds(), 2) + }), i("Hmm", 0, 0, function () { + return "" + this.hours() + a(this.minutes(), 2) + }), i("Hmmss", 0, 0, function () { + return "" + this.hours() + a(this.minutes(), 2) + a(this.seconds(), 2) + }), an("a", true), an("A", false), t("hour", "h"), n("hour", 13), g("a", sn), g("A", sn), g("H", v), g("h", v), g("k", v), g("HH", v, r), g("hh", v, r), g("kk", v, r), g("hmm", He), g("hmmss", je), g("Hmm", He), g("Hmmss", je), L(["H", "HH"], w), L(["k", "kk"], function (e, t, n) { + var i = y(e); + t[w] = i === 24 ? 0 : i + }), L(["a", "A"], function (e, t, n) { + n._isPm = n._locale.isPM(e); + n._meridiem = e + }), L(["h", "hh"], function (e, t, n) { + t[w] = y(e); + c(n).bigHour = true + }), L("hmm", function (e, t, n) { + var i = e.length - 2; + t[w] = y(e.substr(0, i)); + t[D] = y(e.substr(i)); + c(n).bigHour = true + }), L("hmmss", function (e, t, n) { + var i = e.length - 4, r = e.length - 2; + t[w] = y(e.substr(0, i)); + t[D] = y(e.substr(i, 2)); + t[T] = y(e.substr(r)); + c(n).bigHour = true + }), L("Hmm", function (e, t, n) { + var i = e.length - 2; + t[w] = y(e.substr(0, i)); + t[D] = y(e.substr(i)) + }), L("Hmmss", function (e, t, n) { + var i = e.length - 4, r = e.length - 2; + t[w] = y(e.substr(0, i)); + t[D] = y(e.substr(i, 2)); + t[T] = y(e.substr(r)) + }); + var un, dn = Ye("Hours", true); + + function ln(e, t, n) { + if (e > 11) return n ? "pm" : "PM"; else return n ? "am" : "AM" + } + + var hn = { + calendar: re, + longDateFormat: fe, + invalidDate: pe, + ordinal: ve, + dayOfMonthOrdinalParse: ge, + relativeTime: Le, + months: st, + monthsShort: ot, + week: Pt, + weekdays: Ht, + weekdaysMin: Ft, + weekdaysShort: jt, + meridiemParse: /[ap]\.?m?\.?/i + }, P = {}, cn = {}, _n; + + function fn(e, t) { + var n, i = Math.min(e.length, t.length); + for (n = 0; n < i; n += 1) if (e[n] !== t[n]) return n; + return i + } + + function mn(e) { + return e ? e.toLowerCase().replace("_", "-") : e + } + + function pn(e) { + var t = 0, n, i, r, a; + while (t < e.length) { + a = mn(e[t]).split("-"); + n = a.length; + i = mn(e[t + 1]); + i = i ? i.split("-") : null; + while (n > 0) { + r = vn(a.slice(0, n).join("-")); + if (r) return r; + if (i && i.length >= n && fn(a, i) >= n - 1) break; + n-- + } + t++ + } + return _n + } + + function yn(e) { + return e.match("^[^/\\\\]*$") != null + } + + function vn(t) { + var e = null, n; + if (P[t] === undefined && typeof ds !== "undefined" && ds && ds.exports && yn(t)) try { + e = _n._abbr; + n = ls; + hs(284)("./" + t); + gn(e) + } catch (e) { + P[t] = null + } + return P[t] + } + + function gn(e, t) { + var n; + if (e) { + if (o(t)) n = Sn(e); else n = Mn(e, t); + if (n) _n = n; else if (typeof console !== "undefined" && console.warn) console.warn("Locale " + e + " not found. Did you forget to load it?") + } + return _n._abbr + } + + function Mn(e, t) { + if (t !== null) { + var n, i = hn; + t.abbr = e; + if (P[e] != null) { + ee("defineLocaleOverride", "use moment.updateLocale(localeName, config) to change " + "an existing locale. moment.defineLocale(localeName, " + "config) should only be used for creating a new locale " + "See http://momentjs.com/guides/#/warnings/define-locale/ for more info."); + i = P[e]._config + } else if (t.parentLocale != null) if (P[t.parentLocale] != null) i = P[t.parentLocale]._config; else { + n = vn(t.parentLocale); + if (n != null) i = n._config; else { + if (!cn[t.parentLocale]) cn[t.parentLocale] = []; + cn[t.parentLocale].push({name: e, config: t}); + return null + } + } + P[e] = new ie(ne(i, t)); + if (cn[e]) cn[e].forEach(function (e) { + Mn(e.name, e.config) + }); + gn(e); + return P[e] + } else { + delete P[e]; + return null + } + } + + function Ln(e, t) { + if (t != null) { + var n, i, r = hn; + if (P[e] != null && P[e].parentLocale != null) P[e].set(ne(P[e]._config, t)); else { + i = vn(e); + if (i != null) r = i._config; + t = ne(r, t); + if (i == null) t.abbr = e; + n = new ie(t); + n.parentLocale = P[e]; + P[e] = n + } + gn(e) + } else if (P[e] != null) if (P[e].parentLocale != null) { + P[e] = P[e].parentLocale; + if (e === gn()) gn(e) + } else if (P[e] != null) delete P[e]; + return P[e] + } + + function Sn(e) { + var t; + if (e && e._locale && e._locale._abbr) e = e._locale._abbr; + if (!e) return _n; + if (!s(e)) { + t = vn(e); + if (t) return t; + e = [e] + } + return pn(e) + } + + function kn() { + return Q(P) + } + + function bn(e) { + var t, n = e._a; + if (n && c(e).overflow === -2) { + t = n[k] < 0 || n[k] > 11 ? k : n[b] < 1 || n[b] > at(n[S], n[k]) ? b : n[w] < 0 || n[w] > 24 || n[w] === 24 && (n[D] !== 0 || n[T] !== 0 || n[tt] !== 0) ? w : n[D] < 0 || n[D] > 59 ? D : n[T] < 0 || n[T] > 59 ? T : n[tt] < 0 || n[tt] > 999 ? tt : -1; + if (c(e)._overflowDayOfYear && (t < S || t > b)) t = b; + if (c(e)._overflowWeeks && t === -1) t = nt; + if (c(e)._overflowWeekday && t === -1) t = it; + c(e).overflow = t + } + return e + } + + var wn = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + Dn = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d|))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([+-]\d\d(?::?\d\d)?|\s*Z)?)?$/, + Tn = /Z|[+-]\d\d(?::?\d\d)?/, + En = [["YYYYYY-MM-DD", /[+-]\d{6}-\d\d-\d\d/], ["YYYY-MM-DD", /\d{4}-\d\d-\d\d/], ["GGGG-[W]WW-E", /\d{4}-W\d\d-\d/], ["GGGG-[W]WW", /\d{4}-W\d\d/, false], ["YYYY-DDD", /\d{4}-\d{3}/], ["YYYY-MM", /\d{4}-\d\d/, false], ["YYYYYYMMDD", /[+-]\d{10}/], ["YYYYMMDD", /\d{8}/], ["GGGG[W]WWE", /\d{4}W\d{3}/], ["GGGG[W]WW", /\d{4}W\d{2}/, false], ["YYYYDDD", /\d{7}/], ["YYYYMM", /\d{6}/, false], ["YYYY", /\d{4}/, false]], + Yn = [["HH:mm:ss.SSSS", /\d\d:\d\d:\d\d\.\d+/], ["HH:mm:ss,SSSS", /\d\d:\d\d:\d\d,\d+/], ["HH:mm:ss", /\d\d:\d\d:\d\d/], ["HH:mm", /\d\d:\d\d/], ["HHmmss.SSSS", /\d\d\d\d\d\d\.\d+/], ["HHmmss,SSSS", /\d\d\d\d\d\d,\d+/], ["HHmmss", /\d\d\d\d\d\d/], ["HHmm", /\d\d\d\d/], ["HH", /\d\d/]], + Pn = /^\/?Date\((-?\d+)/i, + Cn = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/, + Rn = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; + + function An(e) { + var t, n, i = e._i, r = wn.exec(i) || Dn.exec(i), a, s, o, u, d = En.length, l = Yn.length; + if (r) { + c(e).iso = true; + for (t = 0, n = d; t < n; t++) if (En[t][1].exec(r[1])) { + s = En[t][0]; + a = En[t][2] !== false; + break + } + if (s == null) { + e._isValid = false; + return + } + if (r[3]) { + for (t = 0, n = l; t < n; t++) if (Yn[t][1].exec(r[3])) { + o = (r[2] || " ") + Yn[t][0]; + break + } + if (o == null) { + e._isValid = false; + return + } + } + if (!a && o != null) { + e._isValid = false; + return + } + if (r[4]) if (Tn.exec(r[4])) u = "Z"; else { + e._isValid = false; + return + } + e._f = s + (o || "") + (u || ""); + Vn(e) + } else e._isValid = false + } + + function xn(e, t, n, i, r, a) { + var s = [On(e), ot.indexOf(t), parseInt(n, 10), parseInt(i, 10), parseInt(r, 10)]; + if (a) s.push(parseInt(a, 10)); + return s + } + + function On(e) { + var t = parseInt(e, 10); + if (t <= 49) return 2e3 + t; else if (t <= 999) return 1900 + t; + return t + } + + function In(e) { + return e.replace(/\([^()]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").replace(/^\s\s*/, "").replace(/\s\s*$/, "") + } + + function Wn(e, t, n) { + if (e) { + var i = jt.indexOf(e), r = new Date(t[0], t[1], t[2]).getDay(); + if (i !== r) { + c(n).weekdayMismatch = true; + n._isValid = false; + return false + } + } + return true + } + + function Hn(e, t, n) { + if (e) return Rn[e]; else if (t) return 0; else { + var i = parseInt(n, 10), r = i % 100, a = (i - r) / 100; + return a * 60 + r + } + } + + function jn(e) { + var t = Cn.exec(In(e._i)), n; + if (t) { + n = xn(t[4], t[3], t[2], t[5], t[6], t[7]); + if (!Wn(t[1], n, e)) return; + e._a = n; + e._tzm = Hn(t[8], t[9], t[10]); + e._d = wt.apply(null, e._a); + e._d.setUTCMinutes(e._d.getUTCMinutes() - e._tzm); + c(e).rfc2822 = true + } else e._isValid = false + } + + function Fn(e) { + var t = Pn.exec(e._i); + if (t !== null) { + e._d = new Date(+t[1]); + return + } + An(e); + if (e._isValid === false) delete e._isValid; else return; + jn(e); + if (e._isValid === false) delete e._isValid; else return; + if (e._strict) e._isValid = false; else h.createFromInputFallback(e) + } + + function Bn(e, t, n) { + if (e != null) return e; + if (t != null) return t; + return n + } + + function Nn(e) { + var t = new Date(h.now()); + if (e._useUTC) return [t.getUTCFullYear(), t.getUTCMonth(), t.getUTCDate()]; + return [t.getFullYear(), t.getMonth(), t.getDate()] + } + + function zn(e) { + var t, n, i = [], r, a, s; + if (e._d) return; + r = Nn(e); + if (e._w && e._a[b] == null && e._a[k] == null) Un(e); + if (e._dayOfYear != null) { + s = Bn(e._a[S], r[S]); + if (e._dayOfYear > Lt(s) || e._dayOfYear === 0) c(e)._overflowDayOfYear = true; + n = wt(s, 0, e._dayOfYear); + e._a[k] = n.getUTCMonth(); + e._a[b] = n.getUTCDate() + } + for (t = 0; t < 3 && e._a[t] == null; ++t) e._a[t] = i[t] = r[t]; + for (; t < 7; t++) e._a[t] = i[t] = e._a[t] == null ? t === 2 ? 1 : 0 : e._a[t]; + if (e._a[w] === 24 && e._a[D] === 0 && e._a[T] === 0 && e._a[tt] === 0) { + e._nextDay = true; + e._a[w] = 0 + } + e._d = (e._useUTC ? wt : bt).apply(null, i); + a = e._useUTC ? e._d.getUTCDay() : e._d.getDay(); + if (e._tzm != null) e._d.setUTCMinutes(e._d.getUTCMinutes() - e._tzm); + if (e._nextDay) e._a[w] = 24; + if (e._w && typeof e._w.d !== "undefined" && e._w.d !== a) c(e).weekdayMismatch = true + } + + function Un(e) { + var t, n, i, r, a, s, o, u, d; + t = e._w; + if (t.GG != null || t.W != null || t.E != null) { + a = 1; + s = 4; + n = Bn(t.GG, e._a[S], Et(C(), 1, 4).year); + i = Bn(t.W, 1); + r = Bn(t.E, 1); + if (r < 1 || r > 7) u = true + } else { + a = e._locale._week.dow; + s = e._locale._week.doy; + d = Et(C(), a, s); + n = Bn(t.gg, e._a[S], d.year); + i = Bn(t.w, d.week); + if (t.d != null) { + r = t.d; + if (r < 0 || r > 6) u = true + } else if (t.e != null) { + r = t.e + a; + if (t.e < 0 || t.e > 6) u = true + } else r = a + } + if (i < 1 || i > Y(n, a, s)) c(e)._overflowWeeks = true; else if (u != null) c(e)._overflowWeekday = true; else { + o = Tt(n, i, r, a, s); + e._a[S] = o.year; + e._dayOfYear = o.dayOfYear + } + } + + function Vn(e) { + if (e._f === h.ISO_8601) { + An(e); + return + } + if (e._f === h.RFC_2822) { + jn(e); + return + } + e._a = []; + c(e).empty = true; + var t = "" + e._i, n, i, r, a, s, o = t.length, u = 0, d, l; + r = _e(e._f, e._locale).match(se) || []; + l = r.length; + for (n = 0; n < l; n++) { + a = r[n]; + i = (t.match(Xe(a, e)) || [])[0]; + if (i) { + s = t.substr(0, t.indexOf(i)); + if (s.length > 0) c(e).unusedInput.push(s); + t = t.slice(t.indexOf(i) + i.length); + u += i.length + } + if (de[a]) { + if (i) c(e).empty = false; else c(e).unusedTokens.push(a); + et(a, i, e) + } else if (e._strict && !i) c(e).unusedTokens.push(a) + } + c(e).charsLeftOver = o - u; + if (t.length > 0) c(e).unusedInput.push(t); + if (e._a[w] <= 12 && c(e).bigHour === true && e._a[w] > 0) c(e).bigHour = undefined; + c(e).parsedDateParts = e._a.slice(0); + c(e).meridiem = e._meridiem; + e._a[w] = Gn(e._locale, e._a[w], e._meridiem); + d = c(e).era; + if (d !== null) e._a[S] = e._locale.erasConvertYear(d, e._a[S]); + zn(e); + bn(e) + } + + function Gn(e, t, n) { + var i; + if (n == null) return t; + if (e.meridiemHour != null) return e.meridiemHour(t, n); else if (e.isPM != null) { + i = e.isPM(n); + if (i && t < 12) t += 12; + if (!i && t === 12) t = 0; + return t + } else return t + } + + function Jn(e) { + var t, n, i, r, a, s, o = false, u = e._f.length; + if (u === 0) { + c(e).invalidFormat = true; + e._d = new Date(NaN); + return + } + for (r = 0; r < u; r++) { + a = 0; + s = false; + t = K({}, e); + if (e._useUTC != null) t._useUTC = e._useUTC; + t._f = e._f[r]; + Vn(t); + if (V(t)) s = true; + a += c(t).charsLeftOver; + a += c(t).unusedTokens.length * 10; + c(t).score = a; + if (!o) { + if (i == null || a < i || s) { + i = a; + n = t; + if (s) o = true + } + } else if (a < i) { + i = a; + n = t + } + } + z(e, n || t) + } + + function qn(e) { + if (e._d) return; + var t = we(e._i), n = t.day === undefined ? t.date : t.day; + e._a = N([t.year, t.month, n, t.hour, t.minute, t.second, t.millisecond], function (e) { + return e && parseInt(e, 10) + }); + zn(e) + } + + function Kn(e) { + var t = new X(bn(Xn(e))); + if (t._nextDay) { + t.add(1, "d"); + t._nextDay = undefined + } + return t + } + + function Xn(e) { + var t = e._i, n = e._f; + e._locale = e._locale || Sn(e._l); + if (t === null || n === undefined && t === "") return G({nullInput: true}); + if (typeof t === "string") e._i = t = e._locale.preparse(t); + if (_(t)) return new X(bn(t)); else if (B(t)) e._d = t; else if (s(n)) Jn(e); else if (n) Vn(e); else Zn(e); + if (!V(e)) e._d = null; + return e + } + + function Zn(e) { + var t = e._i; + if (o(t)) e._d = new Date(h.now()); else if (B(t)) e._d = new Date(t.valueOf()); else if (typeof t === "string") Fn(e); else if (s(t)) { + e._a = N(t.slice(0), function (e) { + return parseInt(e, 10) + }); + zn(e) + } else if (j(t)) qn(e); else if (d(t)) e._d = new Date(t); else h.createFromInputFallback(e) + } + + function $n(e, t, n, i, r) { + var a = {}; + if (t === true || t === false) { + i = t; + t = undefined + } + if (n === true || n === false) { + i = n; + n = undefined + } + if (j(e) && F(e) || s(e) && e.length === 0) e = undefined; + a._isAMomentObject = true; + a._useUTC = a._isUTC = r; + a._l = n; + a._i = e; + a._f = t; + a._strict = i; + return Kn(a) + } + + function C(e, t, n, i) { + return $n(e, t, n, i, false) + } + + h.createFromInputFallback = e("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), " + "which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are " + "discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.", function (e) { + e._d = new Date(e._i + (e._useUTC ? " UTC" : "")) + }), h.ISO_8601 = function () { + }, h.RFC_2822 = function () { + }; + var Qn = e("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/", function () { + var e = C.apply(null, arguments); + if (this.isValid() && e.isValid()) return e < this ? this : e; else return G() + }), + ei = e("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/", function () { + var e = C.apply(null, arguments); + if (this.isValid() && e.isValid()) return e > this ? this : e; else return G() + }); + + function ti(e, t) { + var n, i; + if (t.length === 1 && s(t[0])) t = t[0]; + if (!t.length) return C(); + n = t[0]; + for (i = 1; i < t.length; ++i) if (!t[i].isValid() || t[i][e](n)) n = t[i]; + return n + } + + function ni() { + var e = [].slice.call(arguments, 0); + return ti("isBefore", e) + } + + function ii() { + var e = [].slice.call(arguments, 0); + return ti("isAfter", e) + } + + var ri = function () { + return Date.now ? Date.now() : +new Date + }, ai = ["year", "quarter", "month", "week", "day", "hour", "minute", "second", "millisecond"]; + + function si(e) { + var t, n = false, i, r = ai.length; + for (t in e) if (u(e, t) && !(E.call(ai, t) !== -1 && (e[t] == null || !isNaN(e[t])))) return false; + for (i = 0; i < r; ++i) if (e[ai[i]]) { + if (n) return false; + if (parseFloat(e[ai[i]]) !== y(e[ai[i]])) n = true + } + return true + } + + function oi() { + return this._isValid + } + + function ui() { + return R(NaN) + } + + function di(e) { + var t = we(e), n = t.year || 0, i = t.quarter || 0, r = t.month || 0, a = t.week || t.isoWeek || 0, + s = t.day || 0, o = t.hour || 0, u = t.minute || 0, d = t.second || 0, l = t.millisecond || 0; + this._isValid = si(t); + this._milliseconds = +l + d * 1e3 + u * 6e4 + o * 1e3 * 60 * 60; + this._days = +s + a * 7; + this._months = +r + i * 3 + n * 12; + this._data = {}; + this._locale = Sn(); + this._bubble() + } + + function li(e) { + return e instanceof di + } + + function hi(e) { + if (e < 0) return Math.round(-1 * e) * -1; else return Math.round(e) + } + + function ci(e, t, n) { + var i = Math.min(e.length, t.length), r = Math.abs(e.length - t.length), a = 0, s; + for (s = 0; s < i; s++) if (n && e[s] !== t[s] || !n && y(e[s]) !== y(t[s])) a++; + return a + r + } + + function _i(e, n) { + i(e, 0, 0, function () { + var e = this.utcOffset(), t = "+"; + if (e < 0) { + e = -e; + t = "-" + } + return t + a(~~(e / 60), 2) + n + a(~~e % 60, 2) + }) + } + + _i("Z", ":"), _i("ZZ", ""), g("Z", Ge), g("ZZ", Ge), L(["Z", "ZZ"], function (e, t, n) { + n._useUTC = true; + n._tzm = mi(Ge, e) + }); + var fi = /([\+\-]|\d\d)/gi; + + function mi(e, t) { + var n = (t || "").match(e), i, r, a; + if (n === null) return null; + i = n[n.length - 1] || []; + r = (i + "").match(fi) || ["-", 0, 0]; + a = +(r[1] * 60) + y(r[2]); + return a === 0 ? 0 : r[0] === "+" ? a : -a + } + + function pi(e, t) { + var n, i; + if (t._isUTC) { + n = t.clone(); + i = (_(e) || B(e) ? e.valueOf() : C(e).valueOf()) - n.valueOf(); + n._d.setTime(n._d.valueOf() + i); + h.updateOffset(n, false); + return n + } else return C(e).local() + } + + function yi(e) { + return -Math.round(e._d.getTimezoneOffset()) + } + + function vi(e, t, n) { + var i = this._offset || 0, r; + if (!this.isValid()) return e != null ? this : NaN; + if (e != null) { + if (typeof e === "string") { + e = mi(Ge, e); + if (e === null) return this + } else if (Math.abs(e) < 16 && !n) e = e * 60; + if (!this._isUTC && t) r = yi(this); + this._offset = e; + this._isUTC = true; + if (r != null) this.add(r, "m"); + if (i !== e) if (!t || this._changeInProgress) Oi(this, R(e - i, "m"), 1, false); else if (!this._changeInProgress) { + this._changeInProgress = true; + h.updateOffset(this, true); + this._changeInProgress = null + } + return this + } else return this._isUTC ? i : yi(this) + } + + function gi(e, t) { + if (e != null) { + if (typeof e !== "string") e = -e; + this.utcOffset(e, t); + return this + } else return -this.utcOffset() + } + + function Mi(e) { + return this.utcOffset(0, e) + } + + function Li(e) { + if (this._isUTC) { + this.utcOffset(0, e); + this._isUTC = false; + if (e) this.subtract(yi(this), "m") + } + return this + } + + function Si() { + if (this._tzm != null) this.utcOffset(this._tzm, false, true); else if (typeof this._i === "string") { + var e = mi(Ve, this._i); + if (e != null) this.utcOffset(e); else this.utcOffset(0, true) + } + return this + } + + function ki(e) { + if (!this.isValid()) return false; + e = e ? C(e).utcOffset() : 0; + return (this.utcOffset() - e) % 60 === 0 + } + + function bi() { + return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset() + } + + function wi() { + if (!o(this._isDSTShifted)) return this._isDSTShifted; + var e = {}, t; + K(e, this); + e = Xn(e); + if (e._a) { + t = e._isUTC ? l(e._a) : C(e._a); + this._isDSTShifted = this.isValid() && ci(e._a, t.toArray()) > 0 + } else this._isDSTShifted = false; + return this._isDSTShifted + } + + function Di() { + return this.isValid() ? !this._isUTC : false + } + + function Ti() { + return this.isValid() ? this._isUTC : false + } + + function Ei() { + return this.isValid() ? this._isUTC && this._offset === 0 : false + } + + h.updateOffset = function () { + }; + var Yi = /^(-|\+)?(?:(\d*)[. ])?(\d+):(\d+)(?::(\d+)(\.\d*)?)?$/, + Pi = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + + function R(e, t) { + var n = e, i = null, r, a, s; + if (li(e)) n = {ms: e._milliseconds, d: e._days, M: e._months}; else if (d(e) || !isNaN(+e)) { + n = {}; + if (t) n[t] = +e; else n.milliseconds = +e + } else if (i = Yi.exec(e)) { + r = i[1] === "-" ? -1 : 1; + n = { + y: 0, + d: y(i[b]) * r, + h: y(i[w]) * r, + m: y(i[D]) * r, + s: y(i[T]) * r, + ms: y(hi(i[tt] * 1e3)) * r + } + } else if (i = Pi.exec(e)) { + r = i[1] === "-" ? -1 : 1; + n = { + y: Ci(i[2], r), + M: Ci(i[3], r), + w: Ci(i[4], r), + d: Ci(i[5], r), + h: Ci(i[6], r), + m: Ci(i[7], r), + s: Ci(i[8], r) + } + } else if (n == null) n = {}; else if (typeof n === "object" && ("from" in n || "to" in n)) { + s = Ai(C(n.from), C(n.to)); + n = {}; + n.ms = s.milliseconds; + n.M = s.months + } + a = new di(n); + if (li(e) && u(e, "_locale")) a._locale = e._locale; + if (li(e) && u(e, "_isValid")) a._isValid = e._isValid; + return a + } + + function Ci(e, t) { + var n = e && parseFloat(e.replace(",", ".")); + return (isNaN(n) ? 0 : n) * t + } + + function Ri(e, t) { + var n = {}; + n.months = t.month() - e.month() + (t.year() - e.year()) * 12; + if (e.clone().add(n.months, "M").isAfter(t)) --n.months; + n.milliseconds = +t - +e.clone().add(n.months, "M"); + return n + } + + function Ai(e, t) { + var n; + if (!(e.isValid() && t.isValid())) return {milliseconds: 0, months: 0}; + t = pi(t, e); + if (e.isBefore(t)) n = Ri(e, t); else { + n = Ri(t, e); + n.milliseconds = -n.milliseconds; + n.months = -n.months + } + return n + } + + function xi(r, a) { + return function (e, t) { + var n, i; + if (t !== null && !isNaN(+t)) { + ee(a, "moment()." + a + "(period, number) is deprecated. Please use moment()." + a + "(number, period). " + "See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."); + i = e; + e = t; + t = i + } + n = R(e, t); + Oi(this, n, r); + return this + } + } + + function Oi(e, t, n, i) { + var r = t._milliseconds, a = hi(t._days), s = hi(t._months); + if (!e.isValid()) return; + i = i == null ? true : i; + if (s) mt(e, Pe(e, "Month") + s * n); + if (a) Ce(e, "Date", Pe(e, "Date") + a * n); + if (r) e._d.setTime(e._d.valueOf() + r * n); + if (i) h.updateOffset(e, a || s) + } + + R.fn = di.prototype, R.invalid = ui; + var Ii = xi(1, "add"), Wi = xi(-1, "subtract"); + + function Hi(e) { + return typeof e === "string" || e instanceof String + } + + function ji(e) { + return _(e) || B(e) || Hi(e) || d(e) || Bi(e) || Fi(e) || e === null || e === undefined + } + + function Fi(e) { + var t = j(e) && !F(e), n = false, + i = ["years", "year", "y", "months", "month", "M", "days", "day", "d", "dates", "date", "D", "hours", "hour", "h", "minutes", "minute", "m", "seconds", "second", "s", "milliseconds", "millisecond", "ms"], + r, a, s = i.length; + for (r = 0; r < s; r += 1) { + a = i[r]; + n = n || u(e, a) + } + return t && n + } + + function Bi(t) { + var e = s(t), n = false; + if (e) n = t.filter(function (e) { + return !d(e) && Hi(t) + }).length === 0; + return e && n + } + + function Ni(e) { + var t = j(e) && !F(e), n = false, + i = ["sameDay", "nextDay", "lastDay", "nextWeek", "lastWeek", "sameElse"], r, a; + for (r = 0; r < i.length; r += 1) { + a = i[r]; + n = n || u(e, a) + } + return t && n + } + + function zi(e, t) { + var n = e.diff(t, "days", true); + return n < -6 ? "sameElse" : n < -1 ? "lastWeek" : n < 0 ? "lastDay" : n < 1 ? "sameDay" : n < 2 ? "nextDay" : n < 7 ? "nextWeek" : "sameElse" + } + + function Ui(e, t) { + if (arguments.length === 1) if (!arguments[0]) { + e = undefined; + t = undefined + } else if (ji(arguments[0])) { + e = arguments[0]; + t = undefined + } else if (Ni(arguments[0])) { + t = arguments[0]; + e = undefined + } + var n = e || C(), i = pi(n, this).startOf("day"), r = h.calendarFormat(this, i) || "sameElse", + a = t && (f(t[r]) ? t[r].call(this, n) : t[r]); + return this.format(a || this.localeData().calendar(r, this, C(n))) + } + + function Vi() { + return new X(this) + } + + function Gi(e, t) { + var n = _(e) ? e : C(e); + if (!(this.isValid() && n.isValid())) return false; + t = m(t) || "millisecond"; + if (t === "millisecond") return this.valueOf() > n.valueOf(); else return n.valueOf() < this.clone().startOf(t).valueOf() + } + + function Ji(e, t) { + var n = _(e) ? e : C(e); + if (!(this.isValid() && n.isValid())) return false; + t = m(t) || "millisecond"; + if (t === "millisecond") return this.valueOf() < n.valueOf(); else return this.clone().endOf(t).valueOf() < n.valueOf() + } + + function qi(e, t, n, i) { + var r = _(e) ? e : C(e), a = _(t) ? t : C(t); + if (!(this.isValid() && r.isValid() && a.isValid())) return false; + i = i || "()"; + return (i[0] === "(" ? this.isAfter(r, n) : !this.isBefore(r, n)) && (i[1] === ")" ? this.isBefore(a, n) : !this.isAfter(a, n)) + } + + function Ki(e, t) { + var n = _(e) ? e : C(e), i; + if (!(this.isValid() && n.isValid())) return false; + t = m(t) || "millisecond"; + if (t === "millisecond") return this.valueOf() === n.valueOf(); else { + i = n.valueOf(); + return this.clone().startOf(t).valueOf() <= i && i <= this.clone().endOf(t).valueOf() + } + } + + function Xi(e, t) { + return this.isSame(e, t) || this.isAfter(e, t) + } + + function Zi(e, t) { + return this.isSame(e, t) || this.isBefore(e, t) + } + + function $i(e, t, n) { + var i, r, a; + if (!this.isValid()) return NaN; + i = pi(e, this); + if (!i.isValid()) return NaN; + r = (i.utcOffset() - this.utcOffset()) * 6e4; + t = m(t); + switch (t) { + case"year": + a = Qi(this, i) / 12; + break; + case"month": + a = Qi(this, i); + break; + case"quarter": + a = Qi(this, i) / 3; + break; + case"second": + a = (this - i) / 1e3; + break; + case"minute": + a = (this - i) / 6e4; + break; + case"hour": + a = (this - i) / 36e5; + break; + case"day": + a = (this - i - r) / 864e5; + break; + case"week": + a = (this - i - r) / 6048e5; + break; + default: + a = this - i + } + return n ? a : p(a) + } + + function Qi(e, t) { + if (e.date() < t.date()) return -Qi(t, e); + var n = (t.year() - e.year()) * 12 + (t.month() - e.month()), i = e.clone().add(n, "months"), r, a; + if (t - i < 0) { + r = e.clone().add(n - 1, "months"); + a = (t - i) / (i - r) + } else { + r = e.clone().add(n + 1, "months"); + a = (t - i) / (r - i) + } + return -(n + a) || 0 + } + + function er() { + return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ") + } + + function tr(e) { + if (!this.isValid()) return null; + var t = e !== true, n = t ? this.clone().utc() : this; + if (n.year() < 0 || n.year() > 9999) return ce(n, t ? "YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"); + if (f(Date.prototype.toISOString)) if (t) return this.toDate().toISOString(); else return new Date(this.valueOf() + this.utcOffset() * 60 * 1e3).toISOString().replace("Z", ce(n, "Z")); + return ce(n, t ? "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYY-MM-DD[T]HH:mm:ss.SSSZ") + } + + function nr() { + if (!this.isValid()) return "moment.invalid(/* " + this._i + " */)"; + var e = "moment", t = "", n, i, r, a; + if (!this.isLocal()) { + e = this.utcOffset() === 0 ? "moment.utc" : "moment.parseZone"; + t = "Z" + } + n = "[" + e + '("]'; + i = 0 <= this.year() && this.year() <= 9999 ? "YYYY" : "YYYYYY"; + r = "-MM-DD[T]HH:mm:ss.SSS"; + a = t + '[")]'; + return this.format(n + i + r + a) + } + + function ir(e) { + if (!e) e = this.isUtc() ? h.defaultFormatUtc : h.defaultFormat; + var t = ce(this, e); + return this.localeData().postformat(t) + } + + function rr(e, t) { + if (this.isValid() && (_(e) && e.isValid() || C(e).isValid())) return R({ + to: this, + from: e + }).locale(this.locale()).humanize(!t); else return this.localeData().invalidDate() + } + + function ar(e) { + return this.from(C(), e) + } + + function sr(e, t) { + if (this.isValid() && (_(e) && e.isValid() || C(e).isValid())) return R({ + from: this, + to: e + }).locale(this.locale()).humanize(!t); else return this.localeData().invalidDate() + } + + function or(e) { + return this.to(C(), e) + } + + function ur(e) { + var t; + if (e === undefined) return this._locale._abbr; else { + t = Sn(e); + if (t != null) this._locale = t; + return this + } + } + + h.defaultFormat = "YYYY-MM-DDTHH:mm:ssZ", h.defaultFormatUtc = "YYYY-MM-DDTHH:mm:ss[Z]"; + var dr = e("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.", function (e) { + if (e === undefined) return this.localeData(); else return this.locale(e) + }); + + function lr() { + return this._locale + } + + var hr = 1e3, cr = 60 * hr, _r = 60 * cr, fr = (365 * 400 + 97) * 24 * _r; + + function mr(e, t) { + return (e % t + t) % t + } + + function pr(e, t, n) { + if (e < 100 && e >= 0) return new Date(e + 400, t, n) - fr; else return new Date(e, t, n).valueOf() + } + + function yr(e, t, n) { + if (e < 100 && e >= 0) return Date.UTC(e + 400, t, n) - fr; else return Date.UTC(e, t, n) + } + + function vr(e) { + var t, n; + e = m(e); + if (e === undefined || e === "millisecond" || !this.isValid()) return this; + n = this._isUTC ? yr : pr; + switch (e) { + case"year": + t = n(this.year(), 0, 1); + break; + case"quarter": + t = n(this.year(), this.month() - this.month() % 3, 1); + break; + case"month": + t = n(this.year(), this.month(), 1); + break; + case"week": + t = n(this.year(), this.month(), this.date() - this.weekday()); + break; + case"isoWeek": + t = n(this.year(), this.month(), this.date() - (this.isoWeekday() - 1)); + break; + case"day": + case"date": + t = n(this.year(), this.month(), this.date()); + break; + case"hour": + t = this._d.valueOf(); + t -= mr(t + (this._isUTC ? 0 : this.utcOffset() * cr), _r); + break; + case"minute": + t = this._d.valueOf(); + t -= mr(t, cr); + break; + case"second": + t = this._d.valueOf(); + t -= mr(t, hr); + break + } + this._d.setTime(t); + h.updateOffset(this, true); + return this + } + + function gr(e) { + var t, n; + e = m(e); + if (e === undefined || e === "millisecond" || !this.isValid()) return this; + n = this._isUTC ? yr : pr; + switch (e) { + case"year": + t = n(this.year() + 1, 0, 1) - 1; + break; + case"quarter": + t = n(this.year(), this.month() - this.month() % 3 + 3, 1) - 1; + break; + case"month": + t = n(this.year(), this.month() + 1, 1) - 1; + break; + case"week": + t = n(this.year(), this.month(), this.date() - this.weekday() + 7) - 1; + break; + case"isoWeek": + t = n(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1; + break; + case"day": + case"date": + t = n(this.year(), this.month(), this.date() + 1) - 1; + break; + case"hour": + t = this._d.valueOf(); + t += _r - mr(t + (this._isUTC ? 0 : this.utcOffset() * cr), _r) - 1; + break; + case"minute": + t = this._d.valueOf(); + t += cr - mr(t, cr) - 1; + break; + case"second": + t = this._d.valueOf(); + t += hr - mr(t, hr) - 1; + break + } + this._d.setTime(t); + h.updateOffset(this, true); + return this + } + + function Mr() { + return this._d.valueOf() - (this._offset || 0) * 6e4 + } + + function Lr() { + return Math.floor(this.valueOf() / 1e3) + } + + function Sr() { + return new Date(this.valueOf()) + } + + function kr() { + var e = this; + return [e.year(), e.month(), e.date(), e.hour(), e.minute(), e.second(), e.millisecond()] + } + + function br() { + var e = this; + return { + years: e.year(), + months: e.month(), + date: e.date(), + hours: e.hours(), + minutes: e.minutes(), + seconds: e.seconds(), + milliseconds: e.milliseconds() + } + } + + function wr() { + return this.isValid() ? this.toISOString() : null + } + + function Dr() { + return V(this) + } + + function Tr() { + return z({}, c(this)) + } + + function Er() { + return c(this).overflow + } + + function Yr() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + } + } + + function Pr(e, t) { + var n, i, r, a = this._eras || Sn("en")._eras; + for (n = 0, i = a.length; n < i; ++n) { + switch (typeof a[n].since) { + case"string": + r = h(a[n].since).startOf("day"); + a[n].since = r.valueOf(); + break + } + switch (typeof a[n].until) { + case"undefined": + a[n].until = +Infinity; + break; + case"string": + r = h(a[n].until).startOf("day").valueOf(); + a[n].until = r.valueOf(); + break + } + } + return a + } + + function Cr(e, t, n) { + var i, r, a = this.eras(), s, o, u; + e = e.toUpperCase(); + for (i = 0, r = a.length; i < r; ++i) { + s = a[i].name.toUpperCase(); + o = a[i].abbr.toUpperCase(); + u = a[i].narrow.toUpperCase(); + if (n) switch (t) { + case"N": + case"NN": + case"NNN": + if (o === e) return a[i]; + break; + case"NNNN": + if (s === e) return a[i]; + break; + case"NNNNN": + if (u === e) return a[i]; + break + } else if ([s, o, u].indexOf(e) >= 0) return a[i] + } + } + + function Rr(e, t) { + var n = e.since <= e.until ? +1 : -1; + if (t === undefined) return h(e.since).year(); else return h(e.since).year() + (t - e.offset) * n + } + + function Ar() { + var e, t, n, i = this.localeData().eras(); + for (e = 0, t = i.length; e < t; ++e) { + n = this.clone().startOf("day").valueOf(); + if (i[e].since <= n && n <= i[e].until) return i[e].name; + if (i[e].until <= n && n <= i[e].since) return i[e].name + } + return "" + } + + function xr() { + var e, t, n, i = this.localeData().eras(); + for (e = 0, t = i.length; e < t; ++e) { + n = this.clone().startOf("day").valueOf(); + if (i[e].since <= n && n <= i[e].until) return i[e].narrow; + if (i[e].until <= n && n <= i[e].since) return i[e].narrow + } + return "" + } + + function Or() { + var e, t, n, i = this.localeData().eras(); + for (e = 0, t = i.length; e < t; ++e) { + n = this.clone().startOf("day").valueOf(); + if (i[e].since <= n && n <= i[e].until) return i[e].abbr; + if (i[e].until <= n && n <= i[e].since) return i[e].abbr + } + return "" + } + + function Ir() { + var e, t, n, i, r = this.localeData().eras(); + for (e = 0, t = r.length; e < t; ++e) { + n = r[e].since <= r[e].until ? +1 : -1; + i = this.clone().startOf("day").valueOf(); + if (r[e].since <= i && i <= r[e].until || r[e].until <= i && i <= r[e].since) return (this.year() - h(r[e].since).year()) * n + r[e].offset + } + return this.year() + } + + function Wr(e) { + if (!u(this, "_erasNameRegex")) Ur.call(this); + return e ? this._erasNameRegex : this._erasRegex + } + + function Hr(e) { + if (!u(this, "_erasAbbrRegex")) Ur.call(this); + return e ? this._erasAbbrRegex : this._erasRegex + } + + function jr(e) { + if (!u(this, "_erasNarrowRegex")) Ur.call(this); + return e ? this._erasNarrowRegex : this._erasRegex + } + + function Fr(e, t) { + return t.erasAbbrRegex(e) + } + + function Br(e, t) { + return t.erasNameRegex(e) + } + + function Nr(e, t) { + return t.erasNarrowRegex(e) + } + + function zr(e, t) { + return t._eraYearOrdinalRegex || ze + } + + function Ur() { + var e = [], t = [], n = [], i = [], r, a, s = this.eras(); + for (r = 0, a = s.length; r < a; ++r) { + t.push(M(s[r].name)); + e.push(M(s[r].abbr)); + n.push(M(s[r].narrow)); + i.push(M(s[r].name)); + i.push(M(s[r].abbr)); + i.push(M(s[r].narrow)) + } + this._erasRegex = new RegExp("^(" + i.join("|") + ")", "i"); + this._erasNameRegex = new RegExp("^(" + t.join("|") + ")", "i"); + this._erasAbbrRegex = new RegExp("^(" + e.join("|") + ")", "i"); + this._erasNarrowRegex = new RegExp("^(" + n.join("|") + ")", "i") + } + + function Vr(e, t) { + i(0, [e, e.length], 0, t) + } + + function Gr(e) { + return $r.call(this, e, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy) + } + + function Jr(e) { + return $r.call(this, e, this.isoWeek(), this.isoWeekday(), 1, 4) + } + + function qr() { + return Y(this.year(), 1, 4) + } + + function Kr() { + return Y(this.isoWeekYear(), 1, 4) + } + + function Xr() { + var e = this.localeData()._week; + return Y(this.year(), e.dow, e.doy) + } + + function Zr() { + var e = this.localeData()._week; + return Y(this.weekYear(), e.dow, e.doy) + } + + function $r(e, t, n, i, r) { + var a; + if (e == null) return Et(this, i, r).year; else { + a = Y(e, i, r); + if (t > a) t = a; + return Qr.call(this, e, t, n, i, r) + } + } + + function Qr(e, t, n, i, r) { + var a = Tt(e, t, n, i, r), s = wt(a.year, 0, a.dayOfYear); + this.year(s.getUTCFullYear()); + this.month(s.getUTCMonth()); + this.date(s.getUTCDate()); + return this + } + + function ea(e) { + return e == null ? Math.ceil((this.month() + 1) / 3) : this.month((e - 1) * 3 + this.month() % 3) + } + + i("N", 0, 0, "eraAbbr"), i("NN", 0, 0, "eraAbbr"), i("NNN", 0, 0, "eraAbbr"), i("NNNN", 0, 0, "eraName"), i("NNNNN", 0, 0, "eraNarrow"), i("y", ["y", 1], "yo", "eraYear"), i("y", ["yy", 2], 0, "eraYear"), i("y", ["yyy", 3], 0, "eraYear"), i("y", ["yyyy", 4], 0, "eraYear"), g("N", Fr), g("NN", Fr), g("NNN", Fr), g("NNNN", Br), g("NNNNN", Nr), L(["N", "NN", "NNN", "NNNN", "NNNNN"], function (e, t, n, i) { + var r = n._locale.erasParse(e, i, n._strict); + if (r) c(n).era = r; else c(n).invalidEra = e + }), g("y", ze), g("yy", ze), g("yyy", ze), g("yyyy", ze), g("yo", zr), L(["y", "yy", "yyy", "yyyy"], S), L(["yo"], function (e, t, n, i) { + var r; + if (n._locale._eraYearOrdinalRegex) r = e.match(n._locale._eraYearOrdinalRegex); + if (n._locale.eraYearOrdinalParse) t[S] = n._locale.eraYearOrdinalParse(e, r); else t[S] = parseInt(e, 10) + }), i(0, ["gg", 2], 0, function () { + return this.weekYear() % 100 + }), i(0, ["GG", 2], 0, function () { + return this.isoWeekYear() % 100 + }), Vr("gggg", "weekYear"), Vr("ggggg", "weekYear"), Vr("GGGG", "isoWeekYear"), Vr("GGGGG", "isoWeekYear"), t("weekYear", "gg"), t("isoWeekYear", "GG"), n("weekYear", 1), n("isoWeekYear", 1), g("G", Ue), g("g", Ue), g("GG", v, r), g("gg", v, r), g("GGGG", Be, Ie), g("gggg", Be, Ie), g("GGGGG", Ne, We), g("ggggg", Ne, We), Qe(["gggg", "ggggg", "GGGG", "GGGGG"], function (e, t, n, i) { + t[i.substr(0, 2)] = y(e) + }), Qe(["gg", "GG"], function (e, t, n, i) { + t[i] = h.parseTwoDigitYear(e) + }), i("Q", 0, "Qo", "quarter"), t("quarter", "Q"), n("quarter", 7), g("Q", xe), L("Q", function (e, t) { + t[k] = (y(e) - 1) * 3 + }), i("D", ["DD", 2], "Do", "date"), t("date", "D"), n("date", 9), g("D", v), g("DD", v, r), g("Do", function (e, t) { + return e ? t._dayOfMonthOrdinalParse || t._ordinalParse : t._dayOfMonthOrdinalParseLenient + }), L(["D", "DD"], b), L("Do", function (e, t) { + t[b] = y(e.match(v)[0]) + }); + var ta = Ye("Date", true); + + function na(e) { + var t = Math.round((this.clone().startOf("day") - this.clone().startOf("year")) / 864e5) + 1; + return e == null ? t : this.add(e - t, "d") + } + + i("DDD", ["DDDD", 3], "DDDo", "dayOfYear"), t("dayOfYear", "DDD"), n("dayOfYear", 4), g("DDD", Fe), g("DDDD", Oe), L(["DDD", "DDDD"], function (e, t, n) { + n._dayOfYear = y(e) + }), i("m", ["mm", 2], 0, "minute"), t("minute", "m"), n("minute", 14), g("m", v), g("mm", v, r), L(["m", "mm"], D); + var ia = Ye("Minutes", false), + ra = (i("s", ["ss", 2], 0, "second"), t("second", "s"), n("second", 15), g("s", v), g("ss", v, r), L(["s", "ss"], T), Ye("Seconds", false)), + aa, sa; + for (i("S", 0, 0, function () { + return ~~(this.millisecond() / 100) + }), i(0, ["SS", 2], 0, function () { + return ~~(this.millisecond() / 10) + }), i(0, ["SSS", 3], 0, "millisecond"), i(0, ["SSSS", 4], 0, function () { + return this.millisecond() * 10 + }), i(0, ["SSSSS", 5], 0, function () { + return this.millisecond() * 100 + }), i(0, ["SSSSSS", 6], 0, function () { + return this.millisecond() * 1e3 + }), i(0, ["SSSSSSS", 7], 0, function () { + return this.millisecond() * 1e4 + }), i(0, ["SSSSSSSS", 8], 0, function () { + return this.millisecond() * 1e5 + }), i(0, ["SSSSSSSSS", 9], 0, function () { + return this.millisecond() * 1e6 + }), t("millisecond", "ms"), n("millisecond", 16), g("S", Fe, xe), g("SS", Fe, r), g("SSS", Fe, Oe), aa = "SSSS"; aa.length <= 9; aa += "S") g(aa, ze); + + function oa(e, t) { + t[tt] = y(("0." + e) * 1e3) + } + + for (aa = "S"; aa.length <= 9; aa += "S") L(aa, oa); + + function ua() { + return this._isUTC ? "UTC" : "" + } + + function da() { + return this._isUTC ? "Coordinated Universal Time" : "" + } + + sa = Ye("Milliseconds", false), i("z", 0, 0, "zoneAbbr"), i("zz", 0, 0, "zoneName"); + var A = X.prototype; + if (A.add = Ii, A.calendar = Ui, A.clone = Vi, A.diff = $i, A.endOf = gr, A.format = ir, A.from = rr, A.fromNow = ar, A.to = sr, A.toNow = or, A.get = Re, A.invalidAt = Er, A.isAfter = Gi, A.isBefore = Ji, A.isBetween = qi, A.isSame = Ki, A.isSameOrAfter = Xi, A.isSameOrBefore = Zi, A.isValid = Dr, A.lang = dr, A.locale = ur, A.localeData = lr, A.max = ei, A.min = Qn, A.parsingFlags = Tr, A.set = Ae, A.startOf = vr, A.subtract = Wi, A.toArray = kr, A.toObject = br, A.toDate = Sr, A.toISOString = tr, A.inspect = nr, typeof Symbol !== "undefined" && Symbol.for != null) A[Symbol.for("nodejs.util.inspect.custom")] = function () { + return "Moment<" + this.format() + ">" + }; + + function la(e) { + return C(e * 1e3) + } + + function ha() { + return C.apply(null, arguments).parseZone() + } + + function ca(e) { + return e + } + + A.toJSON = wr, A.toString = er, A.unix = Lr, A.valueOf = Mr, A.creationData = Yr, A.eraName = Ar, A.eraNarrow = xr, A.eraAbbr = Or, A.eraYear = Ir, A.year = St, A.isLeapYear = kt, A.weekYear = Gr, A.isoWeekYear = Jr, A.quarter = A.quarters = ea, A.month = pt, A.daysInMonth = yt, A.week = A.weeks = At, A.isoWeek = A.isoWeeks = xt, A.weeksInYear = Xr, A.weeksInWeekYear = Zr, A.isoWeeksInYear = qr, A.isoWeeksInISOWeekYear = Kr, A.date = ta, A.day = A.days = Kt, A.weekday = Xt, A.isoWeekday = Zt, A.dayOfYear = na, A.hour = A.hours = dn, A.minute = A.minutes = ia, A.second = A.seconds = ra, A.millisecond = A.milliseconds = sa, A.utcOffset = vi, A.utc = Mi, A.local = Li, A.parseZone = Si, A.hasAlignedHourOffset = ki, A.isDST = bi, A.isLocal = Di, A.isUtcOffset = Ti, A.isUtc = Ei, A.isUTC = Ei, A.zoneAbbr = ua, A.zoneName = da, A.dates = e("dates accessor is deprecated. Use date instead.", ta), A.months = e("months accessor is deprecated. Use month instead", pt), A.years = e("years accessor is deprecated. Use year instead", St), A.zone = e("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/", gi), A.isDSTShifted = e("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information", wi); + var x = ie.prototype; + + function _a(e, t, n, i) { + var r = Sn(), a = l().set(i, t); + return r[n](a, e) + } + + function fa(e, t, n) { + if (d(e)) { + t = e; + e = undefined + } + e = e || ""; + if (t != null) return _a(e, t, n, "month"); + var i, r = []; + for (i = 0; i < 12; i++) r[i] = _a(e, i, n, "month"); + return r + } + + function ma(e, t, n, i) { + if (typeof e === "boolean") { + if (d(t)) { + n = t; + t = undefined + } + t = t || "" + } else { + t = e; + n = t; + e = false; + if (d(t)) { + n = t; + t = undefined + } + t = t || "" + } + var r = Sn(), a = e ? r._week.dow : 0, s, o = []; + if (n != null) return _a(t, (n + a) % 7, i, "day"); + for (s = 0; s < 7; s++) o[s] = _a(t, (s + a) % 7, i, "day"); + return o + } + + function pa(e, t) { + return fa(e, t, "months") + } + + function ya(e, t) { + return fa(e, t, "monthsShort") + } + + function va(e, t, n) { + return ma(e, t, n, "weekdays") + } + + function ga(e, t, n) { + return ma(e, t, n, "weekdaysShort") + } + + function Ma(e, t, n) { + return ma(e, t, n, "weekdaysMin") + } + + x.calendar = ae, x.longDateFormat = me, x.invalidDate = ye, x.ordinal = Me, x.preparse = ca, x.postformat = ca, x.relativeTime = Se, x.pastFuture = ke, x.set = te, x.eras = Pr, x.erasParse = Cr, x.erasConvertYear = Rr, x.erasAbbrRegex = Hr, x.erasNameRegex = Wr, x.erasNarrowRegex = jr, x.months = ht, x.monthsShort = ct, x.monthsParse = ft, x.monthsRegex = gt, x.monthsShortRegex = vt, x.week = Yt, x.firstDayOfYear = Rt, x.firstDayOfWeek = Ct, x.weekdays = Ut, x.weekdaysMin = Gt, x.weekdaysShort = Vt, x.weekdaysParse = qt, x.weekdaysRegex = $t, x.weekdaysShortRegex = Qt, x.weekdaysMinRegex = en, x.isPM = on, x.meridiem = ln, gn("en", { + eras: [{ + since: "0001-01-01", + until: +Infinity, + offset: 1, + name: "Anno Domini", + narrow: "AD", + abbr: "AD" + }, { + since: "0000-12-31", + until: -Infinity, + offset: 1, + name: "Before Christ", + narrow: "BC", + abbr: "BC" + }], dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: function (e) { + var t = e % 10, + n = y(e % 100 / 10) === 1 ? "th" : t === 1 ? "st" : t === 2 ? "nd" : t === 3 ? "rd" : "th"; + return e + n + } + }), h.lang = e("moment.lang is deprecated. Use moment.locale instead.", gn), h.langData = e("moment.langData is deprecated. Use moment.localeData instead.", Sn); + var La = Math.abs; + + function Sa() { + var e = this._data; + this._milliseconds = La(this._milliseconds); + this._days = La(this._days); + this._months = La(this._months); + e.milliseconds = La(e.milliseconds); + e.seconds = La(e.seconds); + e.minutes = La(e.minutes); + e.hours = La(e.hours); + e.months = La(e.months); + e.years = La(e.years); + return this + } + + function ka(e, t, n, i) { + var r = R(t, n); + e._milliseconds += i * r._milliseconds; + e._days += i * r._days; + e._months += i * r._months; + return e._bubble() + } + + function ba(e, t) { + return ka(this, e, t, 1) + } + + function wa(e, t) { + return ka(this, e, t, -1) + } + + function Da(e) { + if (e < 0) return Math.floor(e); else return Math.ceil(e) + } + + function Ta() { + var e = this._milliseconds, t = this._days, n = this._months, i = this._data, r, a, s, o, u; + if (!(e >= 0 && t >= 0 && n >= 0 || e <= 0 && t <= 0 && n <= 0)) { + e += Da(Ya(n) + t) * 864e5; + t = 0; + n = 0 + } + i.milliseconds = e % 1e3; + r = p(e / 1e3); + i.seconds = r % 60; + a = p(r / 60); + i.minutes = a % 60; + s = p(a / 60); + i.hours = s % 24; + t += p(s / 24); + u = p(Ea(t)); + n += u; + t -= Da(Ya(u)); + o = p(n / 12); + n %= 12; + i.days = t; + i.months = n; + i.years = o; + return this + } + + function Ea(e) { + return e * 4800 / 146097 + } + + function Ya(e) { + return e * 146097 / 4800 + } + + function Pa(e) { + if (!this.isValid()) return NaN; + var t, n, i = this._milliseconds; + e = m(e); + if (e === "month" || e === "quarter" || e === "year") { + t = this._days + i / 864e5; + n = this._months + Ea(t); + switch (e) { + case"month": + return n; + case"quarter": + return n / 3; + case"year": + return n / 12 + } + } else { + t = this._days + Math.round(Ya(this._months)); + switch (e) { + case"week": + return t / 7 + i / 6048e5; + case"day": + return t + i / 864e5; + case"hour": + return t * 24 + i / 36e5; + case"minute": + return t * 1440 + i / 6e4; + case"second": + return t * 86400 + i / 1e3; + case"millisecond": + return Math.floor(t * 864e5) + i; + default: + throw new Error("Unknown unit " + e) + } + } + } + + function Ca() { + if (!this.isValid()) return NaN; + return this._milliseconds + this._days * 864e5 + this._months % 12 * 2592e6 + y(this._months / 12) * 31536e6 + } + + function Ra(e) { + return function () { + return this.as(e) + } + } + + var Aa = Ra("ms"), xa = Ra("s"), Oa = Ra("m"), Ia = Ra("h"), Wa = Ra("d"), Ha = Ra("w"), ja = Ra("M"), + Fa = Ra("Q"), Ba = Ra("y"); + + function Na() { + return R(this) + } + + function za(e) { + e = m(e); + return this.isValid() ? this[e + "s"]() : NaN + } + + function Ua(e) { + return function () { + return this.isValid() ? this._data[e] : NaN + } + } + + var Va = Ua("milliseconds"), Ga = Ua("seconds"), Ja = Ua("minutes"), qa = Ua("hours"), Ka = Ua("days"), + Xa = Ua("months"), Za = Ua("years"); + + function $a() { + return p(this.days() / 7) + } + + var Qa = Math.round, es = {ss: 44, s: 45, m: 45, h: 22, d: 26, w: null, M: 11}; + + function ts(e, t, n, i, r) { + return r.relativeTime(t || 1, !!n, e, i) + } + + function ns(e, t, n, i) { + var r = R(e).abs(), a = Qa(r.as("s")), s = Qa(r.as("m")), o = Qa(r.as("h")), u = Qa(r.as("d")), + d = Qa(r.as("M")), l = Qa(r.as("w")), h = Qa(r.as("y")), + c = a <= n.ss && ["s", a] || a < n.s && ["ss", a] || s <= 1 && ["m"] || s < n.m && ["mm", s] || o <= 1 && ["h"] || o < n.h && ["hh", o] || u <= 1 && ["d"] || u < n.d && ["dd", u]; + if (n.w != null) c = c || l <= 1 && ["w"] || l < n.w && ["ww", l]; + c = c || d <= 1 && ["M"] || d < n.M && ["MM", d] || h <= 1 && ["y"] || ["yy", h]; + c[2] = t; + c[3] = +e > 0; + c[4] = i; + return ts.apply(null, c) + } + + function is(e) { + if (e === undefined) return Qa; + if (typeof e === "function") { + Qa = e; + return true + } + return false + } + + function rs(e, t) { + if (es[e] === undefined) return false; + if (t === undefined) return es[e]; + es[e] = t; + if (e === "s") es.ss = t - 1; + return true + } + + function as(e, t) { + if (!this.isValid()) return this.localeData().invalidDate(); + var n = false, i = es, r, a; + if (typeof e === "object") { + t = e; + e = false + } + if (typeof e === "boolean") n = e; + if (typeof t === "object") { + i = Object.assign({}, es, t); + if (t.s != null && t.ss == null) i.ss = t.s - 1 + } + r = this.localeData(); + a = ns(this, !n, i, r); + if (n) a = r.pastFuture(+this, a); + return r.postformat(a) + } + + var ss = Math.abs; + + function os(e) { + return (e > 0) - (e < 0) || +e + } + + function us() { + if (!this.isValid()) return this.localeData().invalidDate(); + var e = ss(this._milliseconds) / 1e3, t = ss(this._days), n = ss(this._months), i, r, a, s, + o = this.asSeconds(), u, d, l, h; + if (!o) return "P0D"; + i = p(e / 60); + r = p(i / 60); + e %= 60; + i %= 60; + a = p(n / 12); + n %= 12; + s = e ? e.toFixed(3).replace(/\.?0+$/, "") : ""; + u = o < 0 ? "-" : ""; + d = os(this._months) !== os(o) ? "-" : ""; + l = os(this._days) !== os(o) ? "-" : ""; + h = os(this._milliseconds) !== os(o) ? "-" : ""; + return u + "P" + (a ? d + a + "Y" : "") + (n ? d + n + "M" : "") + (t ? l + t + "D" : "") + (r || i || e ? "T" : "") + (r ? h + r + "H" : "") + (i ? h + i + "M" : "") + (e ? h + s + "S" : "") + } + + var O = di.prototype; + return O.isValid = oi, O.abs = Sa, O.add = ba, O.subtract = wa, O.as = Pa, O.asMilliseconds = Aa, O.asSeconds = xa, O.asMinutes = Oa, O.asHours = Ia, O.asDays = Wa, O.asWeeks = Ha, O.asMonths = ja, O.asQuarters = Fa, O.asYears = Ba, O.valueOf = Ca, O._bubble = Ta, O.clone = Na, O.get = za, O.milliseconds = Va, O.seconds = Ga, O.minutes = Ja, O.hours = qa, O.days = Ka, O.weeks = $a, O.months = Xa, O.years = Za, O.humanize = as, O.toISOString = us, O.toString = us, O.toJSON = us, O.locale = ur, O.localeData = lr, O.toIsoString = e("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)", us), O.lang = dr, i("X", 0, 0, "unix"), i("x", 0, 0, "valueOf"), g("x", Ue), g("X", Je), L("X", function (e, t, n) { + n._d = new Date(parseFloat(e) * 1e3) + }), L("x", function (e, t, n) { + n._d = new Date(y(e)) + }), +//! moment.js + h.version = "2.29.4", H(C), h.fn = A, h.min = ni, h.max = ii, h.now = ri, h.utc = l, h.unix = la, h.months = pa, h.isDate = B, h.locale = gn, h.invalid = G, h.duration = R, h.isMoment = _, h.weekdays = va, h.parseZone = ha, h.localeData = Sn, h.isDuration = li, h.monthsShort = ya, h.weekdaysMin = Ma, h.defineLocale = Mn, h.updateLocale = Ln, h.locales = kn, h.weekdaysShort = ga, h.normalizeUnits = m, h.relativeTimeRounding = is, h.relativeTimeThreshold = rs, h.calendarFormat = zi, h.prototype = A, h.HTML5_FMT = { + DATETIME_LOCAL: "YYYY-MM-DDTHH:mm", + DATETIME_LOCAL_SECONDS: "YYYY-MM-DDTHH:mm:ss", + DATETIME_LOCAL_MS: "YYYY-MM-DDTHH:mm:ss.SSS", + DATE: "YYYY-MM-DD", + TIME: "HH:mm", + TIME_SECONDS: "HH:mm:ss", + TIME_MS: "HH:mm:ss.SSS", + WEEK: "GGGG-[W]WW", + MONTH: "YYYY-MM" + }, h + }() + }.call(this, hs(283)(e)) + }, function (e, t, n) { + "use strict"; + t.__esModule = !0, t.default = function (e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + } + }, function (e, t, n) { + "use strict"; + t.__esModule = !0; + var n = n(259), r = (n = n) && n.__esModule ? n : {default: n}; + + function i(e, t) { + for (var n = 0; n < t.length; n++) { + var i = t[n]; + i.enumerable = i.enumerable || !1, i.configurable = !0, "value" in i && (i.writable = !0), (0, r.default)(e, i.key, i) + } + } + + t.default = function (e, t, n) { + return t && i(e.prototype, t), n && i(e, n), e + } + }, function (e, t) { + e = e.exports = {version: "2.6.12"}; + "number" == typeof __e && (__e = e) + }, function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}); + var i = a(n(1)), r = a(n(2)), n = a(n(10)); + + function a(e) { + return e && e.__esModule ? e : {default: e} + } + + (0, r.default)(s, null, [{ + key: "e", value: function (e, t) { + e = "[" + (e = e && !s.FORCE_GLOBAL_TAG ? e : s.GLOBAL_TAG) + "] > " + t; + s.ENABLE_CALLBACK && s.emitter.emit("log", "error", e), s.ENABLE_ERROR && (console.error ? console.error(e) : console.warn ? console.warn(e) : console.log(e)) + } + }, { + key: "i", value: function (e, t) { + e = "[" + (e = e && !s.FORCE_GLOBAL_TAG ? e : s.GLOBAL_TAG) + "] > " + t; + s.ENABLE_CALLBACK && s.emitter.emit("log", "info", e), s.ENABLE_INFO && (console.info ? console.info(e) : console.log(e)) + } + }, { + key: "w", value: function (e, t) { + e = "[" + (e = e && !s.FORCE_GLOBAL_TAG ? e : s.GLOBAL_TAG) + "] > " + t; + s.ENABLE_CALLBACK && s.emitter.emit("log", "warn", e), s.ENABLE_WARN && (console.warn ? console.warn(e) : console.log(e)) + } + }, { + key: "d", value: function (e, t) { + e = "[" + (e = e && !s.FORCE_GLOBAL_TAG ? e : s.GLOBAL_TAG) + "] > " + t; + s.ENABLE_CALLBACK && s.emitter.emit("log", "debug", e), s.ENABLE_DEBUG && (console.debug ? console.debug(e) : console.log(e)) + } + }, { + key: "v", value: function (e, t) { + e = "[" + (e = e && !s.FORCE_GLOBAL_TAG ? e : s.GLOBAL_TAG) + "] > " + t; + s.ENABLE_CALLBACK && s.emitter.emit("log", "verbose", e), s.ENABLE_VERBOSE && console.log(e) + } + }]); + r = s; + + function s() { + (0, i.default)(this, s) + } + + r.GLOBAL_TAG = "flv.js", r.FORCE_GLOBAL_TAG = !1, r.ENABLE_ERROR = !0, r.ENABLE_INFO = !0, r.ENABLE_WARN = !0, r.ENABLE_DEBUG = !0, r.ENABLE_VERBOSE = !0, r.ENABLE_CALLBACK = !1, r.emitter = new n.default, t.default = r + }, function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}), t.NotImplementedException = t.InvalidArgumentException = t.IllegalStateException = t.RuntimeException = void 0; + var i = o(n(21)), r = o(n(25)), a = o(n(26)), s = o(n(1)), n = o(n(2)); + + function o(e) { + return e && e.__esModule ? e : {default: e} + } + + var u = t.RuntimeException = ((0, n.default)(d, [{ + key: "toString", value: function () { + return this.name + ": " + this.message + } + }, { + key: "name", get: function () { + return "RuntimeException" + } + }, { + key: "message", get: function () { + return this._message + } + }]), d); + + function d(e) { + (0, s.default)(this, d), this._message = e + } + + t.IllegalStateException = ((0, a.default)(l, u), (0, n.default)(l, [{ + key: "name", get: function () { + return "IllegalStateException" + } + }]), l); + + function l(e) { + return (0, s.default)(this, l), (0, r.default)(this, (l.__proto__ || (0, i.default)(l)).call(this, e)) + } + + t.InvalidArgumentException = ((0, a.default)(h, u), (0, n.default)(h, [{ + key: "name", get: function () { + return "InvalidArgumentException" + } + }]), h); + + function h(e) { + return (0, s.default)(this, h), (0, r.default)(this, (h.__proto__ || (0, i.default)(h)).call(this, e)) + } + + t.NotImplementedException = ((0, a.default)(c, u), (0, n.default)(c, [{ + key: "name", get: function () { + return "NotImplementedException" + } + }]), c); + + function c(e) { + return (0, s.default)(this, c), (0, r.default)(this, (c.__proto__ || (0, i.default)(c)).call(this, e)) + } + }, function (e, t) { + e = e.exports = "undefined" != typeof window && window.Math == Math ? window : "undefined" != typeof self && self.Math == Math ? self : Function("return this")(); + "number" == typeof __g && (__g = e) + }, function (e, t, n) { + var i = n(49)("wks"), r = n(35), a = n(6).Symbol, s = "function" == typeof a; + (e.exports = function (e) { + return i[e] || (i[e] = s && a[e] || (s ? a : r)("Symbol." + e)) + }).store = i + }, function (e, t, n) { + function m(e, t, n) { + var i, r, a, s = e & m.F, o = e & m.G, u = e & m.S, d = e & m.P, l = e & m.B, h = e & m.W, + c = o ? y : y[t] || (y[t] = {}), _ = c[L], f = o ? p : u ? p[t] : (p[t] || {})[L]; + for (i in n = o ? t : n) (r = !s && f && void 0 !== f[i]) && M(c, i) || (a = (r ? f : n)[i], c[i] = o && "function" != typeof f[i] ? n[i] : l && r ? v(a, p) : h && f[i] == a ? function (i) { + function e(e, t, n) { + if (this instanceof i) { + switch (arguments.length) { + case 0: + return new i; + case 1: + return new i(e); + case 2: + return new i(e, t) + } + return new i(e, t, n) + } + return i.apply(this, arguments) + } + + return e[L] = i[L], e + }(a) : d && "function" == typeof a ? v(Function.call, a) : a, d && ((c.virtual || (c.virtual = {}))[i] = a, e & m.R && _ && !_[i] && g(_, i, a))) + } + + var p = n(6), y = n(3), v = n(22), g = n(17), M = n(18), L = "prototype"; + m.F = 1, m.G = 2, m.S = 4, m.P = 8, m.B = 16, m.W = 32, m.U = 64, m.R = 128, e.exports = m + }, function (e, t, n) { + "use strict"; + t.__esModule = !0; + var i = s(n(270)), r = s(n(272)), + a = "function" == typeof r.default && "symbol" == typeof i.default ? function (e) { + return typeof e + } : function (e) { + return e && "function" == typeof r.default && e.constructor === r.default && e !== r.default.prototype ? "symbol" : typeof e + }; + + function s(e) { + return e && e.__esModule ? e : {default: e} + } + + t.default = "function" == typeof r.default && "symbol" === a(i.default) ? function (e) { + return void 0 === e ? "undefined" : a(e) + } : function (e) { + return e && "function" == typeof r.default && e.constructor === r.default && e !== r.default.prototype ? "symbol" : void 0 === e ? "undefined" : a(e) + } + }, function (e, t, n) { + "use strict"; + var i = "object" == typeof Reflect ? Reflect : null, + u = i && "function" == typeof i.apply ? i.apply : function (e, t, n) { + return Function.prototype.apply.call(e, t, n) + }; + var r = i && "function" == typeof i.ownKeys ? i.ownKeys : Object.getOwnPropertySymbols ? function (e) { + return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e)) + } : function (e) { + return Object.getOwnPropertyNames(e) + }, a = Number.isNaN || function (e) { + return e != e + }; + + function s() { + s.init.call(this) + } + + e.exports = s, e.exports.once = function (o, u) { + return new Promise(function (e, t) { + function n(e) { + o.removeListener(u, i), t(e) + } + + function i() { + "function" == typeof o.removeListener && o.removeListener("error", n), e([].slice.call(arguments)) + } + + var r, a, s; + p(o, u, i, {once: !0}), "error" !== u && (a = n, s = {once: !0}, "function" == typeof (r = o).on && p(r, "error", a, s)) + }) + }, (s.EventEmitter = s).prototype._events = void 0, s.prototype._eventsCount = 0, s.prototype._maxListeners = void 0; + var o = 10; + + function d(e) { + if ("function" != typeof e) throw new TypeError('The "listener" argument must be of type Function. Received type ' + typeof e) + } + + function l(e) { + return void 0 === e._maxListeners ? s.defaultMaxListeners : e._maxListeners + } + + function h(e, t, n, i) { + var r, a; + return d(n), void 0 === (r = e._events) ? (r = e._events = Object.create(null), e._eventsCount = 0) : (void 0 !== r.newListener && (e.emit("newListener", t, n.listener || n), r = e._events), a = r[t]), void 0 === a ? (a = r[t] = n, ++e._eventsCount) : ("function" == typeof a ? a = r[t] = i ? [n, a] : [a, n] : i ? a.unshift(n) : a.push(n), 0 < (r = l(e)) && a.length > r && !a.warned && (a.warned = !0, (i = new Error("Possible EventEmitter memory leak detected. " + a.length + " " + String(t) + " listeners added. Use emitter.setMaxListeners() to increase limit")).name = "MaxListenersExceededWarning", i.emitter = e, i.type = t, i.count = a.length, n = i, console && console.warn && console.warn(n))), e + } + + function c(e, t, n) { + e = {fired: !1, wrapFn: void 0, target: e, type: t, listener: n}, t = function () { + if (!this.fired) return this.target.removeListener(this.type, this.wrapFn), this.fired = !0, 0 === arguments.length ? this.listener.call(this.target) : this.listener.apply(this.target, arguments) + }.bind(e); + return t.listener = n, e.wrapFn = t + } + + function _(e, t, n) { + e = e._events; + if (void 0 === e) return []; + e = e[t]; + { + if (void 0 === e) return []; + if ("function" == typeof e) return n ? [e.listener || e] : [e]; + if (n) { + for (var i = e, r = new Array(i.length), a = 0; a < r.length; ++a) r[a] = i[a].listener || i[a]; + return r + } + return m(e, e.length) + } + } + + function f(e) { + var t = this._events; + if (void 0 !== t) { + t = t[e]; + if ("function" == typeof t) return 1; + if (void 0 !== t) return t.length + } + return 0 + } + + function m(e, t) { + for (var n = new Array(t), i = 0; i < t; ++i) n[i] = e[i]; + return n + } + + function p(n, i, r, a) { + if ("function" == typeof n.on) a.once ? n.once(i, r) : n.on(i, r); else { + if ("function" != typeof n.addEventListener) throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type ' + typeof n); + n.addEventListener(i, function e(t) { + a.once && n.removeEventListener(i, e), r(t) + }) + } + } + + Object.defineProperty(s, "defaultMaxListeners", { + enumerable: !0, get: function () { + return o + }, set: function (e) { + if ("number" != typeof e || e < 0 || a(e)) throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received ' + e + "."); + o = e + } + }), s.init = function () { + void 0 !== this._events && this._events !== Object.getPrototypeOf(this)._events || (this._events = Object.create(null), this._eventsCount = 0), this._maxListeners = this._maxListeners || void 0 + }, s.prototype.setMaxListeners = function (e) { + if ("number" != typeof e || e < 0 || a(e)) throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received ' + e + "."); + return this._maxListeners = e, this + }, s.prototype.getMaxListeners = function () { + return l(this) + }, s.prototype.emit = function (e) { + for (var t = [], n = 1; n < arguments.length; n++) t.push(arguments[n]); + var i = "error" === e, r = this._events; + if (void 0 !== r) i = i && void 0 === r.error; else if (!i) return !1; + if (i) { + if ((a = 0 < t.length ? t[0] : a) instanceof Error) throw a; + i = new Error("Unhandled error." + (a ? " (" + a.message + ")" : "")); + throw i.context = a, i + } + var a = r[e]; + if (void 0 === a) return !1; + if ("function" == typeof a) u(a, this, t); else for (var s = a.length, o = m(a, s), n = 0; n < s; ++n) u(o[n], this, t); + return !0 + }, s.prototype.on = s.prototype.addListener = function (e, t) { + return h(this, e, t, !1) + }, s.prototype.prependListener = function (e, t) { + return h(this, e, t, !0) + }, s.prototype.once = function (e, t) { + return d(t), this.on(e, c(this, e, t)), this + }, s.prototype.prependOnceListener = function (e, t) { + return d(t), this.prependListener(e, c(this, e, t)), this + }, s.prototype.off = s.prototype.removeListener = function (e, t) { + var n, i, r, a, s; + if (d(t), void 0 !== (i = this._events) && void 0 !== (n = i[e])) if (n === t || n.listener === t) 0 == --this._eventsCount ? this._events = Object.create(null) : (delete i[e], i.removeListener && this.emit("removeListener", e, n.listener || t)); else if ("function" != typeof n) { + for (r = -1, a = n.length - 1; 0 <= a; a--) if (n[a] === t || n[a].listener === t) { + s = n[a].listener, r = a; + break + } + if (r < 0) return this; + if (0 === r) n.shift(); else { + for (var o = n, u = r; u + 1 < o.length; u++) o[u] = o[u + 1]; + o.pop() + } + 1 === n.length && (i[e] = n[0]), void 0 !== i.removeListener && this.emit("removeListener", e, s || t) + } + return this + }, s.prototype.removeAllListeners = function (e) { + var t, n = this._events; + if (void 0 !== n) { + if (void 0 === n.removeListener) return 0 === arguments.length ? (this._events = Object.create(null), this._eventsCount = 0) : void 0 !== n[e] && (0 == --this._eventsCount ? this._events = Object.create(null) : delete n[e]), this; + if (0 === arguments.length) { + for (var i, r = Object.keys(n), a = 0; a < r.length; ++a) "removeListener" !== (i = r[a]) && this.removeAllListeners(i); + return this.removeAllListeners("removeListener"), this._events = Object.create(null), this._eventsCount = 0, this + } + if ("function" == typeof (t = n[e])) this.removeListener(e, t); else if (void 0 !== t) for (a = t.length - 1; 0 <= a; a--) this.removeListener(e, t[a]) + } + return this + }, s.prototype.listeners = function (e) { + return _(this, e, !0) + }, s.prototype.rawListeners = function (e) { + return _(this, e, !1) + }, s.listenerCount = function (e, t) { + return "function" == typeof e.listenerCount ? e.listenerCount(t) : f.call(e, t) + }, s.prototype.listenerCount = f, s.prototype.eventNames = function () { + return 0 < this._eventsCount ? r(this._events) : [] + } + }, function (e, t, n) { + e.exports = {default: n(236), __esModule: !0} + }, function (e, t, n) { + var i = n(13), r = n(69), a = n(45), s = Object.defineProperty; + t.f = n(14) ? Object.defineProperty : function (e, t, n) { + if (i(e), t = a(t, !0), i(n), r) try { + return s(e, t, n) + } catch (e) { + } + if ("get" in n || "set" in n) throw TypeError("Accessors not supported!"); + return "value" in n && (e[t] = n.value), e + } + }, function (e, t, n) { + var i = n(16); + e.exports = function (e) { + if (i(e)) return e; + throw TypeError(e + " is not an object!") + } + }, function (e, t, n) { + e.exports = !n(23)(function () { + return 7 != Object.defineProperty({}, "a", { + get: function () { + return 7 + } + }).a + }) + }, function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}), t.BaseLoader = t.LoaderErrors = t.LoaderStatus = void 0; + var i = s(n(1)), r = s(n(2)), a = n(5); + + function s(e) { + return e && e.__esModule ? e : {default: e} + } + + var o = t.LoaderStatus = {kIdle: 0, kConnecting: 1, kBuffering: 2, kError: 3, kComplete: 4}; + t.LoaderErrors = { + OK: "OK", + EXCEPTION: "Exception", + HTTP_STATUS_CODE_INVALID: "HttpStatusCodeInvalid", + CONNECTING_TIMEOUT: "ConnectingTimeout", + EARLY_EOF: "EarlyEof", + UNRECOVERABLE_EARLY_EOF: "UnrecoverableEarlyEof" + }, t.BaseLoader = ((0, r.default)(u, [{ + key: "destroy", value: function () { + this._status = o.kIdle, this._onContentLengthKnown = null, this._onURLRedirect = null, this._onDataArrival = null, this._onError = null, this._onComplete = null + } + }, { + key: "isWorking", value: function () { + return this._status === o.kConnecting || this._status === o.kBuffering + } + }, { + key: "open", value: function (e, t) { + throw new a.NotImplementedException("Unimplemented abstract function!") + } + }, { + key: "abort", value: function () { + throw new a.NotImplementedException("Unimplemented abstract function!") + } + }, { + key: "type", get: function () { + return this._type + } + }, { + key: "status", get: function () { + return this._status + } + }, { + key: "needStashBuffer", get: function () { + return this._needStash + } + }, { + key: "onContentLengthKnown", get: function () { + return this._onContentLengthKnown + }, set: function (e) { + this._onContentLengthKnown = e + } + }, { + key: "onURLRedirect", get: function () { + return this._onURLRedirect + }, set: function (e) { + this._onURLRedirect = e + } + }, { + key: "onDataArrival", get: function () { + return this._onDataArrival + }, set: function (e) { + this._onDataArrival = e + } + }, { + key: "onError", get: function () { + return this._onError + }, set: function (e) { + this._onError = e + } + }, { + key: "onComplete", get: function () { + return this._onComplete + }, set: function (e) { + this._onComplete = e + } + }]), u); + + function u(e) { + (0, i.default)(this, u), this._type = e || "undefined", this._status = o.kIdle, this._needStash = !1, this._onContentLengthKnown = null, this._onURLRedirect = null, this._onDataArrival = null, this._onError = null, this._onComplete = null + } + }, function (e, t) { + e.exports = function (e) { + return "object" == typeof e ? null !== e : "function" == typeof e + } + }, function (e, t, n) { + var i = n(12), r = n(28); + e.exports = n(14) ? function (e, t, n) { + return i.f(e, t, r(1, n)) + } : function (e, t, n) { + return e[t] = n, e + } + }, function (e, t) { + var n = {}.hasOwnProperty; + e.exports = function (e, t) { + return n.call(e, t) + } + }, function (e, t, n) { + var i = n(72), r = n(43); + e.exports = function (e) { + return i(r(e)) + } + }, function (e, t, n) { + e.exports = {default: n(292), __esModule: !0} + }, function (e, t, n) { + e.exports = {default: n(302), __esModule: !0} + }, function (e, t, n) { + var a = n(34); + e.exports = function (i, r, e) { + if (a(i), void 0 === r) return i; + switch (e) { + case 1: + return function (e) { + return i.call(r, e) + }; + case 2: + return function (e, t) { + return i.call(r, e, t) + }; + case 3: + return function (e, t, n) { + return i.call(r, e, t, n) + } + } + return function () { + return i.apply(r, arguments) + } + } + }, function (e, t) { + e.exports = function (e) { + try { + return !!e() + } catch (e) { + return !0 + } + } + }, function (e, t, n) { + var i = n(43); + e.exports = function (e) { + return Object(i(e)) + } + }, function (e, t, n) { + "use strict"; + t.__esModule = !0; + var n = n(9), i = (n = n) && n.__esModule ? n : {default: n}; + t.default = function (e, t) { + if (e) return !t || "object" !== (void 0 === t ? "undefined" : (0, i.default)(t)) && "function" != typeof t ? e : t; + throw new ReferenceError("this hasn't been initialised - super() hasn't been called") + } + }, function (e, t, n) { + "use strict"; + t.__esModule = !0; + var i = s(n(38)), r = s(n(304)), a = s(n(9)); + + function s(e) { + return e && e.__esModule ? e : {default: e} + } + + t.default = function (e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + (void 0 === t ? "undefined" : (0, a.default)(t))); + e.prototype = (0, r.default)(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + }), t && (i.default ? (0, i.default)(e, t) : e.__proto__ = t) + } + }, function (e, t) { + e.exports = !0 + }, function (e, t) { + e.exports = function (e, t) { + return {enumerable: !(1 & e), configurable: !(2 & e), writable: !(4 & e), value: t} + } + }, function (e, t) { + e.exports = {} + }, function (e, t, n) { + var i = n(71), r = n(50); + e.exports = Object.keys || function (e) { + return i(e, r) + } + }, function (e, t) { + var n = {}.toString; + e.exports = function (e) { + return n.call(e).slice(8, -1) + } + }, function (e, t, n) { + "use strict"; + t.__esModule = !0; + var a = i(n(21)), s = i(n(308)); + + function i(e) { + return e && e.__esModule ? e : {default: e} + } + + t.default = function e(t, n, i) { + null === t && (t = Function.prototype); + var r = (0, s.default)(t, n); + if (void 0 !== r) { + if ("value" in r) return r.value; + r = r.get; + return void 0 !== r ? r.call(i) : void 0 + } + r = (0, a.default)(t); + if (null !== r) return e(r, n, i) + } + }, function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}); + var n = n(20), n = (n = n) && n.__esModule ? n : {default: n}; + var i = {}; + var r, a, s = self.navigator.userAgent.toLowerCase(), + o = /(edge)\/([\w.]+)/.exec(s) || /(opr)[\/]([\w.]+)/.exec(s) || /(chrome)[ \/]([\w.]+)/.exec(s) || /(iemobile)[\/]([\w.]+)/.exec(s) || /(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(s) || /(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(s) || /(webkit)[ \/]([\w.]+)/.exec(s) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(s) || /(msie) ([\w.]+)/.exec(s) || 0 <= s.indexOf("trident") && /(rv)(?::| )([\w.]+)/.exec(s) || s.indexOf("compatible") < 0 && /(firefox)[ \/]([\w.]+)/.exec(s) || [], + s = /(ipad)/.exec(s) || /(ipod)/.exec(s) || /(windows phone)/.exec(s) || /(iphone)/.exec(s) || /(kindle)/.exec(s) || /(android)/.exec(s) || /(windows)/.exec(s) || /(mac)/.exec(s) || /(linux)/.exec(s) || /(cros)/.exec(s) || [], + o = { + browser: o[5] || o[3] || o[1] || "", + version: o[2] || o[4] || "0", + majorVersion: o[4] || o[2] || "0", + platform: s[0] || "" + }, s = {}; + for (a in o.browser && (s[o.browser] = !0, r = o.majorVersion.split("."), s.version = { + major: parseInt(o.majorVersion, 10), + string: o.version + }, 1 < r.length && (s.version.minor = parseInt(r[1], 10)), 2 < r.length && (s.version.build = parseInt(r[2], 10))), o.platform && (s[o.platform] = !0), (s.chrome || s.opr || s.safari) && (s.webkit = !0), (s.rv || s.iemobile) && (s.rv && delete s.rv, o.browser = "msie", s.msie = !0), s.edge && (delete s.edge, o.browser = "msedge", s.msedge = !0), s.opr && (o.browser = "opera", s.opera = !0), s.safari && s.android && (s[o.browser = "android"] = !0), s.name = o.browser, s.platform = o.platform, i) i.hasOwnProperty(a) && delete i[a]; + (0, n.default)(i, s), t.default = i + }, function (e, t) { + e.exports = function (e) { + if ("function" != typeof e) throw TypeError(e + " is not a function!"); + return e + } + }, function (e, t) { + var n = 0, i = Math.random(); + e.exports = function (e) { + return "Symbol(".concat(void 0 === e ? "" : e, ")_", (++n + i).toString(36)) + } + }, function (e, t, n) { + var i = n(12).f, r = n(18), a = n(7)("toStringTag"); + e.exports = function (e, t, n) { + e && !r(e = n ? e : e.prototype, a) && i(e, a, {configurable: !0, value: t}) + } + }, function (e, t) { + t.f = {}.propertyIsEnumerable + }, function (e, t, n) { + e.exports = {default: n(295), __esModule: !0} + }, function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}); + t.default = { + ERROR: "error", + LOADING_COMPLETE: "loading_complete", + RECOVERED_EARLY_EOF: "recovered_early_eof", + MEDIA_INFO: "media_info", + METADATA_ARRIVED: "metadata_arrived", + SCRIPTDATA_ARRIVED: "scriptdata_arrived", + STATISTICS_INFO: "statistics_info", + VIDEO_RESOLUTION_CHANGED: "video_resolution_changed", + MEDIA_SOURCE_ENDED: "media_source_ended", + MEDIA_SOURCE_CLOSE: "media_source_close", + VIDEO_FROZEN: "video_decoded_frame_frozen", + MS_BUFFER_FULL: "media_source_buffer_full", + LOADED_META_DATA: "loaded_meta_data" + } + }, function (e, t, n) { + "use strict"; + Object.defineProperty(t, "__esModule", {value: !0}); + t.default = { + IO_ERROR: "io_error", + DEMUX_ERROR: "demux_error", + INIT_SEGMENT: "init_segment", + MEDIA_SEGMENT: "media_segment", + LOADING_COMPLETE: "loading_complete", + RECOVERED_EARLY_EOF: "recovered_early_eof", + MEDIA_INFO: "media_info", + METADATA_ARRIVED: "metadata_arrived", + SCRIPTDATA_ARRIVED: "scriptdata_arrived", + STATISTICS_INFO: "statistics_info", + RECOMMEND_SEEKPOINT: "recommend_seekpoint", + VIDEO_RESOLUTION_CHANGED: "video_resolution_changed", + PARSEDDATA_ARRIVED: "parseddata_arrived" + } + }, function (e, t, n) { + "use strict"; + var i = n(237)(!0); + n(68)(String, "String", function (e) { + this._t = String(e), this._i = 0 + }, function () { + var e = this._t, t = this._i; + return t >= e.length ? {value: void 0, done: !0} : (e = i(e, t), this._i += e.length, {value: e, done: !1}) + }) + }, function (e, t) { + var n = Math.ceil, i = Math.floor; + e.exports = function (e) { + return isNaN(e = +e) ? 0 : (0 < e ? i : n)(e) + } + }, function (e, t) { + e.exports = function (e) { + if (null == e) throw TypeError("Can't call method on " + e); + return e + } + }, function (e, t, n) { + var i = n(16), r = n(6).document, a = i(r) && i(r.createElement); + e.exports = function (e) { + return a ? r.createElement(e) : {} + } + }, function (e, t, n) { + var r = n(16); + e.exports = function (e, t) { + if (!r(e)) return e; + var n, i; + if (t && "function" == typeof (n = e.toString) && !r(i = n.call(e)) || "function" == typeof (n = e.valueOf) && !r(i = n.call(e)) || !t && "function" == typeof (n = e.toString) && !r(i = n.call(e))) return i; + throw TypeError("Can't convert object to primitive value") + } + }, function (e, t, n) { + function i() { + } + + var r = n(13), a = n(239), s = n(50), o = n(48)("IE_PROTO"), u = "prototype", d = function () { + var e = n(44)("iframe"), t = s.length; + for (e.style.display = "none", n(73).appendChild(e), e.src = "javascript:", (e = e.contentWindow.document).open(), e.write("

PqPJz?jo1M?XBHjH@J%ed#I)Q%|&fJ z$QqwEEz_G}4Y!wA2|-;dAt-2Pp-#>AzBH*3N!4svG%^kqk`D*`|EF_T+LmXwjJoNX zB*>g)*)(`2jikV6C*hi*S#D{br_^cdp6#qS_PXJCrs2{&#r#eQ$kTc=s3)3dUYA33 zS%B%CHf@Hoq*S}@=*EJ{!;#%~MNaT7Q1A}l;1LCjSQ0q9v)iU%9Low0V^qOG3?;Cl z;8R>t@GevZ!#KnaHM)||x9+_7{x0Lk73{|Wf?odo>#LvcD9HJ{7r%Y?^4lL24DxR8 zn|s=shM3;8Eh?rzUkC}cymrITJu3K2xP|jg&2^_jZr%2Wpx{l>`zBA&c;aPz)z+HS z(1CE!AXVXW5;Tklu`AreY`zj^*BzzVlk|ei()%+$o8!^}TB&G%rE=+{m&Nl}k_^~4 z$jzaB3`y1&0!L`aD}Pd(5DyV~hUf>H9V6_$;$Mh~jV;8h6HhNhXNHGgPFx1lfm4fl=Z(Ms<(-4D)24KmnXTOIdPAqexmvoGnmeg6uS; z_-n`sM1?r;50Q!R2vKkrWQA6ymnlvRJwmd0`~h*vNe__vozU%tj*vfjQ(_jKEtb85 zvG5W~ghq(KNm_eJgj4i={~97L4!ShXGW`dh3AFi|>fw+21k!4zCmP*?lG*bJd+#Id zL;EC&p4H3Gs}?3xW#KCs0Xg8r7oeGruFL;2-c*xOZ%*QSw3@#WQo}%)RHHx#QnnK79sY z0v|=8U^0d&Oh<4cf=e+BU?xW3ySy_S!yMk@**tGt=2=cfLdAlLD@?n}(4vYXD&AM| z0k85ZhEy!6xE8^(K)9SMEH11HjOR_anytE?e=ke3s_SHZ!@Es$$MX%x&st8s>SarW zmF{g=Ia*B#gmQC*Je>|Lm#*dt0*dM0v;_40E#t0{tr*UFw&>SvXPvmpP0KR{BB#o8 z`Rlo&z{HJ1GE`l;IRd(fV$GTRpu35E`u~s475gB^<6M-wK{UxLi zC0Eb8rco&yHJfv^5-E;R<$UXw&rS+xZ1z9K3Um~G!@Rv@Y_#~{Y1^^=8G*?IbS>_e zx*tiG=?45yZSpNzwAUTOuh&SynFHb-d^l04JHB1D%C=`yA#;x7`i5^)dk73SkE~gS z<7MZ$V`_ENcWWy(cf+drw&iiJNOJ|$X|vL*CYWMbxweGt#`Gb4o}mP>qFb+-)`HDf z8E@~@^W2Uaj`Jfrp*J=|G2;T`;R}o`114J#`hYINPL_gTwEd732BVBM)3 z6}r>D_L!|q>5m2a+woTD#dLXglzvINHUZs(d?BCfW(T3?P?#V14?jhS z)?^_qHAIp5H^L^dL&P|{gK&Q2*`?r2a_ByiBgwHzC87L+NM;-A*9a$+hnqq1;IG{+ zL^(%L=IEDaPojs^A0vb-Ny$H;pCb353nNs&!Wmi)oTYguf-ez`ASlGZpA;j&O+qo* zgB2QCk)9bDdV*Ny++z}vP#)v8p9$Sx+i~I(8(HZy&)DfE#$GFUQ=S{e7>#jqVx0ab zZXn5*&|7jTgvPJV}M=Fd_C%Brpf^$xxB3A!GkTLN)K*YzF=^h%&Fr1$HuOCTEl xmCgjW&|O?rw$NK#4Ut#HM-Z&Ld55}mB2FrL$*Vq6(m@q9^}U6+i5I{-e*>H&q(%S$ literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/controller/SysTaskController.class b/common-task-starter/target/classes/com/mosty/common/task/controller/SysTaskController.class new file mode 100644 index 0000000000000000000000000000000000000000..d58b31ffd611e124a203eadfc967446e0e468508 GIT binary patch literal 6508 zcmd5=ZF3XX6@Jz)$d(u5m=;Wvw1qao7|e#$DKvH+Y-2ZWg>7u(wgf^~(pp}Sw94+v zM14zJD3FkZqzPqcGHH_zGyT-iS4^3L0UNjfQ&$%f3UKVc!@$-H0^Mfcl z@WTjx6vdD6ikSYB2!5)dF>R$3bjB<@r8(*OzB5|PN~H|DUqQQ5aAtMq?2KVAnh8U} z{#e4wXc^0K3mV@tR#tQQzvg%Yw3$`oDPhNSKI@tpW6pHUc-k1sW-V8DO)KjtcrdB-pPQiulDvAwCCzeG^8w!TcP4@ee1+28;Y74HL)1K## zAi|Dm4L#dGNSx1j zPMs65=WRV>oU`n++BqYx#m#Io?08dj>7#ls=kaS^)YEx#dm?69nsZJU;Sd__XhS)3 zGH2M*ld0#kE4S}1zxJDZclrC_@}0llTe`A*^={hJX4c1vkF>hSLsy> zwpM_x;K_1-kxuEaG^14nD77}z^@a1P@w`Kabe!2jj!muh{Nd093feS2F*7<%Y>%&w zRv~Xy#CG{EMDv(QNnV>1uavQC_0%a{nAsqAx2bO^6*q&2@Ub_!@+;x!BmTQMF^@ZzrK0@ z{VU7weelVx^IXZ}Q%8noNBJ^uW=&_It|c9lLjzN9RCeFuK??NLv!rXGDR{s360M!& zN7esyx2l#B)#cy6zH<4k;(A2MIXPU2nU1UAd~N8*@`hcQrPFR)WVLZ`F6vOw`(Rh& z#vg{nh|1|HCPD9@64$ManY8j+rVwYka&qas!*h#mXv|GIGnlT8PjNi`bX&{{@8HaQ z{w{u60;pF~jmRKe-@V3NBSRaC5V`mNH@gRW<46jcJDCYS`S_#dzrVBm>KpfO-2L>% z#ryC6Zsqdr`@g#2?VJ_&u5cnOGoOOZ!hyLT7Jc~QI*iF_8|TLDfg4LT3ZAOplRaPx zI=lly-Zj&j2vJ(`@S3i=9nO;}7UEwIg^BzG6>wWO5kX~lO`lr1eslSs*NX|EymBe+ z&VFDPZLcOQmM+5unO=CUxQ{x*W2sW^`dDz@S?5&T@mMO=#D zvWi#H8^LQTuHbbQ2l0lA!+2B0RlKEQ3~#GAhF_>Sfp=7#Mnb{UmFw|DP)Qb-v1G6a z-c@l8zf|!EI_c2D{9b)G89!qrcn;WECR7$6GE~QN$C-`DCuO+fr82R5rsUr4k66zVW$4huzl^F+L$iV zWq~&+3?C}yy#j9;!mcus)*Xkk*3Rt5PTtsc@B**_pA(TQ-j%DX;&U6HEqrcA z7n-qytrQy3#OL;XOHd|y{)~pby?4;qh(Drf3C*|omkLeP05- z*w4Y5=z7Y)0X&VbaC$2gL7kQ{{hN&r$YxOeQ1~;fN)78!IxI446!nTmKlQt00e7L4JzbU#xy#? z;(Rf{d9obmX?&0PM6?d_Db_yPa~o>U-oK#X4{Uh|Mb-lSLwLkCZ&ctBQE@op|027! z^QrUerIfAAa&aWs7V>xUDL$>8o0ri3Cu|Yo73p-Icp*5+z6Kal*e)*pJliRL7XqOs M&hY)L%vtIG0!9C=;{X5v literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/controller/SysTaskReportController.class b/common-task-starter/target/classes/com/mosty/common/task/controller/SysTaskReportController.class new file mode 100644 index 0000000000000000000000000000000000000000..c31d7ed91100a38b3bc63125a63ed7c50d471dbb GIT binary patch literal 3530 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 L7$0xzqtE{@*P^(s literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/SysTaskItem.class b/common-task-starter/target/classes/com/mosty/common/task/entity/SysTaskItem.class new file mode 100644 index 0000000000000000000000000000000000000000..84d39ecec8837fd5297eff7d6bc9f8cb14699f04 GIT binary patch literal 16606 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 K!v7-o?EeF0l+lR* literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/SysTaskLog.class b/common-task-starter/target/classes/com/mosty/common/task/entity/SysTaskLog.class new file mode 100644 index 0000000000000000000000000000000000000000..b92830ec9d68d4192da0ade3eec89044cbc2026b GIT binary patch literal 4288 zcmb7HTXP&o75-*-W@mOaE3Ma&oQ*|rj3K&u69^O;*#XBFvO%(gB@4#{l#w(@Bkx7o znYAKu3klb7Nw|j;FBDbri>rVtqErDz!Aq#(kteEn;)y@u5WX`#s~t&0)#8$SzV7p# zqto9x-81^ze}4Zb0FU7H0`A9l9u{_F_<{^yl;KMSd{c&RiS^qiUM`@FZ42L#=XYiJo`vsQc*Vl27JgvihZcS$%Re^p6B9qxknvYF zlx8>FTW+=PHrJ}Nt>)T{hRW4WGxQtYq96Fnb?;oW*$UmzZ#4rA)3YnBMs?Y3HT>09 zr`p(FrX|>{cY>8(B!U!a-Io&Q zaY_;DrW8$7N~3Y0l#C=|KBh`eBgx;{O-V>O@41d!r?$gM#+Bs_ZzY@=zrhN(q$a&H z6`LqMPbYm4Utv015L zcdcsLGs?abMwu4pLwDuooVywI74IZo9n5>hZC(@^2-n?UU9~3rw8mXNb+tBkkunhH z+FsD9GfXzx66B29VHUd!iQty|m7G?pWCBIdj zkM1>pM{XRJ+1=dqn(XK4Un8GM+@W$=+G$!-!Ky@5w@gkEebj%P@z@~QD@OuPl{w~^0Tj=5;DgvW?&MZm}K zan3a9AddT;e}~L(Xw0DJJd*0nrb}_o9&{c}b!M}sIO_+UPo_Gv$y1z-gU(~A&O96` z&bfomr&FDIs8XEGgU*knIzNd|#?B7q%~0gr#N?aEq}OUhG2&WD9aXDpm`#t9?Kh5U zX$^DfarA!Us1u;!a(W!2-#F^PXt;u>()7vo8%Lcl4WGi*v^ZwJany0tf&HRESCWN+CfS zat25ma_q{0knEU5lpvLyB1t7@uu>G#U`#4j2D>Ev4)>o;Tng$&c}?lE*QIxH4U1H5 z82`qndCTxR#XoSJYgyi!f5+2AI#1x6xItvF2Y-#v5am$Et9XXUL>n*Tvqb!B12^$G zqCDS89+rp-*yZc(S)u{_k?~z38~@~$yG&HXzi=EYM1xpmzOxuMt-BaB;k|De98$nq!mP(-o=q;W!-jkF;w)}Vo6IWQ_(RZ6T2yLvMNT`H0b0aQ*O`1 z9#dXJjv1NQUa^Q(~3%E%x82|tP literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/vo/AddSysTaskDeptVO.class b/common-task-starter/target/classes/com/mosty/common/task/entity/vo/AddSysTaskDeptVO.class new file mode 100644 index 0000000000000000000000000000000000000000..287ace0f10771fb3ae944f125a275f16561aabef GIT binary patch literal 2913 zcmbVO-E$LF6#w01H@iuY~8NlO$fA1Or&6sLi!$Sb0}omrcz_uVPK#eJIOE^ZQhD+p5b@l-n`Dz_24tqad+zzVzw&+EyYo}Ww(TlvX8hUjQ1Z=2J`xLGtOa>hVD zZ`rzSTKOVFY}mAt#S8l6q)|xfHA`|}#!OSf+|hzHV-)OJ$|IlGb0s>WZ)tIH`LnBc zKmTs|i_7;uzIN~OwUygnuUz@)@7tF;?|wS}*VRiaHy4+`y}0z#f-v8`T<%={^^>LB zR~UjBYkEe{&kki7c6l=`Ei5e0eYN!SoSA)imKHb5h(1k-!k(hX?1Jf(T?ez8eEG|{ zmH8VFKOnHz%$xQ;27gyJo z$^8s%)h#cY6fCCUb@b4iS35~Gonft`qPK0#pqrU9KNPn$pwG-0dCJ}69ir-3*7DRL zrdwI(Ul}^j1*-SQ7J9`aU|0t~e4J^Lqx83+g}xid0!t7AKr~ zN2YC*EJ?R35JWFf9QHJmw$(nG$^XQ@-J@<&yS|9uad^Z|`+nWYcf13pR z8-pWFgJ~|B1WS#04CeU*6PNBH86;iBqw!o{tcoZSx4kT*}{f8<1> zV+=21hg(h^BI%J6i4HS*^;1) zbkmZOdj3F5RJwyT^U!*tQW2UsAq)~6`d^WV8zev>yg?*# zQn%9hy+)EmWUa>#NwP!R1q2?DLL%B2BdWmI19GqJeOwWNTyd!QNcAe$E#Pshc{Xav znPAdOEV#pIg38~e-bH99ZlN{YRz^Fgu#ArI8X*U{92RnjKH(>5DPwK(3oV|pUY8n1 JH1NI-{|7#!iAVqd literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/vo/AddSysTaskUserInfoVO.class b/common-task-starter/target/classes/com/mosty/common/task/entity/vo/AddSysTaskUserInfoVO.class new file mode 100644 index 0000000000000000000000000000000000000000..501baaaaa44aa39f330ba1dfc753ab317d5cfc37 GIT binary patch literal 2965 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 literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/vo/DetailSysTaskVO.class b/common-task-starter/target/classes/com/mosty/common/task/entity/vo/DetailSysTaskVO.class new file mode 100644 index 0000000000000000000000000000000000000000..06322b66e2492a0f5db33655cce6e34be8c20e1a GIT binary patch literal 2235 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 Z(-LnZUc>g@7g{}I`(kPYX^?#_{SSKC?6m*@ literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/vo/QueryTaskVO.class b/common-task-starter/target/classes/com/mosty/common/task/entity/vo/QueryTaskVO.class new file mode 100644 index 0000000000000000000000000000000000000000..0973290d8fb92b830d52a137d61f489b4bce6ca8 GIT binary patch literal 6186 zcmb_gYj6|S6+YM2V|qO|w7}UIC}Jae%rFeGp-(wy-TZl1u`n zEtJsk4A3+{5}qkwLI|&dO>CgakES#I)gSrQ{%L0{8Gdv+)9Fm7GfnAt_ulocr6n<) z&e&(qz32PR-Fx<&bFcmT{|wzBqOa1&UYbd7ddNqIxj4ebQ7+!%;%zS8;o=w<$GJG+ zrjuSgPjPYDOYhRJxORq%vs|3xqMwWNT)fA{1uov_;EQhhz)O?qO@%J;=VgVi@aI*9 zt||0ug{~`fL!kkM1{J!g(1+YO^ngveo6t&HZ!ba(?vI;n7pu|8{HF-PZ@R2M%L}?5-=q6pxPF zI%U{*Gjef%jZtjVO2sxak#tu}q=yG!WOz8c=XCbq{?Yy`jJ({k1|jW3Kr1Zo(3r@? z5LfJUj$n-L8OUwh9-14<9lMY_d3N;J-q5`4;5Dhvhnl^#FSqL;-XfjsOSNOIm4cZ& zel|CBFf@1G`rKPXh)(v>?t4eCjh?xa-8U4PJAZw4=f&*KtC-F1JU{x*q0vjHLvtTr zKXP;T=um%d-)p&jXXOrf{1`RJ_qjTpJ+T*FL%CBovzJbYS@;Xxd-v75ADjboWcUmt zPdXDxW!55xkWFHPJfXr($@WP1vPdSzP1t5YILO}GmhIo0J2G(Z$aQ?>SRyK@(mXo+ zM(+4Y!|YlZPsB4%F)E%_+s4QtK4n=`JP~W@>)8-Xt&JdQd1~{;+9IhqAInKcrZbM9 z&u(f@_Jn(q>C9&2T2D_h5$4|{97En?YEv@&d|xcJc`fGJR^dH;9Wi`jqi8B;)mlE< zSlMvUva#F>j04H+@<<3z7Y^qOh!iQ2BO@)U#?j5h;2ze<|g>YP_TK;i1d|gbD~UV^Re+|{KA8EN-SY? zE>!@Gp}B+zy=4hGp)Zj(Q@%_(FlSU9GS*K@1i&2Q-P*gFBfWZez>(~x+h}|3k;HNy zf2f_2bf;)A=r)ZAZ|myD=H-Y#bXO{t?(5E=+gZZusWBty)^#2|PmLKFpROBGan~68 z6&SHKZ;fSJO3l~{E19HdH#kH@f<7DPz0PlGS9AD@uF^_sRH>HgRQeiyU8Qeuq4D8D zTBOp`TrB2dDJ@g!Sz5-Z{vmpzN;_zyN~@?9AyX;N2hY=LmDX^vmReQ%7PYDLZ7#mU z#S64frSEd_D(z%6DgWNFq%Ynb<(XS$*~=^=f$^eu=r?GZ4Iv}G`qW2=t(af*1!&5LI9}5l7zyqMaT_zUHuIzs>`Q~9IF-(nPUL!1gdK@eXB4sDnsdUAL|0(6f!gi1=9;i0(M1?V?H#!%>_~JS zMlpLw%7h(>F2(4F)M2+Z&x9R`uEwa--jR30jzkw^{A3nyRP+brS``{uSAE?%ayl;7 ze@wo&$yt1{{v+}=H`EP~st=)*v@}3yj@iE>U(oRhmG_f6JLnjoQUg(@IRPotTtO$t zxIUpkKa~WXL6-&O*W3X4H6`fgAVq@QLB#?p*E|4~Yu=!TgS-;t33@G{faU`zps7J0 z2dNSS%>t^>N&u?RN`oaFR4PFw!BPvTQY!hA0;<+30IJq1gB2W9DM1y%N(1D$i25%sI9NUvpTQ`4)^jgM5t+NcMIO%c_w z6_mhSG1alfl!WG>6|9DOp*g9UO{bTjx$t|RQjl)Qe^DBmLWk&&l!4}oQ06u6HG2hxf$q!RvVcppod<03v$MNR`? zU>xJ8B+O-jnaKQE33iVMn|K?8q$mXxlVxv{M2{WOD~v>O%I=kkWPFLc4GSZ z0+4j2ey%Ii+ZW^D5b1_L!bFwQIiwuFy>A_+$uA62Fz}@Tn!<|}kHA!+mkrRgz;vOb zw@(XvS?J{)6B0Vw`Lw_cp;vJID?&#HpB8vT=v7>=5qdS(AB8?ZkJ(@7#2*b?WvMWF JL+?bt{4YQ#QH}rr literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskCountGroup.class b/common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskCountGroup.class new file mode 100644 index 0000000000000000000000000000000000000000..25a71f3946d2d4cc5c578ccd6e665625e6d1115d GIT binary patch literal 2140 zcmb7FOK%%h6#lL~GafsWHg)r;AwZxh*l|*~G*Id!g)~ju6gv%Z2#*yLXB1ECc!E7n z34Z_y7OdE?Kw?8SS+o+k5|I#Wio|bVNkQycQp$H{#)%z!0kVDXx#xYpbMEyo|9t-g zfJwX?LmYEaD7Y$@`3SDXxL=pc4JliY)J;jf89^?F80K{3<-VxnmfV+gye0SL2nrFb z2q@LN<&Om7x!dNpnJJrVS?LrG?K%g#INR(YxFY*|%zhkn#;vs||XjNkV6AAS1uANThkef1gHMThk7FLMdGG{52YP%-aOy3%X7Ntm-11=Lka1R+ zY|*UD%XCPV%v#Cs1lzK}XiLir`FW;8TB};MdYNrigGkzF;8%AYA3T9r!Kqh^)-_x9 zZm>JcDNq^kcxlQ+Qh7{QqvFf!8o$U=(Kzj7#c8yky`KvI0X#=lx3EF0V_- zhC0$oO8jOFybam3@e!{c@B9vHP8oOuXE?@(9{n~5^m{B`l!C>XBETUKRV zV4}6_!C-aHT96rMvQ57^1|752)W`FD4dM_ui4Z>olJp>7k{<3u{GF;HK>@+-6bvIu zCOg3OIof2n3-0RJ1Bm-1LKxwyc}$(50K-?n3pmY_kg#)YH~to(dla@B_jEO8r@9!2 zj~e%OHBKTG7-tzOB=a0ge}_=_ya#=aAa7Zd50$_e(%t-o|EnJ#Ss`aH@bedAMVL=1 zJ@yS$WiR~`lrN!%_tHN?$&ZgUpn69V+Tu8utTOR4dJ@V*oY;jikx&|lG&S_BN)V}`gLB%DU^%^{Y0?x5}A@=Sn&XX4=2AAkFh*$47FoKKx>f$j@`DB#Ow!DV{0++bUj;OM9nO^HG z_=Ds(L_J7PWm5k9@#+R{ex;pC>ulfDv@+wtHQYB9-ow;(q+aJtTefg*n1Dq6E_;@l?8K)AMmEB literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskCountToday.class b/common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskCountToday.class new file mode 100644 index 0000000000000000000000000000000000000000..23c61983008f06c246af227f46689f396600e228 GIT binary patch literal 2209 zcmb7F-%}e^6#j0qn=E005DGLFD=KP!K+{_M6`)EfwA6$mP-gVWC9KJ|VHcAP4*moB z;EcZb;`l5x4&&4rO=on*(U&^o-{7mv`0k^%emA?6Y{-KSaPQgkx1_il#amIV z3G}{a*;c)>;52MkAYQm*>>0VLVV83S$1cwZB-d!McFawyZf#Y~dE0he!?hf{E|4x* zPOkoeQ7)UcoN;2w&F@-8XWOi<)|_3l=I-+xb}Y1qKS1ZLTzSw#?dwL0kfff>Sc8n?}u&-@a0D zD;9xXE|i>|+>TRs_j8nX96RS4^}9KfrBSu#rCRbnA$WnC~}?DiII2N8H-FW0u^R^g9B=k(Hiw$v2T-$E}z( z9x5xI2y}I@WeVyNEw>Kxhdjp)ZQr_Ul@DI?j%ORx<2G36^5TkP{@^!X7OX z%j(*4agkstM`~uhQRQsuK>+;|9ceVzS$AueT^2YK;Mvo%AF*|(Q7f5CmTdRPsg7Nc ztmqiSlRC~|SjQ6>7P$1kJFnv2_0!EJtw7?@ruCc3Gp7Ps|~BVEonc03Qnr6 z2Xi{su_2e+?9k+Rp!7KsmDVu_&UpMJf!A4*(NgiEt(zR}s`a5a?h#{m*R;0V8i6zn1zOG=DYm5NAEHhY!EJmOcZoahDxYW$6-L`z&~a z>u+x<5WiH<1@3$T#K%;_)LXlY4Pjc@r?^Q_1Doe;y3h_ViMa&RSm;*kFSxQQahMQ0xQK66qAy_(uctod@ z?~qgsLp^pl_ECZ=x-lQ06u;6n<`k?n^&?_$-$!pkZ=z2Y+(dt3z>_s8$0;{4*m*_T PFK5cHOW^eu^KbkMW$d^= literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskItemVO.class b/common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskItemVO.class new file mode 100644 index 0000000000000000000000000000000000000000..0f99ec63a0285c28b799e101fe078b02530da94c GIT binary patch literal 6964 zcmcgwYjjjs72YSA$DNrwc}$W?E@0D2s(Fx3)z-%iAkSiG0!S!*`09|1$-rbL%uImP zN2S_Yp)H`;DB70_(H41F2trzD)l#i*t-6-}(Y2a@zx?g86~BGXy)%=U3k?0?0`~px z+27vhoPGA*=MJy^_sm%$x`qDYr%syiQINjR;s-3AW$_$~!z_Nt;s}eQERL}_&f-U2 zdft!c2^J^W(Ilf&EPl-5G>bDVrdYhd;zbr`S)60>5}Up3rJwj|9!+TUQ-1!8#VZ<} z*XUJ^ey-6kG=UuyI#jef1sZ#4R?M!#d$@4fT~Fa1$aMSMU|P0!}&wrC^~O%6tS zQpv$CL7w#X#8@|Up#oiBHXWB*WBq6{8y}8sjA!DT60xPpWGWlY##70RpthcPDw5eA z9UP3MBhkDjvUDWgn;M8E)}>P;v2=C}v$(fK6QeOfRc}m9P49YU=81zdXZG@nT$p}` zAYF}LI6gJ~RO)R?~YQy)dChlj;2ELk~_LIgP2) z+egz0K|bZ^4#rx1V0kn>uqFle#WT;nG4NDU%( z)Lu?Wy`DjCT}Gg~4t91e!I zr6PS}nGG1}NeymX+qD?(tk}$qADlinj(shRC*#@0f+}0vHewmeaX^Bqd*aF1n$h7+ zvGj&0&X==*_p&jXj`O=U=*kYovFJ#-tLV8s`*Hh>u;940+T{?#`XCJrAF%a$}$2Tzgi>Q)JhOCpI3kdAS3@ z-jtxF&Tb|?eMR*7U>ZEx3^YxT6Qe+hjs1V!n4a@Y{V{wt=5`z&ae5t>A3QDddagQYDY=Prj+y^4;2+EkBUo1m{=5 zCivA}tDSJUwb}z}Nvb7VOHwbvzHGFAOK)^Uc0k_#`Z0xT=1UQ z)Ly>3MXgrLrc{k1uzjh~bbsu&xNPRut)TkxO?>z3)Jto0iqOqEy@%eb(+605h(#BR zMJztdVkwK|ELPHOI(>w&vCcBDAvK{+U!!e0ZJ;}J8fCPR?$qfn7I(9_hsDQOe4NE6 zSbUPjr|4dtqO?h;{q%J~jrorjwasOt@x%bGV4NiN&80ss-1pz%N1t zNW23mpb!V&9v{x3WEx`{GjIfoY###NEQdR?N@E`c-r$~(0!Xy!^gX&0SA2fesvZT^ z%OQL<^~G?%CgS(0JJ%B(8HpuPoSlXBo$K0pKeKj^D`*zq?gs@I$!tE|fbYpp5_A&< zsDe`fU$_;V1sHoDZ~)I+@bA_Py&no>MycY1P#{}M6($tOpi;#`D3Dd9ip5YM(@GUf zpg{JODwaWkj4V~GfC5=ss#paDG8b~S-0bbe8||UFutH5ht_3B6r@+(Qeu~6#X|oQ} zBL}PLqrkc%(0b~_o8bJ0oNau9DvlKyha8Pj5)Q_d#l}sJ#waBRV^^_pv!gLe(81VU zY~12#jM8;5_7oepI~t?p9gMxj#y2|}qg6N$?u^?pqKYRAgwGeX*2=pug@LwzvZMVFxm|}l zUZ&sya#tSic!`3&3)&~CO1=VAuUPvIu^F|d8@yDlhGOi^5*|D*kHXEoxHG z_y2$hDSj@fD#Irx{>Ksvb8~s|sa0I2jNSIB;T*=WAHJaQqd~cGJr27n6l-Tq*Fx7K zS(5W=x`t4YT203Uc{?X*?!7!-Yr0rrxGasvWvWym(=An~P-&zYZd+AndZfyeQ=x8^ zRlVtzDwM2c<+W7}rY2QdPK82NR$Jflxkw&UfwaP1Dcb3A8b_GjqLsb@R6%|*pT3DBsHFMA zPX~Zpw3z-y-vV;u7vJmjZ6FV2=`=k7|GWTD`Jn!L349iL2@=o%8u0pb0=~r}> z_jYxj#72f$C9o7Nx_#IQLJ{yt_}) zJ3`k@QZu)zNxD9CgTl3Vgx;wzF3;xBe1+>6wP@BRA&xJX8-Z_jrfG25z^G^fyk+k1x1%eLB{(R_vht{Jw literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskLineChartVO.class b/common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskLineChartVO.class new file mode 100644 index 0000000000000000000000000000000000000000..e47d1d7d3423affd1e2ff637e6ef9c0678508b48 GIT binary patch literal 2169 zcmb7F&r=&!9RIvzH(5fUG%d7I)M%*&LYhL++5pv-QcER(1o6koCG3!G!!9Np9K3qa z84u{eai-ImUR1^zoT)P!oa$7))EWNzR^nEoAae*|Zi01>)0H%P|*?S+io!m5d9PWjnfK+EzuNd)%}$ zm3Q=o1*4qNcO{t%OJ>fVH%e1wd&wv}EA*o->!qq8aAxz)>gMXkpFiB#y7@t(FOlx+ zPb3mspMJh|^H$>bA3whT-Fus#eVMp__ruMvKBCq@y04Gc1)FIIwAH0JZo3JFwm!N2 z$NQ@Sp&`>Uo$~_0WcRFqGQtc54vm|ZF;QKdGs-hM3y@{n1-&$@mrZ&0nTk_1S<%3F z!CuTP+7)LdLu%2sGLBxko-v34S<7}NzfzeYM|vG8>SbqkQWm#hI1@zhXtKL5!5s`W zibuQxVtX|F64Z)k-kxlLupC$HU~@HKX7RcE2eg_O;g+ zF>~7~8fAg7tiMZ6f#z~tGU76Q=$k#he`?7)df|FbUvlx|2y&8WThOghnF`6GUMYGl zU_ZtfX=-{bH_B8W;D-maDl#${8s>{uh}r{t_g@faSD z;wajqcm$6M^#A|%Me#h+QFP&C6upvq8qY*=4q1lXe;+PZ&CILYzdb?9|~Bjd7okMafwvShyN4QWVUS~9G8fpmSt{fTNEGCwhn z;vW6&31}FrZGAk+ry>S{BM9(AAW3)dnQ7*JjKAX*#3>-Sje<@zk;x8leS$U_?t;78 zvjOoni2xE@LoQQeC?M)7;3=HoNl4VW?lt}ff!h?;8#f_ zp#n0`p47Jp9GrKDr{U) z)ZlvRCn&kzo*Gp5NFp@R%O$I%e?fCxxrf7Rh^FI84dHDKEvr&R%ZB2r)Ct`~Yz-}O zH6GelQq~zO*wCpfUJg4I7jepMa69ri&F%%*yG!UJFGvi|qn{N2goyPSQYvzsm;q8D zJWKxxG=;Ul(Hh2c56}_DS$;L~0LMMDiO;pXhCTx4xXX^HvUHhV{VaHcW(HdH0!Q5i49<9}IDAq>0hQs@>Nd4tZ`gI9h IaFM_GFVq61Z~y=R literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskLogVO.class b/common-task-starter/target/classes/com/mosty/common/task/entity/vo/SysTaskLogVO.class new file mode 100644 index 0000000000000000000000000000000000000000..6984c8ddfdef2494643eebb1cf3b95a8d76d4911 GIT binary patch literal 2712 zcmb7GTW?fV6#n+ixy|$xhJhAFih`o{K8mO?rAWD2onCB96-4B8dYm4Z&Z#qJK>DPK zPb55(_-10{g&0k6NF*A4!NlJo5dVXS-#(YlOgk7%+I`ku>sxDodtG+>$3H*)0$@Li zNpxW<0Tt77c~34gI%bpn&dKGp1k6k6eYt!fw`X*mO~S;Kfe+>PoLoLKaNfYj1}?~* zrDH)yK|rfqDXdm63S{yZt;<%{bC&IF-Yrvg=u% ztRa4NG=x#hGvy?b39`U9l_PRmM>-Tcw&UkpA=T-TT+RzW>da z4}bpd!HxP~H*SYaRy~2O0h5wdE@sEep3T7YO-iDx-f_E1*6Ak5tXFZ$MIu_FKD<_c z@c9>vddMj|-eG}wZ{NIta*UJ&Hs_tPJy}~`uq$&GZzLniJI`AcNA5$V;w?G6;&8s; zE@zkBs&_R@Y1u7jJ*#>tYcnZSU3RmxSF3Z>zb!Ttie`Gd7%6oT3 z$aOdG45LMt-`0X#yMChDIJBqtiD$|zL{NEZcL;4cRDwFgc+s(4&A{+fiPP*)YgUPA zY5`0wT(k?`NZ(lj;kFhmG_f6AZ^^C*bjURCjT+JPwQJjkQL=3^%I)Sg&xmEJ;T@?u zXFaQMX~J6ZtIFYF?+X|Ot9(K-r?_NQmx9J%myDCx^vw9g2{NawRqSf5#Iy7@N`WNL z@9=feL5AlBd11HCy0uEdKIzEb+S1$}!*a|_JdYPlY{w20yYQ@u=dfE~@c*=#iDP)f zL?8N1ye_2y44N3iu!-X!_wD{T`&A7{9j!T~MVanx&2)N$w2zutge{j(*dBwsgJBzG z7eulgJnluGi9Ch{QjPdQK^fRr@i~~aIYuRCH5e_;T3NBnivmOKI%vZrhden(E%>OR zo`}aDzJFa{M)A)|uVV##veK z+|$-Mi&sMD94{G@m+T+-5wZ4{?hX*)rDZ~b0tmc{eeL4JpEgcVFM-$i=P*cP3m@fa z;{@dua#(^m;s7}(c(3aN{og`WZVmhf^((0HTLZsBofzz|L-V&3^vOXkIc4Z~bYzr! z*m4u*P)4c4h!BaKN=PE7WmJjL?jd~>of$QwHGz^jouFjS$mkMegdja*L?GoB3B@<` z)VYA@T6(YJO&s7gy6_nevd?1dF9$j5;_S8pMkpybg_Af$NyP+?V3d-E66fSFB^?#) z#9NdM+Q8?-)Q!KfNypeDbn7_EA45FCjzCN_iww=jC#=Rner0#4GJTT$#)$};LtSI9 zlCxwlA=tNGpyRrt1{x@SiQbO(}*X-o-en#yS7{@D3$~$=gn?OzIKR zy#nnq6$;ZP1XBee9uwZ!$E2bQY6OTdN~ zeSchU0A?5k=m!`C7zzv`bh*4B_`cOq%L3Zb-h``{+Fh`(cjS!$a)mm5`v w?Vtb2`>a*RMqt@dc%ArI{oEw5cs@d)qw>xbV*!CdkdN>$1T^gR2;<&HH;eCQ?EnA( literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/mapper/SysTaskMapper.class b/common-task-starter/target/classes/com/mosty/common/task/mapper/SysTaskMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..31a8a7b49775090fc37ec482d1e733916b1d4d43 GIT binary patch literal 991 zcmcIj&2AGh5FY2JDQPMFffqnR0uK1XEft8UsuXFfqz%n|vKbbqYkOsTBkeQrMjUtm z-leZlb#~JdnpO!paPaPqXXe|_-+cak^Ya$~e1ummIBdaD3tkFne^X}CEh6QEfFEz8 z*lIaOtJTEjQWs+k%4ccrWo#WuO#vquQ1%9xP^YTa)`x=AT3aIn`YTB$DBhY`d7hIi zzVhCv-+8wgwt#0tl^6`UBLUZ&F*{z%Y*_e`S1*ueZlC_=Q8p(d;Ppk$B5E2buf{12 z&>?G2?u#)t@Jy`n0^UT{B@#1?zmrtes3a~5WYyIX(41kKvxv>Cgb}b4TSo5|m!6z} z&vR-2eT-9_p-j;vGO{LN{Cm6;%Gg9#(W0O~o>Cm<;;wKNW*IrzMNend=NiTCX2(-w z{|;^LVmehRAMo%lGe`MQ@(}R8wDjZC>G@9|bO_jA<}RSL_NptfOnys%fEuqlU$%Nf wKm(c_Z*f$E7Hso-uf`8HIIp&c9j@7h=Ny!|-Ln0!%-++PKZq}2zd}B^1@oFZ_W%F@ literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/service/SysTaskItemService.class b/common-task-starter/target/classes/com/mosty/common/task/service/SysTaskItemService.class new file mode 100644 index 0000000000000000000000000000000000000000..80c7de6c294ed5bbbbdf0fb3530ca2c1fbd451d7 GIT binary patch literal 344 zcmbVIJC4FI5Pjws0u9~Xf@YZN?yMq8suS*{JrtEC zadJXiX*5|;9%U+M9Y38#15(Dinmk(0d1?FC!F!!XchPHXa0faIY{F>5WK2Vo2^sggdjuL0H%uf1 zju*qdx30B_^(DE`9;Q7IQs_eh!^LTb*0nY*67di*>KB2~hQR(})K59j3MWn1mOWxB z6_LtmT8x+x`XtFU3Y&47BJqeBM*WX0=2(6^6tQF`&p3f^|1;O?dO@+rP8Z+s6r218 zi(4<12vj^3qkn+{F$__<)vV-3B(xM1L9@RGS(-{!L&;=qta54kh3yrAw->14jD?-} zK;gXOkQf!QVo;(Ic-5);UU!3>x;A3Bj75+ZOA-g+#hJ=a++n*jbH#jVc+9hTQhr{> zZ)vq`@(*Phw)yQuNIp1Z84~>RPZI@GU^ixJhV9Pih>uP0{A-xl1k_NKG9 Y;P$EC9rU|9bH0aI72C+Ag*55nJZFWpeZk}I7Icz5J4 ziEIa{yPtfU=qAHlSM`kusiQ1!d89~Kt*&g!^(YcS`DBoKE+2w4UQz6yVZURwrj(&Y zl1MjMz*){rD_feNsFR6;n@7`pziOFq9(PBbRl7EIu{>3ofLp&^G6D8(#ZWM8UZj*& z%bxOz^gTAl25Q|JlDE;ZuFrkql<8kPq2;}GByNyS+AvBa|H@cH31x=EfBy!3W%l-; z`ZMhRo%y!{*hYZ{lID)4lhL9E$W{pP90R4@C$L8%3YaCET?2K@k*($D5~`RdR3w~v QEnqR<>sX>a^Irx&06z2WlmGw# literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/service/impl/SysTaskLogServiceImpl.class b/common-task-starter/target/classes/com/mosty/common/task/service/impl/SysTaskLogServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..d19cc6541d86a6af4541d8e58ac8fdb74623c6c6 GIT binary patch literal 762 zcmbVKO-lnY5PfNFYwJg~et_P*sRwiMAZ{s$APB1mE4`;R)@YL~Nw(Ub}shZ^&o*s=H+E(-elh1pI-p%W4(qV8WpTmuv)_D+Xk=Gb0IhI*`w zJWq93x=Ya=5YmWkPYgQ3sm%WZXTpv042N;gYObvhBTgr64G+TKaWCCa^(0q18SwVV zUlJJGe)|(XB{X8FwpHJVkUC28ng{9%tJRfFxgK>zP(B%?p38?IjaL-cRV zWk-2Mtvxcv29j+Jb#^KFT(vK|^XcB4QXe=2mDxYkHJf8bNY4-{2k$?hb$!6C;9aXaP`MHD|=Ey6O RpRpFOnD2Eg(Vp>_fe$66>XHBe literal 0 HcmV?d00001 diff --git a/common-task-starter/target/classes/com/mosty/common/task/service/impl/SysTaskServiceImpl.class b/common-task-starter/target/classes/com/mosty/common/task/service/impl/SysTaskServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..9e41132da2c9adbbe3da2fc9a7869a932399560f GIT binary patch literal 32136 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 xaoSq{F8|?M`9ITY|B+w&zI~Hc`_A7}*=e + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id,rw_id,rwjsr_id, + rwjsrsfzh,rwjsrxm,rwjsrdw_id, + rwjsrdw,rwjsrbm_id,rwjsrbmmc, + rwzt,rwzdsj,rwcksj, + rwwcsj,bz,xt_zxbz, + xt_zxyy,xt_cjsj,xt_lrsj, + xt_lrrxm,xt_lrrid,xt_lrrbm, + xt_lrrbmid,xt_lrip,xt_zhxgsj, + xt_zhxgrxm,xt_zhxgid,xt_zhxgrbm, + xt_zhxgrbmid,xt_zhxgrip + + diff --git a/common-task-starter/target/classes/mapper/SysTaskLogMapper.xml b/common-task-starter/target/classes/mapper/SysTaskLogMapper.xml new file mode 100644 index 0000000..b8158c5 --- /dev/null +++ b/common-task-starter/target/classes/mapper/SysTaskLogMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + id,rw_xfczb_id,rw_id, + rwjsr_id,rwczsj,rwczzt + + diff --git a/common-task-starter/target/classes/mapper/SysTaskMapper.xml b/common-task-starter/target/classes/mapper/SysTaskMapper.xml new file mode 100644 index 0000000..c0caa02 --- /dev/null +++ b/common-task-starter/target/classes/mapper/SysTaskMapper.xml @@ -0,0 +1,200 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + id + ,rwlx,rwjjcd, + rwmc,rwnr,rwzdsj, + rwwcsj,rwyqwcsj,rwcjrsfzh, + rwcjrxm,rwcjrdw,rwcjrdw_id, + rwcjrdh,rwcjrgz,rwzxzt, + rwlyxt,rw_url,bz, + xt_zxbz,xt_zxyy,xt_cjsj, + xt_lrsj,xt_lrrxm,xt_lrrid, + xt_lrrbm,xt_lrrbmid,xt_lrip, + xt_zhxgsj,xt_zhxgrxm,xt_zhxgid, + xt_zhxgrbm,xt_zhxgrbmid,xt_zhxgrip + + + + + + + diff --git a/common-task-starter/target/common-task-starter-1.0.0-SNAPSHOT.jar b/common-task-starter/target/common-task-starter-1.0.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..1fdd18f908d75e66478983d11135f3307927ce9a GIT binary patch literal 70904 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®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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/common-token-starter/pom.xml b/common-token-starter/pom.xml new file mode 100644 index 0000000..bb7f2cb --- /dev/null +++ b/common-token-starter/pom.xml @@ -0,0 +1,84 @@ + + + + mosty-common + com.mosty + 1.0.0-SNAPSHOT + + 4.0.0 + + common-token-starter + + + 8 + 8 + + + + + com.mosty + common-base-starter + 1.0.0-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-web + ${spring-boot-dependencies.version} + true + + + com.alibaba + transmittable-thread-local + ${transmittable-version} + + + org.springframework.boot + spring-boot-starter-aop + ${spring-boot-dependencies.version} + true + + + com.auth0 + java-jwt + 3.8.1 + + + + org.projectlombok + lombok + 1.16.18 + provided + + + + com.vividsolutions + jts + 1.13 + + + + + + + mosty-nexus-releases + release version + http://10.64.201.126:8081/repository/maven-releases/ + + + mosty-nexus-snapshots + snapshots version + http://10.64.201.126:8081/repository/maven-snapshots/ + + + + + + org.apache.maven.plugins + maven-deploy-plugin + 2.8.2 + + + + \ No newline at end of file diff --git a/common-token-starter/src/main/java/com/mosty/common/token/DeptInfo.java b/common-token-starter/src/main/java/com/mosty/common/token/DeptInfo.java new file mode 100644 index 0000000..5bdc8bb --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/token/DeptInfo.java @@ -0,0 +1,60 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.mosty.common.token; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 部门信息 + */ +@Data +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +public class DeptInfo implements Serializable { + + private static final long serialVersionUID = -2608276244908343842L; + + + @ApiModelProperty(value = "所属部门id") + private Long ssbmid; + + @ApiModelProperty(value = "所属部门") + private String ssbm; + + @ApiModelProperty(value = "所属部门代码") + private String ssbmdm; + + @ApiModelProperty(value = "所属县公安局") + private String ssxgaj; + + @ApiModelProperty(value = "所属县公安局id") + private Long ssxgajid; + + @ApiModelProperty(value = "所属县公安局代码") + private String ssxgajdm; + + @ApiModelProperty(value = "所属市公安局id") + private Long sssgajid; + + @ApiModelProperty(value = "所属市公安局") + private String sssgaj; + + @ApiModelProperty(value = "所属市公安局代码") + private String sssgajdm; + + @ApiModelProperty("权限等级(D_ZDY_SJQX)") + private String permissionsLevel; + + @ApiModelProperty("权限过滤条件ids") + private String ids; +} diff --git a/common-token-starter/src/main/java/com/mosty/common/token/JWTUtil.java b/common-token-starter/src/main/java/com/mosty/common/token/JWTUtil.java new file mode 100644 index 0000000..e2f1ab2 --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/token/JWTUtil.java @@ -0,0 +1,102 @@ +package com.mosty.common.token; + +import cn.hutool.json.JSON; +import com.alibaba.fastjson.JSONObject; +import com.auth0.jwt.JWT; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.TokenExpiredException; +import com.auth0.jwt.interfaces.DecodedJWT; +import com.auth0.jwt.interfaces.JWTVerifier; +import com.mosty.common.base.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.http.HttpStatus; + +import java.util.Date; + +import static com.mosty.common.base.constant.SystemConfigConstants.TOKEN_ISSUER; +import static com.mosty.common.base.constant.SystemConfigConstants.TOKEN_KEY; + +/** + * token工具类 + * + * @author kevin + * @date 2022/3/21 11:03 PM + * @since 1.0.0 + */ +@Slf4j +public class JWTUtil { + public JWTUtil() { + } + + public static DecodedJWT verify(String token) { + try { + // 这里不判断token过期状态 +// Algorithm algorithm = Algorithm.HMAC256(TOKEN_KEY); +// JWTVerifier verifier = JWT.require(algorithm).withIssuer(new String[]{TOKEN_ISSUER}).build(); +// DecodedJWT decodedJWT = verifier.verify(token); +// +// Date expiresAt = decodedJWT.getExpiresAt(); +// if (expiresAt.before(new Date())) { +// log.info("token已过期"); +// } +// +// return expiresAt.after(new Date()) ? decodedJWT : null; + if(StringUtils.isNotEmpty(token)){ + Algorithm algorithm = Algorithm.HMAC256(TOKEN_KEY); + JWTVerifier verifier = JWT.require(algorithm).withIssuer(new String[]{TOKEN_ISSUER}).build(); + return verifier.verify(token); + } + return null; + } catch (TokenExpiredException expiredException) { + log.warn("token过期:{}", expiredException.getMessage()); + throw new BusinessException(HttpStatus.UNAUTHORIZED.value(), "token过期,请重新登陆", null); + } catch (Exception var11) { + var11.printStackTrace(); + log.error("解签失败: {}", var11.getMessage()); + return null; + } + } + + /** + * token 泛解析用户信息 + * + * @param token jwt token + * @return 用户信息 + */ + public static UserInfo getUserInfo(String token) { + DecodedJWT jwt = verify(token); + if (jwt == null) { + return null; + } + return new UserInfo( + jwt.getClaim("userId").asLong(), + jwt.getClaim("userName").asString(), + jwt.getClaim("phone").asString(), + jwt.getClaim("userLoginName").asString(), + jwt.getClaim("inDustRialId").asString(), + jwt.getClaim("idEntityCard").asString(), + jwt.getClaim("isVirtualUser").asString(), + jwt.getClaim("level").asString(), + jwt.getClaim("deptId").asLong(), + jwt.getClaim("deptName").asString(), + jwt.getClaim("deptCode").asString(), + jwt.getClaim("fxjDeptId").asLong(), + jwt.getClaim("fxjDeptName").asString(), + jwt.getClaim("fxjDeptCode").asString(), + jwt.getClaim("dszDeptId").asLong(), + jwt.getClaim("dszDeptName").asString(), + jwt.getClaim("dszDeptCode").asString(), + jwt.getClaim("deptLevel").asString(), + jwt.getClaim("deptBizType").asString(), + JSONObject.parseObject(jwt.getClaim("permissions").asString(), UserPermissionsInfo.class) + ); + } + + public static void main(String[] args) { + UserInfo res = getUserInfo("eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJhZG1pbiIsImlzcyI6Inprai1mcG0tc3RvcmVhZG1pbiIsImV4cCI6MTYyODMzMTE1NCwiaWF0IjoxNjI3ODk5MTU0LCJ1c2VySWQiOjUzfQ.hJ25t46zntTUknwjsB0UJzOIFcM5n7IG0DDA6RVP8jM"); + System.out.println(res); + } + +} diff --git a/common-token-starter/src/main/java/com/mosty/common/token/JwtSysUser.java b/common-token-starter/src/main/java/com/mosty/common/token/JwtSysUser.java new file mode 100644 index 0000000..6993965 --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/token/JwtSysUser.java @@ -0,0 +1,25 @@ +package com.mosty.common.token; + +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 用户信息泛解析标识 + * @author kevin + * @date 2022/2/16 1:17 PM + * @since 1.0.0 + */ +@Documented +@Retention(RetentionPolicy.RUNTIME) +@Target({ElementType.METHOD, ElementType.TYPE}) +public @interface JwtSysUser { + + /** + * 用户realm,方便后续扩展 + * @return 用户 + */ + String value() default ""; +} diff --git a/common-token-starter/src/main/java/com/mosty/common/token/SysUserInterceptor.java b/common-token-starter/src/main/java/com/mosty/common/token/SysUserInterceptor.java new file mode 100644 index 0000000..6440e24 --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/token/SysUserInterceptor.java @@ -0,0 +1,129 @@ +package com.mosty.common.token; + +import com.mosty.common.base.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.lang.Nullable; +import org.springframework.util.StringUtils; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.io.PrintWriter; +import java.lang.reflect.Method; + +/** + * token解析器 + * @author kevin + * @date 2022/3/21 11:12 PM + * @since 1.0.0 + */ +@Slf4j +@SuppressWarnings("unused") +public class SysUserInterceptor implements HandlerInterceptor { + public SysUserInterceptor() { + } + + @PostConstruct + public void init() { + } + + public boolean preHandle(@Nullable HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Object handler){ + if (!(handler instanceof HandlerMethod)) { + return true; + }else{ + HandlerMethod handlerMethod =(HandlerMethod)handler; + Method method = handlerMethod.getMethod(); + JwtSysUser sysUser =(JwtSysUser)method.getAnnotation(JwtSysUser.class); + + if(sysUser == null) { + sysUser = (JwtSysUser) method.getDeclaringClass().getAnnotation(JwtSysUser.class); + } + if (sysUser == null) { + return true; + }else { + UserInfo info = this.getUserInfoFromJwtToken(request, sysUser); + if(info == null){ + throw new BusinessException(401,"登录过期,请重新登录!!",(Object)null); + } else { + UserInfoManager.set(info); + return true; + } + } + + } + + } + + public void afterCompletion(@Nullable HttpServletRequest request, @Nullable HttpServletResponse response, @Nullable Object handler, Exception ex) { + UserInfoManager.clear(); + } + + private boolean setUserInfo(UserInfo info, JwtSysUser sysUser) { +// if (this.mockUserInfo) { +// return true; +// } + +// UserInfoResp resp = this.userInfoCache.getUserInfo(info.getUserId(), sysUser.value()); +// if (resp == null) { +// return false; +// } else { +// info.setMerchantId(resp.getMerchantId()); +// info.setMobile(resp.getMobile()); +// info.setUsername(resp.getUsername()); +// info.setAccount(resp.getAccount()); +// info.setStatus(resp.getStatus()); +// info.setEmail(resp.getEmail()); +// info.setSystemType(SystemTypeEnum.toEnum(resp.getSystem())); +// info.setUserInfoType(UserInfoTypeEnum.toEnum(resp.getType())); +// return true; +// } + return true; + } + + private UserInfo getUserInfoFromJwtToken(HttpServletRequest request, JwtSysUser sysUser) { + try { + String token = request.getHeader("token"); + if (token == null) { + token = request.getHeader("Authorization"); + } + + if (!StringUtils.isEmpty(token)) { + return JWTUtil.getUserInfo(token); + } + } catch (Exception e) { + log.error("解析token异常", e); + } + return null; + } + + private void writeNeedLogin(HttpServletRequest request, HttpServletResponse response) throws IOException { + this.assemblyResponse(request, response, "用户未登录!", HttpStatus.UNAUTHORIZED, "BIZ.USER_NOT_LOGIN"); + } + + private void writeException(HttpServletRequest request, HttpServletResponse response) throws IOException { + this.assemblyResponse(request, response, "网络异常,请稍后再试", HttpStatus.OK, "BIZ.BUSSINESS_EXCEPTION"); + } + + private void assemblyResponse(HttpServletRequest request, HttpServletResponse response, String errorMsg, HttpStatus unauthorized, String userNotLogin) throws IOException { + response.setContentType("application/json;charset=UTF-8"); + response.setStatus(unauthorized.value()); + String origin = request.getHeader("Origin"); + if (origin == null) { + response.addHeader("Access-Control-Allow-Origin", "*"); + } else { + response.addHeader("Access-Control-Allow-Origin", origin); + } + + response.addHeader("Access-Control-Allow-Headers", "*"); + response.addHeader("Access-Control-Allow-Credentials", "true"); + response.addHeader("Access-Control-Allow-Methods", "GET,POST,PUT,OPTIONS,DELETE"); + PrintWriter writer = response.getWriter(); +// writer.write(JSON.toJSONString(new ResponseResult(userNotLogin, errorMsg))); + writer.flush(); + writer.close(); + } +} diff --git a/common-token-starter/src/main/java/com/mosty/common/token/UserInfo.java b/common-token-starter/src/main/java/com/mosty/common/token/UserInfo.java new file mode 100644 index 0000000..0dd335a --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/token/UserInfo.java @@ -0,0 +1,91 @@ +// +// Source code recreated from a .class file by IntelliJ IDEA +// (powered by FernFlower decompiler) +// + +package com.mosty.common.token; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; +import java.util.List; + +/** + * 用户信息 + * + * @author kevin + * @date 2022/2/16 1:24 PM + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@AllArgsConstructor +public class UserInfo implements Serializable { + + private static final long serialVersionUID = -2608276244908343842L; + + @ApiModelProperty(value = "用户id") + public final Long userId; + + @ApiModelProperty(value = "用户名") + public final String userName; + + @ApiModelProperty(value = "用户电话") + public final String phone; + + @ApiModelProperty(value = "用户账号") + public final String userLoginName; + + @ApiModelProperty(value = "用户行业号码") + public final String inDustRialId; + + @ApiModelProperty(value = "用户身份证号") + public final String idEntityCard; + + @ApiModelProperty(value = "是否虚拟用户") + public final String isVirtualUser; + + @ApiModelProperty(value = "数据权限范围") + public final String level; + + @ApiModelProperty(value = "部门id") + public final Long deptId; + + @ApiModelProperty(value = "部门名称") + public final String deptName; + + @ApiModelProperty(value = "部门编码") + public final String deptCode; + + @ApiModelProperty(value = "分县局部门id") + public final Long fxjDeptId; + + @ApiModelProperty(value = "分县局部门名称") + public final String fxjDeptName; + + @ApiModelProperty(value = "分县局部门编码") + public final String fxjDeptCode; + + @ApiModelProperty(value = "地市州部门id") + public final Long dszDeptId; + + @ApiModelProperty(value = "地市州部门名称") + public final String dszDeptName; + + @ApiModelProperty(value = "地市州部门编码") + public final String dszDeptCode; + + @ApiModelProperty(value = "部门等级") + public final String deptLevel; + + @ApiModelProperty(value = "所在部门业务类型代码") + public final String deptBizType; + + @ApiModelProperty(value = "用户数据权限SQL") + public final UserPermissionsInfo userPermissionsInfo; + +} diff --git a/common-token-starter/src/main/java/com/mosty/common/token/UserInfoCache.java b/common-token-starter/src/main/java/com/mosty/common/token/UserInfoCache.java new file mode 100644 index 0000000..4122dc8 --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/token/UserInfoCache.java @@ -0,0 +1,69 @@ +//package com.mosty.common.token; +// +//import com.google.common.base.Function; +//import com.google.common.cache.CacheBuilder; +//import com.google.common.cache.CacheLoader; +//import com.google.common.cache.LoadingCache; +//import java.util.HashMap; +//import java.util.Map; +//import java.util.concurrent.TimeUnit; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +//import org.springframework.stereotype.Component; +//import org.springframework.util.StringUtils; +// +//@Component +//public class UserInfoCache { +// private static final Logger log = LoggerFactory.getLogger(UserInfoCache.class); +// private static final String KEY_MID = "_"; +// private final Map>> func = new HashMap(); +// private final LoadingCache cache; +// +// public UserInfoCache(StoreUserInfoClient storeUserInfoClient, PlatformUserInfoClient platformUserInfoClient) { +// this.cache = CacheBuilder.newBuilder().maximumSize(10000L).expireAfterWrite(3L, TimeUnit.MINUTES).build(new CacheLoader() { +// public UserInfoResp load(String key) { +// if (StringUtils.isEmpty(key)) { +// return null; +// } else { +// String[] vs = key.split("_"); +// Integer type = Integer.valueOf(vs[0]); +// Integer userId = Integer.valueOf(vs[1]); +// UserType userType = UserType.toEnum(type); +// if (userType == null) { +// UserInfoCache.log.error("用户类型正确,type:{},userId:{}", type, userId); +// return null; +// } else { +// ResponseResult result = (ResponseResult)((Function)UserInfoCache.this.func.get(type)).apply(userId); +// if (result != null) { +// if (result.isSuccess()) { +// return (UserInfoResp)result.getData(); +// } +// +// UserInfoCache.log.error("调用{}后台用户失败:{},{}", new Object[]{userType.getName(), userId, result.getMessage()}); +// } +// +// return null; +// } +// } +// } +// }); +// if (storeUserInfoClient != null && platformUserInfoClient != null) { +// this.func.put(UserType.store.getValue(), storeUserInfoClient::getUserInfo); +// this.func.put(UserType.platform.getValue(), platformUserInfoClient::getUserInfo); +// } +// +// } +// +// public UserInfoResp getUserInfo(Integer userId, UserType userType) { +// if (userId != null && userType != null) { +// try { +// return (UserInfoResp)this.cache.getUnchecked(userType.value + "_" + userId); +// } catch (Exception var4) { +// log.error("key:{}/{} err", new Object[]{userId, userType, var4}); +// return null; +// } +// } else { +// return null; +// } +// } +//} diff --git a/common-token-starter/src/main/java/com/mosty/common/token/UserInfoManager.java b/common-token-starter/src/main/java/com/mosty/common/token/UserInfoManager.java new file mode 100644 index 0000000..36ac8c7 --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/token/UserInfoManager.java @@ -0,0 +1,34 @@ +package com.mosty.common.token; + +import com.alibaba.ttl.TransmittableThreadLocal; +import com.mosty.common.base.exception.BusinessException; + +public class UserInfoManager { + + /** + * 用户信息 + */ + private static final ThreadLocal USER_CONTEXT = TransmittableThreadLocal.withInitial(() -> null); + + public UserInfoManager() {} + + public static void set(UserInfo userInfo) { + USER_CONTEXT.set(userInfo); + } + + public static void clear() { + USER_CONTEXT.remove(); + } + + public static UserInfo get() { + UserInfo user = USER_CONTEXT.get(); + if (user == null) { + throw new BusinessException("登录信息获取异常,请重新登录!!"); + } + return user; + } + + public static UserInfo getUser() { + return USER_CONTEXT.get(); + } +} diff --git a/common-token-starter/src/main/java/com/mosty/common/token/UserPermissionsInfo.java b/common-token-starter/src/main/java/com/mosty/common/token/UserPermissionsInfo.java new file mode 100644 index 0000000..a19312d --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/token/UserPermissionsInfo.java @@ -0,0 +1,36 @@ +package com.mosty.common.token; + +import io.swagger.annotations.ApiModelProperty; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +/** + * 用户权限信息 + * @author Lhh + * @date 2022/06/27 17:24 + * @since 1.0.0 + */ +@Data +@Accessors(chain = true) +@NoArgsConstructor +@AllArgsConstructor +public class UserPermissionsInfo { + + @ApiModelProperty("权限过滤条件ids") + private String ids; + + @ApiModelProperty("权限过滤条件orgcodes") + private String orgcodes; + + @ApiModelProperty("权限等级(D_ZDY_SJQX)") + private String permissionsLevel; + + @ApiModelProperty("权限SQL(ssbmid)") + private String permissionsSql; + + @ApiModelProperty("权限SQL(ssbmdm)") + private String permissionsSqlCode; + +} diff --git a/common-token-starter/src/main/java/com/mosty/common/token/UserType.java b/common-token-starter/src/main/java/com/mosty/common/token/UserType.java new file mode 100644 index 0000000..190eb97 --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/token/UserType.java @@ -0,0 +1,28 @@ +//package com.mosty.common.token; +// +//import com.aimart.common.base.BaseEnum; +// +//public enum UserType implements BaseEnum { +// store(1, "商家/门店后台"), +// platform(2, "平台后台"); +// +// public final int value; +// public final String name; +// +// public int getValue() { +// return this.value; +// } +// +// public String getName() { +// return this.name; +// } +// +// public static UserType toEnum(Integer value) { +// return (UserType)BaseEnum.toEnum(value, UserType.class); +// } +// +// private UserType(int value, String name) { +// this.value = value; +// this.name = name; +// } +//} diff --git a/common-token-starter/src/main/java/com/mosty/common/token/VirtualUserEnum.java b/common-token-starter/src/main/java/com/mosty/common/token/VirtualUserEnum.java new file mode 100644 index 0000000..bb5625f --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/token/VirtualUserEnum.java @@ -0,0 +1,43 @@ +package com.mosty.common.token; + +import lombok.AllArgsConstructor; + +/** + * 虚拟用户标识 + * @author kevin + * @date 2022/2/25 9:52 AM + * @since 1.0.0 + */ +@AllArgsConstructor +public enum VirtualUserEnum { + + /** 正常用户 */ + NATURE(1, "正常用户"), + + /** 虚拟用户 */ + VIRTUAL(2, "虚拟状态"); + + /** 编码 */ + public final Integer code; + + /** 描述 */ + public final String desc; + + /** + * 编码匹配 用户类型 + * @param code 编码 + * @return 虚拟用户枚举 + */ + public static VirtualUserEnum valueOf(Integer code) { + if (code == null) { + return null; + } + for (VirtualUserEnum virtualUserEnum : VirtualUserEnum.values()) { + if (virtualUserEnum.code.equals(code)) { + return virtualUserEnum; + } + } + return null; + } + +} diff --git a/common-token-starter/src/main/java/com/mosty/common/util/DataPermissionConstant.java b/common-token-starter/src/main/java/com/mosty/common/util/DataPermissionConstant.java new file mode 100644 index 0000000..b16fa82 --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/util/DataPermissionConstant.java @@ -0,0 +1,27 @@ +package com.mosty.common.util; + +import lombok.AllArgsConstructor; + +/** + * 菜单类型枚举 + * @author kevin + * @date 2022/2/22 12:53 PM + * @since 1.0.0 + */ +@AllArgsConstructor +public class DataPermissionConstant { + + // 全部数据权限 + public static final String DATA_SCOPE_ALL = "1"; + // 市级数据权限 + public static final String DATA_SCOPE_CITY = "2"; + // 县级数据权限 + public static final String DATA_SCOPE_COUNTY = "3"; + // 部门及以下数据权限 + public static final String DATA_SCOPE_DEPT_AND_CHILD = "4"; + // 部门数据权限 + public static final String DATA_SCOPE_DEPT = "5"; + // 仅本人数据权限 + public static final String DATA_SCOPE_SELF = "99"; + +} diff --git a/common-token-starter/src/main/java/com/mosty/common/util/GeoHashKit.java b/common-token-starter/src/main/java/com/mosty/common/util/GeoHashKit.java new file mode 100644 index 0000000..c69fe1f --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/util/GeoHashKit.java @@ -0,0 +1,139 @@ +package com.mosty.common.util; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; + +/** + * @author dw + * @since 2022/7/19 + * 经纬度相关工具 + **/ +public class GeoHashKit { + private static final char[] _base32 = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'j', 'k', 'm', 'n', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'}; + + private final static Map _decodemap = new HashMap<>(); + + private static final int[] bits = {16, 8, 4, 2, 1}; + + static { + int sz = _base32.length; + for (int i = 0; i < sz; i++) { + _decodemap.put(_base32[i], i); + } + } + + + public static void main(String[] args) { + String gc1 = encode(new BigDecimal("39.916527"), new BigDecimal("116.397128")); + System.out.println(gc1); + BigDecimal[] gd1 = decode(gc1); + System.out.println(gd1[0] + ", " + gd1[1]); + } + + + /** + * 经纬度换算geoHash + * + * @param lat + * @param lon + * @return + */ + public static String encode(BigDecimal lat, BigDecimal lon) { + double latitude = lat.doubleValue(); + double longitude = lon.doubleValue(); + double[] lat_interval = {-90.0, 90.0}; + double[] lon_interval = {-180.0, 180.0}; + StringBuilder geohash = new StringBuilder(); + boolean is_even = true; + int bit = 0, ch = 0; + int precision = 12; + while (geohash.length() < precision) { + double mid; + if (is_even) { + mid = (lon_interval[0] + lon_interval[1]) / 2; + if (longitude > mid) { + ch |= bits[bit]; + lon_interval[0] = mid; + } else { + lon_interval[1] = mid; + } + } else { + mid = (lat_interval[0] + lat_interval[1]) / 2; + if (latitude > mid) { + ch |= bits[bit]; + lat_interval[0] = mid; + } else { + lat_interval[1] = mid; + } + } + is_even = !is_even; + if (bit < 4) { + bit++; + } else { + geohash.append(_base32[ch]); + bit = 0; + ch = 0; + } + } + return geohash.toString(); + } + + + public static BigDecimal[] decode(String geohash) { + double[] ge = decode_exactly(geohash); + double lat, lon, lat_err, lon_err; + lat = ge[0]; + lon = ge[1]; + lat_err = ge[2]; + lon_err = ge[3]; + double lat_precision = Math.max(1, Math.round(-Math.log10(lat_err))) - 1; + double lon_precision = Math.max(1, Math.round(-Math.log10(lon_err))) - 1; + lat = getPrecision(lat, lat_precision); + lon = getPrecision(lon, lon_precision); + return new BigDecimal[]{new BigDecimal(lat), new BigDecimal(lon)}; + } + + + public static double[] decode_exactly(String geohash) { + double[] lat_interval = {-90.0, 90.0}; + double[] lon_interval = {-180.0, 180.0}; + double lat_err = 90.0; + double lon_err = 180.0; + boolean is_even = true; + int sz = geohash.length(); + int bsz = bits.length; + double latitude, longitude; + for (int i = 0; i < sz; i++) { + int cd = _decodemap.get(geohash.charAt(i)); + for (int mask : bits) { + if (is_even) { + lon_err /= 2; + if ((cd & mask) != 0) { + lon_interval[0] = (lon_interval[0] + lon_interval[1]) / 2; + } else { + lon_interval[1] = (lon_interval[0] + lon_interval[1]) / 2; + } + } else { + lat_err /= 2; + if ((cd & mask) != 0) { + lat_interval[0] = (lat_interval[0] + lat_interval[1]) / 2; + } else { + lat_interval[1] = (lat_interval[0] + lat_interval[1]) / 2; + } + } + is_even = !is_even; + } + } + latitude = (lat_interval[0] + lat_interval[1]) / 2; + longitude = (lon_interval[0] + lon_interval[1]) / 2; + return new double[]{latitude, longitude, lat_err, lon_err}; + } + + + static double getPrecision(double x, double precision) { + double base = Math.pow(10, -precision); + double diff = x % base; + return x - diff; + } +} diff --git a/common-token-starter/src/main/java/com/mosty/common/util/ImageUtils.java b/common-token-starter/src/main/java/com/mosty/common/util/ImageUtils.java new file mode 100644 index 0000000..ce4f249 --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/util/ImageUtils.java @@ -0,0 +1,547 @@ +package com.mosty.common.util; + + +import org.apache.commons.lang3.StringUtils; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import sun.misc.BASE64Encoder; + +import javax.imageio.ImageIO; +import javax.imageio.ImageReader; +import javax.imageio.stream.ImageInputStream; +import javax.net.ssl.*; +import java.awt.*; +import java.awt.color.ColorSpace; +import java.awt.geom.AffineTransform; +import java.awt.image.*; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLConnection; +import java.util.Arrays; +import java.util.Iterator; + +/** + * 图片处理类
+ * + * @author Esacpe + * @version 2014-8-22 + */ + +public class ImageUtils { + + private static final Logger log = LoggerFactory.getLogger(ImageUtils.class); + + + + public static byte[] getImage(String imagePath) + { + InputStream is = getFile(imagePath); + try + { + return IOUtils.toByteArray(is); + } + catch (Exception e) + { + log.error("图片加载异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(is); + } + } + + public static InputStream getFile(String imagePath) + { + try + { + byte[] result = readFile(imagePath); + result = Arrays.copyOf(result, result.length); + return new ByteArrayInputStream(result); + } + catch (Exception e) + { + log.error("获取图片异常 {}", e); + } + return null; + } + + /** + * 读取文件为字节数据 + * + * @param url 地址 + * @return 字节数据 + */ + public static byte[] readFile(String url) + { + InputStream in = null; + try + { + // 网络地址 + URL urlObj = new URL(url); + URLConnection urlConnection = urlObj.openConnection(); + urlConnection.setConnectTimeout(30 * 1000); + urlConnection.setReadTimeout(60 * 1000); + urlConnection.setDoInput(true); + in = urlConnection.getInputStream(); + return IOUtils.toByteArray(in); + } + catch (Exception e) + { + log.error("访问文件异常 {}", e); + return null; + } + finally + { + IOUtils.closeQuietly(in); + } + } + + + /** + * 将图片缩放处理方法
+ * + * @param source 源图片对象 + * @param targetW 转换后的宽度 + * @param targetH 转换后的高度 + * @param sameScale 是否等比例缩放 + * @return BufferedImage + */ + public static BufferedImage resize(BufferedImage source, int targetW, + int targetH, boolean sameScale) { // targetW,targetH分别表示目标长和宽 + int type = source.getType(); + BufferedImage target = null; + double sx = (double) targetW / source.getWidth(); + double sy = (double) targetH / source.getHeight(); + if (sameScale) { // 需要等比例缩放 + if (sx > sy) { + sx = sy; + targetW = (int) (sx * source.getWidth()); + } else { + sy = sx; + targetH = (int) (sy * source.getHeight()); + } + } + if (type == BufferedImage.TYPE_CUSTOM) { // handmade + ColorModel cm = source.getColorModel(); + WritableRaster raster = cm.createCompatibleWritableRaster(targetW, + targetH); + boolean alphaPremultiplied = cm.isAlphaPremultiplied(); + target = new BufferedImage(cm, raster, alphaPremultiplied, null); + } else { + target = new BufferedImage(targetW, targetH, type); + } + Graphics2D g = target.createGraphics(); + // smoother than exlax: + g.setRenderingHint(RenderingHints.KEY_RENDERING, + RenderingHints.VALUE_RENDER_QUALITY); + g.drawRenderedImage(source, AffineTransform.getScaleInstance(sx, sy)); + g.dispose(); + return target; + } + + /** + * 将图片放大与缩小
+ * + * @param sourceByte 源图片的字节数组 + * @param width 转换后的宽度 + * @param height 转换后的高度 + * @param sameScale 是否等比例缩放 + * @return byte[] + */ + public static byte[] convertImageSize(byte[] sourceByte, int width, + int height, boolean sameScale) throws Exception { + byte[] returnValue = null; + if (sourceByte != null && sourceByte.length > 0) { + ByteArrayInputStream in = new ByteArrayInputStream(sourceByte); + // BufferedImage srcImage = getReadImage(in); + BufferedImage srcImage = null; + try { + srcImage = ImageIO.read(in); // RGB + } catch (Exception e) { + } + if (srcImage != null) { + BufferedImage srcImageTarget = resize(srcImage, width, height, + sameScale); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + boolean flag = ImageIO.write(srcImageTarget, "JPEG", out); + returnValue = out.toByteArray(); + } + } + return returnValue; + } + + /** + * 将图片放大与缩小后另存
+ * + * @param fromFileStr 来源文件名 + * @param saveToFileStr 目标文件名 + * @param width 转换后的宽度 + * @param height 转换后的高度 + * @param sameScale 是否等比例缩放 + */ + public static void saveImageAsJpg(String fromFileStr, String saveToFileStr, + int width, int height, boolean sameScale) throws Exception { + String imgType = "JPEG"; + if (fromFileStr.toLowerCase().endsWith(".png")) { + imgType = "PNG"; + } + File saveFile = new File(saveToFileStr); + File fromFile = new File(fromFileStr); + BufferedImage srcImage = getReadImage(fromFile); + if (srcImage != null) { + if (width > 0 || height > 0) { + srcImage = resize(srcImage, width, height, sameScale); + } + ImageIO.write(srcImage, imgType, saveFile); + } + } + + /** + * 根据文件取得bufferedImage对象(自动识别RGB与CMYK)
+ * + * @param file 来源文件名 + * @return BufferedImage + */ + private static BufferedImage getReadImage(File file) throws Exception { + BufferedImage srcImage = null; + ImageInputStream input = ImageIO.createImageInputStream(file); // 只能接收File或FileInputStream,ByteArrayInputStream无效 + Iterator readers = ImageIO.getImageReaders(input); + if (readers == null || !readers.hasNext()) { + throw new RuntimeException("1 No ImageReaders found"); + } + ImageReader reader = (ImageReader) readers.next(); + reader.setInput(input); + String format = reader.getFormatName(); + if ("JPEG".equalsIgnoreCase(format) || "JPG".equalsIgnoreCase(format)) { + try { + srcImage = ImageIO.read(file); // RGB + } catch (Exception e) { + Raster raster = reader.readRaster(0, null);// CMYK + srcImage = createJPEG4(raster); + } + input.close(); + } + return srcImage; + } + + /** + * RGB彩色空间转换为CMYK
+ * + * @param raster + * @return BufferedImage + */ + private static BufferedImage createJPEG4(Raster raster) { + int w = raster.getWidth(); + int h = raster.getHeight(); + byte[] rgb = new byte[w * h * 3]; // 彩色空间转换 + float[] Y = raster.getSamples(0, 0, w, h, 0, (float[]) null); + float[] Cb = raster.getSamples(0, 0, w, h, 1, (float[]) null); + float[] Cr = raster.getSamples(0, 0, w, h, 2, (float[]) null); + float[] K = raster.getSamples(0, 0, w, h, 3, (float[]) null); + for (int i = 0, imax = Y.length, base = 0; i < imax; i++, base += 3) { + float k = 220 - K[i], y = 255 - Y[i], cb = 255 - Cb[i], cr = 255 - Cr[i]; + double val = y + 1.402 * (cr - 128) - k; + val = (val - 128) * .65f + 128; + rgb[base] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff + : (byte) (val + 0.5); + val = y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128) - k; + val = (val - 128) * .65f + 128; + rgb[base + 1] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff + : (byte) (val + 0.5); + val = y + 1.772 * (cb - 128) - k; + val = (val - 128) * .65f + 128; + rgb[base + 2] = val < 0.0 ? (byte) 0 : val > 255.0 ? (byte) 0xff + : (byte) (val + 0.5); + } + raster = Raster.createInterleavedRaster(new DataBufferByte(rgb, + rgb.length), w, h, w * 3, 3, new int[]{0, 1, 2}, null); + ColorSpace cs = ColorSpace.getInstance(ColorSpace.CS_sRGB); + ColorModel cm = new ComponentColorModel(cs, false, true, + Transparency.OPAQUE, DataBuffer.TYPE_BYTE); + return new BufferedImage(cm, (WritableRaster) raster, true, null); + } + + public static byte[] encodeImageTobyte(String url) { + //打开链接 + try { + URL urls = new URL(url); + HttpURLConnection conn = null; + + conn = (HttpURLConnection) urls.openConnection(); + //设置请求方式为"GET" + conn.setRequestMethod("GET"); + //超时响应时间为5秒 + conn.setConnectTimeout(5 * 1000); + //通过输入流获取图片数据 + InputStream inStream = conn.getInputStream(); + //得到图片的二进制数据,以二进制封装得到数据,具有通用性 + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + //创建一个Buffer字符串 + byte[] buffer = new byte[1024]; + //每次读取的字符串长度,如果为-1,代表全部读取完毕 + int len = 0; + //使用一个输入流从buffer里把数据读取出来 + while ((len = inStream.read(buffer)) != -1) { + //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 + outStream.write(buffer, 0, len); + } + //关闭输入流 + inStream.close(); + byte[] data = outStream.toByteArray(); + return data;//返回Base64编码过的字节数组字符串 + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + /** + * 网络图片转成base64 https + * + * @param url + * @return + * @throws Exception + */ + public static byte[] encodeImageToByteHttps(String url) { + byte[] data = null; + try { + SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[]{new MyX509TrustManager()}, new java.security.SecureRandom()); + URL urls = new URL(url); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + //之后任何Https协议网站皆能正常访问,同第一种情况 + HttpURLConnection conn = null; + + conn = (HttpURLConnection) urls.openConnection(); + //设置请求方式为"GET" + conn.setRequestMethod("GET"); + //超时响应时间为5秒 + conn.setConnectTimeout(5 * 1000); + if (conn.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM) { + String location = conn.getHeaderField("Location"); + byte[] data1 = encodeImageToByteHttps(location.trim()); + if (null != data && data1.length > 0) { + return data1; + } + + } else { + //通过输入流获取图片数据 + InputStream inStream = conn.getInputStream(); + //得到图片的二进制数据,以二进制封装得到数据,具有通用性 + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + //创建一个Buffer字符串 + byte[] buffer = new byte[1024]; + //每次读取的字符串长度,如果为-1,代表全部读取完毕 + int len = 0; + //使用一个输入流从buffer里把数据读取出来 + while ((len = inStream.read(buffer)) != -1) { + //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 + outStream.write(buffer, 0, len); + } + //关闭输入流 + inStream.close(); + data = outStream.toByteArray(); + + } + } catch (Exception e) { + System.out.println("解析失败!------》" + e.getMessage()); + } + return data; + } + + + /** + * 网络图片转成base64 https + * + * @param url + * @return + * @throws Exception + */ + public static String encodeImageToBase64Https(String url) { + String base64 = null; + try { + SSLContext sslcontext = SSLContext.getInstance("SSL", "SunJSSE"); + sslcontext.init(null, new TrustManager[]{new MyX509TrustManager()}, new java.security.SecureRandom()); + URL urls = new URL(url); + HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { + public boolean verify(String s, SSLSession sslsession) { + System.out.println("WARNING: Hostname is not matched for cert."); + return true; + } + }; + HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); + HttpsURLConnection.setDefaultSSLSocketFactory(sslcontext.getSocketFactory()); + //之后任何Https协议网站皆能正常访问,同第一种情况 + HttpURLConnection conn = null; + + conn = (HttpURLConnection) urls.openConnection(); + //设置请求方式为"GET" + conn.setRequestMethod("GET"); + //超时响应时间为5秒 + conn.setConnectTimeout(5 * 1000); + if (conn.getResponseCode() == HttpURLConnection.HTTP_MOVED_PERM) { + String location = conn.getHeaderField("Location"); + String s = encodeImageToBase64Https(location.trim()); + if (StringUtils.isNotBlank(s)) { + return s; + } + + } else { + //通过输入流获取图片数据 + InputStream inStream = conn.getInputStream(); + //得到图片的二进制数据,以二进制封装得到数据,具有通用性 + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + //创建一个Buffer字符串 + byte[] buffer = new byte[1024]; + //每次读取的字符串长度,如果为-1,代表全部读取完毕 + int len = 0; + //使用一个输入流从buffer里把数据读取出来 + while ((len = inStream.read(buffer)) != -1) { + //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 + outStream.write(buffer, 0, len); + } + //关闭输入流 + inStream.close(); + byte[] data = outStream.toByteArray(); + //对字节数组Base64编码 + BASE64Encoder encoder = new BASE64Encoder(); + base64 = encoder.encode(data).replaceAll("[\\s*\t\n\r]", ""); + } + } catch (Exception e) { + System.out.println("解析失败!------》" + e.getMessage()); + } + return base64; + } + + /** + * 网络图片转成base64 + * + * @param url + * @return + * @throws Exception + */ + public static String encodeImageToBase64(String url) throws Exception { + //打开链接 + URL urls = new URL(url); + HttpURLConnection conn; + try { + conn = (HttpURLConnection) urls.openConnection(); + //设置请求方式为"GET" + conn.setRequestMethod("GET"); + //超时响应时间为5秒 + conn.setConnectTimeout(5 * 1000); + //通过输入流获取图片数据 + InputStream inStream = conn.getInputStream(); + //得到图片的二进制数据,以二进制封装得到数据,具有通用性 + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + //创建一个Buffer字符串 + byte[] buffer = new byte[1024]; + //每次读取的字符串长度,如果为-1,代表全部读取完毕 + int len = 0; + //使用一个输入流从buffer里把数据读取出来 + while ((len = inStream.read(buffer)) != -1) { + //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 + outStream.write(buffer, 0, len); + } + //关闭输入流 + inStream.close(); + byte[] data = outStream.toByteArray(); + //对字节数组Base64编码 + BASE64Encoder encoder = new BASE64Encoder(); + return encoder.encode(data).replaceAll("[\\s*\t\n\r]", ""); + } catch (IOException e) { + e.printStackTrace(); + throw new Exception("解析失败!"); + } + } + + public static String ImageToBase64(String imgPath) { + byte[] data = null; + try { + InputStream in = new FileInputStream(imgPath); + data = new byte[in.available()]; + in.read(data); + in.close(); + } catch (Exception e) { + e.printStackTrace(); + } +// return StringUtils.replaceBlank(StringUtils.getByteToBase64(data)); + return ""; + } + + /** + * 网络图片转成base64 + * + * @param url + * @return + * @throws Exception + */ + public static byte[] encodeImageToByte(String url) throws Exception { + //打开链接 + URL urls = new URL(url); + HttpURLConnection conn = null; + try { + conn = (HttpURLConnection) urls.openConnection(); + //设置请求方式为"GET" + conn.setRequestMethod("GET"); + //超时响应时间为5秒 + conn.setConnectTimeout(5 * 1000); + //通过输入流获取图片数据 + InputStream inStream = conn.getInputStream(); + //得到图片的二进制数据,以二进制封装得到数据,具有通用性 + ByteArrayOutputStream outStream = new ByteArrayOutputStream(); + //创建一个Buffer字符串 + byte[] buffer = new byte[1024]; + //每次读取的字符串长度,如果为-1,代表全部读取完毕 + int len = 0; + //使用一个输入流从buffer里把数据读取出来 + while ((len = inStream.read(buffer)) != -1) { + //用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度 + outStream.write(buffer, 0, len); + } + //关闭输入流 + inStream.close(); + byte[] data = outStream.toByteArray(); + return data; + } catch (IOException e) { + e.printStackTrace(); + throw new Exception("解析失败!"); + } + } + + + + + public static void main(String argv[]) throws Exception{ +// ImageUtils.saveImageAsJpg("C:/test.jpg", "c:/test2.jpg", 179, 220, +// true); + + // String s = ImageUtils.ImageToBase64("C:\\Users\\admin\\Desktop\\ryxp.jpg"); +// System.out.println(s); +// String str = "normal://repository-builder/20190628/ehlZxEcjZp09UubZQugxug==@11"; +// //编码加密 +// String encodeStr = Base64.getEncoder().encodeToString(str.getBytes("UTF-8")); +// System.out.println("加密后的字符串为:" + encodeStr); +// //解码解密 +// String decoderStr = new String(Base64.getDecoder().decode(encodeStr), StandardCharsets.UTF_8); // +// // 推荐使用StandardCharsets类指定 +// System.out.println("解密后的字符串为" + decoderStr); + + + + String tp="http://10.64.201.128:7266/xlpcAdminNew/requestservice/czrk/ryxp.jpg?sfzh=510502195403065021"; + String s = ImageUtils.encodeImageToBase64(tp); + System.out.println(s); + } +} diff --git a/common-token-starter/src/main/java/com/mosty/common/util/JtsUtils.java b/common-token-starter/src/main/java/com/mosty/common/util/JtsUtils.java new file mode 100644 index 0000000..b20bfce --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/util/JtsUtils.java @@ -0,0 +1,206 @@ +package com.mosty.common.util; + +import com.vividsolutions.jts.geom.*; +import com.vividsolutions.jts.linearref.LengthIndexedLine; + +import java.math.BigDecimal; +import java.text.DecimalFormat; +import java.util.ArrayList; +import java.util.List; + +public class JtsUtils { + private static final double EARTH_RADIUS = 6378137; + public static GeometryFactory factory = new GeometryFactory(new PrecisionModel(100000000000d)); + private static final DecimalFormat df = new DecimalFormat("0.00000000000"); + private static final DecimalFormat format = new DecimalFormat("0.0000"); + + public static String toEwkt(Geometry geom) { + if (geom == null) { + return null; + } + String type = geom.getGeometryType().toUpperCase(); + switch (type) { + case "POINT": { + Coordinate coor = geom.getCoordinate(); + return "POINT(" + formatCoordinate(coor) + ")"; + } + case "MULTIPOINT": { + return coordinateToEwkt("MULTIPOINT(", geom.getCoordinates(), ")"); + } + case "LINESTRING": { + return coordinateToEwkt("LINESTRING(", geom.getCoordinates(), ")"); + } + case "POLYGON": { + return coordinateToEwkt("POLYGON((", geom.getCoordinates(), "))"); + } + case "MULTILINESTRING": { + StringBuffer sb = new StringBuffer(); + sb.append("MULTILINESTRING("); + sb.append(multiGeometryFormat(geom)); + sb.append(")"); + return sb.toString(); + } + case "MULTIPOLYGON": { + StringBuffer sb = new StringBuffer(); + sb.append("MULTIPOLYGON("); + sb.append(multiGeometryFormat(geom)); + sb.append(")"); + return sb.toString(); + } + case "GEOMETRYCOLLECTION": { + StringBuffer sb = new StringBuffer(); + int num = geom.getNumGeometries(); + sb.append("GEOMETRYCOLLECTION("); + for (int j = 0; j < num; j++) { + Geometry element = geom.getGeometryN(j); + String subType = element.getGeometryType().toUpperCase(); + if ("POINT".equals(subType)) { + sb.append("POINT(" + formatCoordinate(element.getCoordinate()) + ")"); + } else if ("LINESTRING".equals(subType)) { + sb.append(coordinateToEwkt("LINESTRING(", element.getCoordinates(), ")")); + } else if ("POLYGON".equals(subType)) { + sb.append(coordinateToEwkt("POLYGON((", element.getCoordinates(), "))")); + } + if (j < num - 1) { + sb.append(","); + } + } + sb.append(")"); + return sb.toString(); + } + } + return null; + } + + private static String formatCoordinate(Coordinate coordinate) { + return df.format(coordinate.x) + " " + df.format(coordinate.y); + } + + public static String coordinateToEwkt(String prefix, Coordinate[] coordinates, String suffix) { + StringBuffer sb = new StringBuffer(); + sb.append(prefix); + boolean append = false; + for (Coordinate coordinate : coordinates) { + if (append) { + sb.append(","); + } + sb.append(formatCoordinate(coordinate)); + append = true; + } + sb.append(suffix); + return sb.toString(); + } + + public static String multiGeometryFormat(Geometry geom) { + StringBuffer sb = new StringBuffer(); + int num = geom.getNumGeometries(); + for (int i = 0; i < num; i++) { + Geometry g = geom.getGeometryN(i); + sb.append(coordinateToEwkt("((", g.getCoordinates(), "))")); + if (i < num - 1) { + sb.append(","); + } + } + return sb.toString(); + } + + /** + * 获取两组成的线的几何中心 + * + * @param s 起始点 + * @param e 结束点 + * @return + */ + public static Coordinate getCentroid(Coordinate s, Coordinate e) {// 获取两点组成的线的图心 + if (s.x == e.x && s.y == e.y) { + return s; + } + LineString ls = factory.createLineString(new Coordinate[]{s, e}); + Point cp = ls.getCentroid(); + return cp.getCoordinate(); + } + + /** + * 获取多个离散几何点的几何中心 + * + * @param coors + * @return + */ + public static Coordinate getCentroid(Coordinate[] coors) {// 获取多个离散点的图心 + MultiPoint mp = factory.createMultiPoint(coors); + return mp.getCentroid().getCoordinate(); + } + + /** + * 获取面 + * + * @param list + * @return + */ + public static Polygon getPolygon(List list) { + Coordinate[] coors = new Coordinate[list.size()]; + for (int i = 0; i < list.size(); i++) { + BigDecimal[] item = list.get(i); + Coordinate coor = new Coordinate(); + coor.x = item[0].doubleValue(); + coor.y = item[1].doubleValue(); + coors[i] = coor; + } + return factory.createPolygon(coors); + } + + /** + * 获取线 + * + * @param list [[x,y],[x1,y1],[x2,y2]....] + * @return + */ + public static LineString createLine(List list) { + Coordinate[] coors = new Coordinate[list.size() - 1]; + for (int i = 0; i < list.size(); i++) { + BigDecimal[] item = list.get(i); + Coordinate coor = new Coordinate(); + coor.x = item[0].doubleValue(); + coor.y = item[1].doubleValue(); + coors[i] = coor; + } + return factory.createLineString(coors); + } + + /** + * 获取点 + * + * @param x + * @param y + * @return + */ + public static Point getPoint(BigDecimal x, BigDecimal y) { + Coordinate coor = new Coordinate(x.doubleValue(), y.doubleValue()); + return factory.createPoint(coor); + } + + // 解析面类型为经纬度数组 + public static List decodePolygon(Polygon pl) { + if (pl != null) { + List list = new ArrayList<>(); + Coordinate[] coors = pl.getCoordinates(); + if (coors.length > 0) { + for (Coordinate coor : coors) { + BigDecimal[] temp = new BigDecimal[2]; + temp[0] = new BigDecimal(coor.x); + temp[1] = new BigDecimal(coor.y); + list.add(temp); + } + } + return list; + } + return null; + } + + public static Coordinate getCenter(LineString line) { + LengthIndexedLine indexedLine = new LengthIndexedLine(line); + double[] index = indexedLine.indicesOf(line); + Coordinate mid = indexedLine.extractPoint((index[0] + index[1]) / 2); + return mid; + } +} diff --git a/common-token-starter/src/main/java/com/mosty/common/util/MyX509TrustManager.java b/common-token-starter/src/main/java/com/mosty/common/util/MyX509TrustManager.java new file mode 100644 index 0000000..7e6c36f --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/util/MyX509TrustManager.java @@ -0,0 +1,22 @@ +package com.mosty.common.util; + + +import javax.net.ssl.X509TrustManager; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +public class MyX509TrustManager implements X509TrustManager { + + // 检查客户端证书 + public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + // 检查服务器端证书 + public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException { + } + + // 返回受信任的X509证书数组 + public X509Certificate[] getAcceptedIssuers() { + return null; + } +} diff --git a/common-token-starter/src/main/java/com/mosty/common/util/PermissionsUtil.java b/common-token-starter/src/main/java/com/mosty/common/util/PermissionsUtil.java new file mode 100644 index 0000000..d94a6d0 --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/util/PermissionsUtil.java @@ -0,0 +1,106 @@ +package com.mosty.common.util; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.mosty.common.base.util.StringUtils; +import com.mosty.common.token.DeptInfo; +import com.mosty.common.token.UserInfo; + +import java.util.Arrays; + +/** + * 数据权限获取工具 + */ +public class PermissionsUtil { + + // 根据组织机构ID获取查询权限 + public static void queryWrapperUtilByDeptInfo(QueryWrapper queryWrapper, DeptInfo deptInfo) { + if (deptInfo != null && deptInfo.getPermissionsLevel() != null) { + String level = deptInfo.getPermissionsLevel(); + if ("1".equals(level) || "2".equals(level)) { + // do nothing + } else if ("3".equals(level)) { + queryWrapper.eq("sssgajid", deptInfo.getSssgajid()); + } else if ("4".equals(level)) { + queryWrapper.eq("ssxgajid", deptInfo.getSsxgajid()); + } else if ("5".equals(level)) { + if (StringUtils.isNotEmpty(deptInfo.getIds())) { + String[] ids = deptInfo.getIds().split(","); + queryWrapper.in("ssbmid", Arrays.asList(ids)); + } + } else if ("6".equals(level)) { + queryWrapper.eq("ssbmid", deptInfo.getSsbmid()); + } + } + } + + // 根据组织机构ID获取查询权限 + public static void queryWrapperUtil(QueryWrapper queryWrapper, UserInfo userInfo) { + if (userInfo != null && userInfo.getUserPermissionsInfo() != null) { + String level = userInfo.getUserPermissionsInfo().getPermissionsLevel(); + if ("1".equals(level) || "2".equals(level)) { + // do nothing + } else if ("3".equals(level)) { + queryWrapper.eq("sssgajid", userInfo.getDszDeptId()); + } else if ("4".equals(level)) { + queryWrapper.eq("ssxgajid", userInfo.getFxjDeptId()); + } else if ("5".equals(level)) { + if (userInfo.getUserPermissionsInfo() != null + && StringUtils.isNotEmpty(userInfo.getUserPermissionsInfo().getIds())) { + String[] ids = userInfo.getUserPermissionsInfo().getIds().split(","); + queryWrapper.in("ssbmid", Arrays.asList(ids)); + } + } else if ("6".equals(level)) { + queryWrapper.eq("ssbmid", userInfo.getDeptId()); + } + } + } + + // 根据组织机构编码获取查询权限 + public static void queryWrapperUtilByCode(QueryWrapper queryWrapper, UserInfo userInfo) { + if (userInfo != null && userInfo.getUserPermissionsInfo() != null) { + String level = userInfo.getUserPermissionsInfo().getPermissionsLevel(); + if ("1".equals(level) || "2".equals(level)) { + // do nothing + } else if ("3".equals(level)) { + queryWrapper.eq("sssgajdm", userInfo.getDszDeptCode()); + } else if ("4".equals(level)) { + queryWrapper.eq("ssxgajdm", userInfo.getFxjDeptCode()); + } else if ("5".equals(level)) { + String[] orgcodes = userInfo.getUserPermissionsInfo().getOrgcodes().split(","); + queryWrapper.in("ssbmdm", Arrays.asList(orgcodes)); + } else if ("6".equals(level)) { + queryWrapper.eq("ssbmdm", userInfo.getDeptId()); + } + } + } + + // 表别名(使用ssbmid) + public static String createSql(String tableAlias, UserInfo userInfo) { + String dataPermissionSql = ""; + if (userInfo != null && userInfo.userPermissionsInfo != null && !StringUtils.isEmpty(userInfo.userPermissionsInfo.getPermissionsSql())) { + String sql = userInfo.userPermissionsInfo.getPermissionsSql().replaceAll("'", "'"); + if (StringUtils.isEmpty(tableAlias)) { + dataPermissionSql = sql.replaceAll("alias.", ""); + } else { + dataPermissionSql = sql.replaceAll("alias", tableAlias); + } + } + return dataPermissionSql; + } + + // 表别名(使用ssbmdm) + public static String createSqlOfCode(String tableAlias, UserInfo userInfo) { + String dataPermissionSql = ""; + if (userInfo != null && userInfo.userPermissionsInfo != null && + !StringUtils.isEmpty(userInfo.userPermissionsInfo.getPermissionsSqlCode())) { + String sql = userInfo.userPermissionsInfo.getPermissionsSqlCode().replaceAll("'", "'"); + if (StringUtils.isEmpty(tableAlias)) { + dataPermissionSql = sql.replaceAll("alias.", ""); + } else { + dataPermissionSql = sql.replaceAll("alias", tableAlias); + } + } + return dataPermissionSql; + } +} diff --git a/common-token-starter/src/main/java/com/mosty/common/util/UUIDGenerator.java b/common-token-starter/src/main/java/com/mosty/common/util/UUIDGenerator.java new file mode 100644 index 0000000..c24cc39 --- /dev/null +++ b/common-token-starter/src/main/java/com/mosty/common/util/UUIDGenerator.java @@ -0,0 +1,41 @@ +package com.mosty.common.util; + +import java.util.UUID; + +public class UUIDGenerator { + + /** + * 获取UUID + * @return + */ + public static String getUUID() { + UUID uuid = UUID.randomUUID(); + String str = uuid.toString(); + // 去掉"-"符号 + str = str.replace("-", ""); + return str; + } + + /** + * 获得指定数量的UUID + * @param number 指定数量 + * @return + */ + public static String[] getUUID(int number) { + if (number < 1) { + return null; + } + String[] ss = new String[number]; + for (int i = 0; i < number; i++) { + ss[i] = getUUID(); + } + return ss; + } + + public static void main(String[] args) { + String[] ss = getUUID(10); + for (int i = 0; i < ss.length; i++) { + System.out.println("ss[" + i + "]=====" + getUUID()); + } + } +} diff --git a/common-token-starter/target/classes/com/mosty/common/token/DeptInfo.class b/common-token-starter/target/classes/com/mosty/common/token/DeptInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..7f68288907b774a63a6698480d3d20108ae089a5 GIT binary patch literal 7141 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 literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/token/JWTUtil.class b/common-token-starter/target/classes/com/mosty/common/token/JWTUtil.class new file mode 100644 index 0000000000000000000000000000000000000000..7ca2df7152b71583a92f885e554b5798158893e8 GIT binary patch literal 4745 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 literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/token/JwtSysUser.class b/common-token-starter/target/classes/com/mosty/common/token/JwtSysUser.class new file mode 100644 index 0000000000000000000000000000000000000000..accc10e4cb5fbb78f0819c4d602379523c1b0194 GIT binary patch literal 511 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 literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/token/UserInfo.class b/common-token-starter/target/classes/com/mosty/common/token/UserInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..748279675cfc2b1668882513b531759f463b54d8 GIT binary patch literal 10784 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 Qna-*$uaM7ayo#Cs04=@taR2}S literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/token/UserPermissionsInfo.class b/common-token-starter/target/classes/com/mosty/common/token/UserPermissionsInfo.class new file mode 100644 index 0000000000000000000000000000000000000000..ac80a0235c8dc4e36cac2354dd8a78cc72d701d9 GIT binary patch literal 3956 zcmbVO+ix7@75{y^bMx*xw%4(f32tM80q@#oTW&4uBoJ}|({*l!kOXKLuLpaQ-5qCV z)-+OIs#fLF7y4AS5)YLSc?lAT+DIg7X&*r1AK(ut3gwA^fZOkzZ|q&~j)bXXpE+~R z@0>li?|k#=w;%o!z=OEf2Lr#B(`W99#T(!`&5LgJMtR;bU6Keu#Zz&MSS1vniPO0WJmP-p^(`zix3fN~` zjnJ#R=e)pMthq-T4L@{3&u`G6Q1Sdy@UpYK>^4hITT?o+>dpI0ZtZl_Uv-<|HTu!l zoLb8j7`grC@4x)(8~^*)E4OdHb^Fb~e|~c#`f~$oxBGe_ZRH>x*1aH*5mekY zw(Q)kY9b?Y^OT^$w+SBW1|_=Pi-$sky)drJl8 zz8!Rwk@NtU>I53gZa62awR^IVR4+}L4ph8`d$Ltubem5*tedQ^Uv+BdoTew=W1$wV zc=R=0srvO&-4DWRC31DYQ40MlZlm-};5JXU6P|0l9NV)lnOsGHu~y_jc*CDZI`OpdSr2I?$wr4V~s{SV>`8Y*{z1Ng^L2h z-#)pqiWBFDD{fQ3k~N-)hO93VDZW1vw+CyN(zOL65ujr(;>wOHV6S4h+aOA8cMm)g z?@0iwjQ1uPC{_PL=v1%FJFC(7a2-Ua*Qz>=X)q0SL=d5anNgc;bCr+$-+5-7dm?uuaw>i z`~M`;{{dyX=sJy{bd(z*Y__VQ-;DQ;=LS42nFYVqthy&Wc?$O?oT&Tc+RNb%jOB2r zBzH-2w;t1Y?B9M0oH za-5T#;X^sRjNfntOpk9i?~uUo^mupsC>`1+WdkW2>6XbBQZ5QPJd2{hU^^~#lGs#d zb=7Sw3Ctw4vv&!`iOjN=25%TZM@kkK0zctfmd~H^e}8~+Dp>Gd#Q`eVgkHr26>Lne z;vOp4tX{<=1}S7iNT>MoB|e1=s`w9xcgdtMO=?8KQOuCfDFE&x806VQ(r)8ax3QgQ z%-$y$r@M{E5{)@C3C3Et@%}_(&RT-8-fes!(fC0;6dTX7LMhh4EKaRM6uZp_BJ)uN ziAzRs+;D-1lO3gY>_`oWz%P;=rFZN|4V1tylO1V0cBBSS;E`lU`i>o`ffaI7sA7wc zSjT=A`?IOy+t9TeQ~!qXH|XgbQy;;YpDu2|j9$rDC#Olu+RP`&+S` zInwXoF>)H7z#BM1PUk*-9gmYUP{S1*C1;`u7stq1_%lx6IJrLjg_bACWw61u^8~pp zZgEhbB$vY+V>^PpX?=}dCZ75Rqb7dEKTCXry^8JoVU~gM28fT&BYeuEqsunR+&gzo z=fTmpa@U!$%w5P^Lb(y2)6Syxp9W_SYKNlMj}6YQu<_R5)ODCM8`$-tlxNDCRM=Xq zvE(=?Rko~0Do#RVWZC+rDpxilm9eGbd?>5_vKgs38nKlbsm78Uc~*rPCzHmjIEB+p zLdPF*hFprJ{~gXU!8F(V3Kqy|On4qolhbj5m*g|#420N&bL7mZE&oO4I|?+mMF_S6 zLVQOT?e~-vj6mN6Y+|(Sq8Mg$z}m=eX$&^EgWLE7MQmdAn6#~ubu?s|c>k)7V~wSf zmsI5@1}=Pn!Tit$^0M)KULEw3!Q+VNfOO6xh literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/token/VirtualUserEnum.class b/common-token-starter/target/classes/com/mosty/common/token/VirtualUserEnum.class new file mode 100644 index 0000000000000000000000000000000000000000..09c73c552af14bd4daa9bf4f8b8c21674c620b86 GIT binary patch literal 1779 zcmb7E-*4Mg6#i~<6Q`-ytZCORqaE$m4JTm@8y!E|v^10s0$DpXZKQ2au4jt3#2&U& zi8qjVK=6db%XmS82Y8uOI@U%YroAEYcRL3u(N9R~3vZcrA?~yq+d-hF50OC}WPXd47B&g<(b(Qm8QJO$HZJ7)jwR zo-Qf4D3DyPtgWvu31~ILX_Z=z=YLe9S-QFx!ZQtB9U82eBre_FbBa3z4wd_p}G1;ip)|cu6`D+JH zoZQlzZPODdYR~eTTntoZYL;y-w_6*gyQXh6Nw*TjTX|ogtUawVe{f;hnq%nAhVEJ% zIE*fBy+ujpqM>{4JVWfv){_koI8^s_90gNkiCzV2I&O(9Qq6KgCCm_}8+jdujj9PAjVm_Sv<7*41-ien1iRq-BbDl}YDk;8E&EDNancfR|x z(|P#S5Bs0(@oHYhFpki|U$?*B|Kgj6pYQH}{E3PY#s(fABQBIYF`ACe!nJ(Fgq4jO zrr}d@7ozQ1Z0epj8=>`D8-c<$9r)C|A1`Si?uL_Jr@!sa*{)}kV zsJh-ZSvW@@nIZacB^GjAGC(7hNys2u7K~&RaQHa4fSKrHMCOLNy;WQx};Y(sCXnd*g z8xmr>gJi9Ee=a^hHu^2bieu+zWKRABrLc?CZ6tGY`_s7i{+~Yt=ZOb-PC%jgI8{DD z8c)$in8a!NX*8b-?jR3hglBMuypWtNbmIk@XCRZ0kWvsA;@ICLCdONag0sBKG_t&G zp*XsSzQWmiq$MZsA^jtvPZv5)d}5;zn9eh{y^FE&62;)X7jc%xK{8>A{-tY(c{u8k z#uRBg7kYD*>fvkV7sxBw{OH0E*5Xb*hYa458Ykk&t)q{!{d>up)N>Z^9+Cpo=Q`y!~SMq>lEBLWI2_F0a zekgHL6eD=?Fthvn@9fOZ?EA;-8-NpRXE284G*;4BB}|!>cBR`g8qI3AVp)Wu^&lRF z?g($7w^Sg#!8svk_+F@lr#iwJ+8Wjf`PfCH*1pxSPMD61jhlKTZxBi`*{n9(-Adi; z8rL<;)KLDNDmvD%`CDvNtt$;%gw%!fq`D-G?d*04NyERhInYU@gu>6f8@&g+uLyL=cEonfcEWZ_NSvLaj0FE3kU|MbjDrWl zlt7wUi}3_=CdQM@*%;@Tr(&FEF2s16GxHEJ!+w@4=pzQk_g+BHqmpx@XAt{I%(KsO Q2nS#Ri@frevrk~@6BUqwc>n+a literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/util/GeoHashKit.class b/common-token-starter/target/classes/com/mosty/common/util/GeoHashKit.class new file mode 100644 index 0000000000000000000000000000000000000000..168e9a3bd5b5637f536f1cb8894fca136d67461c GIT binary patch literal 4425 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 H$lL!9&~3iK literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/util/ImageUtils$1.class b/common-token-starter/target/classes/com/mosty/common/util/ImageUtils$1.class new file mode 100644 index 0000000000000000000000000000000000000000..91123ee4326f1c1eeed56cac15fcc955c4072c4b GIT binary patch literal 888 zcmah{U2oGc6g_Ucr3-;VM+*$t!YI%dSU}>5!X!2Us}u?%qe$?Sre5nQv8TkH=zrn` z9zf!OAHa`7T&F|T#Lyze_ru5M9^dOVdA4?NsmRw;B=+r>2@4u z8K3Qr($o);5GgI@G$h^P>#Gnr$UZ8 zdFGQRx%RRw_JY6fX>-Jtgc6aEyGEBHDGFK|?CZUeT zeCY0})QxzmH!QRr+{HbH_0!wKaDLvB*Mof?X@*skn)l>y#lC5y;3HI8aSwWxQ-1EMJzeE;h}~)L*vb(SDjYp*?oV9t}DZY`$GFt89xb4 zG~xq)Po;juQ?u!y;o&B3F{~di55wu1Brp2=JTeSxHZ{}acg3ESQSg+(KaQATh0BO0 zoZWXXAJduBLC4^ccKkX=<%pAHCUOVg$iEM5DkrzhY3x3IlIf> zX$I%Of?^s}WnSeT?qGplE&=Ho=jbQpDRRjR$TG4Ejjv#zvh5SJS}@oI9{JuBfRiXu zM0(;3t@d!6$ns>}&&ZYYUr;D~q$mf=;Mzj$J&No@#^O(rM=W-~jOC2k#aUD`rgPcp U^H?EUzy+-0RK~=peft%E0SN)$MgRZ+ literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/util/ImageUtils.class b/common-token-starter/target/classes/com/mosty/common/util/ImageUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..7113b4de72c3fe6f78a64f67ef0851469d7890f0 GIT binary patch literal 13823 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 literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/util/JtsUtils.class b/common-token-starter/target/classes/com/mosty/common/util/JtsUtils.class new file mode 100644 index 0000000000000000000000000000000000000000..6909896245fe4013ef36e937885ccca2ed402b8e GIT binary patch literal 7940 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 U%YFs3c_oXBC7hk+*oD*o2c;4iR{#J2 literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/util/MyX509TrustManager.class b/common-token-starter/target/classes/com/mosty/common/util/MyX509TrustManager.class new file mode 100644 index 0000000000000000000000000000000000000000..709a4072a867370725029dc6459216abdad02dd8 GIT binary patch literal 897 zcmbVKOHWfl6h6}j7itwOAmD?*f>?-QSik~nG^D}Ar0AjzF<~{G9@@d%xnyQ8q5le2 zCNB5^{3zo&w}@9=*tnSUnsdJUo$t==_ir}E z^H@NsneI;tB}rPfNcijS2uoZl5oVPL#~t(H!Pa+vrqk`xUSE7M?N zc{KXGx3k}IsSiiWsy?~~0qFtiFU{DX4cQg;1iY@Fw9eFpk{)&H4C9~+lE<4Am{X%w zz{a>IR<_!`=t)Q*1^hA;d7$jivjCUpvOaRgkDmKJdquucfd`Zc${$h}55J>RqmN)V1EY1}F@e-* pnEA}pS@<{X+<(9>!V>~#wy((ZRt0gzHn-_q%`^-xOtAG;M*hh#O9lp-f3KX=Z{HH$+9n z1$PB^QE~gA=XfGV&(Uvu@F#iH<8x;wVcHZ0mz;Lqd+&SaF3(+(U;g;vCje{kbrdVH zBZ{5arD7zC-PogIuZn#t?iT6(DDJ_%D(+Kpzwi&JI3VYPQ5Z<6NXsi36=oC%F)GT3 zR9K=h7R6y?qsU>GPY9fDB_z7`xOvS@09uYr} zs(4Jr<8pO8f+r$4p`dY{mABjt3hFz%_9~dM+0K{>T9Q`Y94h5fW^uQX%2J{y?X;2I zYZNWv1K|w!kmV@oNT%&vJZC%ZM4VL4&c{oxm5uK(i#f}2EIaS)A)ipNV7z1&C-xPM zLcuJGtbbyQS#Y=K584WhPR~xtuya<%F2!>bDZ{m#Lbl}4Y|-Q+pRrsq7x(PMcZRGb zYJ+g?!)88SagdPw>a7d|ZoM}-W*jl%StCChA90ITew4vAWX&UHR#KhjQVU0}VEw-e zRe_qRroHrU16MF>#5K}~2aSRUd<0J_m>mvCp#0we+~b%8(|tM(mM+7WwESK75NYZ-JjCu6wA zrKa>8wp5)DAM_)Oj@YGQ+T3PI+t0nE?)C6WX$=i=+!(=A8lJ{U1vr@s@_Safa7xHJlZr?`U`z??v#wh7WK`!-w+tNK6LqGdT?(ONivfrSRu) zQo|=A^sHxc3ZUUre5T>NTzxJPG_EiTw!@iFIy8KNFDWqu!=XOrp0gdK($;h(q*MytO_n+vxN5M>5 z8wu*fv7clmX?r^%AtC+4jijK?99MAbG~PoETZyMuR0+^;7M6hFZkP47q6Vjw;h6r; z^|6$FK*gx#4B771T)~}~fNU|rZ{pzGt{scyEjS@sGSej;4pK#_~XtDj8B<$I^HB)E#G zEnKL7{O_HWEPM^3e&~V#IQSo{1LCLe@xgfpV8lYUH3nLS0*FnOYHhuf~fc zgr(@^&nNjbLXoA)=S}3|Jh_(85c?j=wD;=oE z49Z^XzKB=4%c#4EQ*sRI^*v?GIEzR01|iO%@jME8qfgI?=@DwFWi;(OkNtYIDxOKP z=8OCFS-!ZPvgQkDIfJ-R`s_0148?T4_X1kWm`e-u^lN<8W{RoPCKe=>dM}j?Xd$g* zCR#BYbJ31AA~6r^a4oiCK1Q$r_hBJ_6kdk{7U5wm#$#B*FPZD{DwcZ?#F%D*7H-9D zv^pCna61x&imB7idY(dUz(xYIiF7j>enWc%eQj;AU+K3A{n#9UmIy#QN61095* zlj(Hv+0FLpVZyz*gK+L;BOPEJQ zJXZzs9Ja79As{24rs8wpw;;pr!}nV@YUXj=)|He@k?hbVax z+X+~*3RISF4tO2c%C4*cb-D`F>FI%5?gMoPt@$(lV*u2EzI>2a^>u%T8!qB@Im&3i zfE8!a8!&o@-dRT1P>j+uXzA5s`f~Dv=P|Qa?~V!C^9_^oM{6-6q<4_p$pPBM>W(nM z-Aq|h+h0v2#@jnNF!j_Pz+I%|GZ2Jd&ok+b(Tze=Ph roJh~rC9(`ET|Yqc2e>I7WVi;CNimr;lQEghq5mWq1w-^xhv7c~0367& literal 0 HcmV?d00001 diff --git a/common-token-starter/target/classes/com/mosty/common/util/UUIDGenerator.class b/common-token-starter/target/classes/com/mosty/common/util/UUIDGenerator.class new file mode 100644 index 0000000000000000000000000000000000000000..255731926b1fc7698edd9c288889317b1cc7fe03 GIT binary patch literal 1468 zcma)6OHEcZIha&&bW8wKXA*& zt-2_Tj{X3*{u7tZpnf;0ShUXA#kuF6bME=R^JqSQfBy-{M%t8oG7xB{|E|5=ib90sM> zt>UVVYbXkA`!nc5!>KIUY>85@KhSX9}9Vjs@PpNd;LZsU%?p8uH5CKfjrAKT?X zpeMxK7y>KxEqBSQMiVrCO>iTCQ%VM2G)vCfw`&!v%*~n0w+(0Zk>!`{rw!XJ+f)Ct zcifHkK0U7oc9pez4e}g_(m0-Zi)$2+fNfPtCSlcTw##)IZzs^&wZ9=+9p%Fu7pjd~ z^y0U>FYL=^IM!Q};1w>+Kqt5bjPTFd&wnxy2ZNBI+{T;9liPrmr#smFph+P|NLMaxExY5-_qF8uCdz8x{q|6dWH(&R{KswBu zp+8Q22)pP{@!K#=nj%El-9mUt1cly_Y;!XA=)S@zz%dViekXu8t^dcr+|M(ih zDIxVCev?3eE@Y|Y2t3HzhiDlj&~OMn%%nZoiappH7BGT+)FjCP?8gCu=XvXfqOK#M zVpM!1&lJW`Xz_a0;x(Dp){v5n3ZGUm{tns)Y`MP*-RN$jC)Y%;k)}eTluc}H!Uzd} zk*$vSX2=voPmn_o(I_7~4d93(qAo}+C%b;Q<@jA+Vvjx!>LLq7rX CM>+cd literal 0 HcmV?d00001 diff --git a/common-token-starter/target/common-token-starter-1.0.0-SNAPSHOT.jar b/common-token-starter/target/common-token-starter-1.0.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..6aa1563a518406caee4b0e49fc9a393136be27de GIT binary patch literal 37195 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

+
+
+
+
+ +
+ +
+
+
+