From ebdbdbeb415a79a3af968d56e1711fbfe67ae87c Mon Sep 17 00:00:00 2001 From: hongawen <83944980@qq.com> Date: Tue, 31 Mar 2026 19:35:21 +0800 Subject: [PATCH] =?UTF-8?q?1=E3=80=81=E7=BB=93=E6=9E=84=E8=B0=83=E6=95=B4?= =?UTF-8?q?=202=E3=80=81=E6=8A=BD=E8=B1=A1=E5=B7=A5=E5=8E=82=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + msgpush-dependencies/pom.xml | 721 ----------------- msgpush-framework/msgpush-common/pom.xml | 43 +- .../com/fhs/trans/service/AutoTransable.java | 2 - .../common/biz/infra/package-info.java | 4 - .../biz/system/dict/DictDataCommonApi.java | 2 +- .../biz/system/dict/dto/DictDataRespDTO.java | 2 +- .../system/logger/OperateLogCommonApi.java | 2 +- .../system/oauth2/OAuth2TokenCommonApi.java | 13 +- .../dto/OAuth2AccessTokenCheckRespDTO.java | 12 +- .../dto/OAuth2AccessTokenCreateReqDTO.java | 2 +- .../permission/PermissionCommonApi.java | 8 +- .../dto/DeptDataPermissionRespDTO.java | 28 - .../framework/common/core/ArrayValuable.java | 2 +- .../framework/common/enums/DocumentEnum.java | 5 - .../framework/common/enums/RpcConstants.java | 12 +- .../framework/common/enums/UserTypeEnum.java | 8 +- .../enums/GlobalErrorCodeConstants.java | 3 +- .../exception/util/ServiceExceptionUtil.java | 2 +- .../framework/common/package-info.java | 6 - .../framework/common/pojo/CommonResult.java | 2 +- .../framework/common/pojo/PageParam.java | 6 +- .../common/util/cache/CacheUtils.java | 2 +- .../util/collection/CollectionUtils.java | 2 +- .../common/util/collection/MapUtils.java | 46 +- .../common/util/date/LocalDateTimeUtils.java | 3 +- .../framework/common/util/io/IoUtils.java | 2 +- .../framework/common/util/json/JsonUtils.java | 53 +- .../common/util/number/NumberUtils.java | 2 +- .../common/util/object/BeanUtils.java | 2 +- .../common/util/object/PageUtils.java | 2 +- .../util/validation/ValidationUtils.java | 4 +- .../framework/common/validation/Mobile.java | 1 + .../common/validation/MobileValidator.java | 1 - .../common/validation/Telephone.java | 1 + .../common/validation/TelephoneValidator.java | 1 - .../util/collection/CollectionUtilsTest.java | 64 -- .../pom.xml | 10 +- .../framework/ip/core/utils/IPUtils.java | 2 +- .../msgpush/framework/ip/package-info.java | 11 - .../ip/core/utils/AreaUtilsTest.java | 36 - .../framework/ip/core/utils/IPUtilsTest.java | 47 -- .../msgpush-spring-boot-starter-env/pom.xml | 12 +- .../config/EnvEnvironmentPostProcessor.java | 2 - .../env/core/fegin/EnvLoadBalancerClient.java | 4 +- .../framework/env/core/package-info.java | 1 - .../msgpush/framework/env/package-info.java | 7 - .../msgpush-spring-boot-starter-excel/pom.xml | 7 +- .../core/annotations/ExcelColumnSelect.java | 2 +- .../excel/core/convert/AreaConvert.java | 2 +- .../function/ExcelColumnSelectFunction.java | 2 +- .../core/handler/SelectSheetWriteHandler.java | 2 +- .../core/util/DictFrameworkUtilsTest.java | 61 -- .../msgpush-spring-boot-starter-mq/pom.xml | 5 +- .../msgpush/framework/mq/package-info.java | 4 - .../AbstractRedisStreamMessageListener.java | 2 +- .../pom.xml | 5 +- .../MsgpushDataSourceAutoConfiguration.java | 2 +- .../core/filter/DruidAdRemoveFilter.java | 4 +- .../IdTypeEnvironmentPostProcessor.java | 6 +- .../MsgpushMybatisAutoConfiguration.java | 5 +- .../core/handler/DefaultDBFieldHandler.java | 4 + .../mybatis/core/mapper/BaseMapperX.java | 12 +- .../core/query/LambdaQueryWrapperX.java | 2 +- .../mybatis/core/query/MPJLambdaWrapperX.java | 9 +- .../mybatis/core/query/QueryWrapperX.java | 4 +- .../mybatis/core/util/JdbcUtils.java | 4 +- .../mybatis/core/util/MyBatisUtils.java | 6 +- .../MsgpushTranslateAutoConfiguration.java | 2 +- .../pom.xml | 6 +- .../MsgpushIdempotentConfiguration.java | 4 +- .../core/annotation/Idempotent.java | 2 +- .../config/MsgpushLock4jConfiguration.java | 2 +- .../core/DefaultLockFailureStrategy.java | 2 +- .../core/redis/RateLimiterRedisDAO.java | 5 +- .../signature/core/ApiSignatureTest.java | 74 -- .../msgpush-spring-boot-starter-redis/pom.xml | 5 +- .../config/MsgpushCacheAutoConfiguration.java | 2 +- .../msgpush/framework/redis/package-info.java | 4 - .../msgpush-spring-boot-starter-rpc/pom.xml | 12 +- .../msgpush/framework/rpc/package-info.java | 6 - .../pom.xml | 6 +- .../MsgpushOperateLogConfiguration.java | 6 +- .../core/service/LogRecordServiceImpl.java | 9 +- .../framework/operatelog/package-info.java | 2 +- .../config/AuthorizeRequestsCustomizer.java | 1 - .../MsgpushSecurityAutoConfiguration.java | 4 +- .../MsgpushSecurityRpcAutoConfiguration.java | 2 +- .../MsgpushWebSecurityConfigurerAdapter.java | 6 +- .../security/config/SecurityProperties.java | 4 +- .../framework/security/core/LoginUser.java | 30 - ...eadLocalSecurityContextHolderStrategy.java | 2 +- .../filter/TokenAuthenticationFilter.java | 67 +- .../core/handler/AccessDeniedHandlerImpl.java | 10 +- .../handler/AuthenticationEntryPointImpl.java | 9 +- .../service/SecurityFrameworkServiceImpl.java | 26 +- .../core/util/SecurityFrameworkUtils.java | 65 +- ...ot.autoconfigure.AutoConfiguration.imports | 2 +- .../msgpush-spring-boot-starter-test/pom.xml | 5 +- .../test/core/ut/BaseDbAndRedisUnitTest.java | 4 +- .../test/core/ut/BaseDbUnitTest.java | 6 +- .../msgpush/framework/test/package-info.java | 4 - .../msgpush-spring-boot-starter-web/pom.xml | 9 +- .../MsgpushApiLogAutoConfiguration.java | 4 +- .../MsgpushApiLogRpcAutoConfiguration.java | 4 +- .../apilog/core/enums/OperateTypeEnum.java | 2 +- .../core/filter/ApiAccessLogFilter.java | 6 +- .../interceptor/ApiAccessLogInterceptor.java | 72 +- .../core/base/annotation/DesensitizeBy.java | 4 +- .../StringDesensitizeSerializer.java | 4 +- .../regex/annotation/EmailDesensitize.java | 2 +- .../regex/annotation/RegexDesensitize.java | 2 +- .../annotation/BankCardDesensitize.java | 2 +- .../annotation/CarLicenseDesensitize.java | 2 +- .../annotation/ChineseNameDesensitize.java | 2 +- .../annotation/FixedPhoneDesensitize.java | 2 +- .../slider/annotation/IdCardDesensitize.java | 2 +- .../slider/annotation/MobileDesensitize.java | 2 +- .../annotation/PasswordDesensitize.java | 2 +- .../slider/annotation/SliderDesensitize.java | 2 +- .../encrypt/config/ApiEncryptProperties.java | 3 +- .../MsgpushApiEncryptAutoConfiguration.java | 6 +- .../encrypt/core/annotation/ApiEncrypt.java | 7 + .../core/filter/ApiDecryptRequestWrapper.java | 44 +- .../encrypt/core/filter/ApiEncryptFilter.java | 36 +- .../MsgpushJacksonAutoConfiguration.java | 8 +- .../njcn/msgpush/framework/package-info.java | 4 - .../MsgpushSwaggerAutoConfiguration.java | 74 +- .../swagger/config/SwaggerProperties.java | 3 +- .../config/MsgpushWebAutoConfiguration.java | 12 +- .../framework/web/config/WebProperties.java | 7 +- .../web/core/filter/ApiRequestFilter.java | 3 +- .../core/filter/CacheRequestBodyFilter.java | 4 +- .../framework/web/core/filter/DemoFilter.java | 35 - .../core/handler/GlobalExceptionHandler.java | 64 +- .../web/core/util/WebFrameworkUtils.java | 63 +- .../config/MsgpushXssAutoConfiguration.java | 1 - .../framework/xss/core/filter/XssFilter.java | 8 +- .../xss/core/filter/XssRequestWrapper.java | 2 +- .../core/json/XssStringJsonDeserializer.java | 6 +- ...ot.autoconfigure.AutoConfiguration.imports | 2 +- .../src/main/resources/banner.txt | 1 - .../desensitize/core/DesensitizeTest.java | 100 --- .../desensitize/core/annotation/Address.java | 30 - .../core/handler/AddressHandler.java | 19 - .../framework/encrypt/ApiEncryptTest.java | 86 -- .../pom.xml | 25 +- .../MsgpushWebSocketAutoConfiguration.java | 123 +-- .../websocket/config/WebSocketProperties.java | 12 +- .../handler/JsonWebSocketMessageHandler.java | 1 - .../core/message/JsonWebSocketMessage.java | 1 + .../sender/kafka/KafkaWebSocketMessage.java | 35 - .../kafka/KafkaWebSocketMessageConsumer.java | 28 - .../kafka/KafkaWebSocketMessageSender.java | 67 -- .../rabbitmq/RabbitMQWebSocketMessage.java | 37 - .../RabbitMQWebSocketMessageConsumer.java | 39 - .../RabbitMQWebSocketMessageSender.java | 62 -- .../sender/redis/RedisWebSocketMessage.java | 34 - .../redis/RedisWebSocketMessageConsumer.java | 23 - .../redis/RedisWebSocketMessageSender.java | 57 -- .../rocketmq/RocketMQWebSocketMessage.java | 35 - .../RocketMQWebSocketMessageConsumer.java | 30 - .../RocketMQWebSocketMessageSender.java | 61 -- .../core/util/WebSocketFrameworkUtils.java | 27 - .../framework/websocket/package-info.java | 4 - msgpush-framework/pom.xml | 26 +- msgpush-gateway/pom.xml | 8 +- .../filter/cors/CorsResponseHeaderFilter.java | 54 -- .../gateway/filter/grey/GrayLoadBalancer.java | 4 +- .../GrayReactiveLoadBalancerClientFilter.java | 4 +- .../filter/logging/AccessLogFilter.java | 58 +- .../gateway/filter/security/LoginUser.java | 23 - .../security/TokenAuthenticationFilter.java | 114 ++- .../handler/GlobalExceptionHandler.java | 30 +- .../GatewayJacksonAutoConfiguration.java | 10 +- .../gateway/util/WebFrameworkUtils.java | 44 +- .../src/main/resources/application-dev.yaml | 10 +- .../src/main/resources/application-local.yaml | 12 +- .../src/main/resources/application.yaml | 37 +- msgpush-gateway/src/main/resources/banner.txt | 1 - .../src/main/resources/logback-spring.xml | 11 - .../msgpush-module-infra-api/pom.xml | 47 -- .../module/infra/api/file/FileApi.java | 73 -- .../infra/api/file/dto/FileCreateReqDTO.java | 25 - .../module/infra/api/package-info.java | 4 - .../api/websocket/WebSocketSenderApi.java | 74 -- .../websocket/dto/WebSocketSendReqDTO.java | 26 - .../module/infra/enums/ApiConstants.java | 23 - .../module/infra/enums/DictTypeConstants.java | 22 - .../infra/enums/ErrorCodeConstants.java | 52 -- .../codegen/CodegenColumnHtmlTypeEnum.java | 29 - .../CodegenColumnListConditionEnum.java | 27 - .../enums/codegen/CodegenFrontTypeEnum.java | 35 - .../infra/enums/codegen/CodegenSceneEnum.java | 41 - .../codegen/CodegenTemplateTypeEnum.java | 53 -- .../enums/codegen/CodegenVOTypeEnum.java | 30 - .../module/infra/enums/package-info.java | 4 - .../module/infra/InfraServerApplication.java | 23 - .../module/infra/api/file/FileApiImpl.java | 31 - .../module/infra/api/package-info.java | 1 - .../api/websocket/WebSocketSenderApiImpl.java | 36 - .../admin/codegen/CodegenController.java | 160 ---- .../codegen/vo/CodegenCreateListReqVO.java | 21 - .../admin/codegen/vo/CodegenDetailRespVO.java | 20 - .../codegen/vo/CodegenPreviewRespVO.java | 16 - .../admin/codegen/vo/CodegenUpdateReqVO.java | 24 - .../vo/column/CodegenColumnRespVO.java | 69 -- .../vo/column/CodegenColumnSaveReqVO.java | 81 -- .../vo/table/CodegenTablePageReqVO.java | 29 - .../codegen/vo/table/CodegenTableRespVO.java | 72 -- .../vo/table/CodegenTableSaveReqVO.java | 100 --- .../codegen/vo/table/DatabaseTableRespVO.java | 16 - .../admin/db/DataSourceConfigController.java | 81 -- .../admin/db/vo/DataSourceConfigRespVO.java | 27 - .../db/vo/DataSourceConfigSaveReqVO.java | 31 - .../infra/controller/app/package-info.java | 4 - .../module/infra/controller/package-info.java | 6 - .../infra/convert/codegen/CodegenConvert.java | 68 -- .../module/infra/convert/package-info.java | 6 - .../dataobject/codegen/CodegenColumnDO.java | 133 ---- .../dataobject/codegen/CodegenTableDO.java | 155 ---- .../dal/dataobject/db/DataSourceConfigDO.java | 49 -- .../mysql/codegen/CodegenColumnMapper.java | 29 - .../dal/mysql/codegen/CodegenTableMapper.java | 39 - .../dal/mysql/db/DataSourceConfigMapper.java | 14 - .../codegen/config/CodegenConfiguration.java | 9 - .../codegen/config/CodegenProperties.java | 58 -- .../infra/framework/codegen/package-info.java | 4 - .../file/core/enums/FileStorageEnum.java | 55 -- .../module/infra/framework/package-info.java | 6 - .../rpc/config/RpcConfiguration.java | 9 - .../infra/framework/rpc/package-info.java | 4 - .../config/SecurityConfiguration.java | 43 - .../framework/security/core/package-info.java | 4 - .../infra/mq/consumer/package-info.java | 4 - .../module/infra/mq/message/package-info.java | 4 - .../infra/mq/producer/package-info.java | 4 - .../msgpush/module/infra/package-info.java | 9 - .../infra/service/codegen/CodegenService.java | 108 --- .../service/codegen/CodegenServiceImpl.java | 310 -------- .../service/codegen/inner/CodegenBuilder.java | 216 ----- .../service/codegen/inner/CodegenEngine.java | 679 ---------------- .../service/db/DataSourceConfigService.java | 60 -- .../db/DataSourceConfigServiceImpl.java | 111 --- .../service/db/DatabaseTableService.java | 33 - .../service/db/DatabaseTableServiceImpl.java | 77 -- .../src/main/resources/application-dev.yaml | 89 --- .../src/main/resources/application-local.yaml | 103 --- .../src/main/resources/application.yaml | 111 --- .../codegen/java/controller/controller.vm | 271 ------- .../codegen/java/controller/vo/listReqVO.vm | 45 -- .../codegen/java/controller/vo/pageReqVO.vm | 45 -- .../codegen/java/controller/vo/respVO.vm | 53 -- .../codegen/java/controller/vo/saveReqVO.vm | 64 -- .../src/main/resources/codegen/java/dal/do.vm | 103 --- .../main/resources/codegen/java/dal/do_sub.vm | 69 -- .../main/resources/codegen/java/dal/mapper.vm | 82 -- .../resources/codegen/java/dal/mapper.xml.vm | 12 - .../resources/codegen/java/dal/mapper_sub.vm | 63 -- .../resources/codegen/java/enums/errorcode.vm | 22 - .../resources/codegen/java/service/service.vm | 165 ---- .../codegen/java/service/serviceImpl.vm | 419 ---------- .../codegen/java/test/serviceTest.vm | 167 ---- .../src/main/resources/codegen/sql/h2.vm | 35 - .../src/main/resources/codegen/sql/sql.vm | 181 ----- .../main/resources/codegen/vue/api/api.js.vm | 160 ---- .../vue/views/components/form_sub_erp.vue.vm | 205 ----- .../views/components/form_sub_inner.vue.vm | 2 - .../views/components/form_sub_normal.vue.vm | 347 -------- .../vue/views/components/list_sub_erp.vue.vm | 210 ----- .../views/components/list_sub_inner.vue.vm | 4 - .../resources/codegen/vue/views/form.vue.vm | 320 -------- .../resources/codegen/vue/views/index.vue.vm | 386 --------- .../main/resources/codegen/vue3/api/api.ts.vm | 166 ---- .../vue3/views/components/form_sub_erp.vue.vm | 204 ----- .../views/components/form_sub_inner.vue.vm | 2 - .../views/components/form_sub_normal.vue.vm | 360 --------- .../vue3/views/components/list_sub_erp.vue.vm | 231 ------ .../views/components/list_sub_inner.vue.vm | 4 - .../resources/codegen/vue3/views/form.vue.vm | 300 ------- .../resources/codegen/vue3/views/index.vue.vm | 424 ---------- .../components/search-form.vue.vm | 297 ------- .../views/detail/index.vue.vm | 151 ---- .../vue3_admin_uniapp/views/form/index.vue.vm | 253 ------ .../vue3_admin_uniapp/views/index.vue.vm | 211 ----- .../resources/codegen/vue3_vben/api/api.ts.vm | 32 - .../codegen/vue3_vben/views/data.ts.vm | 260 ------ .../codegen/vue3_vben/views/form.vue.vm | 58 -- .../codegen/vue3_vben/views/index.vue.vm | 92 --- .../vue3_vben5_antd/general/api/api.ts.vm | 167 ---- .../vue3_vben5_antd/general/views/form.vue.vm | 325 -------- .../general/views/index.vue.vm | 483 ------------ .../general/views/modules/form_sub_erp.vue.vm | 213 ----- .../views/modules/form_sub_inner.vue.vm | 2 - .../views/modules/form_sub_normal.vue.vm | 347 -------- .../general/views/modules/list_sub_erp.vue.vm | 424 ---------- .../views/modules/list_sub_inner.vue.vm | 4 - .../vue3_vben5_antd/schema/api/api.ts.vm | 1 - .../vue3_vben5_antd/schema/views/data.ts.vm | 601 -------------- .../vue3_vben5_antd/schema/views/form.vue.vm | 157 ---- .../vue3_vben5_antd/schema/views/index.vue.vm | 321 -------- .../schema/views/modules/form_sub_erp.vue.vm | 89 --- .../views/modules/form_sub_inner.vue.vm | 2 - .../views/modules/form_sub_normal.vue.vm | 195 ----- .../schema/views/modules/list_sub_erp.vue.vm | 240 ------ .../views/modules/list_sub_inner.vue.vm | 4 - .../vue3_vben5_ele/general/api/api.ts.vm | 167 ---- .../vue3_vben5_ele/general/views/form.vue.vm | 321 -------- .../vue3_vben5_ele/general/views/index.vue.vm | 488 ------------ .../general/views/modules/form_sub_erp.vue.vm | 210 ----- .../views/modules/form_sub_inner.vue.vm | 2 - .../views/modules/form_sub_normal.vue.vm | 341 -------- .../general/views/modules/list_sub_erp.vue.vm | 427 ---------- .../views/modules/list_sub_inner.vue.vm | 4 - .../vue3_vben5_ele/schema/api/api.ts.vm | 191 ----- .../vue3_vben5_ele/schema/views/data.ts.vm | 610 -------------- .../vue3_vben5_ele/schema/views/form.vue.vm | 157 ---- .../vue3_vben5_ele/schema/views/index.vue.vm | 320 -------- .../schema/views/modules/form_sub_erp.vue.vm | 93 --- .../views/modules/form_sub_inner.vue.vm | 2 - .../views/modules/form_sub_normal.vue.vm | 204 ----- .../schema/views/modules/list_sub_erp.vue.vm | 237 ------ .../views/modules/list_sub_inner.vue.vm | 4 - .../file/core/ftp/FtpFileClientTest.java | 56 -- .../file/core/local/LocalFileClientTest.java | 45 -- .../file/core/s3/S3FileClientTest.java | 146 ---- .../file/core/sftp/SftpFileClientTest.java | 49 -- .../service/DefaultDatabaseQueryTest.java | 37 - .../codegen/CodegenServiceImplTest.java | 563 ------------- .../codegen/inner/CodegenBuilderTest.java | 87 -- .../inner/CodegenEngineAbstractTest.java | 138 ---- .../codegen/inner/CodegenEngineVue2Test.java | 101 --- .../codegen/inner/CodegenEngineVue3Test.java | 101 --- .../service/config/ConfigServiceImplTest.java | 219 ------ .../db/DataSourceConfigServiceImplTest.java | 208 ----- .../db/DatabaseTableServiceImplTest.java | 89 --- .../file/FileConfigServiceImplTest.java | 281 ------- .../service/file/FileServiceImplTest.java | 309 -------- .../logger/ApiAccessLogServiceImplTest.java | 110 --- .../logger/ApiErrorLogServiceImplTest.java | 164 ---- .../test/resources/application-unit-test.yaml | 51 -- .../resources/codegen/table/category.json | 52 -- .../test/resources/codegen/table/contact.json | 143 ---- .../test/resources/codegen/table/student.json | 134 ---- .../test/resources/codegen/table/teacher.json | 143 ---- .../windows10/vue2_master_erp/assert.json | 73 -- .../java/ErrorCodeConstants_手动操作 | 6 - .../java/InfraStudentContactDO | 71 -- .../java/InfraStudentContactMapper | 30 - .../java/InfraStudentController | 183 ----- .../vue2_master_erp/java/InfraStudentDO | 67 -- .../vue2_master_erp/java/InfraStudentMapper | 30 - .../java/InfraStudentPageReqVO | 34 - .../vue2_master_erp/java/InfraStudentRespVO | 60 -- .../java/InfraStudentSaveReqVO | 52 -- .../vue2_master_erp/java/InfraStudentService | 139 ---- .../java/InfraStudentServiceImpl | 180 ----- .../java/InfraStudentServiceImplTest | 145 ---- .../java/InfraStudentTeacherDO | 71 -- .../java/InfraStudentTeacherMapper | 30 - .../windows10/vue2_master_erp/js/index | 141 ---- .../codegen/windows10/vue2_master_erp/sql/h2 | 17 - .../codegen/windows10/vue2_master_erp/sql/sql | 55 -- .../vue2_master_erp/vue/StudentContactForm | 151 ---- .../vue2_master_erp/vue/StudentContactList | 129 --- .../windows10/vue2_master_erp/vue/StudentForm | 149 ---- .../vue2_master_erp/vue/StudentTeacherForm | 151 ---- .../vue2_master_erp/vue/StudentTeacherList | 129 --- .../windows10/vue2_master_erp/vue/index | 233 ------ .../vue2_master_erp/xml/InfraStudentMapper | 12 - .../windows10/vue2_master_inner/assert.json | 73 -- .../java/ErrorCodeConstants_手动操作 | 3 - .../java/InfraStudentContactDO | 71 -- .../java/InfraStudentContactMapper | 28 - .../java/InfraStudentController | 117 --- .../vue2_master_inner/java/InfraStudentDO | 67 -- .../vue2_master_inner/java/InfraStudentMapper | 30 - .../java/InfraStudentPageReqVO | 34 - .../vue2_master_inner/java/InfraStudentRespVO | 60 -- .../java/InfraStudentSaveReqVO | 58 -- .../java/InfraStudentService | 77 -- .../java/InfraStudentServiceImpl | 147 ---- .../java/InfraStudentServiceImplTest | 145 ---- .../java/InfraStudentTeacherDO | 71 -- .../java/InfraStudentTeacherMapper | 28 - .../windows10/vue2_master_inner/js/index | 74 -- .../windows10/vue2_master_inner/sql/h2 | 17 - .../windows10/vue2_master_inner/sql/sql | 55 -- .../vue2_master_inner/vue/StudentContactForm | 177 ----- .../vue2_master_inner/vue/StudentContactList | 89 --- .../vue2_master_inner/vue/StudentForm | 180 ----- .../vue2_master_inner/vue/StudentTeacherForm | 127 --- .../vue2_master_inner/vue/StudentTeacherList | 93 --- .../windows10/vue2_master_inner/vue/index | 222 ------ .../vue2_master_inner/xml/InfraStudentMapper | 12 - .../windows10/vue2_master_normal/assert.json | 67 -- .../java/ErrorCodeConstants_手动操作 | 3 - .../java/InfraStudentContactDO | 71 -- .../java/InfraStudentContactMapper | 28 - .../java/InfraStudentController | 117 --- .../vue2_master_normal/java/InfraStudentDO | 67 -- .../java/InfraStudentMapper | 30 - .../java/InfraStudentPageReqVO | 34 - .../java/InfraStudentRespVO | 60 -- .../java/InfraStudentSaveReqVO | 58 -- .../java/InfraStudentService | 77 -- .../java/InfraStudentServiceImpl | 147 ---- .../java/InfraStudentServiceImplTest | 145 ---- .../java/InfraStudentTeacherDO | 71 -- .../java/InfraStudentTeacherMapper | 28 - .../windows10/vue2_master_normal/js/index | 74 -- .../windows10/vue2_master_normal/sql/h2 | 17 - .../windows10/vue2_master_normal/sql/sql | 55 -- .../vue2_master_normal/vue/StudentContactForm | 177 ----- .../vue2_master_normal/vue/StudentForm | 180 ----- .../vue2_master_normal/vue/StudentTeacherForm | 127 --- .../windows10/vue2_master_normal/vue/index | 205 ----- .../vue2_master_normal/xml/InfraStudentMapper | 12 - .../codegen/windows10/vue2_one/assert.json | 49 -- .../vue2_one/java/ErrorCodeConstants_手动操作 | 3 - .../vue2_one/java/InfraStudentController | 95 --- .../windows10/vue2_one/java/InfraStudentDO | 67 -- .../vue2_one/java/InfraStudentMapper | 30 - .../vue2_one/java/InfraStudentPageReqVO | 34 - .../vue2_one/java/InfraStudentRespVO | 60 -- .../vue2_one/java/InfraStudentSaveReqVO | 50 -- .../vue2_one/java/InfraStudentService | 55 -- .../vue2_one/java/InfraStudentServiceImpl | 74 -- .../vue2_one/java/InfraStudentServiceImplTest | 145 ---- .../codegen/windows10/vue2_one/js/index | 53 -- .../codegen/windows10/vue2_one/sql/h2 | 17 - .../codegen/windows10/vue2_one/sql/sql | 55 -- .../windows10/vue2_one/vue/StudentForm | 149 ---- .../codegen/windows10/vue2_one/vue/index | 205 ----- .../windows10/vue2_one/xml/InfraStudentMapper | 12 - .../codegen/windows10/vue2_tree/assert.json | 49 -- .../java/ErrorCodeConstants_手动操作 | 8 - .../vue2_tree/java/InfraCategoryController | 94 --- .../windows10/vue2_tree/java/InfraCategoryDO | 39 - .../vue2_tree/java/InfraCategoryListReqVO | 15 - .../vue2_tree/java/InfraCategoryMapper | 34 - .../vue2_tree/java/InfraCategoryRespVO | 26 - .../vue2_tree/java/InfraCategorySaveReqVO | 24 - .../vue2_tree/java/InfraCategoryService | 55 -- .../vue2_tree/java/InfraCategoryServiceImpl | 136 ---- .../java/InfraCategoryServiceImplTest | 128 --- .../codegen/windows10/vue2_tree/js/index | 53 -- .../codegen/windows10/vue2_tree/sql/h2 | 10 - .../codegen/windows10/vue2_tree/sql/sql | 55 -- .../windows10/vue2_tree/vue/CategoryForm | 130 --- .../codegen/windows10/vue2_tree/vue/index | 161 ---- .../vue2_tree/xml/InfraCategoryMapper | 12 - .../windows10/vue3_master_erp/assert.json | 73 -- .../java/ErrorCodeConstants_手动操作 | 6 - .../java/InfraStudentContactDO | 71 -- .../java/InfraStudentContactMapper | 30 - .../java/InfraStudentController | 183 ----- .../vue3_master_erp/java/InfraStudentDO | 67 -- .../vue3_master_erp/java/InfraStudentMapper | 30 - .../java/InfraStudentPageReqVO | 34 - .../vue3_master_erp/java/InfraStudentRespVO | 60 -- .../java/InfraStudentSaveReqVO | 52 -- .../vue3_master_erp/java/InfraStudentService | 139 ---- .../java/InfraStudentServiceImpl | 180 ----- .../java/InfraStudentServiceImplTest | 145 ---- .../java/InfraStudentTeacherDO | 71 -- .../java/InfraStudentTeacherMapper | 30 - .../codegen/windows10/vue3_master_erp/sql/h2 | 17 - .../codegen/windows10/vue3_master_erp/sql/sql | 55 -- .../windows10/vue3_master_erp/ts/index | 95 --- .../vue3_master_erp/vue/StudentContactForm | 155 ---- .../vue3_master_erp/vue/StudentContactList | 146 ---- .../windows10/vue3_master_erp/vue/StudentForm | 152 ---- .../vue3_master_erp/vue/StudentTeacherForm | 155 ---- .../vue3_master_erp/vue/StudentTeacherList | 146 ---- .../windows10/vue3_master_erp/vue/index | 278 ------- .../vue3_master_erp/xml/InfraStudentMapper | 12 - .../windows10/vue3_master_inner/assert.json | 73 -- .../java/ErrorCodeConstants_手动操作 | 3 - .../java/InfraStudentContactDO | 71 -- .../java/InfraStudentContactMapper | 28 - .../java/InfraStudentController | 117 --- .../vue3_master_inner/java/InfraStudentDO | 67 -- .../vue3_master_inner/java/InfraStudentMapper | 30 - .../java/InfraStudentPageReqVO | 34 - .../vue3_master_inner/java/InfraStudentRespVO | 60 -- .../java/InfraStudentSaveReqVO | 58 -- .../java/InfraStudentService | 77 -- .../java/InfraStudentServiceImpl | 147 ---- .../java/InfraStudentServiceImplTest | 145 ---- .../java/InfraStudentTeacherDO | 71 -- .../java/InfraStudentTeacherMapper | 28 - .../windows10/vue3_master_inner/sql/h2 | 17 - .../windows10/vue3_master_inner/sql/sql | 55 -- .../windows10/vue3_master_inner/ts/index | 57 -- .../vue3_master_inner/vue/StudentContactForm | 174 ---- .../vue3_master_inner/vue/StudentContactList | 72 -- .../vue3_master_inner/vue/StudentForm | 184 ----- .../vue3_master_inner/vue/StudentTeacherForm | 122 --- .../vue3_master_inner/vue/StudentTeacherList | 76 -- .../windows10/vue3_master_inner/vue/index | 267 ------- .../vue3_master_inner/xml/InfraStudentMapper | 12 - .../windows10/vue3_master_normal/assert.json | 67 -- .../java/ErrorCodeConstants_手动操作 | 3 - .../java/InfraStudentContactDO | 71 -- .../java/InfraStudentContactMapper | 28 - .../java/InfraStudentController | 117 --- .../vue3_master_normal/java/InfraStudentDO | 67 -- .../java/InfraStudentMapper | 30 - .../java/InfraStudentPageReqVO | 34 - .../java/InfraStudentRespVO | 60 -- .../java/InfraStudentSaveReqVO | 58 -- .../java/InfraStudentService | 77 -- .../java/InfraStudentServiceImpl | 147 ---- .../java/InfraStudentServiceImplTest | 145 ---- .../java/InfraStudentTeacherDO | 71 -- .../java/InfraStudentTeacherMapper | 28 - .../windows10/vue3_master_normal/sql/h2 | 17 - .../windows10/vue3_master_normal/sql/sql | 55 -- .../windows10/vue3_master_normal/ts/index | 57 -- .../vue3_master_normal/vue/StudentContactForm | 174 ---- .../vue3_master_normal/vue/StudentForm | 184 ----- .../vue3_master_normal/vue/StudentTeacherForm | 122 --- .../windows10/vue3_master_normal/vue/index | 252 ------ .../vue3_master_normal/xml/InfraStudentMapper | 12 - .../codegen/windows10/vue3_one/assert.json | 49 -- .../vue3_one/java/ErrorCodeConstants_手动操作 | 3 - .../vue3_one/java/InfraStudentController | 95 --- .../windows10/vue3_one/java/InfraStudentDO | 67 -- .../vue3_one/java/InfraStudentMapper | 30 - .../vue3_one/java/InfraStudentPageReqVO | 34 - .../vue3_one/java/InfraStudentRespVO | 60 -- .../vue3_one/java/InfraStudentSaveReqVO | 50 -- .../vue3_one/java/InfraStudentService | 55 -- .../vue3_one/java/InfraStudentServiceImpl | 74 -- .../vue3_one/java/InfraStudentServiceImplTest | 145 ---- .../codegen/windows10/vue3_one/sql/h2 | 17 - .../codegen/windows10/vue3_one/sql/sql | 55 -- .../codegen/windows10/vue3_one/ts/index | 43 - .../windows10/vue3_one/vue/StudentForm | 152 ---- .../codegen/windows10/vue3_one/vue/index | 252 ------ .../windows10/vue3_one/xml/InfraStudentMapper | 12 - .../codegen/windows10/vue3_tree/assert.json | 49 -- .../java/ErrorCodeConstants_手动操作 | 8 - .../vue3_tree/java/InfraCategoryController | 94 --- .../windows10/vue3_tree/java/InfraCategoryDO | 39 - .../vue3_tree/java/InfraCategoryListReqVO | 15 - .../vue3_tree/java/InfraCategoryMapper | 34 - .../vue3_tree/java/InfraCategoryRespVO | 26 - .../vue3_tree/java/InfraCategorySaveReqVO | 24 - .../vue3_tree/java/InfraCategoryService | 55 -- .../vue3_tree/java/InfraCategoryServiceImpl | 136 ---- .../java/InfraCategoryServiceImplTest | 128 --- .../codegen/windows10/vue3_tree/sql/h2 | 10 - .../codegen/windows10/vue3_tree/sql/sql | 55 -- .../codegen/windows10/vue3_tree/ts/index | 37 - .../windows10/vue3_tree/vue/CategoryForm | 114 --- .../codegen/windows10/vue3_tree/vue/index | 185 ----- .../vue3_tree/xml/InfraCategoryMapper | 12 - .../src/test/resources/logback.xml | 4 - msgpush-module-infra/pom.xml | 25 - .../msgpush-module-push-server/pom.xml | 5 - .../factory/MessageProviderFactory.java | 8 +- .../factory/impl/AliyunProviderFactory.java | 33 +- .../factory/impl/TelecomProviderFactory.java | 25 +- .../factory/impl/UniPushProviderFactory.java | 52 +- .../push/client/sender/AppPushSender.java | 9 +- .../push/client/sender/EmailSender.java | 13 +- .../module/push/client/sender/Sender.java | 124 ++- .../module/push/client/sender/SmsSender.java | 27 +- .../client/sender/impl/AliyunEmailSender.java | 131 --- .../client/sender/impl/AliyunSmsSender.java | 181 ----- .../client/sender/impl/TelecomSmsSender.java | 315 -------- .../sender/impl/UniPushAppPushSender.java | 134 ---- .../setting/impl/UniPushAppPushSetting.java | 11 +- .../push/constant/MsgStatusConstant.java | 17 +- .../message/MessageRecordServiceImpl.java | 183 +++-- .../retry/MessageRetryQueueServiceImpl.java | 161 +--- .../src/main/resources/application-local.yaml | 4 +- msgpush-module-push/pom.xml | 2 +- .../msgpush-module-system-api/pom.xml | 16 +- .../module/system/api/dept/DeptApi.java | 2 +- .../module/system/api/dept/PostApi.java | 2 +- .../system/api/dept/dto/DeptRespDTO.java | 5 +- .../module/system/api/dict/DictDataApi.java | 2 +- .../module/system/api/logger/LoginLogApi.java | 24 - .../system/api/logger/OperateLogApi.java | 2 +- .../module/system/api/mail/MailSendApi.java | 28 - .../mail/dto/MailSendSingleToUserReqDTO.java | 50 -- .../api/notify/NotifyMessageSendApi.java | 28 - .../dto/NotifySendSingleToUserReqDTO.java | 23 - .../system/api/permission/PermissionApi.java | 2 +- .../module/system/api/permission/RoleApi.java | 25 - .../system/api/user/dto/AdminUserRespDTO.java | 8 +- .../module/system/enums/ApiConstants.java | 4 +- .../system/enums/DictTypeConstants.java | 29 +- .../system/enums/ErrorCodeConstants.java | 46 +- .../system/enums/logger/LoginLogTypeEnum.java | 16 +- .../system/enums/logger/LoginResultEnum.java | 1 + .../system/enums/mail/MailSendStatusEnum.java | 24 - .../enums/notify/NotifyTemplateTypeEnum.java | 2 +- .../enums/permission/DataScopeEnum.java | 40 - .../system/enums/permission/RoleCodeEnum.java | 17 +- .../msgpush-module-system-server/pom.xml | 132 ---- .../system/api/logger/LoginLogApiImpl.java | 26 - .../api/notify/NotifyMessageSendApiImpl.java | 32 - .../system/api/permission/RoleApiImpl.java | 25 - .../controller/admin/auth/AuthController.http | 51 -- .../admin/auth/vo/AuthResetPasswordReqVO.java | 32 - .../admin/dict/DictDataController.http | 4 - .../controller/admin/ip/AreaController.http | 5 - .../admin/logger/OperateLogController.http | 4 - .../admin/oauth2/OAuth2ClientController.http | 23 - .../admin/oauth2/OAuth2OpenController.http | 62 -- .../admin/oauth2/OAuth2UserController.http | 14 - .../vo/open/OAuth2OpenCheckTokenRespVO.java | 37 - .../admin/permission/MenuController.http | 4 - .../admin/permission/RoleController.http | 42 - .../PermissionAssignRoleDataScopeReqVO.java | 28 - .../controller/admin/user/UserController.http | 10 - .../admin/user/UserProfileController.http | 4 - .../system/convert/auth/AuthConvert.java | 78 -- .../dal/dataobject/dept/UserPostDO.java | 40 - .../dal/dataobject/mail/MailAccountDO.java | 60 -- .../system/dal/dataobject/mail/MailLogDO.java | 138 ---- .../dal/dataobject/mail/MailTemplateDO.java | 74 -- .../system/dal/mysql/dept/UserPostMapper.java | 32 - .../system/dal/redis/RedisKeyConstants.java | 110 --- .../mq/message/mail/MailSendMessage.java | 58 -- .../system/mq/message/sms/SmsSendMessage.java | 42 - .../system/mq/producer/mail/MailProducer.java | 51 -- .../system/mq/producer/sms/SmsProducer.java | 41 - .../msgpush/module/system/package-info.java | 8 - .../service/permission/MenuService.java | 94 --- .../src/main/resources/logback-spring.xml | 56 -- .../oauth2/OAuth2OpenControllerTest.java | 337 -------- .../auth/AdminAuthServiceImplTest.java | 235 ------ .../service/dept/DeptServiceImplTest.java | 324 -------- .../service/dept/PostServiceImplTest.java | 248 ------ .../service/dict/DictDataServiceImplTest.java | 352 --------- .../service/dict/DictTypeServiceImplTest.java | 271 ------- .../logger/LoginLogServiceImplTest.java | 76 -- .../logger/OperateLogServiceImplTest.java | 113 --- .../service/notice/NoticeServiceImplTest.java | 130 --- .../notify/NotifyMessageServiceImplTest.java | 276 ------- .../notify/NotifySendServiceImplTest.java | 190 ----- .../notify/NotifyTemplateServiceImplTest.java | 178 ----- .../oauth2/OAuth2ApproveServiceImplTest.java | 272 ------- .../oauth2/OAuth2ClientServiceImplTest.java | 220 ------ .../oauth2/OAuth2CodeServiceImplTest.java | 101 --- .../oauth2/OAuth2GrantServiceImplTest.java | 166 ---- .../oauth2/OAuth2TokenServiceImplTest.java | 326 -------- .../permission/MenuServiceImplTest.java | 304 ------- .../permission/PermissionServiceTest.java | 527 ------------- .../permission/RoleServiceImplTest.java | 355 --------- .../user/AdminUserServiceImplTest.java | 744 ------------------ .../test/resources/application-unit-test.yaml | 53 -- .../src/test/resources/logback.xml | 4 - msgpush-module-system/pom.xml | 33 +- msgpush-server/pom.xml | 96 --- .../server/MsgpushServerApplication.java | 21 - .../server/controller/DefaultController.java | 38 - .../src/main/resources/application-dev.yaml | 79 -- .../src/main/resources/application-local.yaml | 96 --- .../src/main/resources/application.yaml | 148 ---- .../src/main/resources/logback-spring.xml | 56 -- pom.xml | 103 ++- 667 files changed, 1240 insertions(+), 50173 deletions(-) delete mode 100644 msgpush-dependencies/pom.xml delete mode 100644 msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/infra/package-info.java delete mode 100644 msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/permission/dto/DeptDataPermissionRespDTO.java delete mode 100644 msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/package-info.java delete mode 100644 msgpush-framework/msgpush-common/src/test/java/com/njcn/msgpush/framework/common/util/collection/CollectionUtilsTest.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/main/java/com/njcn/msgpush/framework/ip/package-info.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/test/java/com/njcn/msgpush/framework/ip/core/utils/AreaUtilsTest.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/test/java/com/njcn/msgpush/framework/ip/core/utils/IPUtilsTest.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/package-info.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-excel/src/test/java/com/njcn/msgpush/framework/dict/core/util/DictFrameworkUtilsTest.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-mq/src/main/java/com/njcn/msgpush/framework/mq/package-info.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-protection/src/test/java/com/njcn/msgpush/framework/signature/core/ApiSignatureTest.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-redis/src/main/java/com/njcn/msgpush/framework/redis/package-info.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-rpc/src/main/java/com/njcn/msgpush/framework/rpc/package-info.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/package-info.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/package-info.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/DemoFilter.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/DesensitizeTest.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/annotation/Address.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/handler/AddressHandler.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/encrypt/ApiEncryptTest.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessage.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessageConsumer.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessageSender.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessage.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageConsumer.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageSender.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessage.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessageConsumer.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessageSender.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessage.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageConsumer.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageSender.java delete mode 100644 msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/package-info.java delete mode 100644 msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/cors/CorsResponseHeaderFilter.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/pom.xml delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/file/FileApi.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/file/dto/FileCreateReqDTO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/websocket/WebSocketSenderApi.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/websocket/dto/WebSocketSendReqDTO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/ApiConstants.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/DictTypeConstants.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/ErrorCodeConstants.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenColumnListConditionEnum.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenFrontTypeEnum.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenSceneEnum.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenTemplateTypeEnum.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenVOTypeEnum.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/InfraServerApplication.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/file/FileApiImpl.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/websocket/WebSocketSenderApiImpl.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/CodegenController.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/DataSourceConfigController.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/vo/DataSourceConfigSaveReqVO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/app/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/convert/codegen/CodegenConvert.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/convert/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/codegen/CodegenColumnDO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/codegen/CodegenTableDO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/db/DataSourceConfigDO.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/codegen/CodegenColumnMapper.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/codegen/CodegenTableMapper.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/db/DataSourceConfigMapper.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/config/CodegenConfiguration.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/config/CodegenProperties.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/file/core/enums/FileStorageEnum.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/rpc/config/RpcConfiguration.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/rpc/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/security/config/SecurityConfiguration.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/security/core/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/consumer/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/message/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/producer/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/package-info.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/CodegenService.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/CodegenServiceImpl.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenBuilder.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenEngine.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DataSourceConfigService.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DataSourceConfigServiceImpl.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DatabaseTableService.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DatabaseTableServiceImpl.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application-dev.yaml delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application-local.yaml delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application.yaml delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/controller.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/listReqVO.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/pageReqVO.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/respVO.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/saveReqVO.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/do.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/do_sub.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper.xml.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper_sub.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/enums/errorcode.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/service/service.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/service/serviceImpl.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/test/serviceTest.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/sql/h2.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/sql/sql.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/api/api.js.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/form.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/index.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/form.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/index.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/components/search-form.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/detail/index.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/form/index.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/index.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/api/api.ts.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/data.ts.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/form.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/index.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/views/index.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/form_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/form_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/form_sub_normal.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/list_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/list_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_normal.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/general/api/api.ts.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/general/views/form.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/general/views/index.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/general/views/modules/form_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/general/views/modules/form_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/general/views/modules/form_sub_normal.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/general/views/modules/list_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/general/views/modules/list_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/schema/views/data.ts.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/schema/views/form.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/form_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/form_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/form_sub_normal.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/list_sub_erp.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/list_sub_inner.vue.vm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/framework/file/core/ftp/FtpFileClientTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/framework/file/core/local/LocalFileClientTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/framework/file/core/s3/S3FileClientTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/framework/file/core/sftp/SftpFileClientTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/DefaultDatabaseQueryTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/codegen/CodegenServiceImplTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenBuilderTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenEngineAbstractTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenEngineVue2Test.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenEngineVue3Test.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/config/ConfigServiceImplTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/db/DataSourceConfigServiceImplTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/db/DatabaseTableServiceImplTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/file/FileConfigServiceImplTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/file/FileServiceImplTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/logger/ApiAccessLogServiceImplTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/java/com/njcn/msgpush/module/infra/service/logger/ApiErrorLogServiceImplTest.java delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/application-unit-test.yaml delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/table/category.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/table/contact.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/table/student.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/table/teacher.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/assert.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/ErrorCodeConstants_手动操作 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentContactDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentContactMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentController delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentPageReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentRespVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentSaveReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentService delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentServiceImpl delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentServiceImplTest delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentTeacherDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/java/InfraStudentTeacherMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/js/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/sql/h2 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/sql/sql delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/vue/StudentContactForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/vue/StudentContactList delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/vue/StudentForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/vue/StudentTeacherForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/vue/StudentTeacherList delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/vue/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_erp/xml/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/assert.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/ErrorCodeConstants_手动操作 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentContactDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentContactMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentController delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentPageReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentRespVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentSaveReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentService delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentServiceImpl delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentServiceImplTest delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentTeacherDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/java/InfraStudentTeacherMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/js/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/sql/h2 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/sql/sql delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/vue/StudentContactForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/vue/StudentContactList delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/vue/StudentForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/vue/StudentTeacherForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/vue/StudentTeacherList delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/vue/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_inner/xml/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/assert.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/ErrorCodeConstants_手动操作 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentContactDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentContactMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentController delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentPageReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentRespVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentSaveReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentService delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentServiceImpl delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentServiceImplTest delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentTeacherDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/java/InfraStudentTeacherMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/js/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/sql/h2 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/sql/sql delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/vue/StudentContactForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/vue/StudentForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/vue/StudentTeacherForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/vue/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_master_normal/xml/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/assert.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/java/ErrorCodeConstants_手动操作 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentController delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentPageReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentRespVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentSaveReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentService delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentServiceImpl delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/java/InfraStudentServiceImplTest delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/js/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/sql/h2 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/sql/sql delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/vue/StudentForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/vue/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_one/xml/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/assert.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/java/ErrorCodeConstants_手动操作 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategoryController delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategoryDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategoryListReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategoryMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategoryRespVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategorySaveReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategoryService delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategoryServiceImpl delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/java/InfraCategoryServiceImplTest delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/js/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/sql/h2 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/sql/sql delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/vue/CategoryForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/vue/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue2_tree/xml/InfraCategoryMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/assert.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/ErrorCodeConstants_手动操作 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentContactDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentContactMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentController delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentPageReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentRespVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentSaveReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentService delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentServiceImpl delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentServiceImplTest delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentTeacherDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/java/InfraStudentTeacherMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/sql/h2 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/sql/sql delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/ts/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/vue/StudentContactForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/vue/StudentContactList delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/vue/StudentForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/vue/StudentTeacherForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/vue/StudentTeacherList delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/vue/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_erp/xml/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/assert.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/ErrorCodeConstants_手动操作 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentContactDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentContactMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentController delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentPageReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentRespVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentSaveReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentService delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentServiceImpl delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentServiceImplTest delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentTeacherDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/java/InfraStudentTeacherMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/sql/h2 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/sql/sql delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/ts/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/vue/StudentContactForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/vue/StudentContactList delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/vue/StudentForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/vue/StudentTeacherForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/vue/StudentTeacherList delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/vue/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_inner/xml/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/assert.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/ErrorCodeConstants_手动操作 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentContactDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentContactMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentController delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentPageReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentRespVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentSaveReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentService delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentServiceImpl delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentServiceImplTest delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentTeacherDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/java/InfraStudentTeacherMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/sql/h2 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/sql/sql delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/ts/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/vue/StudentContactForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/vue/StudentForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/vue/StudentTeacherForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/vue/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_master_normal/xml/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/assert.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/java/ErrorCodeConstants_手动操作 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentController delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentPageReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentRespVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentSaveReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentService delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentServiceImpl delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/java/InfraStudentServiceImplTest delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/sql/h2 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/sql/sql delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/ts/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/vue/StudentForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/vue/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_one/xml/InfraStudentMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/assert.json delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/java/ErrorCodeConstants_手动操作 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategoryController delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategoryDO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategoryListReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategoryMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategoryRespVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategorySaveReqVO delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategoryService delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategoryServiceImpl delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/java/InfraCategoryServiceImplTest delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/sql/h2 delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/sql/sql delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/ts/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/vue/CategoryForm delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/vue/index delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/codegen/windows10/vue3_tree/xml/InfraCategoryMapper delete mode 100644 msgpush-module-infra/msgpush-module-infra-server/src/test/resources/logback.xml delete mode 100644 msgpush-module-infra/pom.xml delete mode 100644 msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/client/sender/impl/AliyunEmailSender.java delete mode 100644 msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/client/sender/impl/AliyunSmsSender.java delete mode 100644 msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/client/sender/impl/TelecomSmsSender.java delete mode 100644 msgpush-module-push/msgpush-module-push-server/src/main/java/com/njcn/msgpush/module/push/client/sender/impl/UniPushAppPushSender.java delete mode 100644 msgpush-module-system/msgpush-module-system-api/src/main/java/com/njcn/msgpush/module/system/api/logger/LoginLogApi.java delete mode 100644 msgpush-module-system/msgpush-module-system-api/src/main/java/com/njcn/msgpush/module/system/api/mail/MailSendApi.java delete mode 100644 msgpush-module-system/msgpush-module-system-api/src/main/java/com/njcn/msgpush/module/system/api/mail/dto/MailSendSingleToUserReqDTO.java delete mode 100644 msgpush-module-system/msgpush-module-system-api/src/main/java/com/njcn/msgpush/module/system/api/notify/NotifyMessageSendApi.java delete mode 100644 msgpush-module-system/msgpush-module-system-api/src/main/java/com/njcn/msgpush/module/system/api/notify/dto/NotifySendSingleToUserReqDTO.java delete mode 100644 msgpush-module-system/msgpush-module-system-api/src/main/java/com/njcn/msgpush/module/system/api/permission/RoleApi.java delete mode 100644 msgpush-module-system/msgpush-module-system-api/src/main/java/com/njcn/msgpush/module/system/enums/mail/MailSendStatusEnum.java delete mode 100644 msgpush-module-system/msgpush-module-system-api/src/main/java/com/njcn/msgpush/module/system/enums/permission/DataScopeEnum.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/pom.xml delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/api/logger/LoginLogApiImpl.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/api/notify/NotifyMessageSendApiImpl.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/api/permission/RoleApiImpl.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/auth/AuthController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/auth/vo/AuthResetPasswordReqVO.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/dict/DictDataController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/ip/AreaController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/logger/OperateLogController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/oauth2/OAuth2ClientController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/oauth2/OAuth2OpenController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/oauth2/OAuth2UserController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/oauth2/vo/open/OAuth2OpenCheckTokenRespVO.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/permission/MenuController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/permission/RoleController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/permission/vo/permission/PermissionAssignRoleDataScopeReqVO.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/user/UserController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/controller/admin/user/UserProfileController.http delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/convert/auth/AuthConvert.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/dal/dataobject/dept/UserPostDO.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/dal/dataobject/mail/MailAccountDO.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/dal/dataobject/mail/MailLogDO.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/dal/dataobject/mail/MailTemplateDO.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/dal/mysql/dept/UserPostMapper.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/dal/redis/RedisKeyConstants.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/mq/message/mail/MailSendMessage.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/mq/message/sms/SmsSendMessage.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/mq/producer/mail/MailProducer.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/mq/producer/sms/SmsProducer.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/package-info.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/java/com/njcn/msgpush/module/system/service/permission/MenuService.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/main/resources/logback-spring.xml delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/controller/admin/oauth2/OAuth2OpenControllerTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/auth/AdminAuthServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/dept/DeptServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/dept/PostServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/dict/DictDataServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/dict/DictTypeServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/logger/LoginLogServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/logger/OperateLogServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/notice/NoticeServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/notify/NotifyMessageServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/notify/NotifySendServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/notify/NotifyTemplateServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/oauth2/OAuth2ApproveServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/oauth2/OAuth2ClientServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/oauth2/OAuth2CodeServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/oauth2/OAuth2GrantServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/oauth2/OAuth2TokenServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/permission/MenuServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/permission/PermissionServiceTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/permission/RoleServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/java/com/njcn/msgpush/module/system/service/user/AdminUserServiceImplTest.java delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/resources/application-unit-test.yaml delete mode 100644 msgpush-module-system/msgpush-module-system-server/src/test/resources/logback.xml delete mode 100644 msgpush-server/pom.xml delete mode 100644 msgpush-server/src/main/java/com/njcn/msgpush/server/MsgpushServerApplication.java delete mode 100644 msgpush-server/src/main/java/com/njcn/msgpush/server/controller/DefaultController.java delete mode 100644 msgpush-server/src/main/resources/application-dev.yaml delete mode 100644 msgpush-server/src/main/resources/application-local.yaml delete mode 100644 msgpush-server/src/main/resources/application.yaml delete mode 100644 msgpush-server/src/main/resources/logback-spring.xml diff --git a/.gitignore b/.gitignore index e55eb64..2e5268d 100644 --- a/.gitignore +++ b/.gitignore @@ -73,3 +73,6 @@ functions/mock screenshot .firebase sessionStore + +# local docs +/docs/ diff --git a/msgpush-dependencies/pom.xml b/msgpush-dependencies/pom.xml deleted file mode 100644 index c37070f..0000000 --- a/msgpush-dependencies/pom.xml +++ /dev/null @@ -1,721 +0,0 @@ - - - 4.0.0 - - com.njcn - msgpush-dependencies - ${revision} - pom - - ${project.artifactId} - 基础 bom 文件,管理整个项目的依赖版本 - - - - 2025.12-SNAPSHOT - 1.7.2 - - 3.5.9 - 2025.0.0 - 2023.0.3.3 - - 2.8.14 - 4.5.0 - - 1.2.27 - 3.5.19 - 3.5.15 - 1.5.5 - 4.5.0 - 3.0.6 - 3.52.0 - 8.1.3.140 - 8.6.0 - 5.1.0 - 3.7.9 - - 2.3.5 - - - - 2.4.0 - - 2.2.7 - - 9.5.0 - 3.5.6 - 0.33.0 - - 8.0.2.RELEASE - 1.1.12 - 5.2.0 - - 7.2.0 - - 1.4.0 - 1.21.2 - 1.18.42 - 1.6.3 - 5.8.42 - 6.0.0-M22 - 1.3.0 - 2.4.1 - 1.2.83 - 33.5.0-jre - 2.14.5 - 3.12.0 - 3.20.0 - 2.27.7 - 3.2.3 - 2.7.0 - 3.0.6 - 0.10.2 - 4.2.9.Final - 1.2.5 - 4.5.22 - - 2.40.15 - 1.16.7 - 1.4.0 - 2.1.3 - 2.3.0 - 4.7.9-20251224.161447 - 4.40.607.ALL - - - - - - - io.netty - netty-bom - ${netty.version} - pom - import - - - org.springframework.boot - spring-boot-dependencies - ${spring.boot.version} - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - ${spring.cloud.version} - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - ${spring.cloud.alibaba.version} - pom - import - - - - - io.github.mouzt - bizlog-sdk - ${bizlog-sdk.version} - - - org.springframework.boot - spring-boot-starter - - - - - com.njcn - msgpush-spring-boot-starter-biz-ip - ${revision} - - - - - - org.springframework.boot - spring-boot-configuration-processor - ${spring.boot.version} - - - - com.njcn - msgpush-spring-boot-starter-env - ${revision} - - - - - com.njcn - msgpush-spring-boot-starter-web - ${revision} - - - - com.njcn - msgpush-spring-boot-starter-security - ${revision} - - - - com.njcn - msgpush-spring-boot-starter-websocket - ${revision} - - - - com.github.xiaoymin - knife4j-openapi3-jakarta-spring-boot-starter - ${knife4j.version} - - - org.springdoc - springdoc-openapi-starter-webmvc-ui - - - - - org.springdoc - springdoc-openapi-starter-webmvc-ui - ${springdoc.version} - - - com.github.xiaoymin - knife4j-gateway-spring-boot-starter - ${knife4j.version} - - - - - com.njcn - msgpush-spring-boot-starter-mybatis - ${revision} - - - - com.alibaba - druid-spring-boot-3-starter - ${druid.version} - - - - org.mybatis - mybatis - ${mybatis.version} - - - com.baomidou - mybatis-plus-spring-boot3-starter - ${mybatis-plus.version} - - - com.baomidou - mybatis-plus-jsqlparser - ${mybatis-plus.version} - - - com.baomidou - mybatis-plus-generator - ${mybatis-plus.version} - - - com.baomidou - dynamic-datasource-spring-boot3-starter - ${dynamic-datasource.version} - - - com.github.yulichang - mybatis-plus-join-boot-starter - ${mybatis-plus-join.version} - - - - com.fhs-opensource - easy-trans-spring-boot-starter - ${easy-trans.version} - - - org.springframework - spring-context - - - org.springframework.cloud - spring-cloud-commons - - - - - com.fhs-opensource - easy-trans-mybatis-plus-extend - ${easy-trans.version} - - - com.fhs-opensource - easy-trans-anno - ${easy-trans.version} - - - - com.njcn - msgpush-spring-boot-starter-redis - ${revision} - - - - org.redisson - redisson-spring-boot-starter - ${redisson.version} - - - - com.dameng - DmJdbcDriver18 - ${dm8.jdbc.version} - - - - org.opengauss - opengauss-jdbc - ${opengauss.jdbc.version} - - - - cn.com.kingbase - kingbase8 - ${kingbase.jdbc.version} - - - - com.taosdata.jdbc - taos-jdbcdriver - ${taos.version} - - - - - com.njcn - msgpush-spring-boot-starter-rpc - ${revision} - - - - - - com.alibaba.cloud - spring-cloud-starter-alibaba-nacos-discovery - ${spring.cloud.alibaba.version} - - - - logback-adapter - com.alibaba.nacos - - - - - - - - - com.xuxueli - xxl-job-core - ${xxl-job.version} - - - com.njcn - msgpush-spring-boot-starter-job - ${revision} - - - - - com.njcn - msgpush-spring-boot-starter-mq - ${revision} - - - - org.apache.rocketmq - rocketmq-spring-boot-starter - ${rocketmq-spring.version} - - - - - com.njcn - msgpush-spring-boot-starter-protection - ${revision} - - - - com.baomidou - lock4j-redisson-spring-boot-starter - ${lock4j.version} - - - redisson-spring-boot-starter - org.redisson - - - - - org.apache.skywalking - apm-toolkit-trace - ${skywalking.version} - - - org.apache.skywalking - apm-toolkit-logback-1.x - ${skywalking.version} - - - org.apache.skywalking - apm-toolkit-opentracing - ${skywalking.version} - - - - - - - - - - - - - io.opentracing - opentracing-api - ${opentracing.version} - - - io.opentracing - opentracing-util - ${opentracing.version} - - - io.opentracing - opentracing-noop - ${opentracing.version} - - - - de.codecentric - spring-boot-admin-starter-server - ${spring-boot-admin.version} - - - de.codecentric - spring-boot-admin-starter-client - ${spring-boot-admin.version} - - - - - com.njcn - msgpush-spring-boot-starter-test - ${revision} - test - - - - org.mockito - mockito-inline - ${mockito-inline.version} - - - - org.springframework.boot - spring-boot-starter-test - ${spring.boot.version} - - - asm - org.ow2.asm - - - org.mockito - mockito-core - - - - - - com.github.fppt - jedis-mock - ${jedis-mock.version} - - - - uk.co.jemos.podam - podam - ${podam.version} - - - - - org.flowable - flowable-spring-boot-starter-process - ${flowable.version} - - - org.flowable - flowable-spring-boot-starter-actuator - ${flowable.version} - - - - - - com.njcn - msgpush-common - ${revision} - - - - com.njcn - msgpush-spring-boot-starter-excel - ${revision} - - - - org.projectlombok - lombok - ${lombok.version} - - - - org.mapstruct - mapstruct - ${mapstruct.version} - - - org.mapstruct - mapstruct-jdk8 - ${mapstruct.version} - - - org.mapstruct - mapstruct-processor - ${mapstruct.version} - - - - cn.hutool - hutool-all - ${hutool-5.version} - - - org.dromara.hutool - hutool-extra - ${hutool-6.version} - - - - cn.idev.excel - fastexcel - ${fastexcel.version} - - - - org.apache.tika - tika-core - ${tika-core.version} - - - - org.apache.velocity - velocity-engine-core - ${velocity.version} - - - - com.alibaba - fastjson - ${fastjson.version} - - - - com.google.guava - guava - ${guava.version} - - - - com.alibaba - transmittable-thread-local - ${transmittable-thread-local.version} - - - - commons-net - commons-net - ${commons-net.version} - - - com.github.mwiede - jsch - ${jsch.version} - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - - com.anji-plus - captcha-spring-boot-starter - ${anji-plus-captcha.version} - - - - org.lionsoul - ip2region - ${ip2region.version} - - - - org.jsoup - jsoup - ${jsoup.version} - - - - org.reflections - reflections - ${reflections.version} - - - - - software.amazon.awssdk - s3 - ${awssdk.version} - - - - com.alipay.sdk - alipay-sdk-java - ${alipay-sdk-java.version} - - - org.bouncycastle - bcprov-jdk15on - - - - - - com.github.binarywang - weixin-java-pay - ${weixin-java.version} - - - com.github.binarywang - wx-java-mp-spring-boot-starter - ${weixin-java.version} - - - com.github.binarywang - wx-java-miniapp-spring-boot-starter - ${weixin-java.version} - - - - me.zhyd.oauth - JustAuth - ${justauth.version} - - - com.xkcoding.justauth - justauth-spring-boot-starter - ${justauth-starter.version} - - - - - org.jeecgframework.jimureport - jimureport-spring-boot3-starter-fastjson2 - ${jimureport.version} - - - org.jeecgframework.jimureport - jimubi-spring-boot3-starter - ${jimubi.version} - - - com.github.jsqlparser - jsqlparser - - - cn.hutool - hutool-core - - - - - - - io.vertx - vertx-core - ${vertx.version} - - - io.vertx - vertx-web - ${vertx.version} - - - io.vertx - vertx-mqtt - ${vertx.version} - - - - - org.eclipse.paho - org.eclipse.paho.client.mqttv3 - ${mqtt.version} - - - - - - - - - org.codehaus.mojo - flatten-maven-plugin - ${flatten-maven-plugin.version} - - bom - true - - - - - flatten - - flatten - process-resources - - - - clean - - flatten.clean - clean - - - - - - - diff --git a/msgpush-framework/msgpush-common/pom.xml b/msgpush-framework/msgpush-common/pom.xml index 2fbfde0..e83a647 100644 --- a/msgpush-framework/msgpush-common/pom.xml +++ b/msgpush-framework/msgpush-common/pom.xml @@ -2,36 +2,45 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 + msgpush-common jar - ${project.artifactId} 定义基础 pojo 类、枚举、工具类等等 + + 17 + 17 + UTF-8 + + org.springframework spring-core provided + org.springframework spring-expression provided + org.springframework spring-aop provided + org.aspectj aspectjweaver @@ -46,25 +55,28 @@ + org.springframework spring-web provided + jakarta.servlet jakarta.servlet-api provided + - org.springdoc - springdoc-openapi-starter-webmvc-ui - provided + io.swagger.core.v3 + swagger-annotations + org.springframework.cloud spring-cloud-openfeign-core @@ -72,6 +84,7 @@ + org.apache.skywalking apm-toolkit-trace @@ -79,78 +92,92 @@ + org.projectlombok lombok + org.mapstruct mapstruct + org.mapstruct - mapstruct-jdk8 + mapstruct-jdk8 + org.mapstruct mapstruct-processor + com.google.guava guava provided + com.fasterxml.jackson.core jackson-databind provided + com.fasterxml.jackson.core jackson-core provided + com.fasterxml.jackson.datatype jackson-datatype-jsr310 provided + org.slf4j slf4j-api provided + jakarta.validation jakarta.validation-api provided + cn.hutool hutool-all + com.alibaba transmittable-thread-local - com.fhs-opensource + + com.fhs-opensource easy-trans-anno + org.springframework.boot spring-boot-starter-test test - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-common/src/main/java/com/fhs/trans/service/AutoTransable.java b/msgpush-framework/msgpush-common/src/main/java/com/fhs/trans/service/AutoTransable.java index 6561931..09af519 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/fhs/trans/service/AutoTransable.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/fhs/trans/service/AutoTransable.java @@ -11,8 +11,6 @@ import java.util.List; * 为什么要赋值粘贴到 msgpush-common 包下? * 因为 AutoTransable 属于 easy-trans-service 下,无法方便的在 msgpush-module-xxx-api 模块下使用 * - * @author hongawen - * @since 2020-05-19 10:26:15 */ public interface AutoTransable { diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/infra/package-info.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/infra/package-info.java deleted file mode 100644 index 7652553..0000000 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/infra/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 针对 infra 模块的 api 包 - */ -package com.njcn.msgpush.framework.common.biz.infra; \ No newline at end of file diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/dict/DictDataCommonApi.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/dict/DictDataCommonApi.java index fcc61c8..f259d00 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/dict/DictDataCommonApi.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/dict/DictDataCommonApi.java @@ -12,7 +12,7 @@ import org.springframework.web.bind.annotation.RequestParam; import java.util.List; -@FeignClient(name = RpcConstants.SYSTEM_NAME, primary = false) // TODO 芋艿:fallbackFactory = +@FeignClient(name = RpcConstants.SYSTEM_NAME, primary = false) @Tag(name = "RPC 服务 - 字典数据") public interface DictDataCommonApi { diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/dict/dto/DictDataRespDTO.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/dict/dto/DictDataRespDTO.java index e14a533..1d58eed 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/dict/dto/DictDataRespDTO.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/dict/dto/DictDataRespDTO.java @@ -10,7 +10,7 @@ public class DictDataRespDTO { @Schema(description = "字典标签", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能") private String label; - @Schema(description = "字典值", requiredMode = Schema.RequiredMode.REQUIRED, example = "iocoder") + @Schema(description = "字典值", requiredMode = Schema.RequiredMode.REQUIRED, example = "njcn") private String value; @Schema(description = "字典类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "sys_common_sex") diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/logger/OperateLogCommonApi.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/logger/OperateLogCommonApi.java index e3321f5..1a931ea 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/logger/OperateLogCommonApi.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/logger/OperateLogCommonApi.java @@ -11,7 +11,7 @@ import org.springframework.scheduling.annotation.Async; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -@FeignClient(name = RpcConstants.SYSTEM_NAME, primary = false) // TODO 芋艿:fallbackFactory = +@FeignClient(name = RpcConstants.SYSTEM_NAME, primary = false) @Tag(name = "RPC 服务 - 操作日志") public interface OperateLogCommonApi { diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/OAuth2TokenCommonApi.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/OAuth2TokenCommonApi.java index b50629d..7bdad7d 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/OAuth2TokenCommonApi.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/OAuth2TokenCommonApi.java @@ -1,20 +1,19 @@ package com.njcn.msgpush.framework.common.biz.system.oauth2; -import com.njcn.msgpush.framework.common.enums.RpcConstants; -import com.njcn.msgpush.framework.common.pojo.CommonResult; import com.njcn.msgpush.framework.common.biz.system.oauth2.dto.OAuth2AccessTokenCheckRespDTO; import com.njcn.msgpush.framework.common.biz.system.oauth2.dto.OAuth2AccessTokenCreateReqDTO; import com.njcn.msgpush.framework.common.biz.system.oauth2.dto.OAuth2AccessTokenRespDTO; -import io.swagger.v3.oas.annotations.tags.Tag; +import com.njcn.msgpush.framework.common.enums.RpcConstants; +import com.njcn.msgpush.framework.common.pojo.CommonResult; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; -import jakarta.validation.Valid; - -@FeignClient(name = RpcConstants.SYSTEM_NAME) // TODO 芋艿:fallbackFactory = +@FeignClient(name = RpcConstants.SYSTEM_NAME) @Tag(name = "RPC 服务 - OAuth2.0 令牌") public interface OAuth2TokenCommonApi { diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java index 2a2ff7f..5257117 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCheckRespDTO.java @@ -8,23 +8,23 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Map; -@Schema(description = "RPC 服务 - OAuth2 访问令牌的校验 Response DTO") +@Schema(description = "RPC service - OAuth2 access token check response") @Data public class OAuth2AccessTokenCheckRespDTO implements Serializable { - @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") + @Schema(description = "User id", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") private Long userId; - @Schema(description = "用户类型,参见 UserTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") + @Schema(description = "User type", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") private Integer userType; - @Schema(description = "用户信息", example = "{\"nickname\": \"灿能\"}") + @Schema(description = "User info", example = "{\"nickname\": \"msgpush\"}") private Map userInfo; - @Schema(description = "授权范围的数组", example = "user_info") + @Schema(description = "Scopes", example = "user_info") private List scopes; - @Schema(description = "过期时间", requiredMode = Schema.RequiredMode.REQUIRED) + @Schema(description = "Expire time", requiredMode = Schema.RequiredMode.REQUIRED) private LocalDateTime expiresTime; } diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java index c2b790f..f01bff8 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java @@ -3,9 +3,9 @@ package com.njcn.msgpush.framework.common.biz.system.oauth2.dto; import com.njcn.msgpush.framework.common.enums.UserTypeEnum; import com.njcn.msgpush.framework.common.validation.InEnum; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.NotNull; import lombok.Data; -import jakarta.validation.constraints.NotNull; import java.io.Serializable; import java.util.List; diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/permission/PermissionCommonApi.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/permission/PermissionCommonApi.java index 2f01bb5..9886a37 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/permission/PermissionCommonApi.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/permission/PermissionCommonApi.java @@ -1,6 +1,5 @@ package com.njcn.msgpush.framework.common.biz.system.permission; -import com.njcn.msgpush.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO; import com.njcn.msgpush.framework.common.enums.RpcConstants; import com.njcn.msgpush.framework.common.pojo.CommonResult; import io.swagger.v3.oas.annotations.Operation; @@ -11,7 +10,7 @@ import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; -@FeignClient(name = RpcConstants.SYSTEM_NAME, primary = false) // TODO 芋艿:fallbackFactory = +@FeignClient(name = RpcConstants.SYSTEM_NAME, primary = false) @Tag(name = "RPC 服务 - 权限") public interface PermissionCommonApi { @@ -35,9 +34,4 @@ public interface PermissionCommonApi { CommonResult hasAnyRoles(@RequestParam("userId") Long userId, @RequestParam("roles") String... roles); - @GetMapping(PREFIX + "/get-dept-data-permission") - @Operation(summary = "获得登陆用户的部门数据权限") - @Parameter(name = "userId", description = "用户编号", example = "2", required = true) - CommonResult getDeptDataPermission(@RequestParam("userId") Long userId); - } \ No newline at end of file diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/permission/dto/DeptDataPermissionRespDTO.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/permission/dto/DeptDataPermissionRespDTO.java deleted file mode 100644 index d7cd3c1..0000000 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/biz/system/permission/dto/DeptDataPermissionRespDTO.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.njcn.msgpush.framework.common.biz.system.permission.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.HashSet; -import java.util.Set; - -@Schema(description = "RPC 服务 - 部门的数据权限 Response DTO") -@Data -public class DeptDataPermissionRespDTO { - - @Schema(description = "是否可查看全部数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean all; - - @Schema(description = "是否可查看自己的数据", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean self; - - @Schema(description = "可查看的部门编号数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 3]") - private Set deptIds; - - public DeptDataPermissionRespDTO() { - this.all = false; - this.self = false; - this.deptIds = new HashSet<>(); - } - -} diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/core/ArrayValuable.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/core/ArrayValuable.java index f882b04..c233e7b 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/core/ArrayValuable.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/core/ArrayValuable.java @@ -3,7 +3,7 @@ package com.njcn.msgpush.framework.common.core; /** * 可生成 T 数组的接口 * - * @author HUIHUI + * @author hongawen */ public interface ArrayValuable { diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/DocumentEnum.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/DocumentEnum.java index c0cf985..a9eae18 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/DocumentEnum.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/DocumentEnum.java @@ -3,11 +3,6 @@ package com.njcn.msgpush.framework.common.enums; import lombok.AllArgsConstructor; import lombok.Getter; -/** - * 文档地址 - * - * @author hongawen - */ @Getter @AllArgsConstructor public enum DocumentEnum { diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/RpcConstants.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/RpcConstants.java index 15ac114..3326e77 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/RpcConstants.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/RpcConstants.java @@ -19,22 +19,12 @@ public interface RpcConstants { * * 注意,需要保证和 spring.application.name 保持一致 */ - String SYSTEM_NAME = "system-server"; + String SYSTEM_NAME = "msgpush-system-server"; /** * system 服务的前缀 */ String SYSTEM_PREFIX = RPC_API_PREFIX + "/system"; - /** - * infra 服务名 - * - * 注意,需要保证和 spring.application.name 保持一致 - */ - String INFRA_NAME = "infra-server"; - /** - * infra 服务的前缀 - */ - String INFRA_PREFIX = RPC_API_PREFIX + "/infra"; } diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/UserTypeEnum.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/UserTypeEnum.java index a055c78..1593ef4 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/UserTypeEnum.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/enums/UserTypeEnum.java @@ -9,13 +9,17 @@ import java.util.Arrays; /** * 全局用户类型枚举 + * + * 用于区分不同访问端的用户类型: + * - MEMBER: 对应 /app-api/** 路径,通常用于移动端或 C 端用户 + * - ADMIN: 对应 /admin-api/** 路径,通常用于 Web 管理端或 B 端用户 */ @AllArgsConstructor @Getter public enum UserTypeEnum implements ArrayValuable { - MEMBER(1, "会员"), // 面向 c 端,普通用户 - ADMIN(2, "管理员"); // 面向 b 端,管理后台 + MEMBER(1, "App端用户"), // 对应 /app-api,移动端或 C 端 + ADMIN(2, "Web端用户"); // 对应 /admin-api,Web 管理端或 B 端 public static final Integer[] ARRAYS = Arrays.stream(values()).map(UserTypeEnum::getValue).toArray(Integer[]::new); diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/exception/enums/GlobalErrorCodeConstants.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/exception/enums/GlobalErrorCodeConstants.java index 33d9ce7..9084b45 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/exception/enums/GlobalErrorCodeConstants.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/exception/enums/GlobalErrorCodeConstants.java @@ -29,12 +29,11 @@ public interface GlobalErrorCodeConstants { // ========== 服务端错误段 ========== ErrorCode INTERNAL_SERVER_ERROR = new ErrorCode(500, "系统异常"); - ErrorCode NOT_IMPLEMENTED = new ErrorCode(501, "功能未实现/未开启"); + ErrorCode TABLE_NOT_EXISTS = new ErrorCode(501, "表不存在"); ErrorCode ERROR_CONFIGURATION = new ErrorCode(502, "错误的配置项"); // ========== 自定义错误段 ========== ErrorCode REPEATED_REQUESTS = new ErrorCode(900, "重复请求,请稍后重试"); // 重复请求 - ErrorCode DEMO_DENY = new ErrorCode(901, "演示模式,禁止写操作"); ErrorCode UNKNOWN = new ErrorCode(999, "未知错误"); diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/exception/util/ServiceExceptionUtil.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/exception/util/ServiceExceptionUtil.java index c7ba620..af0bdfe 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/exception/util/ServiceExceptionUtil.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/exception/util/ServiceExceptionUtil.java @@ -1,9 +1,9 @@ package com.njcn.msgpush.framework.common.exception.util; +import com.google.common.annotations.VisibleForTesting; import com.njcn.msgpush.framework.common.exception.ErrorCode; import com.njcn.msgpush.framework.common.exception.ServiceException; import com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants; -import com.google.common.annotations.VisibleForTesting; import lombok.extern.slf4j.Slf4j; /** diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/package-info.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/package-info.java deleted file mode 100644 index 9c4b988..0000000 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 基础的通用类,和框架无关 - * - * 例如说,CommonResult 为通用返回 - */ -package com.njcn.msgpush.framework.common; diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/pojo/CommonResult.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/pojo/CommonResult.java index d6ad866..2382900 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/pojo/CommonResult.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/pojo/CommonResult.java @@ -1,11 +1,11 @@ package com.njcn.msgpush.framework.common.pojo; import cn.hutool.core.lang.Assert; +import com.fasterxml.jackson.annotation.JsonIgnore; import com.njcn.msgpush.framework.common.exception.ErrorCode; import com.njcn.msgpush.framework.common.exception.ServiceException; import com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants; import com.njcn.msgpush.framework.common.exception.util.ServiceExceptionUtil; -import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import java.io.Serializable; diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/pojo/PageParam.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/pojo/PageParam.java index ea937af..7462202 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/pojo/PageParam.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/pojo/PageParam.java @@ -1,11 +1,11 @@ package com.njcn.msgpush.framework.common.pojo; import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.Max; +import jakarta.validation.constraints.Min; +import jakarta.validation.constraints.NotNull; import lombok.Data; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.Max; -import jakarta.validation.constraints.NotNull; import java.io.Serializable; @Schema(description="分页参数") diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/cache/CacheUtils.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/cache/CacheUtils.java index 016d692..07f9992 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/cache/CacheUtils.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/cache/CacheUtils.java @@ -40,7 +40,7 @@ public class CacheUtils { // 只阻塞当前数据加载线程,其他线程返回旧值 .refreshAfterWrite(duration) // 通过 asyncReloading 实现全异步加载,包括 refreshAfterWrite 被阻塞的加载线程 - .build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO 芋艿:可能要思考下,未来要不要做成可配置 + .build(CacheLoader.asyncReloading(loader, Executors.newCachedThreadPool())); // TODO 可能要思考下,未来要不要做成可配置 } /** diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/collection/CollectionUtils.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/collection/CollectionUtils.java index 8108dda..5f5f17c 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/collection/CollectionUtils.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/collection/CollectionUtils.java @@ -3,8 +3,8 @@ package com.njcn.msgpush.framework.common.util.collection; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ArrayUtil; -import com.njcn.msgpush.framework.common.pojo.PageResult; import com.google.common.collect.ImmutableMap; +import com.njcn.msgpush.framework.common.pojo.PageResult; import java.util.*; import java.util.function.*; diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/collection/MapUtils.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/collection/MapUtils.java index 7a7c43b..67917b4 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/collection/MapUtils.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/collection/MapUtils.java @@ -3,10 +3,11 @@ package com.njcn.msgpush.framework.common.util.collection; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.util.ObjUtil; -import com.njcn.msgpush.framework.common.core.KeyValue; import com.google.common.collect.Maps; import com.google.common.collect.Multimap; +import com.njcn.msgpush.framework.common.core.KeyValue; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -65,4 +66,47 @@ public class MapUtils { return map; } + /** + * 从 Map 中获取 BigDecimal 值 + * + * @param map Map 数据源 + * @param key 键名 + * @return BigDecimal 值,解析失败或值为 null 时返回 null + */ + public static BigDecimal getBigDecimal(Map map, String key) { + return getBigDecimal(map, key, null); + } + + /** + * 从 Map 中获取 BigDecimal 值 + * + * @param map Map 数据源 + * @param key 键名 + * @param defaultValue 默认值 + * @return BigDecimal 值,解析失败或值为 null 时返回默认值 + */ + public static BigDecimal getBigDecimal(Map map, String key, BigDecimal defaultValue) { + if (map == null) { + return defaultValue; + } + Object value = map.get(key); + if (value == null) { + return defaultValue; + } + if (value instanceof BigDecimal) { + return (BigDecimal) value; + } + if (value instanceof Number) { + return BigDecimal.valueOf(((Number) value).doubleValue()); + } + if (value instanceof String) { + try { + return new BigDecimal((String) value); + } catch (NumberFormatException e) { + return defaultValue; + } + } + return defaultValue; + } + } diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/date/LocalDateTimeUtils.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/date/LocalDateTimeUtils.java index 7f13756..6aeb0b5 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/date/LocalDateTimeUtils.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/date/LocalDateTimeUtils.java @@ -17,7 +17,8 @@ import java.time.temporal.TemporalAdjusters; import java.util.ArrayList; import java.util.List; -import static cn.hutool.core.date.DatePattern.*; +import static cn.hutool.core.date.DatePattern.UTC_MS_WITH_XXX_OFFSET_PATTERN; +import static cn.hutool.core.date.DatePattern.createFormatter; /** * 时间工具类,用于 {@link LocalDateTime} diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/io/IoUtils.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/io/IoUtils.java index 3545833..093046a 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/io/IoUtils.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/io/IoUtils.java @@ -7,7 +7,7 @@ import cn.hutool.core.util.StrUtil; import java.io.InputStream; /** - * IO 工具类,用于 {@link cn.hutool.core.io.IoUtil} 缺失的方法 + * IO 工具类,用于 {@link IoUtil} 缺失的方法 * * @author hongawen */ diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/json/JsonUtils.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/json/JsonUtils.java index 77425da..d2404e9 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/json/JsonUtils.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/json/JsonUtils.java @@ -3,8 +3,6 @@ package com.njcn.msgpush.framework.common.util.json; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONUtil; -import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; -import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -13,6 +11,8 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.SerializationFeature; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; +import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; +import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; import lombok.Getter; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -229,4 +229,53 @@ public class JsonUtils { return JSONUtil.isTypeJSONObject(str); } + /** + * 将 Object 转换为目标类型 + *

+ * 避免先转 jsonString 再 parseObject 的性能损耗 + * + * @param obj 源对象(可以是 Map、POJO 等) + * @param clazz 目标类型 + * @return 转换后的对象 + */ + public static T convertObject(Object obj, Class clazz) { + if (obj == null) { + return null; + } + if (clazz.isInstance(obj)) { + return clazz.cast(obj); + } + return objectMapper.convertValue(obj, clazz); + } + + /** + * 将 Object 转换为目标类型(支持泛型) + * + * @param obj 源对象 + * @param typeReference 目标类型引用 + * @return 转换后的对象 + */ + public static T convertObject(Object obj, TypeReference typeReference) { + if (obj == null) { + return null; + } + return objectMapper.convertValue(obj, typeReference); + } + + /** + * 将 Object 转换为 List 类型 + *

+ * 避免先转 jsonString 再 parseArray 的性能损耗 + * + * @param obj 源对象(可以是 List、数组等) + * @param clazz 目标元素类型 + * @return 转换后的 List + */ + public static List convertList(Object obj, Class clazz) { + if (obj == null) { + return new ArrayList<>(); + } + return objectMapper.convertValue(obj, objectMapper.getTypeFactory().constructCollectionType(List.class, clazz)); + } + } diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/number/NumberUtils.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/number/NumberUtils.java index d1c9142..eac002c 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/number/NumberUtils.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/number/NumberUtils.java @@ -8,7 +8,7 @@ import java.math.BigDecimal; import java.util.List; /** - * 数字的工具类,补全 {@link cn.hutool.core.util.NumberUtil} 的功能 + * 数字的工具类,补全 {@link NumberUtil} 的功能 * * @author hongawen */ diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/object/BeanUtils.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/object/BeanUtils.java index 6d30f19..6c58cae 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/object/BeanUtils.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/object/BeanUtils.java @@ -10,7 +10,7 @@ import java.util.function.Consumer; /** * Bean 工具类 * - * 1. 默认使用 {@link cn.hutool.core.bean.BeanUtil} 作为实现类,虽然不同 bean 工具的性能有差别,但是对绝大多数同学的项目,不用在意这点性能 + * 1. 默认使用 {@link BeanUtil} 作为实现类,虽然不同 bean 工具的性能有差别,但是对绝大多数同学的项目,不用在意这点性能 * 2. 针对复杂的对象转换,可以搜参考 AuthConvert 实现,通过 mapstruct + default 配合实现 * * @author hongawen diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/object/PageUtils.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/object/PageUtils.java index e9cb1cc..1ecbea1 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/object/PageUtils.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/object/PageUtils.java @@ -13,7 +13,7 @@ import org.springframework.util.Assert; import static java.util.Collections.singletonList; /** - * {@link com.njcn.msgpush.framework.common.pojo.PageParam} 工具类 + * {@link PageParam} 工具类 * * @author hongawen */ diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/validation/ValidationUtils.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/validation/ValidationUtils.java index f9d8514..4b099b3 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/validation/ValidationUtils.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/util/validation/ValidationUtils.java @@ -2,12 +2,12 @@ package com.njcn.msgpush.framework.common.util.validation; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.Assert; -import org.springframework.util.StringUtils; - import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; import jakarta.validation.Validation; import jakarta.validation.Validator; +import org.springframework.util.StringUtils; + import java.util.Set; import java.util.regex.Pattern; diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/Mobile.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/Mobile.java index 843b335..83be617 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/Mobile.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/Mobile.java @@ -2,6 +2,7 @@ package com.njcn.msgpush.framework.common.validation; import jakarta.validation.Constraint; import jakarta.validation.Payload; + import java.lang.annotation.*; @Target({ diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/MobileValidator.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/MobileValidator.java index c65722f..bc4dc0f 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/MobileValidator.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/MobileValidator.java @@ -2,7 +2,6 @@ package com.njcn.msgpush.framework.common.validation; import cn.hutool.core.util.StrUtil; import com.njcn.msgpush.framework.common.util.validation.ValidationUtils; - import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/Telephone.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/Telephone.java index 158b203..1e7906d 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/Telephone.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/Telephone.java @@ -2,6 +2,7 @@ package com.njcn.msgpush.framework.common.validation; import jakarta.validation.Constraint; import jakarta.validation.Payload; + import java.lang.annotation.*; @Target({ diff --git a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/TelephoneValidator.java b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/TelephoneValidator.java index 8032ff4..515bb8c 100644 --- a/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/TelephoneValidator.java +++ b/msgpush-framework/msgpush-common/src/main/java/com/njcn/msgpush/framework/common/validation/TelephoneValidator.java @@ -2,7 +2,6 @@ package com.njcn.msgpush.framework.common.validation; import cn.hutool.core.text.CharSequenceUtil; import cn.hutool.core.util.PhoneUtil; - import jakarta.validation.ConstraintValidator; import jakarta.validation.ConstraintValidatorContext; diff --git a/msgpush-framework/msgpush-common/src/test/java/com/njcn/msgpush/framework/common/util/collection/CollectionUtilsTest.java b/msgpush-framework/msgpush-common/src/test/java/com/njcn/msgpush/framework/common/util/collection/CollectionUtilsTest.java deleted file mode 100644 index 4ac750d..0000000 --- a/msgpush-framework/msgpush-common/src/test/java/com/njcn/msgpush/framework/common/util/collection/CollectionUtilsTest.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.njcn.msgpush.framework.common.util.collection; - -import lombok.AllArgsConstructor; -import lombok.Data; -import org.junit.jupiter.api.Test; - -import java.util.Arrays; -import java.util.Collection; -import java.util.List; -import java.util.function.BiFunction; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * {@link CollectionUtils} 的单元测试 - */ -public class CollectionUtilsTest { - - @Data - @AllArgsConstructor - private static class Dog { - - private Integer id; - private String name; - private String code; - - } - - @Test - public void testDiffList() { - // 准备参数 - Collection oldList = Arrays.asList( - new Dog(1, "花花", "hh"), - new Dog(2, "旺财", "wc") - ); - Collection newList = Arrays.asList( - new Dog(null, "花花2", "hh"), - new Dog(null, "小白", "xb") - ); - BiFunction sameFunc = (oldObj, newObj) -> { - boolean same = oldObj.getCode().equals(newObj.getCode()); - // 如果相等的情况下,需要设置下 id,后续好更新 - if (same) { - newObj.setId(oldObj.getId()); - } - return same; - }; - - // 调用 - List> result = CollectionUtils.diffList(oldList, newList, sameFunc); - // 断言 - assertEquals(result.size(), 3); - // 断言 create - assertEquals(result.get(0).size(), 1); - assertEquals(result.get(0).get(0), new Dog(null, "小白", "xb")); - // 断言 update - assertEquals(result.get(1).size(), 1); - assertEquals(result.get(1).get(0), new Dog(1, "花花2", "hh")); - // 断言 delete - assertEquals(result.get(2).size(), 1); - assertEquals(result.get(2).get(0), new Dog(2, "旺财", "wc")); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-biz-ip/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-biz-ip/pom.xml index af228bf..abc57df 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-biz-ip/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-biz-ip/pom.xml @@ -2,21 +2,20 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 msgpush-spring-boot-starter-biz-ip jar - ${project.artifactId} IP 拓展,支持如下功能: 1. IP 功能:查询 IP 对应的城市信息 - 基于 https://gitee.com/lionsoul/ip2region 实现 + 基于 https://gitee.com/lionsoul/ip2region 实现 2. 城市功能:查询城市编码对应的城市信息 - 基于 https://github.com/modood/Administrative-divisions-of-China 实现 + 基于 https://github.com/modood/Administrative-divisions-of-China 实现 @@ -50,5 +49,4 @@ test - - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/main/java/com/njcn/msgpush/framework/ip/core/utils/IPUtils.java b/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/main/java/com/njcn/msgpush/framework/ip/core/utils/IPUtils.java index bd758f9..885eb99 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/main/java/com/njcn/msgpush/framework/ip/core/utils/IPUtils.java +++ b/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/main/java/com/njcn/msgpush/framework/ip/core/utils/IPUtils.java @@ -13,7 +13,7 @@ import java.io.IOException; * * IP 数据源来自 ip2region.xdb 精简版,基于 项目 * - * @author wanglhup + * @author hongawen */ @Slf4j public class IPUtils { diff --git a/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/main/java/com/njcn/msgpush/framework/ip/package-info.java b/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/main/java/com/njcn/msgpush/framework/ip/package-info.java deleted file mode 100644 index 2f5a6ee..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/main/java/com/njcn/msgpush/framework/ip/package-info.java +++ /dev/null @@ -1,11 +0,0 @@ -/** - * IP 拓展,支持如下功能: - * - * 1. IP 功能:查询 IP 对应的城市信息 - * 基于 https://gitee.com/lionsoul/ip2region 实现 - * 2. 城市功能:查询城市编码对应的城市信息 - * 基于 https://github.com/modood/Administrative-divisions-of-China 实现 - * - * @author hongawen - */ -package com.njcn.msgpush.framework.ip; diff --git a/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/test/java/com/njcn/msgpush/framework/ip/core/utils/AreaUtilsTest.java b/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/test/java/com/njcn/msgpush/framework/ip/core/utils/AreaUtilsTest.java deleted file mode 100644 index 4563047..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/test/java/com/njcn/msgpush/framework/ip/core/utils/AreaUtilsTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.njcn.msgpush.framework.ip.core.utils; - - -import com.njcn.msgpush.framework.ip.core.Area; -import com.njcn.msgpush.framework.ip.core.enums.AreaTypeEnum; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * {@link AreaUtils} 的单元测试 - * - * @author hongawen - */ -public class AreaUtilsTest { - - @Test - public void testGetArea() { - // 调用:北京 - Area area = AreaUtils.getArea(110100); - // 断言 - assertEquals(area.getId(), 110100); - assertEquals(area.getName(), "北京市"); - assertEquals(area.getType(), AreaTypeEnum.CITY.getType()); - assertEquals(area.getParent().getId(), 110000); - assertEquals(area.getChildren().size(), 16); - } - - @Test - public void testFormat() { - assertEquals(AreaUtils.format(110105), "北京市 北京市 朝阳区"); - assertEquals(AreaUtils.format(1), "中国"); - assertEquals(AreaUtils.format(2), "蒙古"); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/test/java/com/njcn/msgpush/framework/ip/core/utils/IPUtilsTest.java b/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/test/java/com/njcn/msgpush/framework/ip/core/utils/IPUtilsTest.java deleted file mode 100644 index 497cfc7..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-biz-ip/src/test/java/com/njcn/msgpush/framework/ip/core/utils/IPUtilsTest.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.njcn.msgpush.framework.ip.core.utils; - -import com.njcn.msgpush.framework.ip.core.Area; -import org.junit.jupiter.api.Test; -import org.lionsoul.ip2region.xdb.Searcher; - - -import static org.junit.jupiter.api.Assertions.assertEquals; - -/** - * {@link IPUtils} 的单元测试 - * - * @author wanglhup - */ -public class IPUtilsTest { - - @Test - public void testGetAreaId_string() { - // 120.202.4.0|120.202.4.255|420600 - Integer areaId = IPUtils.getAreaId("120.202.4.50"); - assertEquals(420600, areaId); - } - - @Test - public void testGetAreaId_long() throws Exception { - // 120.203.123.0|120.203.133.255|360900 - long ip = Searcher.checkIP("120.203.123.250"); - Integer areaId = IPUtils.getAreaId(ip); - assertEquals(360900, areaId); - } - - @Test - public void testGetArea_string() { - // 120.202.4.0|120.202.4.255|420600 - Area area = IPUtils.getArea("120.202.4.50"); - assertEquals("襄阳市", area.getName()); - } - - @Test - public void testGetArea_long() throws Exception { - // 120.203.123.0|120.203.133.255|360900 - long ip = Searcher.checkIP("120.203.123.252"); - Area area = IPUtils.getArea(ip); - assertEquals("宜春市", area.getName()); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-env/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-env/pom.xml index d01c5a0..212973c 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-env/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-env/pom.xml @@ -2,27 +2,20 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 msgpush-spring-boot-starter-env jar ${project.artifactId} 开发环境拓展,实现类似阿里的特性环境的能力 - 1. https://segmentfault.com/a/1190000018022987 - - - 8 - 8 - - com.njcn @@ -62,5 +55,4 @@ spring-cloud-starter-alibaba-nacos-discovery - - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/config/EnvEnvironmentPostProcessor.java b/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/config/EnvEnvironmentPostProcessor.java index d119b52..47e368b 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/config/EnvEnvironmentPostProcessor.java +++ b/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/config/EnvEnvironmentPostProcessor.java @@ -21,7 +21,6 @@ public class EnvEnvironmentPostProcessor implements EnvironmentPostProcessor { private static final Set TARGET_TAG_KEYS = SetUtils.asSet( "spring.cloud.nacos.discovery.metadata.tag" // Nacos 注册中心 - // MQ TODO ); @Override @@ -29,7 +28,6 @@ public class EnvEnvironmentPostProcessor implements EnvironmentPostProcessor { // 0. 设置 ${HOST_NAME} 兜底的环境变量 String hostNameKey = StrUtil.subBetween(HOST_NAME_VALUE, "{", "}"); if (!environment.containsProperty(hostNameKey)) { - System.out.println(EnvUtils.getHostName()); environment.getSystemProperties().put(hostNameKey, EnvUtils.getHostName()); } diff --git a/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/core/fegin/EnvLoadBalancerClient.java b/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/core/fegin/EnvLoadBalancerClient.java index e26e9d8..fe07ccd 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/core/fegin/EnvLoadBalancerClient.java +++ b/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/core/fegin/EnvLoadBalancerClient.java @@ -76,9 +76,9 @@ public class EnvLoadBalancerClient implements ReactorServiceInstanceLoadBalancer chooseInstances = instances; } - // TODO 芋艿:https://juejin.cn/post/7056770721858469896 相同网段 + // TODO https://juejin.cn/post/7056770721858469896 相同网段 - // 随机 + 权重获取实例列表 TODO 芋艿:目前直接使用 Nacos 提供的方法,如果替换注册中心,需要重新失败该方法 + // 随机 + 权重获取实例列表 TODO 目前直接使用 Nacos 提供的方法,如果替换注册中心,需要重新失败该方法 return new DefaultResponse(NacosBalancer.getHostByRandomWeight3(chooseInstances)); } diff --git a/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/core/package-info.java b/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/core/package-info.java index 121d8fc..e69de29 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/core/package-info.java +++ b/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/core/package-info.java @@ -1 +0,0 @@ -package com.njcn.msgpush.framework.env.core; diff --git a/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/package-info.java b/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/package-info.java deleted file mode 100644 index b8df99c..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-env/src/main/java/com/njcn/msgpush/framework/env/package-info.java +++ /dev/null @@ -1,7 +0,0 @@ -/** - * 开发环境拓展,实现类似阿里的特性环境的能力 - * 1. https://segmentfault.com/a/1190000018022987 - * - * @author hongawen - */ -package com.njcn.msgpush.framework.env; diff --git a/msgpush-framework/msgpush-spring-boot-starter-excel/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-excel/pom.xml index c493c83..7626473 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-excel/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-excel/pom.xml @@ -2,12 +2,13 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 + msgpush-spring-boot-starter-excel jar @@ -15,6 +16,7 @@ Excel 拓展 + com.njcn @@ -71,5 +73,4 @@ test - - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/annotations/ExcelColumnSelect.java b/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/annotations/ExcelColumnSelect.java index 6e25057..b59e8e5 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/annotations/ExcelColumnSelect.java +++ b/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/annotations/ExcelColumnSelect.java @@ -7,7 +7,7 @@ import java.lang.annotation.*; * * 其中 {@link #dictType()} 和 {@link #functionName()} 二选一 * - * @author HUIHUI + * @author hongawen */ @Target({ElementType.FIELD}) @Retention(RetentionPolicy.RUNTIME) diff --git a/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/convert/AreaConvert.java b/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/convert/AreaConvert.java index e78c464..752d647 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/convert/AreaConvert.java +++ b/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/convert/AreaConvert.java @@ -13,7 +13,7 @@ import lombok.extern.slf4j.Slf4j; /** * Excel 数据地区转换器 * - * @author HUIHUI + * @author hongawen */ @Slf4j public class AreaConvert implements Converter { diff --git a/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/function/ExcelColumnSelectFunction.java b/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/function/ExcelColumnSelectFunction.java index c052ac7..fd3533b 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/function/ExcelColumnSelectFunction.java +++ b/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/function/ExcelColumnSelectFunction.java @@ -7,7 +7,7 @@ import java.util.List; * * 为什么不直接解析字典还搞个接口?考虑到有的下拉数据不是从字典中获取的所有需要做一个兼容 - * @author HUIHUI + * @author hongawen */ public interface ExcelColumnSelectFunction { diff --git a/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/handler/SelectSheetWriteHandler.java b/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/handler/SelectSheetWriteHandler.java index 7db9741..99118c4 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/handler/SelectSheetWriteHandler.java +++ b/msgpush-framework/msgpush-spring-boot-starter-excel/src/main/java/com/njcn/msgpush/framework/excel/core/handler/SelectSheetWriteHandler.java @@ -34,7 +34,7 @@ import static com.njcn.msgpush.framework.common.util.collection.CollectionUtils. /** * 基于固定 sheet 实现下拉框 * - * @author HUIHUI + * @author hongawen */ @Slf4j public class SelectSheetWriteHandler implements SheetWriteHandler { diff --git a/msgpush-framework/msgpush-spring-boot-starter-excel/src/test/java/com/njcn/msgpush/framework/dict/core/util/DictFrameworkUtilsTest.java b/msgpush-framework/msgpush-spring-boot-starter-excel/src/test/java/com/njcn/msgpush/framework/dict/core/util/DictFrameworkUtilsTest.java deleted file mode 100644 index befc994..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-excel/src/test/java/com/njcn/msgpush/framework/dict/core/util/DictFrameworkUtilsTest.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.njcn.msgpush.framework.dict.core.util; - -import com.njcn.msgpush.framework.common.biz.system.dict.DictDataCommonApi; -import com.njcn.msgpush.framework.dict.core.DictFrameworkUtils; -import com.njcn.msgpush.framework.test.core.ut.BaseMockitoUnitTest; -import com.njcn.msgpush.framework.common.biz.system.dict.dto.DictDataRespDTO; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.Mock; - -import java.util.List; - -import static com.njcn.msgpush.framework.common.pojo.CommonResult.success; -import static com.njcn.msgpush.framework.test.core.util.RandomUtils.randomPojo; -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.when; - -/** - * {@link DictFrameworkUtils} 的单元测试 - */ -public class DictFrameworkUtilsTest extends BaseMockitoUnitTest { - - @Mock - private DictDataCommonApi dictDataApi; - - @BeforeEach - public void setUp() { - DictFrameworkUtils.init(dictDataApi); - DictFrameworkUtils.clearCache(); - } - - @Test - public void testParseDictDataLabel() { - // mock 数据 - List dictDatas = List.of( - randomPojo(DictDataRespDTO.class, o -> o.setDictType("animal").setValue("cat").setLabel("猫")), - randomPojo(DictDataRespDTO.class, o -> o.setDictType("animal").setValue("dog").setLabel("狗")) - ); - // mock 方法 - when(dictDataApi.getDictDataList(eq("animal"))).thenReturn(success(dictDatas)); - - // 断言返回值 - assertEquals("狗", DictFrameworkUtils.parseDictDataLabel("animal", "dog")); - } - - @Test - public void testParseDictDataValue() { - // mock 数据 - List dictDatas = List.of( - randomPojo(DictDataRespDTO.class, o -> o.setDictType("animal").setValue("cat").setLabel("猫")), - randomPojo(DictDataRespDTO.class, o -> o.setDictType("animal").setValue("dog").setLabel("狗")) - ); - // mock 方法 - when(dictDataApi.getDictDataList(eq("animal"))).thenReturn(success(dictDatas)); - - // 断言返回值 - assertEquals("dog", DictFrameworkUtils.parseDictDataValue("animal", "狗")); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-mq/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-mq/pom.xml index 48448a4..683a7ee 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mq/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-mq/pom.xml @@ -2,12 +2,13 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 + msgpush-spring-boot-starter-mq jar @@ -40,4 +41,4 @@ - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-mq/src/main/java/com/njcn/msgpush/framework/mq/package-info.java b/msgpush-framework/msgpush-spring-boot-starter-mq/src/main/java/com/njcn/msgpush/framework/mq/package-info.java deleted file mode 100644 index e74b1ae..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-mq/src/main/java/com/njcn/msgpush/framework/mq/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 消息队列,支持 Redis、RocketMQ、RabbitMQ、Kafka 四种 - */ -package com.njcn.msgpush.framework.mq; diff --git a/msgpush-framework/msgpush-spring-boot-starter-mq/src/main/java/com/njcn/msgpush/framework/mq/redis/core/stream/AbstractRedisStreamMessageListener.java b/msgpush-framework/msgpush-spring-boot-starter-mq/src/main/java/com/njcn/msgpush/framework/mq/redis/core/stream/AbstractRedisStreamMessageListener.java index 36f6207..4c606b8 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mq/src/main/java/com/njcn/msgpush/framework/mq/redis/core/stream/AbstractRedisStreamMessageListener.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mq/src/main/java/com/njcn/msgpush/framework/mq/redis/core/stream/AbstractRedisStreamMessageListener.java @@ -69,7 +69,7 @@ public abstract class AbstractRedisStreamMessageListener + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 + msgpush-spring-boot-starter-mybatis jar @@ -102,4 +103,4 @@ - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/datasource/config/MsgpushDataSourceAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/datasource/config/MsgpushDataSourceAutoConfiguration.java index f4f31c4..132d9a0 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/datasource/config/MsgpushDataSourceAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/datasource/config/MsgpushDataSourceAutoConfiguration.java @@ -1,7 +1,7 @@ package com.njcn.msgpush.framework.datasource.config; -import com.njcn.msgpush.framework.datasource.core.filter.DruidAdRemoveFilter; import com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties; +import com.njcn.msgpush.framework.datasource.core.filter.DruidAdRemoveFilter; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/datasource/core/filter/DruidAdRemoveFilter.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/datasource/core/filter/DruidAdRemoveFilter.java index 95332b8..7c71ab6 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/datasource/core/filter/DruidAdRemoveFilter.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/datasource/core/filter/DruidAdRemoveFilter.java @@ -1,12 +1,12 @@ package com.njcn.msgpush.framework.datasource.core.filter; import com.alibaba.druid.util.Utils; -import org.springframework.web.filter.OncePerRequestFilter; - import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.filter.OncePerRequestFilter; + import java.io.IOException; /** diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java index 8c4f599..c144c2a 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/config/IdTypeEnvironmentPostProcessor.java @@ -1,10 +1,10 @@ package com.njcn.msgpush.framework.mybatis.config; import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.common.util.collection.SetUtils; -import com.njcn.msgpush.framework.mybatis.core.util.JdbcUtils; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.annotation.IdType; +import com.njcn.msgpush.framework.common.util.collection.SetUtils; +import com.njcn.msgpush.framework.mybatis.core.util.JdbcUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.env.EnvironmentPostProcessor; @@ -41,7 +41,7 @@ public class IdTypeEnvironmentPostProcessor implements EnvironmentPostProcessor } // 设置 Quartz JobStore 对应的 Driver - // TODO 芋艿:暂时没有找到特别合适的地方,先放在这里 + // TODO 暂时没有找到特别合适的地方,先放在这里 setJobStoreDriverIfPresent(environment, dbType); // 如果非 NONE,则不进行处理 diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/config/MsgpushMybatisAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/config/MsgpushMybatisAutoConfiguration.java index 415ea67..5749f00 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/config/MsgpushMybatisAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/config/MsgpushMybatisAutoConfiguration.java @@ -2,11 +2,8 @@ package com.njcn.msgpush.framework.mybatis.config; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.common.util.json.JsonUtils; -import com.njcn.msgpush.framework.mybatis.core.handler.DefaultDBFieldHandler; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; -import com.baomidou.mybatisplus.core.handlers.IJsonTypeHandler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.core.incrementer.IKeyGenerator; import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler; @@ -16,6 +13,8 @@ import com.baomidou.mybatisplus.extension.parser.cache.JdkSerialCaffeineJsqlPars import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import com.fasterxml.jackson.databind.ObjectMapper; +import com.njcn.msgpush.framework.common.util.json.JsonUtils; +import com.njcn.msgpush.framework.mybatis.core.handler.DefaultDBFieldHandler; import org.apache.ibatis.annotations.Mapper; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/handler/DefaultDBFieldHandler.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/handler/DefaultDBFieldHandler.java index e8be174..719cebc 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/handler/DefaultDBFieldHandler.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/handler/DefaultDBFieldHandler.java @@ -32,6 +32,10 @@ public class DefaultDBFieldHandler implements MetaObjectHandler { if (Objects.isNull(baseDO.getUpdateTime())) { baseDO.setUpdateTime(current); } + // deleted 为空时,统一按未删除处理,避免依赖数据库默认值 + if (Objects.isNull(baseDO.getDeleted())) { + baseDO.setDeleted(Boolean.FALSE); + } Long userId = SecurityFrameworkUtils.getLoginUserId(); // 当前登录用户不为空,创建人为空,则当前登录用户为创建人 diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/mapper/BaseMapperX.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/mapper/BaseMapperX.java index 11e17c3..021c551 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/mapper/BaseMapperX.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/mapper/BaseMapperX.java @@ -1,12 +1,6 @@ package com.njcn.msgpush.framework.mybatis.core.mapper; import cn.hutool.core.collection.CollUtil; -import com.njcn.msgpush.framework.common.pojo.PageParam; -import com.njcn.msgpush.framework.common.pojo.PageResult; -import com.njcn.msgpush.framework.common.pojo.SortablePageParam; -import com.njcn.msgpush.framework.common.pojo.SortingField; -import com.njcn.msgpush.framework.mybatis.core.util.JdbcUtils; -import com.njcn.msgpush.framework.mybatis.core.util.MyBatisUtils; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -18,6 +12,12 @@ import com.baomidou.mybatisplus.extension.toolkit.Db; import com.github.yulichang.base.MPJBaseMapper; import com.github.yulichang.interfaces.MPJBaseJoin; import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.njcn.msgpush.framework.common.pojo.PageParam; +import com.njcn.msgpush.framework.common.pojo.PageResult; +import com.njcn.msgpush.framework.common.pojo.SortablePageParam; +import com.njcn.msgpush.framework.common.pojo.SortingField; +import com.njcn.msgpush.framework.mybatis.core.util.JdbcUtils; +import com.njcn.msgpush.framework.mybatis.core.util.MyBatisUtils; import org.apache.ibatis.annotations.Param; import java.util.Collection; diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/LambdaQueryWrapperX.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/LambdaQueryWrapperX.java index 988beda..16d5b56 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/LambdaQueryWrapperX.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/LambdaQueryWrapperX.java @@ -2,9 +2,9 @@ package com.njcn.msgpush.framework.mybatis.core.query; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; -import com.njcn.msgpush.framework.common.util.collection.ArrayUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; +import com.njcn.msgpush.framework.common.util.collection.ArrayUtils; import org.springframework.util.StringUtils; import java.util.Collection; diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/MPJLambdaWrapperX.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/MPJLambdaWrapperX.java index 1e9e822..9ac5700 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/MPJLambdaWrapperX.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/MPJLambdaWrapperX.java @@ -2,9 +2,9 @@ package com.njcn.msgpush.framework.mybatis.core.query; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ObjectUtil; -import com.njcn.msgpush.framework.common.util.collection.ArrayUtils; import com.baomidou.mybatisplus.core.toolkit.support.SFunction; import com.github.yulichang.wrapper.MPJLambdaWrapper; +import com.njcn.msgpush.framework.common.util.collection.ArrayUtils; import org.springframework.util.StringUtils; import java.util.Collection; @@ -15,6 +15,7 @@ import java.util.function.Consumer; *

* 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。 * 2. SFunction column + 泛型:支持任意类字段(主表、子表、三表),推荐写法, 让编译器自动推断 S 类型 + * * @param 数据类型 */ public class MPJLambdaWrapperX extends MPJLambdaWrapper { @@ -122,6 +123,12 @@ public class MPJLambdaWrapperX extends MPJLambdaWrapper { return this; } + @Override + public MPJLambdaWrapperX orderByAsc(SFunction column) { + super.orderByAsc(true, column); + return this; + } + @Override public MPJLambdaWrapperX last(String lastSql) { super.last(lastSql); diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/QueryWrapperX.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/QueryWrapperX.java index 4f8a52a..0ac7c29 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/QueryWrapperX.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/query/QueryWrapperX.java @@ -1,10 +1,10 @@ package com.njcn.msgpush.framework.mybatis.core.query; -import com.njcn.msgpush.framework.mybatis.core.util.JdbcUtils; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.ArrayUtils; import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.njcn.msgpush.framework.mybatis.core.util.JdbcUtils; import org.springframework.util.StringUtils; import java.util.Collection; @@ -142,7 +142,7 @@ public class QueryWrapperX extends QueryWrapper { /** * 设置只返回最后一条 * - * TODO 芋艿:不是完美解,需要在思考下。如果使用多数据源,并且数据源是多种类型时,可能会存在问题:实现之返回一条的语法不同 + * TODO 不是完美解,需要在思考下。如果使用多数据源,并且数据源是多种类型时,可能会存在问题:实现之返回一条的语法不同 * * @return this */ diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/util/JdbcUtils.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/util/JdbcUtils.java index f0698f0..cd0adf7 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/util/JdbcUtils.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/util/JdbcUtils.java @@ -1,10 +1,10 @@ package com.njcn.msgpush.framework.mybatis.core.util; +import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; +import com.baomidou.mybatisplus.annotation.DbType; import com.njcn.msgpush.framework.common.util.object.ObjectUtils; import com.njcn.msgpush.framework.common.util.spring.SpringUtils; import com.njcn.msgpush.framework.mybatis.core.enums.DbTypeEnum; -import com.baomidou.dynamic.datasource.DynamicRoutingDataSource; -import com.baomidou.mybatisplus.annotation.DbType; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import javax.sql.DataSource; diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/util/MyBatisUtils.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/util/MyBatisUtils.java index 6a61140..dd3efd3 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/util/MyBatisUtils.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/mybatis/core/util/MyBatisUtils.java @@ -4,9 +4,6 @@ import cn.hutool.core.collection.CollUtil; import cn.hutool.core.lang.func.Func1; import cn.hutool.core.lang.func.LambdaUtil; import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.common.pojo.PageParam; -import com.njcn.msgpush.framework.common.pojo.SortingField; -import com.njcn.msgpush.framework.mybatis.core.enums.DbTypeEnum; import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.core.conditions.Wrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; @@ -16,6 +13,9 @@ import com.baomidou.mybatisplus.core.toolkit.StringPool; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.njcn.msgpush.framework.common.pojo.PageParam; +import com.njcn.msgpush.framework.common.pojo.SortingField; +import com.njcn.msgpush.framework.mybatis.core.enums.DbTypeEnum; import net.sf.jsqlparser.expression.Alias; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; diff --git a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/translate/config/MsgpushTranslateAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/translate/config/MsgpushTranslateAutoConfiguration.java index 5c5e04f..68a82ba 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/translate/config/MsgpushTranslateAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-mybatis/src/main/java/com/njcn/msgpush/framework/translate/config/MsgpushTranslateAutoConfiguration.java @@ -1,7 +1,7 @@ package com.njcn.msgpush.framework.translate.config; -import com.njcn.msgpush.framework.translate.core.TranslateUtils; import com.fhs.trans.service.impl.TransService; +import com.njcn.msgpush.framework.translate.core.TranslateUtils; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; diff --git a/msgpush-framework/msgpush-spring-boot-starter-protection/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-protection/pom.xml index afbeac5..5cd4a49 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-protection/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-protection/pom.xml @@ -2,12 +2,13 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 + msgpush-spring-boot-starter-protection jar @@ -43,5 +44,4 @@ test - - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/idempotent/config/MsgpushIdempotentConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/idempotent/config/MsgpushIdempotentConfiguration.java index a0ca920..a15c67d 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/idempotent/config/MsgpushIdempotentConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/idempotent/config/MsgpushIdempotentConfiguration.java @@ -1,13 +1,13 @@ package com.njcn.msgpush.framework.idempotent.config; import com.njcn.msgpush.framework.idempotent.core.aop.IdempotentAspect; +import com.njcn.msgpush.framework.idempotent.core.keyresolver.IdempotentKeyResolver; import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver; import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.ExpressionIdempotentKeyResolver; -import com.njcn.msgpush.framework.idempotent.core.keyresolver.IdempotentKeyResolver; import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.UserIdempotentKeyResolver; import com.njcn.msgpush.framework.idempotent.core.redis.IdempotentRedisDAO; -import org.springframework.boot.autoconfigure.AutoConfiguration; import com.njcn.msgpush.framework.redis.config.MsgpushRedisAutoConfiguration; +import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.data.redis.core.StringRedisTemplate; diff --git a/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/idempotent/core/annotation/Idempotent.java b/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/idempotent/core/annotation/Idempotent.java index 2799855..3c47ba2 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/idempotent/core/annotation/Idempotent.java +++ b/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/idempotent/core/annotation/Idempotent.java @@ -1,7 +1,7 @@ package com.njcn.msgpush.framework.idempotent.core.annotation; -import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver; import com.njcn.msgpush.framework.idempotent.core.keyresolver.IdempotentKeyResolver; +import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.DefaultIdempotentKeyResolver; import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.ExpressionIdempotentKeyResolver; import com.njcn.msgpush.framework.idempotent.core.keyresolver.impl.UserIdempotentKeyResolver; diff --git a/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/lock4j/config/MsgpushLock4jConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/lock4j/config/MsgpushLock4jConfiguration.java index d8855d3..dae0794 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/lock4j/config/MsgpushLock4jConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/lock4j/config/MsgpushLock4jConfiguration.java @@ -1,7 +1,7 @@ package com.njcn.msgpush.framework.lock4j.config; -import com.njcn.msgpush.framework.lock4j.core.DefaultLockFailureStrategy; import com.baomidou.lock.spring.boot.autoconfigure.LockAutoConfiguration; +import com.njcn.msgpush.framework.lock4j.core.DefaultLockFailureStrategy; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.context.annotation.Bean; diff --git a/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/lock4j/core/DefaultLockFailureStrategy.java b/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/lock4j/core/DefaultLockFailureStrategy.java index 2265999..81b5647 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/lock4j/core/DefaultLockFailureStrategy.java +++ b/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/lock4j/core/DefaultLockFailureStrategy.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.lock4j.core; +import com.baomidou.lock.LockFailureStrategy; import com.njcn.msgpush.framework.common.exception.ServiceException; import com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants; -import com.baomidou.lock.LockFailureStrategy; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Method; diff --git a/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/ratelimiter/core/redis/RateLimiterRedisDAO.java b/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/ratelimiter/core/redis/RateLimiterRedisDAO.java index 114348f..b7d1267 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/ratelimiter/core/redis/RateLimiterRedisDAO.java +++ b/msgpush-framework/msgpush-spring-boot-starter-protection/src/main/java/com/njcn/msgpush/framework/ratelimiter/core/redis/RateLimiterRedisDAO.java @@ -1,7 +1,10 @@ package com.njcn.msgpush.framework.ratelimiter.core.redis; import lombok.AllArgsConstructor; -import org.redisson.api.*; +import org.redisson.api.RRateLimiter; +import org.redisson.api.RateLimiterConfig; +import org.redisson.api.RateType; +import org.redisson.api.RedissonClient; import java.time.Duration; import java.util.Objects; diff --git a/msgpush-framework/msgpush-spring-boot-starter-protection/src/test/java/com/njcn/msgpush/framework/signature/core/ApiSignatureTest.java b/msgpush-framework/msgpush-spring-boot-starter-protection/src/test/java/com/njcn/msgpush/framework/signature/core/ApiSignatureTest.java deleted file mode 100644 index 73fd2dc..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-protection/src/test/java/com/njcn/msgpush/framework/signature/core/ApiSignatureTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.njcn.msgpush.framework.signature.core; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.IdUtil; -import cn.hutool.crypto.digest.DigestUtil; -import com.njcn.msgpush.framework.signature.core.annotation.ApiSignature; -import com.njcn.msgpush.framework.signature.core.aop.ApiSignatureAspect; -import com.njcn.msgpush.framework.signature.core.redis.ApiSignatureRedisDAO; -import jakarta.servlet.http.HttpServletRequest; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.StringReader; -import java.util.concurrent.TimeUnit; - -import static org.junit.jupiter.api.Assertions.assertTrue; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.Mockito.*; - -/** - * {@link ApiSignatureTest} 的单元测试 - */ -@ExtendWith(MockitoExtension.class) -public class ApiSignatureTest { - - @InjectMocks - private ApiSignatureAspect apiSignatureAspect; - - @Mock - private ApiSignatureRedisDAO signatureRedisDAO; - - @Test - public void testSignatureGet() throws IOException { - // 搞一个签名 - Long timestamp = System.currentTimeMillis(); - String nonce = IdUtil.randomUUID(); - String appId = "xxxxxx"; - String appSecret = "yyyyyy"; - String signString = "k1=v1&v1=k1testappId=xxxxxx&nonce=" + nonce + "×tamp=" + timestamp + "yyyyyy"; - String sign = DigestUtil.sha256Hex(signString); - - // 准备参数 - ApiSignature apiSignature = mock(ApiSignature.class); - when(apiSignature.appId()).thenReturn("appId"); - when(apiSignature.timestamp()).thenReturn("timestamp"); - when(apiSignature.nonce()).thenReturn("nonce"); - when(apiSignature.sign()).thenReturn("sign"); - when(apiSignature.timeout()).thenReturn(60); - when(apiSignature.timeUnit()).thenReturn(TimeUnit.SECONDS); - HttpServletRequest request = mock(HttpServletRequest.class); - when(request.getHeader(eq("appId"))).thenReturn(appId); - when(request.getHeader(eq("timestamp"))).thenReturn(String.valueOf(timestamp)); - when(request.getHeader(eq("nonce"))).thenReturn(nonce); - when(request.getHeader(eq("sign"))).thenReturn(sign); - when(request.getParameterMap()).thenReturn(MapUtil.builder() - .put("v1", new String[]{"k1"}).put("k1", new String[]{"v1"}).build()); - when(request.getContentType()).thenReturn("application/json"); - when(request.getReader()).thenReturn(new BufferedReader(new StringReader("test"))); - // mock 方法 - when(signatureRedisDAO.getAppSecret(eq(appId))).thenReturn(appSecret); - when(signatureRedisDAO.setNonce(eq(appId), eq(nonce), eq(120), eq(TimeUnit.SECONDS))).thenReturn(true); - - // 调用 - boolean result = apiSignatureAspect.verifySignature(apiSignature, request); - // 断言结果 - assertTrue(result); - } - -} \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-redis/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-redis/pom.xml index aa84e02..8269241 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-redis/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-redis/pom.xml @@ -2,12 +2,12 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 msgpush-spring-boot-starter-redis jar @@ -37,5 +37,4 @@ jackson-datatype-jsr310 - - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-redis/src/main/java/com/njcn/msgpush/framework/redis/config/MsgpushCacheAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-redis/src/main/java/com/njcn/msgpush/framework/redis/config/MsgpushCacheAutoConfiguration.java index 40bc027..2d83adb 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-redis/src/main/java/com/njcn/msgpush/framework/redis/config/MsgpushCacheAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-redis/src/main/java/com/njcn/msgpush/framework/redis/config/MsgpushCacheAutoConfiguration.java @@ -75,7 +75,7 @@ public class MsgpushCacheAutoConfiguration { RedisConnectionFactory connectionFactory = Objects.requireNonNull(redisTemplate.getConnectionFactory()); RedisCacheWriter cacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory, BatchStrategies.scan(msgpushCacheProperties.getRedisScanBatchSize())); - // 创建 RedisCacheManager 对象 + // 创建 TenantRedisCacheManager 对象 return new TimeoutRedisCacheManager(cacheWriter, redisCacheConfiguration); } diff --git a/msgpush-framework/msgpush-spring-boot-starter-redis/src/main/java/com/njcn/msgpush/framework/redis/package-info.java b/msgpush-framework/msgpush-spring-boot-starter-redis/src/main/java/com/njcn/msgpush/framework/redis/package-info.java deleted file mode 100644 index c0aa02f..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-redis/src/main/java/com/njcn/msgpush/framework/redis/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 采用 Spring Data Redis 操作 Redis,底层使用 Redisson 作为客户端 - */ -package com.njcn.msgpush.framework.redis; diff --git a/msgpush-framework/msgpush-spring-boot-starter-rpc/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-rpc/pom.xml index 399ac1c..763fb47 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-rpc/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-rpc/pom.xml @@ -2,12 +2,13 @@ + 4.0.0 - msgpush-framework com.njcn + msgpush-framework ${revision} - 4.0.0 + msgpush-spring-boot-starter-rpc jar @@ -16,6 +17,10 @@ OpenFeign:提供 RESTful API 的调用 + + UTF-8 + + @@ -43,4 +48,5 @@ jakarta.validation-api - + + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-rpc/src/main/java/com/njcn/msgpush/framework/rpc/package-info.java b/msgpush-framework/msgpush-spring-boot-starter-rpc/src/main/java/com/njcn/msgpush/framework/rpc/package-info.java deleted file mode 100644 index e67c689..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-rpc/src/main/java/com/njcn/msgpush/framework/rpc/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * OpenFeign:提供 RESTful API 的调用 - * - * @author hongawen - */ -package com.njcn.msgpush.framework.rpc; diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-security/pom.xml index d4d68e0..0e0621c 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-security/pom.xml @@ -2,12 +2,13 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 + msgpush-spring-boot-starter-security jar @@ -68,5 +69,4 @@ - - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/config/MsgpushOperateLogConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/config/MsgpushOperateLogConfiguration.java index 2544033..4f41ace 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/config/MsgpushOperateLogConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/config/MsgpushOperateLogConfiguration.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.operatelog.config; -import com.njcn.msgpush.framework.operatelog.core.service.LogRecordServiceImpl; import com.mzt.logapi.service.ILogRecordService; import com.mzt.logapi.starter.annotation.EnableLogRecord; +import com.njcn.msgpush.framework.operatelog.core.service.LogRecordServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.context.annotation.Bean; @@ -11,9 +11,9 @@ import org.springframework.context.annotation.Primary; /** * 操作日志配置类 * - * @author HUIHUI + * @author hongawen */ -@EnableLogRecord(tenant = "admin") // 貌似用不上 tenant 这玩意给个空好啦 +@EnableLogRecord(tenant = "") // 貌似用不上 tenant 这玩意给个空好啦 @AutoConfiguration @Slf4j public class MsgpushOperateLogConfiguration { diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/core/service/LogRecordServiceImpl.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/core/service/LogRecordServiceImpl.java index 92f85de..d4c94a9 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/core/service/LogRecordServiceImpl.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/core/service/LogRecordServiceImpl.java @@ -1,17 +1,16 @@ package com.njcn.msgpush.framework.operatelog.core.service; +import com.mzt.logapi.beans.LogRecord; +import com.mzt.logapi.service.ILogRecordService; import com.njcn.msgpush.framework.common.biz.system.logger.OperateLogCommonApi; +import com.njcn.msgpush.framework.common.biz.system.logger.dto.OperateLogCreateReqDTO; import com.njcn.msgpush.framework.common.util.monitor.TracerUtils; import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; import com.njcn.msgpush.framework.security.core.LoginUser; import com.njcn.msgpush.framework.security.core.util.SecurityFrameworkUtils; -import com.njcn.msgpush.framework.common.biz.system.logger.dto.OperateLogCreateReqDTO; -import com.mzt.logapi.beans.LogRecord; -import com.mzt.logapi.service.ILogRecordService; import jakarta.annotation.Resource; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Qualifier; import java.util.List; @@ -20,7 +19,7 @@ import java.util.List; * * 基于 {@link OperateLogCommonApi} 实现,记录操作日志 * - * @author HUIHUI + * @author hongawen */ @Slf4j public class LogRecordServiceImpl implements ILogRecordService { diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/package-info.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/package-info.java index e0b7f88..a1bedd4 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/package-info.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/operatelog/package-info.java @@ -2,6 +2,6 @@ * 基于 mzt-log 框架 * 实现操作日志功能 * - * @author HUIHUI + * @author hongawen */ package com.njcn.msgpush.framework.operatelog; diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/AuthorizeRequestsCustomizer.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/AuthorizeRequestsCustomizer.java index d788f0e..6716f12 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/AuthorizeRequestsCustomizer.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/AuthorizeRequestsCustomizer.java @@ -6,7 +6,6 @@ import org.springframework.core.Ordered; import org.springframework.security.config.Customizer; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer; -import org.springframework.stereotype.Component; /** * 自定义的 URL 的安全配置 diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushSecurityAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushSecurityAutoConfiguration.java index 1d664cf..c8d0e87 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushSecurityAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushSecurityAutoConfiguration.java @@ -1,5 +1,6 @@ package com.njcn.msgpush.framework.security.config; +import com.njcn.msgpush.framework.common.biz.system.oauth2.OAuth2TokenCommonApi; import com.njcn.msgpush.framework.common.biz.system.permission.PermissionCommonApi; import com.njcn.msgpush.framework.security.core.context.TransmittableThreadLocalSecurityContextHolderStrategy; import com.njcn.msgpush.framework.security.core.filter.TokenAuthenticationFilter; @@ -8,7 +9,6 @@ import com.njcn.msgpush.framework.security.core.handler.AuthenticationEntryPoint import com.njcn.msgpush.framework.security.core.service.SecurityFrameworkService; import com.njcn.msgpush.framework.security.core.service.SecurityFrameworkServiceImpl; import com.njcn.msgpush.framework.web.core.handler.GlobalExceptionHandler; -import com.njcn.msgpush.framework.common.biz.system.oauth2.OAuth2TokenCommonApi; import jakarta.annotation.Resource; import org.springframework.beans.factory.config.MethodInvokingFactoryBean; import org.springframework.boot.autoconfigure.AutoConfiguration; @@ -38,7 +38,7 @@ public class MsgpushSecurityAutoConfiguration { private SecurityProperties securityProperties; /** - * 身份认证失败处理类 Bean + * 认证失败处理类 Bean */ @Bean public AuthenticationEntryPoint authenticationEntryPoint() { diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushSecurityRpcAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushSecurityRpcAutoConfiguration.java index 005e3b8..da76694 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushSecurityRpcAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushSecurityRpcAutoConfiguration.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.security.config; +import com.njcn.msgpush.framework.common.biz.system.oauth2.OAuth2TokenCommonApi; import com.njcn.msgpush.framework.common.biz.system.permission.PermissionCommonApi; import com.njcn.msgpush.framework.security.core.rpc.LoginUserRequestInterceptor; -import com.njcn.msgpush.framework.common.biz.system.oauth2.OAuth2TokenCommonApi; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.Bean; diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushWebSecurityConfigurerAdapter.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushWebSecurityConfigurerAdapter.java index e48adbd..f4a1917 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushWebSecurityConfigurerAdapter.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/MsgpushWebSecurityConfigurerAdapter.java @@ -1,10 +1,10 @@ package com.njcn.msgpush.framework.security.config; import cn.hutool.core.collection.CollUtil; -import com.njcn.msgpush.framework.security.core.filter.TokenAuthenticationFilter; -import com.njcn.msgpush.framework.web.config.WebProperties; import com.google.common.collect.HashMultimap; import com.google.common.collect.Multimap; +import com.njcn.msgpush.framework.security.core.filter.TokenAuthenticationFilter; +import com.njcn.msgpush.framework.web.config.WebProperties; import jakarta.annotation.Resource; import jakarta.annotation.security.PermitAll; import jakarta.servlet.DispatcherType; @@ -114,6 +114,8 @@ public class MsgpushWebSecurityConfigurerAdapter { .cors(Customizer.withDefaults()) // CSRF 禁用,因为不使用 Session .csrf(AbstractHttpConfigurer::disable) + .httpBasic(AbstractHttpConfigurer::disable) + .formLogin(AbstractHttpConfigurer::disable) // 基于 token 机制,所以不需要 Session .sessionManagement(c -> c.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) .headers(c -> c.frameOptions(HeadersConfigurer.FrameOptionsConfig::disable)) diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/SecurityProperties.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/SecurityProperties.java index b08fe91..143e75a 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/SecurityProperties.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/config/SecurityProperties.java @@ -1,11 +1,11 @@ package com.njcn.msgpush.framework.security.config; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; import java.util.Collections; import java.util.List; diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/LoginUser.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/LoginUser.java index e71e2e5..45f59a1 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/LoginUser.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/LoginUser.java @@ -1,7 +1,6 @@ package com.njcn.msgpush.framework.security.core; import cn.hutool.core.map.MapUtil; -import com.njcn.msgpush.framework.common.enums.UserTypeEnum; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; @@ -10,47 +9,18 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -/** - * 登录用户信息 - * - * @author hongawen - */ @Data public class LoginUser { public static final String INFO_KEY_NICKNAME = "nickname"; public static final String INFO_KEY_DEPT_ID = "deptId"; - /** - * 用户编号 - */ private Long id; - /** - * 用户类型 - * - * 关联 {@link UserTypeEnum} - */ private Integer userType; - /** - * 额外的用户信息 - */ private Map info; - - /** - * 授权范围 - */ private List scopes; - /** - * 过期时间 - */ private LocalDateTime expiresTime; - // ========== 上下文 ========== - /** - * 上下文字段,不进行持久化 - * - * 1. 用于基于 LoginUser 维度的临时缓存 - */ @JsonIgnore private Map context; diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java index 98dc67e..5b40ce9 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/context/TransmittableThreadLocalSecurityContextHolderStrategy.java @@ -15,7 +15,7 @@ import org.springframework.util.Assert; public class TransmittableThreadLocalSecurityContextHolderStrategy implements SecurityContextHolderStrategy { /** - * 使用 TransmittableThreadLocal 实现线程之间上下文的传递。 + * 使用 TransmittableThreadLocal 作为上下文 */ private static final ThreadLocal CONTEXT_HOLDER = new TransmittableThreadLocal<>(); diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/filter/TokenAuthenticationFilter.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/filter/TokenAuthenticationFilter.java index 63d511b..854a0ef 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/filter/TokenAuthenticationFilter.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/filter/TokenAuthenticationFilter.java @@ -2,7 +2,10 @@ package com.njcn.msgpush.framework.security.core.filter; import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.StrUtil; +import com.njcn.msgpush.framework.common.biz.system.oauth2.OAuth2TokenCommonApi; +import com.njcn.msgpush.framework.common.biz.system.oauth2.dto.OAuth2AccessTokenCheckRespDTO; import com.njcn.msgpush.framework.common.exception.ServiceException; +import com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants; import com.njcn.msgpush.framework.common.pojo.CommonResult; import com.njcn.msgpush.framework.common.util.json.JsonUtils; import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; @@ -11,8 +14,6 @@ import com.njcn.msgpush.framework.security.core.LoginUser; import com.njcn.msgpush.framework.security.core.util.SecurityFrameworkUtils; import com.njcn.msgpush.framework.web.core.handler.GlobalExceptionHandler; import com.njcn.msgpush.framework.web.core.util.WebFrameworkUtils; -import com.njcn.msgpush.framework.common.biz.system.oauth2.OAuth2TokenCommonApi; -import com.njcn.msgpush.framework.common.biz.system.oauth2.dto.OAuth2AccessTokenCheckRespDTO; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; @@ -26,42 +27,29 @@ import java.io.IOException; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; -/** - * Token 过滤器,验证 token 的有效性 - * 验证通过后,获得 {@link LoginUser} 信息,并加入到 Spring Security 上下文 - * - * @author hongawen - */ @RequiredArgsConstructor @Slf4j public class TokenAuthenticationFilter extends OncePerRequestFilter { private final SecurityProperties securityProperties; - private final GlobalExceptionHandler globalExceptionHandler; - private final OAuth2TokenCommonApi oauth2TokenApi; @Override @SuppressWarnings("NullableProblems") protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { - // 情况一,基于 header[login-user] 获得用户,例如说来自 Gateway 或者其它服务透传 LoginUser loginUser = buildLoginUserByHeader(request); - // 情况二,基于 Token 获得用户 - // 注意,这里主要满足直接使用 Nginx 直接转发到 Spring Cloud 服务的场景。 if (loginUser == null) { String token = SecurityFrameworkUtils.obtainAuthorization(request, securityProperties.getTokenHeader(), securityProperties.getTokenParameter()); if (StrUtil.isNotEmpty(token)) { Integer userType = WebFrameworkUtils.getLoginUserType(request); try { - // 1.1 基于 token 构建登录用户 loginUser = buildLoginUserByToken(token, userType); - // 1.2 模拟 Login 功能,方便日常开发调试 if (loginUser == null) { - loginUser = mockLoginUser(request, token, userType); + loginUser = mockLoginUser(token, userType); } } catch (Throwable ex) { CommonResult result = globalExceptionHandler.allExceptionHandler(request, ex); @@ -71,57 +59,41 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter { } } - // 设置当前用户 if (loginUser != null) { SecurityFrameworkUtils.setLoginUser(loginUser, request); } - // 继续过滤链 chain.doFilter(request, response); } private LoginUser buildLoginUserByToken(String token, Integer userType) { try { - // 校验访问令牌 OAuth2AccessTokenCheckRespDTO accessToken = oauth2TokenApi.checkAccessToken(token).getCheckedData(); if (accessToken == null) { return null; } - // 用户类型不匹配,无权限 - // 注意:只有 /admin-api/* 和 /app-api/* 有 userType,才需要比对用户类型 - // 类似 WebSocket 的 /ws/* 连接地址,是不需要比对用户类型的 - if (userType != null - && ObjectUtil.notEqual(accessToken.getUserType(), userType)) { + if (userType != null && ObjectUtil.notEqual(accessToken.getUserType(), userType)) { throw new AccessDeniedException("错误的用户类型"); } - // 构建登录用户 - return new LoginUser().setId(accessToken.getUserId()).setUserType(accessToken.getUserType()) - .setInfo(accessToken.getUserInfo()) // 额外的用户信息 + return new LoginUser().setId(accessToken.getUserId()) + .setUserType(accessToken.getUserType()) + .setInfo(accessToken.getUserInfo()) + .setScopes(accessToken.getScopes()) .setExpiresTime(accessToken.getExpiresTime()); } catch (ServiceException serviceException) { - // 校验 Token 不通过时,考虑到一些接口是无需登录的,所以直接返回 null 即可 - return null; + if (ObjectUtil.equal(serviceException.getCode(), GlobalErrorCodeConstants.UNAUTHORIZED.getCode())) { + return null; + } + throw serviceException; } } - /** - * 模拟登录用户,方便日常开发调试 - * - * 注意,在线上环境下,一定要关闭该功能!!! - * - * @param request 请求 - * @param token 模拟的 token,格式为 {@link SecurityProperties#getMockSecret()} + 用户编号 - * @param userType 用户类型 - * @return 模拟的 LoginUser - */ - private LoginUser mockLoginUser(HttpServletRequest request, String token, Integer userType) { + private LoginUser mockLoginUser(String token, Integer userType) { if (!securityProperties.getMockEnable()) { return null; } - // 必须以 mockSecret 开头 if (!token.startsWith(securityProperties.getMockSecret())) { return null; } - // 构建模拟用户 Long userId = Long.valueOf(token.substring(securityProperties.getMockSecret().length())); return new LoginUser().setId(userId).setUserType(userType); } @@ -132,20 +104,15 @@ public class TokenAuthenticationFilter extends OncePerRequestFilter { return null; } try { - loginUserStr = URLDecoder.decode(loginUserStr, StandardCharsets.UTF_8); // 解码,解决中文乱码问题 + loginUserStr = URLDecoder.decode(loginUserStr, StandardCharsets.UTF_8); LoginUser loginUser = JsonUtils.parseObject(loginUserStr, LoginUser.class); - // 用户类型不匹配,无权限 - // 注意:只有 /admin-api/* 和 /app-api/* 有 userType,才需要比对用户类型 - // 类似 WebSocket 的 /ws/* 连接地址,是不需要比对用户类型的 Integer userType = WebFrameworkUtils.getLoginUserType(request); - if (userType != null - && loginUser != null - && ObjectUtil.notEqual(loginUser.getUserType(), userType)) { + if (userType != null && loginUser != null && ObjectUtil.notEqual(loginUser.getUserType(), userType)) { throw new AccessDeniedException("错误的用户类型"); } return loginUser; } catch (Exception ex) { - log.error("[buildLoginUserByHeader][解析 LoginUser({}) 发生异常]", loginUserStr, ex); ; + log.error("[buildLoginUserByHeader][parse LoginUser({}) error]", loginUserStr, ex); throw ex; } } diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/handler/AccessDeniedHandlerImpl.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/handler/AccessDeniedHandlerImpl.java index 05ed125..edb574b 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/handler/AccessDeniedHandlerImpl.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/handler/AccessDeniedHandlerImpl.java @@ -2,17 +2,17 @@ package com.njcn.msgpush.framework.security.core.handler; import com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants; import com.njcn.msgpush.framework.common.pojo.CommonResult; -import com.njcn.msgpush.framework.security.core.util.SecurityFrameworkUtils; import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; +import com.njcn.msgpush.framework.security.core.util.SecurityFrameworkUtils; +import jakarta.servlet.FilterChain; +import jakarta.servlet.ServletException; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.access.ExceptionTranslationFilter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.ServletException; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import static com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN; diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/handler/AuthenticationEntryPointImpl.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/handler/AuthenticationEntryPointImpl.java index 478b4cf..dfe1c00 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/handler/AuthenticationEntryPointImpl.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/handler/AuthenticationEntryPointImpl.java @@ -3,15 +3,14 @@ package com.njcn.msgpush.framework.security.core.handler; import com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants; import com.njcn.msgpush.framework.common.pojo.CommonResult; import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; +import jakarta.servlet.FilterChain; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.AuthenticationEntryPoint; import org.springframework.security.web.access.ExceptionTranslationFilter; -import jakarta.servlet.FilterChain; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - import static com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED; /** @@ -19,7 +18,7 @@ import static com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeC * * 补充:Spring Security 通过 {@link ExceptionTranslationFilter#sendStartAuthentication(HttpServletRequest, HttpServletResponse, FilterChain, AuthenticationException)} 方法,调用当前类 * - * @author ruoyi + * @author hongawen */ @Slf4j @SuppressWarnings("JavadocReference") // 忽略文档引用报错 diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/service/SecurityFrameworkServiceImpl.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/service/SecurityFrameworkServiceImpl.java index 4eaf931..53a23e3 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/service/SecurityFrameworkServiceImpl.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/service/SecurityFrameworkServiceImpl.java @@ -1,12 +1,12 @@ package com.njcn.msgpush.framework.security.core.service; import cn.hutool.core.collection.CollUtil; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; import com.njcn.msgpush.framework.common.biz.system.permission.PermissionCommonApi; import com.njcn.msgpush.framework.common.core.KeyValue; import com.njcn.msgpush.framework.security.core.LoginUser; import com.njcn.msgpush.framework.security.core.util.SecurityFrameworkUtils; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; import lombok.AllArgsConstructor; import lombok.SneakyThrows; @@ -17,42 +17,27 @@ import java.util.List; import static com.njcn.msgpush.framework.common.util.cache.CacheUtils.buildCache; import static com.njcn.msgpush.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId; -/** - * 默认的 {@link SecurityFrameworkService} 实现类 - * - * @author hongawen - */ @AllArgsConstructor public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { private final PermissionCommonApi permissionApi; - /** - * 针对 {@link #hasAnyRoles(String...)} 的缓存 - */ private final LoadingCache>, Boolean> hasAnyRolesCache = buildCache( - Duration.ofMinutes(1L), // 过期时间 1 分钟 + Duration.ofMinutes(1L), new CacheLoader>, Boolean>() { - @Override public Boolean load(KeyValue> key) { return permissionApi.hasAnyRoles(key.getKey(), key.getValue().toArray(new String[0])).getCheckedData(); } - }); - /** - * 针对 {@link #hasAnyPermissions(String...)} 的缓存 - */ private final LoadingCache>, Boolean> hasAnyPermissionsCache = buildCache( - Duration.ofMinutes(1L), // 过期时间 1 分钟 + Duration.ofMinutes(1L), new CacheLoader>, Boolean>() { - @Override public Boolean load(KeyValue> key) { return permissionApi.hasAnyPermissions(key.getKey(), key.getValue().toArray(new String[0])).getCheckedData(); } - }); @Override @@ -63,7 +48,6 @@ public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { @Override @SneakyThrows public boolean hasAnyPermissions(String... permissions) { - // 权限校验 Long userId = getLoginUserId(); if (userId == null) { return false; @@ -79,7 +63,6 @@ public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { @Override @SneakyThrows public boolean hasAnyRoles(String... roles) { - // 权限校验 Long userId = getLoginUserId(); if (userId == null) { return false; @@ -94,7 +77,6 @@ public class SecurityFrameworkServiceImpl implements SecurityFrameworkService { @Override public boolean hasAnyScopes(String... scope) { - // 权限校验 LoginUser user = SecurityFrameworkUtils.getLoginUser(); if (user == null) { return false; diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/util/SecurityFrameworkUtils.java b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/util/SecurityFrameworkUtils.java index a9f04d7..5105b03 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/util/SecurityFrameworkUtils.java +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/java/com/njcn/msgpush/framework/security/core/util/SecurityFrameworkUtils.java @@ -1,10 +1,10 @@ package com.njcn.msgpush.framework.security.core.util; import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; import com.njcn.msgpush.framework.security.core.LoginUser; import com.njcn.msgpush.framework.web.core.util.WebFrameworkUtils; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.lang.Nullable; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; @@ -13,36 +13,16 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.web.authentication.WebAuthenticationDetailsSource; import org.springframework.util.StringUtils; -import jakarta.servlet.http.HttpServletRequest; import java.util.Collections; -/** - * 安全服务工具类 - * - * @author hongawen - */ public class SecurityFrameworkUtils { - /** - * HEADER 认证头 value 的前缀 - */ public static final String AUTHORIZATION_BEARER = "Bearer"; - public static final String LOGIN_USER_HEADER = "login-user"; private SecurityFrameworkUtils() {} - /** - * 从请求中,获得认证 Token - * - * @param request 请求 - * @param headerName 认证 Token 对应的 Header 名字 - * @param parameterName 认证 Token 对应的 Parameter 名字 - * @return 认证 Token - */ - public static String obtainAuthorization(HttpServletRequest request, - String headerName, String parameterName) { - // 1. 获得 Token。优先级:Header > Parameter + public static String obtainAuthorization(HttpServletRequest request, String headerName, String parameterName) { String token = request.getHeader(headerName); if (StrUtil.isEmpty(token)) { token = request.getParameter(parameterName); @@ -50,16 +30,10 @@ public class SecurityFrameworkUtils { if (!StringUtils.hasText(token)) { return null; } - // 2. 去除 Token 中带的 Bearer int index = token.indexOf(AUTHORIZATION_BEARER + " "); return index >= 0 ? token.substring(index + 7).trim() : token; } - /** - * 获得当前认证信息 - * - * @return 认证信息 - */ public static Authentication getAuthentication() { SecurityContext context = SecurityContextHolder.getContext(); if (context == null) { @@ -68,11 +42,6 @@ public class SecurityFrameworkUtils { return context.getAuthentication(); } - /** - * 获取当前用户 - * - * @return 当前用户 - */ @Nullable public static LoginUser getLoginUser() { Authentication authentication = getAuthentication(); @@ -82,52 +51,28 @@ public class SecurityFrameworkUtils { return authentication.getPrincipal() instanceof LoginUser ? (LoginUser) authentication.getPrincipal() : null; } - /** - * 获得当前用户的编号,从上下文中 - * - * @return 用户编号 - */ @Nullable public static Long getLoginUserId() { LoginUser loginUser = getLoginUser(); return loginUser != null ? loginUser.getId() : null; } - /** - * 获得当前用户的昵称,从上下文中 - * - * @return 昵称 - */ @Nullable public static String getLoginUserNickname() { LoginUser loginUser = getLoginUser(); return loginUser != null ? MapUtil.getStr(loginUser.getInfo(), LoginUser.INFO_KEY_NICKNAME) : null; } - /** - * 获得当前用户的部门编号,从上下文中 - * - * @return 部门编号 - */ @Nullable public static Long getLoginUserDeptId() { LoginUser loginUser = getLoginUser(); return loginUser != null ? MapUtil.getLong(loginUser.getInfo(), LoginUser.INFO_KEY_DEPT_ID) : null; } - /** - * 设置当前用户 - * - * @param loginUser 登录用户 - * @param request 请求 - */ public static void setLoginUser(LoginUser loginUser, HttpServletRequest request) { - // 创建 Authentication,并设置到上下文 Authentication authentication = buildAuthentication(loginUser, request); SecurityContextHolder.getContext().setAuthentication(authentication); - // 额外设置到 request 中,用于 ApiAccessLogFilter 可以获取到用户编号; - // 原因是,Spring Security 的 Filter 在 ApiAccessLogFilter 后面,在它记录访问日志时,线上上下文已经没有用户编号等信息 if (request != null) { WebFrameworkUtils.setLoginUserId(request, loginUser.getId()); WebFrameworkUtils.setLoginUserType(request, loginUser.getUserType()); @@ -135,12 +80,10 @@ public class SecurityFrameworkUtils { } private static Authentication buildAuthentication(LoginUser loginUser, HttpServletRequest request) { - // 创建 UsernamePasswordAuthenticationToken 对象 - UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( - loginUser, null, Collections.emptyList()); + UsernamePasswordAuthenticationToken authenticationToken = + new UsernamePasswordAuthenticationToken(loginUser, null, Collections.emptyList()); authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request)); return authenticationToken; } - } diff --git a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index c7f1adb..06590c6 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/msgpush-framework/msgpush-spring-boot-starter-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -2,4 +2,4 @@ com.njcn.msgpush.framework.security.config.MsgpushSecurityRpcAutoConfiguration com.njcn.msgpush.framework.security.config.MsgpushSecurityAutoConfiguration com.njcn.msgpush.framework.security.config.MsgpushWebSecurityConfigurerAdapter com.njcn.msgpush.framework.operatelog.config.MsgpushOperateLogConfiguration -com.njcn.msgpush.framework.operatelog.config.MsgpushOperateLogRpcAutoConfiguration \ No newline at end of file +com.njcn.msgpush.framework.operatelog.config.MsgpushOperateLogRpcAutoConfiguration diff --git a/msgpush-framework/msgpush-spring-boot-starter-test/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-test/pom.xml index 88e47e2..df4472f 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-test/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-test/pom.xml @@ -2,12 +2,13 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 + msgpush-spring-boot-starter-test jar @@ -57,4 +58,4 @@ podam - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/core/ut/BaseDbAndRedisUnitTest.java b/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/core/ut/BaseDbAndRedisUnitTest.java index 2b86731..9a9ce9e 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/core/ut/BaseDbAndRedisUnitTest.java +++ b/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/core/ut/BaseDbAndRedisUnitTest.java @@ -1,13 +1,13 @@ package com.njcn.msgpush.framework.test.core.ut; import cn.hutool.extra.spring.SpringUtil; +import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure; +import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import com.njcn.msgpush.framework.datasource.config.MsgpushDataSourceAutoConfiguration; import com.njcn.msgpush.framework.mybatis.config.MsgpushMybatisAutoConfiguration; import com.njcn.msgpush.framework.redis.config.MsgpushRedisAutoConfiguration; import com.njcn.msgpush.framework.test.config.RedisTestConfiguration; import com.njcn.msgpush.framework.test.config.SqlInitializationTestConfiguration; -import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure; -import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import org.redisson.spring.starter.RedissonAutoConfiguration; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; diff --git a/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/core/ut/BaseDbUnitTest.java b/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/core/ut/BaseDbUnitTest.java index 724c5e7..8446b0b 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/core/ut/BaseDbUnitTest.java +++ b/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/core/ut/BaseDbUnitTest.java @@ -1,12 +1,12 @@ package com.njcn.msgpush.framework.test.core.ut; import cn.hutool.extra.spring.SpringUtil; -import com.njcn.msgpush.framework.datasource.config.MsgpushDataSourceAutoConfiguration; -import com.njcn.msgpush.framework.mybatis.config.MsgpushMybatisAutoConfiguration; -import com.njcn.msgpush.framework.test.config.SqlInitializationTestConfiguration; import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure; import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration; import com.github.yulichang.autoconfigure.MybatisPlusJoinAutoConfiguration; +import com.njcn.msgpush.framework.datasource.config.MsgpushDataSourceAutoConfiguration; +import com.njcn.msgpush.framework.mybatis.config.MsgpushMybatisAutoConfiguration; +import com.njcn.msgpush.framework.test.config.SqlInitializationTestConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration; import org.springframework.boot.test.context.SpringBootTest; diff --git a/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/package-info.java b/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/package-info.java deleted file mode 100644 index 75b5ec6..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-test/src/main/java/com/njcn/msgpush/framework/test/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 测试组件,用于单元测试、集成测试等等 - */ -package com.njcn.msgpush.framework.test; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-web/pom.xml index db55e88..957283c 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-web/pom.xml @@ -2,18 +2,21 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 + msgpush-spring-boot-starter-web jar ${project.artifactId} Web 框架,全局异常、API 日志、脱敏、错误码等 - + + UTF-8 + @@ -86,4 +89,4 @@ - + \ No newline at end of file diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/config/MsgpushApiLogAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/config/MsgpushApiLogAutoConfiguration.java index 5d75770..8ee3dce 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/config/MsgpushApiLogAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/config/MsgpushApiLogAutoConfiguration.java @@ -2,10 +2,10 @@ package com.njcn.msgpush.framework.apilog.config; import com.njcn.msgpush.framework.apilog.core.filter.ApiAccessLogFilter; import com.njcn.msgpush.framework.apilog.core.interceptor.ApiAccessLogInterceptor; -import com.njcn.msgpush.framework.common.biz.infra.logger.ApiAccessLogCommonApi; +import com.njcn.msgpush.framework.common.biz.system.logger.ApiAccessLogCommonApi; import com.njcn.msgpush.framework.common.enums.WebFilterOrderEnum; -import com.njcn.msgpush.framework.web.config.WebProperties; import com.njcn.msgpush.framework.web.config.MsgpushWebAutoConfiguration; +import com.njcn.msgpush.framework.web.config.WebProperties; import jakarta.servlet.Filter; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/config/MsgpushApiLogRpcAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/config/MsgpushApiLogRpcAutoConfiguration.java index 3199ead..176351c 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/config/MsgpushApiLogRpcAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/config/MsgpushApiLogRpcAutoConfiguration.java @@ -1,7 +1,7 @@ package com.njcn.msgpush.framework.apilog.config; -import com.njcn.msgpush.framework.common.biz.infra.logger.ApiAccessLogCommonApi; -import com.njcn.msgpush.framework.common.biz.infra.logger.ApiErrorLogCommonApi; +import com.njcn.msgpush.framework.common.biz.system.logger.ApiAccessLogCommonApi; +import com.njcn.msgpush.framework.common.biz.system.logger.ApiErrorLogCommonApi; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.cloud.openfeign.EnableFeignClients; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/enums/OperateTypeEnum.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/enums/OperateTypeEnum.java index 65f8c59..b85bc92 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/enums/OperateTypeEnum.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/enums/OperateTypeEnum.java @@ -6,7 +6,7 @@ import lombok.Getter; /** * 操作日志的操作类型 * - * @author ruoyi + * @author hongawen */ @Getter @AllArgsConstructor diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/filter/ApiAccessLogFilter.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/filter/ApiAccessLogFilter.java index 1b21980..1a8e85a 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/filter/ApiAccessLogFilter.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/filter/ApiAccessLogFilter.java @@ -7,10 +7,11 @@ import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.BooleanUtil; import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.JsonNode; import com.njcn.msgpush.framework.apilog.core.annotation.ApiAccessLog; import com.njcn.msgpush.framework.apilog.core.enums.OperateTypeEnum; -import com.njcn.msgpush.framework.common.biz.infra.logger.ApiAccessLogCommonApi; -import com.njcn.msgpush.framework.common.biz.infra.logger.dto.ApiAccessLogCreateReqDTO; +import com.njcn.msgpush.framework.common.biz.system.logger.ApiAccessLogCommonApi; +import com.njcn.msgpush.framework.common.biz.system.logger.dto.ApiAccessLogCreateReqDTO; import com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants; import com.njcn.msgpush.framework.common.pojo.CommonResult; import com.njcn.msgpush.framework.common.util.json.JsonUtils; @@ -19,7 +20,6 @@ import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; import com.njcn.msgpush.framework.web.config.WebProperties; import com.njcn.msgpush.framework.web.core.filter.ApiRequestFilter; import com.njcn.msgpush.framework.web.core.util.WebFrameworkUtils; -import com.fasterxml.jackson.databind.JsonNode; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.FilterChain; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java index c3c41e4..f6eb23d 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java @@ -1,38 +1,21 @@ package com.njcn.msgpush.framework.apilog.core.interceptor; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.io.FileUtil; -import cn.hutool.core.io.resource.ResourceUtil; -import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; -import com.njcn.msgpush.framework.common.util.spring.SpringUtils; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import lombok.extern.slf4j.Slf4j; -import org.springframework.util.StopWatch; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; -import java.lang.reflect.Method; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.stream.IntStream; - /** * API 访问日志 Interceptor * - * 目的:在非 prod 环境时,打印 request 和 response 两条日志到日志文件(控制台)中。 + * 目的:记录 HandlerMethod,提供给 ApiAccessLogFilter 使用 * * @author hongawen */ -@Slf4j public class ApiAccessLogInterceptor implements HandlerInterceptor { public static final String ATTRIBUTE_HANDLER_METHOD = "HANDLER_METHOD"; - private static final String ATTRIBUTE_STOP_WATCH = "ApiAccessLogInterceptor.StopWatch"; - @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { // 记录 HandlerMethod,提供给 ApiAccessLogFilter 使用 @@ -40,64 +23,11 @@ public class ApiAccessLogInterceptor implements HandlerInterceptor { if (handlerMethod != null) { request.setAttribute(ATTRIBUTE_HANDLER_METHOD, handlerMethod); } - - // 打印 request 日志 - if (!SpringUtils.isProd()) { - Map queryString = ServletUtils.getParamMap(request); - String requestBody = ServletUtils.isJsonRequest(request) ? ServletUtils.getBody(request) : null; - if (CollUtil.isEmpty(queryString) && StrUtil.isEmpty(requestBody)) { - log.info("[preHandle][开始请求 URL({}) 无参数]", request.getRequestURI()); - } else { - log.info("[preHandle][开始请求 URL({}) 参数({})]", request.getRequestURI(), - StrUtil.blankToDefault(requestBody, queryString.toString())); - } - // 计时 - StopWatch stopWatch = new StopWatch(); - stopWatch.start(); - request.setAttribute(ATTRIBUTE_STOP_WATCH, stopWatch); - // 打印 Controller 路径 - printHandlerMethodPosition(handlerMethod); - } return true; } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { - // 打印 response 日志 - if (!SpringUtils.isProd()) { - StopWatch stopWatch = (StopWatch) request.getAttribute(ATTRIBUTE_STOP_WATCH); - stopWatch.stop(); - log.info("[afterCompletion][完成请求 URL({}) 耗时({} ms)]", - request.getRequestURI(), stopWatch.getTotalTimeMillis()); - } - } - - /** - * 打印 Controller 方法路径 - */ - private void printHandlerMethodPosition(HandlerMethod handlerMethod) { - if (handlerMethod == null) { - return; - } - Method method = handlerMethod.getMethod(); - Class clazz = method.getDeclaringClass(); - try { - // 获取 method 的 lineNumber - List clazzContents = FileUtil.readUtf8Lines( - ResourceUtil.getResource(null, clazz).getPath().replace("/target/classes/", "/src/main/java/") - + clazz.getSimpleName() + ".java"); - Optional lineNumber = IntStream.range(0, clazzContents.size()) - .filter(i -> clazzContents.get(i).contains(" " + method.getName() + "(")) // 简单匹配,不考虑方法重名 - .mapToObj(i -> i + 1) // 行号从 1 开始 - .findFirst(); - if (!lineNumber.isPresent()) { - return; - } - // 打印结果 - System.out.printf("\tController 方法路径:%s(%s.java:%d)\n", clazz.getName(), clazz.getSimpleName(), lineNumber.get()); - } catch (Exception ignore) { - // 忽略异常。原因:仅仅打印,非重要逻辑 - } } } diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/base/annotation/DesensitizeBy.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/base/annotation/DesensitizeBy.java index 3393769..a860c27 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/base/annotation/DesensitizeBy.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/base/annotation/DesensitizeBy.java @@ -1,9 +1,9 @@ package com.njcn.msgpush.framework.desensitize.core.base.annotation; -import com.njcn.msgpush.framework.desensitize.core.base.handler.DesensitizationHandler; -import com.njcn.msgpush.framework.desensitize.core.base.serializer.StringDesensitizeSerializer; import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.njcn.msgpush.framework.desensitize.core.base.handler.DesensitizationHandler; +import com.njcn.msgpush.framework.desensitize.core.base.serializer.StringDesensitizeSerializer; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java index e3bcd86..f79df0b 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/base/serializer/StringDesensitizeSerializer.java @@ -5,14 +5,14 @@ import cn.hutool.core.lang.Singleton; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.ReflectUtil; import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; -import com.njcn.msgpush.framework.desensitize.core.base.handler.DesensitizationHandler; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.BeanProperty; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import com.fasterxml.jackson.databind.ser.ContextualSerializer; import com.fasterxml.jackson.databind.ser.std.StdSerializer; +import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; +import com.njcn.msgpush.framework.desensitize.core.base.handler.DesensitizationHandler; import lombok.Getter; import lombok.Setter; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/regex/annotation/EmailDesensitize.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/regex/annotation/EmailDesensitize.java index 535710f..599a146 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/regex/annotation/EmailDesensitize.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/regex/annotation/EmailDesensitize.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.desensitize.core.regex.annotation; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; import com.njcn.msgpush.framework.desensitize.core.regex.handler.EmailDesensitizationHandler; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/regex/annotation/RegexDesensitize.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/regex/annotation/RegexDesensitize.java index 700a5f6..a0b6816 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/regex/annotation/RegexDesensitize.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/regex/annotation/RegexDesensitize.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.desensitize.core.regex.annotation; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; import com.njcn.msgpush.framework.desensitize.core.regex.handler.DefaultRegexDesensitizationHandler; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/BankCardDesensitize.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/BankCardDesensitize.java index 7997e7f..f06c508 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/BankCardDesensitize.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/BankCardDesensitize.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.desensitize.core.slider.annotation; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; import com.njcn.msgpush.framework.desensitize.core.slider.handler.BankCardDesensitization; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java index 2944ec9..8264855 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/CarLicenseDesensitize.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.desensitize.core.slider.annotation; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; import com.njcn.msgpush.framework.desensitize.core.slider.handler.CarLicenseDesensitization; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java index e14645d..cc2296a 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/ChineseNameDesensitize.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.desensitize.core.slider.annotation; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; import com.njcn.msgpush.framework.desensitize.core.slider.handler.ChineseNameDesensitization; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java index 92e163e..01a7b58 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/FixedPhoneDesensitize.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.desensitize.core.slider.annotation; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; import com.njcn.msgpush.framework.desensitize.core.slider.handler.FixedPhoneDesensitization; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/IdCardDesensitize.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/IdCardDesensitize.java index 5285e0c..abb2c4f 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/IdCardDesensitize.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/IdCardDesensitize.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.desensitize.core.slider.annotation; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; import com.njcn.msgpush.framework.desensitize.core.slider.handler.IdCardDesensitization; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/MobileDesensitize.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/MobileDesensitize.java index b1e6653..e84c6d0 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/MobileDesensitize.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/MobileDesensitize.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.desensitize.core.slider.annotation; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; import com.njcn.msgpush.framework.desensitize.core.slider.handler.MobileDesensitization; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/PasswordDesensitize.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/PasswordDesensitize.java index 306434d..736639b 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/PasswordDesensitize.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/PasswordDesensitize.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.desensitize.core.slider.annotation; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; import com.njcn.msgpush.framework.desensitize.core.slider.handler.PasswordDesensitization; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/SliderDesensitize.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/SliderDesensitize.java index d156e22..8c604c8 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/SliderDesensitize.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/desensitize/core/slider/annotation/SliderDesensitize.java @@ -1,8 +1,8 @@ package com.njcn.msgpush.framework.desensitize.core.slider.annotation; +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; import com.njcn.msgpush.framework.desensitize.core.slider.handler.DefaultDesensitizationHandler; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; import java.lang.annotation.*; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/config/ApiEncryptProperties.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/config/ApiEncryptProperties.java index b63d6f5..88b94aa 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/config/ApiEncryptProperties.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/config/ApiEncryptProperties.java @@ -63,8 +63,9 @@ public class ApiEncryptProperties { * 注意: * 1. 如果是【对称加密】时,它「后端」对应的是“密钥”。对应的,「前端」也对应的也是“密钥”。 * 2. 如果是【非对称加密】时,它「后端」对应的是“公钥”。对应的,「前端」对应的是“私钥”。(重要!!!) + * + * 当前 system 模块密码加密方案不启用响应加密,因此该配置可为空。 */ - @NotEmpty(message = "响应的加密密钥不能为空") private String responseKey; } diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/config/MsgpushApiEncryptAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/config/MsgpushApiEncryptAutoConfiguration.java index fe4c23b..f94400a 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/config/MsgpushApiEncryptAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/config/MsgpushApiEncryptAutoConfiguration.java @@ -4,6 +4,7 @@ import com.njcn.msgpush.framework.common.enums.WebFilterOrderEnum; import com.njcn.msgpush.framework.encrypt.core.filter.ApiEncryptFilter; import com.njcn.msgpush.framework.web.config.WebProperties; import com.njcn.msgpush.framework.web.core.handler.GlobalExceptionHandler; +import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; @@ -24,9 +25,10 @@ public class MsgpushApiEncryptAutoConfiguration { public FilterRegistrationBean apiEncryptFilter(WebProperties webProperties, ApiEncryptProperties apiEncryptProperties, RequestMappingHandlerMapping requestMappingHandlerMapping, - GlobalExceptionHandler globalExceptionHandler) { + GlobalExceptionHandler globalExceptionHandler, + ObjectMapper objectMapper) { ApiEncryptFilter filter = new ApiEncryptFilter(webProperties, apiEncryptProperties, - requestMappingHandlerMapping, globalExceptionHandler); + requestMappingHandlerMapping, globalExceptionHandler, objectMapper); return createFilterBean(filter, WebFilterOrderEnum.API_ENCRYPT_FILTER); } diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/annotation/ApiEncrypt.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/annotation/ApiEncrypt.java index bce866a..4a31069 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/annotation/ApiEncrypt.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/annotation/ApiEncrypt.java @@ -15,6 +15,13 @@ public @interface ApiEncrypt { */ boolean request() default true; + /** + * 需要解密的请求字段 + * + * 仅在 request = true 时生效 + */ + String[] requestFields() default {}; + /** * 是否对响应结果进行加密,默认 true */ diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/filter/ApiDecryptRequestWrapper.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/filter/ApiDecryptRequestWrapper.java index bb40164..b5da8ee 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/filter/ApiDecryptRequestWrapper.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/filter/ApiDecryptRequestWrapper.java @@ -1,7 +1,11 @@ package com.njcn.msgpush.framework.encrypt.core.filter; +import cn.hutool.core.collection.CollUtil; import cn.hutool.core.io.IoUtil; import cn.hutool.core.util.StrUtil; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; import cn.hutool.crypto.asymmetric.AsymmetricDecryptor; import cn.hutool.crypto.asymmetric.KeyType; import cn.hutool.crypto.symmetric.SymmetricDecryptor; @@ -14,6 +18,9 @@ import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.util.List; + +import static com.njcn.msgpush.framework.common.exception.util.ServiceExceptionUtil.invalidParamException; /** * 解密请求 {@link HttpServletRequestWrapper} 实现类 @@ -25,16 +32,41 @@ public class ApiDecryptRequestWrapper extends HttpServletRequestWrapper { private final byte[] body; public ApiDecryptRequestWrapper(HttpServletRequest request, + ObjectMapper objectMapper, + List requestFields, SymmetricDecryptor symmetricDecryptor, AsymmetricDecryptor asymmetricDecryptor) throws IOException { super(request); - // 读取 body,允许 HEX、BASE64 传输 - String requestBody = StrUtil.utf8Str( - IoUtil.readBytes(request.getInputStream(), false)); + if (CollUtil.isEmpty(requestFields)) { + throw invalidParamException("请求解密失败,请刷新页面后重试"); + } + String requestBody = StrUtil.utf8Str(IoUtil.readBytes(request.getInputStream(), false)); + if (StrUtil.isBlank(requestBody)) { + throw invalidParamException("请求解密失败,请刷新页面后重试"); + } - // 解密 body - body = symmetricDecryptor != null ? symmetricDecryptor.decrypt(requestBody) - : asymmetricDecryptor.decrypt(requestBody, KeyType.PrivateKey); + JsonNode requestJson; + try { + requestJson = objectMapper.readTree(requestBody); + } catch (Exception ex) { + throw invalidParamException("请求解密失败,请刷新页面后重试"); + } + if (!(requestJson instanceof ObjectNode requestObject)) { + throw invalidParamException("请求解密失败,请刷新页面后重试"); + } + + for (String requestField : requestFields) { + JsonNode fieldNode = requestObject.get(requestField); + if (fieldNode == null || fieldNode.isNull() || !fieldNode.isTextual() || StrUtil.isBlank(fieldNode.asText())) { + throw invalidParamException("请求解密失败,请刷新页面后重试"); + } + byte[] decryptedBytes = symmetricDecryptor != null + ? symmetricDecryptor.decrypt(fieldNode.asText()) + : asymmetricDecryptor.decrypt(fieldNode.asText(), KeyType.PrivateKey); + requestObject.put(requestField, StrUtil.utf8Str(decryptedBytes)); + } + + body = objectMapper.writeValueAsBytes(requestObject); } @Override diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/filter/ApiEncryptFilter.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/filter/ApiEncryptFilter.java index f2bc9cf..aa602a9 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/filter/ApiEncryptFilter.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/encrypt/core/filter/ApiEncryptFilter.java @@ -6,6 +6,7 @@ import cn.hutool.crypto.asymmetric.AsymmetricDecryptor; import cn.hutool.crypto.asymmetric.AsymmetricEncryptor; import cn.hutool.crypto.symmetric.SymmetricDecryptor; import cn.hutool.crypto.symmetric.SymmetricEncryptor; +import com.fasterxml.jackson.databind.ObjectMapper; import com.njcn.msgpush.framework.common.pojo.CommonResult; import com.njcn.msgpush.framework.common.util.object.ObjectUtils; import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; @@ -26,6 +27,7 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl import org.springframework.web.util.ServletRequestPathUtils; import java.io.IOException; +import java.util.Arrays; import static com.njcn.msgpush.framework.common.exception.util.ServiceExceptionUtil.invalidParamException; @@ -43,12 +45,17 @@ import static com.njcn.msgpush.framework.common.exception.util.ServiceExceptionU @Slf4j public class ApiEncryptFilter extends ApiRequestFilter { + private static final String MISSING_ENCRYPT_HEADER_MESSAGE = "当前接口要求加密传输,请刷新页面后重试"; + private static final String DECRYPT_FAILED_MESSAGE = "请求解密失败,请刷新页面后重试"; + private final ApiEncryptProperties apiEncryptProperties; private final RequestMappingHandlerMapping requestMappingHandlerMapping; private final GlobalExceptionHandler globalExceptionHandler; + private final ObjectMapper objectMapper; + private final SymmetricDecryptor requestSymmetricDecryptor; private final AsymmetricDecryptor requestAsymmetricDecryptor; @@ -58,21 +65,25 @@ public class ApiEncryptFilter extends ApiRequestFilter { public ApiEncryptFilter(WebProperties webProperties, ApiEncryptProperties apiEncryptProperties, RequestMappingHandlerMapping requestMappingHandlerMapping, - GlobalExceptionHandler globalExceptionHandler) { + GlobalExceptionHandler globalExceptionHandler, + ObjectMapper objectMapper) { super(webProperties); this.apiEncryptProperties = apiEncryptProperties; this.requestMappingHandlerMapping = requestMappingHandlerMapping; this.globalExceptionHandler = globalExceptionHandler; + this.objectMapper = objectMapper; if (StrUtil.equalsIgnoreCase(apiEncryptProperties.getAlgorithm(), "AES")) { this.requestSymmetricDecryptor = SecureUtil.aes(StrUtil.utf8Bytes(apiEncryptProperties.getRequestKey())); this.requestAsymmetricDecryptor = null; - this.responseSymmetricEncryptor = SecureUtil.aes(StrUtil.utf8Bytes(apiEncryptProperties.getResponseKey())); + this.responseSymmetricEncryptor = StrUtil.isNotBlank(apiEncryptProperties.getResponseKey()) + ? SecureUtil.aes(StrUtil.utf8Bytes(apiEncryptProperties.getResponseKey())) : null; this.responseAsymmetricEncryptor = null; } else if (StrUtil.equalsIgnoreCase(apiEncryptProperties.getAlgorithm(), "RSA")) { this.requestSymmetricDecryptor = null; this.requestAsymmetricDecryptor = SecureUtil.rsa(apiEncryptProperties.getRequestKey(), null); this.responseSymmetricEncryptor = null; - this.responseAsymmetricEncryptor = SecureUtil.rsa(null, apiEncryptProperties.getResponseKey()); + this.responseAsymmetricEncryptor = StrUtil.isNotBlank(apiEncryptProperties.getResponseKey()) + ? SecureUtil.rsa(null, apiEncryptProperties.getResponseKey()) : null; } else { // 补充说明:如果要支持 SM2、SM4 等算法,可在此处增加对应实例的创建,并添加相应的 Maven 依赖即可。 throw new IllegalArgumentException("不支持的加密算法:" + apiEncryptProperties.getAlgorithm()); @@ -86,9 +97,10 @@ public class ApiEncryptFilter extends ApiRequestFilter { // 获取 @ApiEncrypt 注解 ApiEncrypt apiEncrypt = getApiEncrypt(request); boolean requestEnable = apiEncrypt != null && apiEncrypt.request(); - boolean responseEnable = apiEncrypt != null && apiEncrypt.response(); + boolean responseEnable = apiEncrypt != null && apiEncrypt.response() + && (responseSymmetricEncryptor != null || responseAsymmetricEncryptor != null); String encryptHeader = request.getHeader(apiEncryptProperties.getHeader()); - if (!requestEnable && !responseEnable && StrUtil.isBlank(encryptHeader)) { + if (!requestEnable && !responseEnable) { chain.doFilter(request, response); return; } @@ -97,13 +109,19 @@ public class ApiEncryptFilter extends ApiRequestFilter { if (ObjectUtils.equalsAny(HttpMethod.valueOf(request.getMethod()), HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE)) { try { - if (StrUtil.isNotBlank(encryptHeader)) { - request = new ApiDecryptRequestWrapper(request, + if (requestEnable) { + if (StrUtil.isBlank(encryptHeader)) { + throw invalidParamException(MISSING_ENCRYPT_HEADER_MESSAGE); + } + request = new ApiDecryptRequestWrapper(request, objectMapper, + Arrays.asList(apiEncrypt.requestFields()), requestSymmetricDecryptor, requestAsymmetricDecryptor); - } else if (requestEnable) { - throw invalidParamException("请求未包含加密标头,请检查是否正确配置了加密标头"); } } catch (Exception ex) { + if (!(ex instanceof com.njcn.msgpush.framework.common.exception.ServiceException) + || !StrUtil.equals(ex.getMessage(), MISSING_ENCRYPT_HEADER_MESSAGE)) { + ex = invalidParamException(DECRYPT_FAILED_MESSAGE); + } CommonResult result = globalExceptionHandler.allExceptionHandler(request, ex); ServletUtils.writeJSON(response, result); return; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/jackson/config/MsgpushJacksonAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/jackson/config/MsgpushJacksonAutoConfiguration.java index c84bc1b..d80f6f1 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/jackson/config/MsgpushJacksonAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/jackson/config/MsgpushJacksonAutoConfiguration.java @@ -1,9 +1,5 @@ package com.njcn.msgpush.framework.jackson.config; -import com.njcn.msgpush.framework.common.util.json.JsonUtils; -import com.njcn.msgpush.framework.common.util.json.databind.NumberSerializer; -import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; -import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; @@ -11,6 +7,10 @@ import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; +import com.njcn.msgpush.framework.common.util.json.JsonUtils; +import com.njcn.msgpush.framework.common.util.json.databind.NumberSerializer; +import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; +import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/package-info.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/package-info.java deleted file mode 100644 index 7acad47..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * Web 框架,全局异常、API 日志等 - */ -package com.njcn.msgpush.framework; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/swagger/config/MsgpushSwaggerAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/swagger/config/MsgpushSwaggerAutoConfiguration.java index 84a3447..88a7157 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/swagger/config/MsgpushSwaggerAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/swagger/config/MsgpushSwaggerAutoConfiguration.java @@ -6,7 +6,6 @@ import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Contact; import io.swagger.v3.oas.models.info.Info; import io.swagger.v3.oas.models.info.License; -import io.swagger.v3.oas.models.media.IntegerSchema; import io.swagger.v3.oas.models.media.StringSchema; import io.swagger.v3.oas.models.parameters.Parameter; import io.swagger.v3.oas.models.security.SecurityRequirement; @@ -34,41 +33,24 @@ import java.util.List; import java.util.Map; import java.util.Optional; - -/** - * Swagger 自动配置类,基于 OpenAPI + Springdoc 实现。 - * - * 友情提示: - * 1. Springdoc 文档地址:仓库 - * 2. Swagger 规范,于 2015 更名为 OpenAPI 规范,本质是一个东西 - * - * @author hongawen - */ -@AutoConfiguration(before = Knife4jAutoConfiguration.class) // before 原因,保证覆写的 Knife4jOpenApiCustomizer 先生效!相关 https://github.com/YunaiV/ruoyi-vue-pro/issues/954 讨论 +@AutoConfiguration(before = Knife4jAutoConfiguration.class) @ConditionalOnClass({OpenAPI.class}) @EnableConfigurationProperties(SwaggerProperties.class) -@ConditionalOnProperty(prefix = "springdoc.api-docs", name = "enabled", havingValue = "true", matchIfMissing = true) // 设置为 false 时,禁用 +@ConditionalOnProperty(prefix = "springdoc.api-docs", name = "enabled", havingValue = "true", matchIfMissing = true) @Import(Knife4jOpenApiCustomizer.class) public class MsgpushSwaggerAutoConfiguration { - // ========== 全局 OpenAPI 配置 ========== - @Bean public OpenAPI createApi(SwaggerProperties properties) { Map securitySchemas = buildSecuritySchemes(); OpenAPI openAPI = new OpenAPI() - // 接口信息 .info(buildInfo(properties)) - // 接口安全配置 .components(new Components().securitySchemes(securitySchemas)) .addSecurityItem(new SecurityRequirement().addList(HttpHeaders.AUTHORIZATION)); securitySchemas.keySet().forEach(key -> openAPI.addSecurityItem(new SecurityRequirement().addList(key))); return openAPI; } - /** - * API 摘要信息 - */ private Info buildInfo(SwaggerProperties properties) { return new Info() .title(properties.getTitle()) @@ -78,24 +60,18 @@ public class MsgpushSwaggerAutoConfiguration { .license(new License().name(properties.getLicense()).url(properties.getLicenseUrl())); } - /** - * 安全模式,这里配置通过请求头 Authorization 传递 token 参数 - */ private Map buildSecuritySchemes() { Map securitySchemes = new HashMap<>(); SecurityScheme securityScheme = new SecurityScheme() - .type(SecurityScheme.Type.APIKEY) // 类型 - .name(HttpHeaders.AUTHORIZATION) // 请求头的 name - .in(SecurityScheme.In.HEADER); // token 所在位置 + .type(SecurityScheme.Type.APIKEY) + .name(HttpHeaders.AUTHORIZATION) + .in(SecurityScheme.In.HEADER); securitySchemes.put(HttpHeaders.AUTHORIZATION, securityScheme); return securitySchemes; } - /** - * 自定义 OpenAPI 处理器 - */ @Bean - @Primary // 目的:以我们创建的 OpenAPIService Bean 为主,避免一键改包后,启动报错! + @Primary public OpenAPIService openApiBuilder(Optional openAPI, SecurityService securityParser, SpringDocConfigProperties springDocConfigProperties, @@ -107,11 +83,6 @@ public class MsgpushSwaggerAutoConfiguration { propertyResolverUtils, openApiBuilderCustomizers, serverBaseUrlCustomizers, javadocProvider); } - // ========== 分组 OpenAPI 配置 ========== - - /** - * 所有模块的 API 分组 - */ @Bean public GroupedOpenApi allGroupedOpenApi() { return buildGroupedOpenApi("all", ""); @@ -131,43 +102,24 @@ public class MsgpushSwaggerAutoConfiguration { .build(); } - - - /** - * 构建 Authorization 认证请求头参数 - * - * 解决 Knife4j Authorize 未生效,请求header里未包含参数 - * - * @return 认证参数 - */ private static Parameter buildSecurityHeaderParameter() { return new Parameter() - .name(HttpHeaders.AUTHORIZATION) // header 名 - .description("认证 Token") // 描述 - .in(String.valueOf(SecurityScheme.In.HEADER)) // 请求 header - .schema(new StringSchema()._default("Bearer test1").description("认证 Token")); // 默认:使用用户编号为 1 + .name(HttpHeaders.AUTHORIZATION) + .description("认证 Token") + .in(String.valueOf(SecurityScheme.In.HEADER)) + .schema(new StringSchema()._default("Bearer test1") + .name(HttpHeaders.AUTHORIZATION) + .description("认证 Token")); } - /** - * 核心:自定义OperationId生成规则,组合「类名前缀 + 方法名」 - * - * @see app-api 前缀不生效,都是使用 admin-api - */ private static OperationCustomizer buildOperationIdCustomizer() { return (operation, handlerMethod) -> { - // 1. 获取控制器类名(如 UserController) String className = handlerMethod.getBeanType().getSimpleName(); - // 2. 提取类名前缀(去除 Controller 后缀,如 UserController -> User) String classPrefix = className.replaceAll("Controller$", ""); - // 3. 获取方法名(如 list) String methodName = handlerMethod.getMethod().getName(); - // 4. 组合生成 operationId(如 User_list) - String operationId = classPrefix + "_" + methodName; - // 5. 设置自定义 operationId - operation.setOperationId(operationId); + operation.setOperationId(classPrefix + "_" + methodName); return operation; }; } } - diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/swagger/config/SwaggerProperties.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/swagger/config/SwaggerProperties.java index feddc3e..6e7f0d6 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/swagger/config/SwaggerProperties.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/swagger/config/SwaggerProperties.java @@ -1,10 +1,9 @@ package com.njcn.msgpush.framework.swagger.config; +import jakarta.validation.constraints.NotEmpty; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; -import jakarta.validation.constraints.NotEmpty; - /** * Swagger 配置属性 * diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/config/MsgpushWebAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/config/MsgpushWebAutoConfiguration.java index 20133d0..ce68ab4 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/config/MsgpushWebAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/config/MsgpushWebAutoConfiguration.java @@ -1,19 +1,17 @@ package com.njcn.msgpush.framework.web.config; import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.common.biz.infra.logger.ApiErrorLogCommonApi; +import com.google.common.collect.Maps; +import com.njcn.msgpush.framework.common.biz.system.logger.ApiErrorLogCommonApi; import com.njcn.msgpush.framework.common.enums.WebFilterOrderEnum; import com.njcn.msgpush.framework.web.core.filter.CacheRequestBodyFilter; -import com.njcn.msgpush.framework.web.core.filter.DemoFilter; import com.njcn.msgpush.framework.web.core.handler.GlobalExceptionHandler; import com.njcn.msgpush.framework.web.core.handler.GlobalResponseBodyHandler; import com.njcn.msgpush.framework.web.core.util.WebFrameworkUtils; -import com.google.common.collect.Maps; import jakarta.servlet.Filter; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration; import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations; import org.springframework.boot.context.properties.EnableConfigurationProperties; @@ -133,12 +131,6 @@ public class MsgpushWebAutoConfiguration { /** * 创建 DemoFilter Bean,演示模式 */ - @Bean - @ConditionalOnProperty(value = "msgpush.demo", havingValue = "true") - public FilterRegistrationBean demoFilter() { - return createFilterBean(new DemoFilter(), WebFilterOrderEnum.DEMO_FILTER); - } - public static FilterRegistrationBean createFilterBean(T filter, Integer order) { FilterRegistrationBean bean = new FilterRegistrationBean<>(filter); bean.setOrder(order); diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/config/WebProperties.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/config/WebProperties.java index a8d68dd..ce09fb1 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/config/WebProperties.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/config/WebProperties.java @@ -1,5 +1,8 @@ package com.njcn.msgpush.framework.web.config; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotEmpty; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -7,10 +10,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; import org.springframework.web.servlet.config.annotation.PathMatchConfigurer; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; - @ConfigurationProperties(prefix = "msgpush.web") @Validated @Data diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/ApiRequestFilter.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/ApiRequestFilter.java index ab46d07..72f60b0 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/ApiRequestFilter.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/ApiRequestFilter.java @@ -2,11 +2,10 @@ package com.njcn.msgpush.framework.web.core.filter; import cn.hutool.core.util.StrUtil; import com.njcn.msgpush.framework.web.config.WebProperties; +import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import org.springframework.web.filter.OncePerRequestFilter; -import jakarta.servlet.http.HttpServletRequest; - /** * 过滤 /admin-api、/app-api 等 API 请求的过滤器 * diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/CacheRequestBodyFilter.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/CacheRequestBodyFilter.java index 1a09584..5dbef5a 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/CacheRequestBodyFilter.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/CacheRequestBodyFilter.java @@ -2,12 +2,12 @@ package com.njcn.msgpush.framework.web.core.filter; import cn.hutool.core.util.StrUtil; import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; -import org.springframework.web.filter.OncePerRequestFilter; - import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import org.springframework.web.filter.OncePerRequestFilter; + import java.io.IOException; /** diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/DemoFilter.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/DemoFilter.java deleted file mode 100644 index cd2815c..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/filter/DemoFilter.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.njcn.msgpush.framework.web.core.filter; - -import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.common.pojo.CommonResult; -import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; -import com.njcn.msgpush.framework.web.core.util.WebFrameworkUtils; -import org.springframework.web.filter.OncePerRequestFilter; - -import jakarta.servlet.FilterChain; -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -import static com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants.DEMO_DENY; - -/** - * 演示 Filter,禁止用户发起写操作,避免影响测试数据 - * - * @author hongawen - */ -public class DemoFilter extends OncePerRequestFilter { - - @Override - protected boolean shouldNotFilter(HttpServletRequest request) { - String method = request.getMethod(); - return !StrUtil.equalsAnyIgnoreCase(method, "POST", "PUT", "DELETE") // 写操作时,不进行过滤率 - || WebFrameworkUtils.getLoginUserId(request) == null; // 非登录用户时,不进行过滤 - } - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) { - // 直接返回 DEMO_DENY 的结果。即,请求不继续 - ServletUtils.writeJSON(response, CommonResult.error(DEMO_DENY)); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/handler/GlobalExceptionHandler.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/handler/GlobalExceptionHandler.java index 020a0e7..82b06b5 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/handler/GlobalExceptionHandler.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/handler/GlobalExceptionHandler.java @@ -5,8 +5,10 @@ import cn.hutool.core.exceptions.ExceptionUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.core.util.ObjUtil; import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.common.biz.infra.logger.ApiErrorLogCommonApi; -import com.njcn.msgpush.framework.common.biz.infra.logger.dto.ApiErrorLogCreateReqDTO; +import com.fasterxml.jackson.databind.exc.InvalidFormatException; +import com.google.common.util.concurrent.UncheckedExecutionException; +import com.njcn.msgpush.framework.common.biz.system.logger.ApiErrorLogCommonApi; +import com.njcn.msgpush.framework.common.biz.system.logger.dto.ApiErrorLogCreateReqDTO; import com.njcn.msgpush.framework.common.exception.ServiceException; import com.njcn.msgpush.framework.common.exception.util.ServiceExceptionUtil; import com.njcn.msgpush.framework.common.pojo.CommonResult; @@ -15,8 +17,6 @@ import com.njcn.msgpush.framework.common.util.json.JsonUtils; import com.njcn.msgpush.framework.common.util.monitor.TracerUtils; import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; import com.njcn.msgpush.framework.web.core.util.WebFrameworkUtils; -import com.fasterxml.jackson.databind.exc.InvalidFormatException; -import com.google.common.util.concurrent.UncheckedExecutionException; import jakarta.servlet.http.HttpServletRequest; import jakarta.validation.ConstraintViolation; import jakarta.validation.ConstraintViolationException; @@ -393,61 +393,7 @@ public class GlobalExceptionHandler { if (!message.contains("doesn't exist")) { return null; } - // 1. 数据报表 - if (message.contains("report_")) { - log.error("[报表模块 msgpush-module-report - 表结构未导入][参考 https://cloud.iocoder.cn/report/ 开启]"); - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[报表模块 msgpush-module-report - 表结构未导入][参考 https://cloud.iocoder.cn/report/ 开启]"); - } - // 2. 工作流 - if (message.contains("bpm_")) { - log.error("[工作流模块 msgpush-module-bpm - 表结构未导入][参考 https://cloud.iocoder.cn/bpm/ 开启]"); - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[工作流模块 msgpush-module-bpm - 表结构未导入][参考 https://cloud.iocoder.cn/bpm/ 开启]"); - } - // 3. 微信公众号 - if (message.contains("mp_")) { - log.error("[微信公众号 msgpush-module-mp - 表结构未导入][参考 https://cloud.iocoder.cn/mp/build/ 开启]"); - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[微信公众号 msgpush-module-mp - 表结构未导入][参考 https://cloud.iocoder.cn/mp/build/ 开启]"); - } - // 4. 商城系统 - if (StrUtil.containsAny(message, "product_", "promotion_", "trade_")) { - log.error("[商城系统 msgpush-module-mall - 已禁用][参考 https://cloud.iocoder.cn/mall/build/ 开启]"); - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[商城系统 msgpush-module-mall - 已禁用][参考 https://cloud.iocoder.cn/mall/build/ 开启]"); - } - // 5. ERP 系统 - if (message.contains("erp_")) { - log.error("[ERP 系统 msgpush-module-erp - 表结构未导入][参考 https://cloud.iocoder.cn/erp/build/ 开启]"); - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[ERP 系统 msgpush-module-erp - 表结构未导入][参考 https://cloud.iocoder.cn/erp/build/ 开启]"); - } - // 6. CRM 系统 - if (message.contains("crm_")) { - log.error("[CRM 系统 msgpush-module-crm - 表结构未导入][参考 https://cloud.iocoder.cn/crm/build/ 开启]"); - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[CRM 系统 msgpush-module-crm - 表结构未导入][参考 https://cloud.iocoder.cn/crm/build/ 开启]"); - } - // 7. 支付平台 - if (message.contains("pay_")) { - log.error("[支付模块 msgpush-module-pay - 表结构未导入][参考 https://cloud.iocoder.cn/pay/build/ 开启]"); - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[支付模块 msgpush-module-pay - 表结构未导入][参考 https://cloud.iocoder.cn/pay/build/ 开启]"); - } - // 8. AI 大模型 - if (message.contains("ai_")) { - log.error("[AI 大模型 msgpush-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]"); - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[AI 大模型 msgpush-module-ai - 表结构未导入][参考 https://cloud.iocoder.cn/ai/build/ 开启]"); - } - // 9. IoT 物联网 - if (message.contains("iot_")) { - log.error("[IoT 物联网 msgpush-module-iot - 表结构未导入][参考 https://doc.iocoder.cn/iot/build/ 开启]"); - return CommonResult.error(NOT_IMPLEMENTED.getCode(), - "[IoT 物联网 msgpush-module-iot - 表结构未导入][参考 https://doc.iocoder.cn/iot/build/ 开启]"); - } - return null; + return CommonResult.error(TABLE_NOT_EXISTS.getCode(), TABLE_NOT_EXISTS.getMsg()); } } diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/util/WebFrameworkUtils.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/util/WebFrameworkUtils.java index 7b5fefd..ab34cf3 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/util/WebFrameworkUtils.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/web/core/util/WebFrameworkUtils.java @@ -1,37 +1,23 @@ package com.njcn.msgpush.framework.web.core.util; import cn.hutool.core.util.NumberUtil; -import cn.hutool.extra.servlet.ServletUtil; import com.njcn.msgpush.framework.common.enums.RpcConstants; import com.njcn.msgpush.framework.common.enums.TerminalEnum; import com.njcn.msgpush.framework.common.enums.UserTypeEnum; import com.njcn.msgpush.framework.common.pojo.CommonResult; -import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; import com.njcn.msgpush.framework.web.config.WebProperties; +import jakarta.servlet.ServletRequest; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.web.context.request.RequestAttributes; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; -import jakarta.servlet.ServletRequest; -import jakarta.servlet.http.HttpServletRequest; - -/** - * 专属于 web 包的工具类 - * - * @author hongawen - */ public class WebFrameworkUtils { private static final String REQUEST_ATTRIBUTE_LOGIN_USER_ID = "login_user_id"; private static final String REQUEST_ATTRIBUTE_LOGIN_USER_TYPE = "login_user_type"; - private static final String REQUEST_ATTRIBUTE_COMMON_RESULT = "common_result"; - /** - * 终端的 Header - * - * @see com.njcn.msgpush.framework.common.enums.TerminalEnum - */ public static final String HEADER_TERMINAL = "terminal"; private static WebProperties properties; @@ -40,30 +26,14 @@ public class WebFrameworkUtils { WebFrameworkUtils.properties = webProperties; } - - - public static void setLoginUserId(ServletRequest request, Long userId) { request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID, userId); } - /** - * 设置用户类型 - * - * @param request 请求 - * @param userType 用户类型 - */ public static void setLoginUserType(ServletRequest request, Integer userType) { request.setAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE, userType); } - /** - * 获得当前用户的编号,从请求中 - * 注意:该方法仅限于 framework 框架使用!!! - * - * @param request 请求 - * @return 用户编号 - */ public static Long getLoginUserId(HttpServletRequest request) { if (request == null) { return null; @@ -71,23 +41,14 @@ public class WebFrameworkUtils { return (Long) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_ID); } - /** - * 获得当前用户的类型 - * 注意:该方法仅限于 web 相关的 framework 组件使用!!! - * - * @param request 请求 - * @return 用户编号 - */ public static Integer getLoginUserType(HttpServletRequest request) { if (request == null) { return null; } - // 1. 优先,从 Attribute 中获取 Integer userType = (Integer) request.getAttribute(REQUEST_ATTRIBUTE_LOGIN_USER_TYPE); if (userType != null) { return userType; } - // 2. 其次,基于 URL 前缀的约定 if (request.getServletPath().startsWith(properties.getAdminApi().getPrefix())) { return UserTypeEnum.ADMIN.getValue(); } @@ -98,13 +59,11 @@ public class WebFrameworkUtils { } public static Integer getLoginUserType() { - HttpServletRequest request = getRequest(); - return getLoginUserType(request); + return getLoginUserType(getRequest()); } public static Long getLoginUserId() { - HttpServletRequest request = getRequest(); - return getLoginUserId(request); + return getLoginUserId(getRequest()); } public static Integer getTerminal() { @@ -134,24 +93,10 @@ public class WebFrameworkUtils { return servletRequestAttributes.getRequest(); } - /** - * 判断是否为 RPC 请求 - * - * @param request 请求 - * @return 是否为 RPC 请求 - */ public static boolean isRpcRequest(HttpServletRequest request) { return request.getRequestURI().startsWith(RpcConstants.RPC_API_PREFIX); } - /** - * 判断是否为 RPC 请求 - * - * 约定大于配置,只要以 Api 结尾,都认为是 RPC 接口 - * - * @param className 类名 - * @return 是否为 RPC 请求 - */ public static boolean isRpcRequest(String className) { return className.endsWith("Api"); } diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/config/MsgpushXssAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/config/MsgpushXssAutoConfiguration.java index 345acdc..12b7b45 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/config/MsgpushXssAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/config/MsgpushXssAutoConfiguration.java @@ -5,7 +5,6 @@ import com.njcn.msgpush.framework.xss.core.clean.JsoupXssCleaner; import com.njcn.msgpush.framework.xss.core.clean.XssCleaner; import com.njcn.msgpush.framework.xss.core.filter.XssFilter; import com.njcn.msgpush.framework.xss.core.json.XssStringJsonDeserializer; -import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/filter/XssFilter.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/filter/XssFilter.java index 14cbd9f..b8a64fb 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/filter/XssFilter.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/filter/XssFilter.java @@ -2,14 +2,14 @@ package com.njcn.msgpush.framework.xss.core.filter; import com.njcn.msgpush.framework.xss.config.XssProperties; import com.njcn.msgpush.framework.xss.core.clean.XssCleaner; -import lombok.AllArgsConstructor; -import org.springframework.util.PathMatcher; -import org.springframework.web.filter.OncePerRequestFilter; - import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.AllArgsConstructor; +import org.springframework.util.PathMatcher; +import org.springframework.web.filter.OncePerRequestFilter; + import java.io.IOException; /** diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/filter/XssRequestWrapper.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/filter/XssRequestWrapper.java index cdc9a85..7ec2ad1 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/filter/XssRequestWrapper.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/filter/XssRequestWrapper.java @@ -1,9 +1,9 @@ package com.njcn.msgpush.framework.xss.core.filter; import com.njcn.msgpush.framework.xss.core.clean.XssCleaner; - import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequestWrapper; + import java.util.LinkedHashMap; import java.util.Map; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/json/XssStringJsonDeserializer.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/json/XssStringJsonDeserializer.java index e429ee4..3a9b763 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/json/XssStringJsonDeserializer.java +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/java/com/njcn/msgpush/framework/xss/core/json/XssStringJsonDeserializer.java @@ -1,12 +1,12 @@ package com.njcn.msgpush.framework.xss.core.json; -import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; -import com.njcn.msgpush.framework.xss.config.XssProperties; -import com.njcn.msgpush.framework.xss.core.clean.XssCleaner; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.core.JsonToken; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.deser.std.StringDeserializer; +import com.njcn.msgpush.framework.common.util.servlet.ServletUtils; +import com.njcn.msgpush.framework.xss.config.XssProperties; +import com.njcn.msgpush.framework.xss.core.clean.XssCleaner; import jakarta.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index 937b0e8..8e9e98a 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -5,4 +5,4 @@ com.njcn.msgpush.framework.web.config.MsgpushWebAutoConfiguration com.njcn.msgpush.framework.apilog.config.MsgpushApiLogRpcAutoConfiguration com.njcn.msgpush.framework.xss.config.MsgpushXssAutoConfiguration com.njcn.msgpush.framework.banner.config.MsgpushBannerAutoConfiguration -com.njcn.msgpush.framework.encrypt.config.MsgpushApiEncryptAutoConfiguration \ No newline at end of file +com.njcn.msgpush.framework.encrypt.config.MsgpushApiEncryptAutoConfiguration diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/resources/banner.txt b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/resources/banner.txt index 189c48d..452ee48 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/main/resources/banner.txt +++ b/msgpush-framework/msgpush-spring-boot-starter-web/src/main/resources/banner.txt @@ -1,4 +1,3 @@ -灿能源码 http://www.iocoder.cn Application Version: ${msgpush.info.version} Spring Boot Version: ${spring-boot.version} diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/DesensitizeTest.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/DesensitizeTest.java deleted file mode 100644 index 25c2133..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/DesensitizeTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.njcn.msgpush.framework.desensitize.core; - -import com.njcn.msgpush.framework.common.util.json.JsonUtils; -import com.njcn.msgpush.framework.desensitize.core.regex.annotation.EmailDesensitize; -import com.njcn.msgpush.framework.desensitize.core.regex.annotation.RegexDesensitize; -import com.njcn.msgpush.framework.desensitize.core.annotation.Address; -import com.njcn.msgpush.framework.desensitize.core.slider.annotation.BankCardDesensitize; -import com.njcn.msgpush.framework.desensitize.core.slider.annotation.CarLicenseDesensitize; -import com.njcn.msgpush.framework.desensitize.core.slider.annotation.ChineseNameDesensitize; -import com.njcn.msgpush.framework.desensitize.core.slider.annotation.FixedPhoneDesensitize; -import com.njcn.msgpush.framework.desensitize.core.slider.annotation.IdCardDesensitize; -import com.njcn.msgpush.framework.desensitize.core.slider.annotation.PasswordDesensitize; -import com.njcn.msgpush.framework.desensitize.core.slider.annotation.MobileDesensitize; -import com.njcn.msgpush.framework.desensitize.core.slider.annotation.SliderDesensitize; -import lombok.Data; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.junit.jupiter.MockitoExtension; - -import static org.junit.jupiter.api.Assertions.*; - -/** - * {@link DesensitizeTest} 的单元测试 - */ -@ExtendWith(MockitoExtension.class) -public class DesensitizeTest { - - @Test - public void test() { - // 准备参数 - DesensitizeDemo desensitizeDemo = new DesensitizeDemo(); - desensitizeDemo.setNickname("灿能源码"); - desensitizeDemo.setBankCard("9988002866797031"); - desensitizeDemo.setCarLicense("粤A66666"); - desensitizeDemo.setFixedPhone("01086551122"); - desensitizeDemo.setIdCard("530321199204074611"); - desensitizeDemo.setPassword("123456"); - desensitizeDemo.setPhoneNumber("13248765917"); - desensitizeDemo.setSlider1("ABCDEFG"); - desensitizeDemo.setSlider2("ABCDEFG"); - desensitizeDemo.setSlider3("ABCDEFG"); - desensitizeDemo.setEmail("1@email.com"); - desensitizeDemo.setRegex("你好,我是灿能源码"); - desensitizeDemo.setAddress("北京市海淀区上地十街10号"); - desensitizeDemo.setOrigin("灿能源码"); - - // 调用 - DesensitizeDemo d = JsonUtils.parseObject(JsonUtils.toJsonString(desensitizeDemo), DesensitizeDemo.class); - // 断言 - assertNotNull(d); - assertEquals("芋***", d.getNickname()); - assertEquals("998800********31", d.getBankCard()); - assertEquals("粤A6***6", d.getCarLicense()); - assertEquals("0108*****22", d.getFixedPhone()); - assertEquals("530321**********11", d.getIdCard()); - assertEquals("******", d.getPassword()); - assertEquals("132****5917", d.getPhoneNumber()); - assertEquals("#######", d.getSlider1()); - assertEquals("ABC*EFG", d.getSlider2()); - assertEquals("*******", d.getSlider3()); - assertEquals("1****@email.com", d.getEmail()); - assertEquals("你好,我是*", d.getRegex()); - assertEquals("北京市海淀区上地十街10号*", d.getAddress()); - assertEquals("灿能源码", d.getOrigin()); - } - - @Data - public static class DesensitizeDemo { - - @ChineseNameDesensitize - private String nickname; - @BankCardDesensitize - private String bankCard; - @CarLicenseDesensitize - private String carLicense; - @FixedPhoneDesensitize - private String fixedPhone; - @IdCardDesensitize - private String idCard; - @PasswordDesensitize - private String password; - @MobileDesensitize - private String phoneNumber; - @SliderDesensitize(prefixKeep = 6, suffixKeep = 1, replacer = "#") - private String slider1; - @SliderDesensitize(prefixKeep = 3, suffixKeep = 3) - private String slider2; - @SliderDesensitize(prefixKeep = 10) - private String slider3; - @EmailDesensitize - private String email; - @RegexDesensitize(regex = "灿能源码", replacer = "*") - private String regex; - @Address - private String address; - private String origin; - - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/annotation/Address.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/annotation/Address.java deleted file mode 100644 index 91dbdc5..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/annotation/Address.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.njcn.msgpush.framework.desensitize.core.annotation; - -import com.njcn.msgpush.framework.desensitize.core.DesensitizeTest; -import com.njcn.msgpush.framework.desensitize.core.base.annotation.DesensitizeBy; -import com.njcn.msgpush.framework.desensitize.core.handler.AddressHandler; -import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; - -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; - -/** - * 地址 - * - * 用于 {@link DesensitizeTest} 测试使用 - * - * @author gaibu - */ -@Documented -@Target({ElementType.FIELD}) -@Retention(RetentionPolicy.RUNTIME) -@JacksonAnnotationsInside -@DesensitizeBy(handler = AddressHandler.class) -public @interface Address { - - String replacer() default "*"; - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/handler/AddressHandler.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/handler/AddressHandler.java deleted file mode 100644 index 4f88ff9..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/desensitize/core/handler/AddressHandler.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.njcn.msgpush.framework.desensitize.core.handler; - -import com.njcn.msgpush.framework.desensitize.core.DesensitizeTest; -import com.njcn.msgpush.framework.desensitize.core.base.handler.DesensitizationHandler; -import com.njcn.msgpush.framework.desensitize.core.annotation.Address; - -/** - * {@link Address} 的脱敏处理器 - * - * 用于 {@link DesensitizeTest} 测试使用 - */ -public class AddressHandler implements DesensitizationHandler

{ - - @Override - public String desensitize(String origin, Address annotation) { - return origin + annotation.replacer(); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/encrypt/ApiEncryptTest.java b/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/encrypt/ApiEncryptTest.java deleted file mode 100644 index 3b2eb8c..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-web/src/test/java/com/njcn/msgpush/framework/encrypt/ApiEncryptTest.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.njcn.msgpush.framework.encrypt; - -import cn.hutool.core.util.RandomUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.crypto.SecureUtil; -import cn.hutool.crypto.asymmetric.AsymmetricAlgorithm; -import cn.hutool.crypto.asymmetric.KeyType; -import cn.hutool.crypto.asymmetric.RSA; -import cn.hutool.crypto.symmetric.SymmetricAlgorithm; -import org.junit.jupiter.api.Test; - -import java.util.Objects; - -/** - * 各种 API 加解密的测试类:不是单测,而是方便大家生成密钥、加密、解密等操作。 - * - * @author hongawen - */ -@SuppressWarnings("ConstantValue") -public class ApiEncryptTest { - - @Test - public void testGenerateAsymmetric() { - String asymmetricAlgorithm = AsymmetricAlgorithm.RSA.getValue(); -// String asymmetricAlgorithm = "SM2"; -// String asymmetricAlgorithm = SM4.ALGORITHM_NAME; -// String asymmetricAlgorithm = SymmetricAlgorithm.AES.getValue(); - String requestClientKey = null; - String requestServerKey = null; - String responseClientKey = null; - String responseServerKey = null; - if (Objects.equals(asymmetricAlgorithm, AsymmetricAlgorithm.RSA.getValue())) { - // 请求的密钥 - RSA requestRsa = SecureUtil.rsa(); - requestClientKey = requestRsa.getPublicKeyBase64(); - requestServerKey = requestRsa.getPrivateKeyBase64(); - // 响应的密钥 - RSA responseRsa = new RSA(); - responseClientKey = responseRsa.getPrivateKeyBase64(); - responseServerKey = responseRsa.getPublicKeyBase64(); - } else if (Objects.equals(asymmetricAlgorithm, SymmetricAlgorithm.AES.getValue())) { - // AES 密钥可选 32、24、16 位 - // 请求的密钥(前后端密钥一致) - requestClientKey = RandomUtil.randomNumbers(32); - requestServerKey = requestClientKey; - // 响应的密钥(前后端密钥一致) - responseClientKey = RandomUtil.randomNumbers(32); - responseServerKey = responseClientKey; - } - - // 打印结果 - System.out.println("requestClientKey = " + requestClientKey); - System.out.println("requestServerKey = " + requestServerKey); - System.out.println("responseClientKey = " + responseClientKey); - System.out.println("responseServerKey = " + responseServerKey); - } - - @Test - public void testEncrypt_aes() { - String key = "52549111389893486934626385991395"; - String body = "{\n" + - " \"username\": \"admin\",\n" + - " \"password\": \"admin123\",\n" + - " \"uuid\": \"3acd87a09a4f48fb9118333780e94883\",\n" + - " \"code\": \"1024\"\n" + - "}"; - String encrypt = SecureUtil.aes(StrUtil.utf8Bytes(key)) - .encryptBase64(body); - System.out.println("encrypt = " + encrypt); - } - - @Test - public void testEncrypt_rsa() { - String key = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCls2rIpnGdYnLFgz1XU13GbNQ5DloyPpvW00FPGjqn5Z6JpK+kDtVlnkhwR87iRrE5Vf2WNqRX6vzbLSgveIQY8e8oqGCb829myjf1MuI+ZzN4ghf/7tEYhZJGPI9AbfxFqBUzm+kR3/HByAI22GLT96WM26QiMK8n3tIP/yiLswIDAQAB"; - String body = "{\n" + - " \"username\": \"admin\",\n" + - " \"password\": \"admin123\",\n" + - " \"uuid\": \"3acd87a09a4f48fb9118333780e94883\",\n" + - " \"code\": \"1024\"\n" + - "}"; - String encrypt = SecureUtil.rsa(null, key) - .encryptBase64(body, KeyType.PublicKey); - System.out.println("encrypt = " + encrypt); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/pom.xml b/msgpush-framework/msgpush-spring-boot-starter-websocket/pom.xml index 02046c8..a94ba4a 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/pom.xml +++ b/msgpush-framework/msgpush-spring-boot-starter-websocket/pom.xml @@ -2,12 +2,13 @@ + 4.0.0 com.njcn msgpush-framework ${revision} - 4.0.0 + msgpush-spring-boot-starter-websocket jar @@ -38,26 +39,6 @@ spring-boot-starter-websocket - - - com.njcn - msgpush-spring-boot-starter-mq - - - org.springframework.kafka - spring-kafka - true - - - org.springframework.amqp - spring-rabbit - true - - - org.apache.rocketmq - rocketmq-spring-boot-starter - true - - \ No newline at end of file + diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/config/MsgpushWebSocketAutoConfiguration.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/config/MsgpushWebSocketAutoConfiguration.java index 8fc5cff..88a1207 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/config/MsgpushWebSocketAutoConfiguration.java +++ b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/config/MsgpushWebSocketAutoConfiguration.java @@ -1,33 +1,17 @@ package com.njcn.msgpush.framework.websocket.config; -import com.njcn.msgpush.framework.mq.redis.config.MsgpushRedisMQConsumerAutoConfiguration; -import com.njcn.msgpush.framework.mq.redis.core.RedisMQTemplate; import com.njcn.msgpush.framework.websocket.core.handler.JsonWebSocketMessageHandler; import com.njcn.msgpush.framework.websocket.core.listener.WebSocketMessageListener; import com.njcn.msgpush.framework.websocket.core.security.LoginUserHandshakeInterceptor; import com.njcn.msgpush.framework.websocket.core.security.WebSocketAuthorizeRequestsCustomizer; -import com.njcn.msgpush.framework.websocket.core.sender.kafka.KafkaWebSocketMessageConsumer; -import com.njcn.msgpush.framework.websocket.core.sender.kafka.KafkaWebSocketMessageSender; import com.njcn.msgpush.framework.websocket.core.sender.local.LocalWebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.sender.rabbitmq.RabbitMQWebSocketMessageConsumer; -import com.njcn.msgpush.framework.websocket.core.sender.rabbitmq.RabbitMQWebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.sender.redis.RedisWebSocketMessageConsumer; -import com.njcn.msgpush.framework.websocket.core.sender.redis.RedisWebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.sender.rocketmq.RocketMQWebSocketMessageConsumer; -import com.njcn.msgpush.framework.websocket.core.sender.rocketmq.RocketMQWebSocketMessageSender; import com.njcn.msgpush.framework.websocket.core.session.WebSocketSessionHandlerDecorator; import com.njcn.msgpush.framework.websocket.core.session.WebSocketSessionManager; import com.njcn.msgpush.framework.websocket.core.session.WebSocketSessionManagerImpl; -import org.apache.rocketmq.spring.core.RocketMQTemplate; -import org.springframework.amqp.core.TopicExchange; -import org.springframework.amqp.rabbit.core.RabbitTemplate; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.kafka.core.KafkaTemplate; import org.springframework.web.socket.WebSocketHandler; import org.springframework.web.socket.config.annotation.EnableWebSocket; import org.springframework.web.socket.config.annotation.WebSocketConfigurer; @@ -40,7 +24,7 @@ import java.util.List; * * @author xingyu4j */ -@AutoConfiguration(before = MsgpushRedisMQConsumerAutoConfiguration.class) // before MsgpushRedisMQConsumerAutoConfiguration 的原因是,需要保证 RedisWebSocketMessageConsumer 先创建,才能创建 RedisMessageListenerContainer +@AutoConfiguration @EnableWebSocket // 开启 websocket @ConditionalOnProperty(prefix = "msgpush.websocket", value = "enable", matchIfMissing = true) // 允许使用 msgpush.websocket.enable=false 禁用 websocket @EnableConfigurationProperties(WebSocketProperties.class) @@ -77,107 +61,14 @@ public class MsgpushWebSocketAutoConfiguration { return new WebSocketSessionManagerImpl(); } + @Bean + public LocalWebSocketMessageSender webSocketMessageSender(WebSocketSessionManager sessionManager) { + return new LocalWebSocketMessageSender(sessionManager); + } + @Bean public WebSocketAuthorizeRequestsCustomizer webSocketAuthorizeRequestsCustomizer(WebSocketProperties webSocketProperties) { return new WebSocketAuthorizeRequestsCustomizer(webSocketProperties); } - // ==================== Sender 相关 ==================== - - @Configuration - @ConditionalOnProperty(prefix = "msgpush.websocket", name = "sender-type", havingValue = "local") - public class LocalWebSocketMessageSenderConfiguration { - - @Bean - public LocalWebSocketMessageSender localWebSocketMessageSender(WebSocketSessionManager sessionManager) { - return new LocalWebSocketMessageSender(sessionManager); - } - - } - - @Configuration - @ConditionalOnProperty(prefix = "msgpush.websocket", name = "sender-type", havingValue = "redis") - public class RedisWebSocketMessageSenderConfiguration { - - @Bean - public RedisWebSocketMessageSender redisWebSocketMessageSender(WebSocketSessionManager sessionManager, - RedisMQTemplate redisMQTemplate) { - return new RedisWebSocketMessageSender(sessionManager, redisMQTemplate); - } - - @Bean - public RedisWebSocketMessageConsumer redisWebSocketMessageConsumer( - RedisWebSocketMessageSender redisWebSocketMessageSender) { - return new RedisWebSocketMessageConsumer(redisWebSocketMessageSender); - } - - } - - @Configuration - @ConditionalOnProperty(prefix = "msgpush.websocket", name = "sender-type", havingValue = "rocketmq") - public class RocketMQWebSocketMessageSenderConfiguration { - - @Bean - public RocketMQWebSocketMessageSender rocketMQWebSocketMessageSender( - WebSocketSessionManager sessionManager, RocketMQTemplate rocketMQTemplate, - @Value("${msgpush.websocket.sender-rocketmq.topic}") String topic) { - return new RocketMQWebSocketMessageSender(sessionManager, rocketMQTemplate, topic); - } - - @Bean - public RocketMQWebSocketMessageConsumer rocketMQWebSocketMessageConsumer( - RocketMQWebSocketMessageSender rocketMQWebSocketMessageSender) { - return new RocketMQWebSocketMessageConsumer(rocketMQWebSocketMessageSender); - } - - } - - @Configuration - @ConditionalOnProperty(prefix = "msgpush.websocket", name = "sender-type", havingValue = "rabbitmq") - public class RabbitMQWebSocketMessageSenderConfiguration { - - @Bean - public RabbitMQWebSocketMessageSender rabbitMQWebSocketMessageSender( - WebSocketSessionManager sessionManager, RabbitTemplate rabbitTemplate, - TopicExchange websocketTopicExchange) { - return new RabbitMQWebSocketMessageSender(sessionManager, rabbitTemplate, websocketTopicExchange); - } - - @Bean - public RabbitMQWebSocketMessageConsumer rabbitMQWebSocketMessageConsumer( - RabbitMQWebSocketMessageSender rabbitMQWebSocketMessageSender) { - return new RabbitMQWebSocketMessageConsumer(rabbitMQWebSocketMessageSender); - } - - /** - * 创建 Topic Exchange - */ - @Bean - public TopicExchange websocketTopicExchange(@Value("${msgpush.websocket.sender-rabbitmq.exchange}") String exchange) { - return new TopicExchange(exchange, - true, // durable: 是否持久化 - false); // exclusive: 是否排它 - } - - } - - @Configuration - @ConditionalOnProperty(prefix = "msgpush.websocket", name = "sender-type", havingValue = "kafka") - public class KafkaWebSocketMessageSenderConfiguration { - - @Bean - public KafkaWebSocketMessageSender kafkaWebSocketMessageSender( - WebSocketSessionManager sessionManager, KafkaTemplate kafkaTemplate, - @Value("${msgpush.websocket.sender-kafka.topic}") String topic) { - return new KafkaWebSocketMessageSender(sessionManager, kafkaTemplate, topic); - } - - @Bean - public KafkaWebSocketMessageConsumer kafkaWebSocketMessageConsumer( - KafkaWebSocketMessageSender kafkaWebSocketMessageSender) { - return new KafkaWebSocketMessageConsumer(kafkaWebSocketMessageSender); - } - - } - -} \ No newline at end of file +} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/config/WebSocketProperties.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/config/WebSocketProperties.java index 8d53d1a..d525109 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/config/WebSocketProperties.java +++ b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/config/WebSocketProperties.java @@ -1,12 +1,10 @@ package com.njcn.msgpush.framework.websocket.config; +import jakarta.validation.constraints.NotEmpty; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.validation.annotation.Validated; -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; - /** * WebSocket 配置项 * @@ -23,12 +21,4 @@ public class WebSocketProperties { @NotEmpty(message = "WebSocket 的连接路径不能为空") private String path = "/ws"; - /** - * 消息发送器的类型 - * - * 可选值:local、redis、rocketmq、kafka、rabbitmq - */ - @NotNull(message = "WebSocket 的消息发送者不能为空") - private String senderType = "local"; - } diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/handler/JsonWebSocketMessageHandler.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/handler/JsonWebSocketMessageHandler.java index ee70ebb..3c70a36 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/handler/JsonWebSocketMessageHandler.java +++ b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/handler/JsonWebSocketMessageHandler.java @@ -5,7 +5,6 @@ import cn.hutool.core.util.TypeUtil; import com.njcn.msgpush.framework.common.util.json.JsonUtils; import com.njcn.msgpush.framework.websocket.core.listener.WebSocketMessageListener; import com.njcn.msgpush.framework.websocket.core.message.JsonWebSocketMessage; -import com.njcn.msgpush.framework.websocket.core.util.WebSocketFrameworkUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketHandler; diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/message/JsonWebSocketMessage.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/message/JsonWebSocketMessage.java index 4884ff9..4134aa0 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/message/JsonWebSocketMessage.java +++ b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/message/JsonWebSocketMessage.java @@ -2,6 +2,7 @@ package com.njcn.msgpush.framework.websocket.core.message; import com.njcn.msgpush.framework.websocket.core.listener.WebSocketMessageListener; import lombok.Data; +import lombok.experimental.Accessors; import java.io.Serializable; diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessage.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessage.java deleted file mode 100644 index c2fc570..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessage.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.kafka; - -import lombok.Data; - -/** - * Kafka 广播 WebSocket 的消息 - * - * @author hongawen - */ -@Data -public class KafkaWebSocketMessage { - - /** - * Session 编号 - */ - private String sessionId; - /** - * 用户类型 - */ - private Integer userType; - /** - * 用户编号 - */ - private Long userId; - - /** - * 消息类型 - */ - private String messageType; - /** - * 消息内容 - */ - private String messageContent; - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessageConsumer.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessageConsumer.java deleted file mode 100644 index af9683d..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessageConsumer.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.kafka; - -import lombok.RequiredArgsConstructor; -import org.springframework.amqp.rabbit.annotation.RabbitHandler; -import org.springframework.kafka.annotation.KafkaListener; - -/** - * {@link KafkaWebSocketMessage} 广播消息的消费者,真正把消息发送出去 - * - * @author hongawen - */ -@RequiredArgsConstructor -public class KafkaWebSocketMessageConsumer { - - private final KafkaWebSocketMessageSender kafkaWebSocketMessageSender; - - @RabbitHandler - @KafkaListener( - topics = "${msgpush.websocket.sender-kafka.topic}", - // 在 Group 上,使用 UUID 生成其后缀。这样,启动的 Consumer 的 Group 不同,以达到广播消费的目的 - groupId = "${msgpush.websocket.sender-kafka.consumer-group}" + "-" + "#{T(java.util.UUID).randomUUID()}") - public void onMessage(KafkaWebSocketMessage message) { - kafkaWebSocketMessageSender.send(message.getSessionId(), - message.getUserType(), message.getUserId(), - message.getMessageType(), message.getMessageContent()); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessageSender.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessageSender.java deleted file mode 100644 index 59824f1..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/kafka/KafkaWebSocketMessageSender.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.kafka; - -import com.njcn.msgpush.framework.websocket.core.sender.AbstractWebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.sender.WebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.session.WebSocketSessionManager; -import lombok.extern.slf4j.Slf4j; -import org.springframework.kafka.core.KafkaTemplate; - -import java.util.concurrent.ExecutionException; - -/** - * 基于 Kafka 的 {@link WebSocketMessageSender} 实现类 - * - * @author hongawen - */ -@Slf4j -public class KafkaWebSocketMessageSender extends AbstractWebSocketMessageSender { - - private final KafkaTemplate kafkaTemplate; - - private final String topic; - - public KafkaWebSocketMessageSender(WebSocketSessionManager sessionManager, - KafkaTemplate kafkaTemplate, - String topic) { - super(sessionManager); - this.kafkaTemplate = kafkaTemplate; - this.topic = topic; - } - - @Override - public void send(Integer userType, Long userId, String messageType, String messageContent) { - sendKafkaMessage(null, userId, userType, messageType, messageContent); - } - - @Override - public void send(Integer userType, String messageType, String messageContent) { - sendKafkaMessage(null, null, userType, messageType, messageContent); - } - - @Override - public void send(String sessionId, String messageType, String messageContent) { - sendKafkaMessage(sessionId, null, null, messageType, messageContent); - } - - /** - * 通过 Kafka 广播消息 - * - * @param sessionId Session 编号 - * @param userId 用户编号 - * @param userType 用户类型 - * @param messageType 消息类型 - * @param messageContent 消息内容 - */ - private void sendKafkaMessage(String sessionId, Long userId, Integer userType, - String messageType, String messageContent) { - KafkaWebSocketMessage mqMessage = new KafkaWebSocketMessage() - .setSessionId(sessionId).setUserId(userId).setUserType(userType) - .setMessageType(messageType).setMessageContent(messageContent); - try { - kafkaTemplate.send(topic, mqMessage).get(); - } catch (InterruptedException | ExecutionException e) { - log.error("[sendKafkaMessage][发送消息({}) 到 Kafka 失败]", mqMessage, e); - } - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessage.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessage.java deleted file mode 100644 index adb9d46..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessage.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.rabbitmq; - -import lombok.Data; - -import java.io.Serializable; - -/** - * RabbitMQ 广播 WebSocket 的消息 - * - * @author hongawen - */ -@Data -public class RabbitMQWebSocketMessage implements Serializable { - - /** - * Session 编号 - */ - private String sessionId; - /** - * 用户类型 - */ - private Integer userType; - /** - * 用户编号 - */ - private Long userId; - - /** - * 消息类型 - */ - private String messageType; - /** - * 消息内容 - */ - private String messageContent; - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageConsumer.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageConsumer.java deleted file mode 100644 index 07ea9c6..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageConsumer.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.rabbitmq; - -import lombok.RequiredArgsConstructor; -import org.springframework.amqp.core.ExchangeTypes; -import org.springframework.amqp.rabbit.annotation.*; - -/** - * {@link RabbitMQWebSocketMessage} 广播消息的消费者,真正把消息发送出去 - * - * @author hongawen - */ -@RabbitListener( - bindings = @QueueBinding( - value = @Queue( - // 在 Queue 的名字上,使用 UUID 生成其后缀。这样,启动的 Consumer 的 Queue 不同,以达到广播消费的目的 - name = "${msgpush.websocket.sender-rabbitmq.queue}" + "-" + "#{T(java.util.UUID).randomUUID()}", - // Consumer 关闭时,该队列就可以被自动删除了 - autoDelete = "true" - ), - exchange = @Exchange( - name = "${msgpush.websocket.sender-rabbitmq.exchange}", - type = ExchangeTypes.TOPIC, - declare = "false" - ) - ) -) -@RequiredArgsConstructor -public class RabbitMQWebSocketMessageConsumer { - - private final RabbitMQWebSocketMessageSender rabbitMQWebSocketMessageSender; - - @RabbitHandler - public void onMessage(RabbitMQWebSocketMessage message) { - rabbitMQWebSocketMessageSender.send(message.getSessionId(), - message.getUserType(), message.getUserId(), - message.getMessageType(), message.getMessageContent()); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageSender.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageSender.java deleted file mode 100644 index d48e8a1..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rabbitmq/RabbitMQWebSocketMessageSender.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.rabbitmq; - -import com.njcn.msgpush.framework.websocket.core.sender.AbstractWebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.sender.WebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.session.WebSocketSessionManager; -import lombok.extern.slf4j.Slf4j; -import org.springframework.amqp.core.TopicExchange; -import org.springframework.amqp.rabbit.core.RabbitTemplate; - -/** - * 基于 RabbitMQ 的 {@link WebSocketMessageSender} 实现类 - * - * @author hongawen - */ -@Slf4j -public class RabbitMQWebSocketMessageSender extends AbstractWebSocketMessageSender { - - private final RabbitTemplate rabbitTemplate; - - private final TopicExchange topicExchange; - - public RabbitMQWebSocketMessageSender(WebSocketSessionManager sessionManager, - RabbitTemplate rabbitTemplate, - TopicExchange topicExchange) { - super(sessionManager); - this.rabbitTemplate = rabbitTemplate; - this.topicExchange = topicExchange; - } - - @Override - public void send(Integer userType, Long userId, String messageType, String messageContent) { - sendRabbitMQMessage(null, userId, userType, messageType, messageContent); - } - - @Override - public void send(Integer userType, String messageType, String messageContent) { - sendRabbitMQMessage(null, null, userType, messageType, messageContent); - } - - @Override - public void send(String sessionId, String messageType, String messageContent) { - sendRabbitMQMessage(sessionId, null, null, messageType, messageContent); - } - - /** - * 通过 RabbitMQ 广播消息 - * - * @param sessionId Session 编号 - * @param userId 用户编号 - * @param userType 用户类型 - * @param messageType 消息类型 - * @param messageContent 消息内容 - */ - private void sendRabbitMQMessage(String sessionId, Long userId, Integer userType, - String messageType, String messageContent) { - RabbitMQWebSocketMessage mqMessage = new RabbitMQWebSocketMessage() - .setSessionId(sessionId).setUserId(userId).setUserType(userType) - .setMessageType(messageType).setMessageContent(messageContent); - rabbitTemplate.convertAndSend(topicExchange.getName(), null, mqMessage); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessage.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessage.java deleted file mode 100644 index 2467b42..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessage.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.redis; - -import com.njcn.msgpush.framework.mq.redis.core.pubsub.AbstractRedisChannelMessage; -import lombok.Data; - -/** - * Redis 广播 WebSocket 的消息 - */ -@Data -public class RedisWebSocketMessage extends AbstractRedisChannelMessage { - - /** - * Session 编号 - */ - private String sessionId; - /** - * 用户类型 - */ - private Integer userType; - /** - * 用户编号 - */ - private Long userId; - - /** - * 消息类型 - */ - private String messageType; - /** - * 消息内容 - */ - private String messageContent; - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessageConsumer.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessageConsumer.java deleted file mode 100644 index 0b6ce00..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessageConsumer.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.redis; - -import com.njcn.msgpush.framework.mq.redis.core.pubsub.AbstractRedisChannelMessageListener; -import lombok.RequiredArgsConstructor; - -/** - * {@link RedisWebSocketMessage} 广播消息的消费者,真正把消息发送出去 - * - * @author hongawen - */ -@RequiredArgsConstructor -public class RedisWebSocketMessageConsumer extends AbstractRedisChannelMessageListener { - - private final RedisWebSocketMessageSender redisWebSocketMessageSender; - - @Override - public void onMessage(RedisWebSocketMessage message) { - redisWebSocketMessageSender.send(message.getSessionId(), - message.getUserType(), message.getUserId(), - message.getMessageType(), message.getMessageContent()); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessageSender.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessageSender.java deleted file mode 100644 index db57395..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/redis/RedisWebSocketMessageSender.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.redis; - -import com.njcn.msgpush.framework.mq.redis.core.RedisMQTemplate; -import com.njcn.msgpush.framework.websocket.core.sender.AbstractWebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.sender.WebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.session.WebSocketSessionManager; -import lombok.extern.slf4j.Slf4j; - -/** - * 基于 Redis 的 {@link WebSocketMessageSender} 实现类 - * - * @author hongawen - */ -@Slf4j -public class RedisWebSocketMessageSender extends AbstractWebSocketMessageSender { - - private final RedisMQTemplate redisMQTemplate; - - public RedisWebSocketMessageSender(WebSocketSessionManager sessionManager, - RedisMQTemplate redisMQTemplate) { - super(sessionManager); - this.redisMQTemplate = redisMQTemplate; - } - - @Override - public void send(Integer userType, Long userId, String messageType, String messageContent) { - sendRedisMessage(null, userId, userType, messageType, messageContent); - } - - @Override - public void send(Integer userType, String messageType, String messageContent) { - sendRedisMessage(null, null, userType, messageType, messageContent); - } - - @Override - public void send(String sessionId, String messageType, String messageContent) { - sendRedisMessage(sessionId, null, null, messageType, messageContent); - } - - /** - * 通过 Redis 广播消息 - * - * @param sessionId Session 编号 - * @param userId 用户编号 - * @param userType 用户类型 - * @param messageType 消息类型 - * @param messageContent 消息内容 - */ - private void sendRedisMessage(String sessionId, Long userId, Integer userType, - String messageType, String messageContent) { - RedisWebSocketMessage mqMessage = new RedisWebSocketMessage() - .setSessionId(sessionId).setUserId(userId).setUserType(userType) - .setMessageType(messageType).setMessageContent(messageContent); - redisMQTemplate.send(mqMessage); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessage.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessage.java deleted file mode 100644 index 538e04f..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessage.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.rocketmq; - -import lombok.Data; - -/** - * RocketMQ 广播 WebSocket 的消息 - * - * @author hongawen - */ -@Data -public class RocketMQWebSocketMessage { - - /** - * Session 编号 - */ - private String sessionId; - /** - * 用户类型 - */ - private Integer userType; - /** - * 用户编号 - */ - private Long userId; - - /** - * 消息类型 - */ - private String messageType; - /** - * 消息内容 - */ - private String messageContent; - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageConsumer.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageConsumer.java deleted file mode 100644 index 31a0e32..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageConsumer.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.rocketmq; - -import lombok.RequiredArgsConstructor; -import org.apache.rocketmq.spring.annotation.MessageModel; -import org.apache.rocketmq.spring.annotation.RocketMQMessageListener; -import org.apache.rocketmq.spring.core.RocketMQListener; - -/** - * {@link RocketMQWebSocketMessage} 广播消息的消费者,真正把消息发送出去 - * - * @author hongawen - */ -@RocketMQMessageListener( // 重点:添加 @RocketMQMessageListener 注解,声明消费的 topic - topic = "${msgpush.websocket.sender-rocketmq.topic}", - consumerGroup = "${msgpush.websocket.sender-rocketmq.consumer-group}", - messageModel = MessageModel.BROADCASTING // 设置为广播模式,保证每个实例都能收到消息 -) -@RequiredArgsConstructor -public class RocketMQWebSocketMessageConsumer implements RocketMQListener { - - private final RocketMQWebSocketMessageSender rocketMQWebSocketMessageSender; - - @Override - public void onMessage(RocketMQWebSocketMessage message) { - rocketMQWebSocketMessageSender.send(message.getSessionId(), - message.getUserType(), message.getUserId(), - message.getMessageType(), message.getMessageContent()); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageSender.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageSender.java deleted file mode 100644 index e07293b..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/sender/rocketmq/RocketMQWebSocketMessageSender.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.njcn.msgpush.framework.websocket.core.sender.rocketmq; - -import com.njcn.msgpush.framework.websocket.core.sender.AbstractWebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.sender.WebSocketMessageSender; -import com.njcn.msgpush.framework.websocket.core.session.WebSocketSessionManager; -import lombok.extern.slf4j.Slf4j; -import org.apache.rocketmq.spring.core.RocketMQTemplate; - -/** - * 基于 RocketMQ 的 {@link WebSocketMessageSender} 实现类 - * - * @author hongawen - */ -@Slf4j -public class RocketMQWebSocketMessageSender extends AbstractWebSocketMessageSender { - - private final RocketMQTemplate rocketMQTemplate; - - private final String topic; - - public RocketMQWebSocketMessageSender(WebSocketSessionManager sessionManager, - RocketMQTemplate rocketMQTemplate, - String topic) { - super(sessionManager); - this.rocketMQTemplate = rocketMQTemplate; - this.topic = topic; - } - - @Override - public void send(Integer userType, Long userId, String messageType, String messageContent) { - sendRocketMQMessage(null, userId, userType, messageType, messageContent); - } - - @Override - public void send(Integer userType, String messageType, String messageContent) { - sendRocketMQMessage(null, null, userType, messageType, messageContent); - } - - @Override - public void send(String sessionId, String messageType, String messageContent) { - sendRocketMQMessage(sessionId, null, null, messageType, messageContent); - } - - /** - * 通过 RocketMQ 广播消息 - * - * @param sessionId Session 编号 - * @param userId 用户编号 - * @param userType 用户类型 - * @param messageType 消息类型 - * @param messageContent 消息内容 - */ - private void sendRocketMQMessage(String sessionId, Long userId, Integer userType, - String messageType, String messageContent) { - RocketMQWebSocketMessage mqMessage = new RocketMQWebSocketMessage() - .setSessionId(sessionId).setUserId(userId).setUserType(userType) - .setMessageType(messageType).setMessageContent(messageContent); - rocketMQTemplate.syncSend(topic, mqMessage); - } - -} diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/util/WebSocketFrameworkUtils.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/util/WebSocketFrameworkUtils.java index 33837db..b92b88f 100644 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/util/WebSocketFrameworkUtils.java +++ b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/core/util/WebSocketFrameworkUtils.java @@ -5,53 +5,26 @@ import org.springframework.web.socket.WebSocketSession; import java.util.Map; -/** - * 专属于 web 包的工具类 - * - * @author hongawen - */ public class WebSocketFrameworkUtils { public static final String ATTRIBUTE_LOGIN_USER = "LOGIN_USER"; - /** - * 设置当前用户 - * - * @param loginUser 登录用户 - * @param attributes Session - */ public static void setLoginUser(LoginUser loginUser, Map attributes) { attributes.put(ATTRIBUTE_LOGIN_USER, loginUser); } - /** - * 获取当前用户 - * - * @return 当前用户 - */ public static LoginUser getLoginUser(WebSocketSession session) { return (LoginUser) session.getAttributes().get(ATTRIBUTE_LOGIN_USER); } - /** - * 获得当前用户的编号 - * - * @return 用户编号 - */ public static Long getLoginUserId(WebSocketSession session) { LoginUser loginUser = getLoginUser(session); return loginUser != null ? loginUser.getId() : null; } - /** - * 获得当前用户的类型 - * - * @return 用户编号 - */ public static Integer getLoginUserType(WebSocketSession session) { LoginUser loginUser = getLoginUser(session); return loginUser != null ? loginUser.getUserType() : null; } - } diff --git a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/package-info.java b/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/package-info.java deleted file mode 100644 index 784b064..0000000 --- a/msgpush-framework/msgpush-spring-boot-starter-websocket/src/main/java/com/njcn/msgpush/framework/websocket/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * WebSocket 框架,支持多节点的广播 - */ -package com.njcn.msgpush.framework.websocket; diff --git a/msgpush-framework/pom.xml b/msgpush-framework/pom.xml index 899a056..69a68b2 100644 --- a/msgpush-framework/pom.xml +++ b/msgpush-framework/pom.xml @@ -4,30 +4,30 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - msgpush com.njcn + cn-msgpush ${revision} pom + msgpush-common msgpush-spring-boot-starter-env - msgpush-spring-boot-starter-mybatis - msgpush-spring-boot-starter-redis msgpush-spring-boot-starter-web + msgpush-spring-boot-starter-rpc + msgpush-spring-boot-starter-biz-ip + msgpush-spring-boot-starter-test + msgpush-spring-boot-starter-excel + msgpush-spring-boot-starter-mybatis + msgpush-spring-boot-starter-protection + msgpush-spring-boot-starter-redis msgpush-spring-boot-starter-security msgpush-spring-boot-starter-websocket - msgpush-spring-boot-starter-protection msgpush-spring-boot-starter-mq - msgpush-spring-boot-starter-rpc - msgpush-spring-boot-starter-excel - msgpush-spring-boot-starter-test - msgpush-spring-boot-starter-biz-ip - msgpush-framework - 该包是技术组件,每个子包,代表一个组件。每个组件包括两部分: + RDMS 框架功能模块,每一个子模块都代表一个功能组件。每个组件包括两部分: 1. core 包:是该组件的核心封装 2. config 包:是该组件基于 Spring 的配置 @@ -36,6 +36,10 @@ 2. 业务组件:和业务相关的组件的封装,例如说数据字典、操作日志等等。 如果是业务组件,Maven 名字会包含 biz - + + 17 + 17 + UTF-8 + diff --git a/msgpush-gateway/pom.xml b/msgpush-gateway/pom.xml index 99eb5f2..1eac385 100644 --- a/msgpush-gateway/pom.xml +++ b/msgpush-gateway/pom.xml @@ -2,12 +2,13 @@ + 4.0.0 - msgpush com.njcn + cn-msgpush ${revision} - 4.0.0 + msgpush-gateway jar @@ -15,6 +16,7 @@ API 服务网关,基于 Spring Cloud Gateway 实现 https://github.com/YunaiV/msgpush-cloud + @@ -57,6 +59,7 @@ com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config + com.google.guava @@ -90,5 +93,4 @@ - diff --git a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/cors/CorsResponseHeaderFilter.java b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/cors/CorsResponseHeaderFilter.java deleted file mode 100644 index 0cc0520..0000000 --- a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/cors/CorsResponseHeaderFilter.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.njcn.msgpush.gateway.filter.cors; - -import org.springframework.cloud.gateway.filter.GatewayFilterChain; -import org.springframework.cloud.gateway.filter.GlobalFilter; -import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter; -import org.springframework.core.Ordered; -import org.springframework.http.HttpHeaders; -import org.springframework.stereotype.Component; -import org.springframework.web.server.ServerWebExchange; -import reactor.core.publisher.Mono; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -/** - * 解决 Spring Cloud Gateway 2.x 跨域时,出现重复 Origin 的 BUG - * - * 参考文档: - * - * @author hongawen - */ -@Component -public class CorsResponseHeaderFilter implements GlobalFilter, Ordered { - - @Override - public int getOrder() { - // 指定此过滤器位于 NettyWriteResponseFilter 之后 - // 即待处理完响应体后接着处理响应头 - return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1; - } - - @Override - public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - return chain.filter(exchange).then(Mono.defer(() -> { - // https://gitee.com/zhijiantianya/msgpush-cloud/pulls/177/ - List keysToModify = exchange.getResponse().getHeaders().entrySet().stream() - .filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1)) - .filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN) - || kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS))) - .map(Map.Entry::getKey) - .collect(Collectors.toList()); - keysToModify.forEach(key->{ - List values = exchange.getResponse().getHeaders().get(key); - if (values != null && !values.isEmpty()) { - exchange.getResponse().getHeaders().put(key, Collections.singletonList(values.get(0))); - } - }); - return chain.filter(exchange); - })); - } - -} diff --git a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/grey/GrayLoadBalancer.java b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/grey/GrayLoadBalancer.java index fec58f2..c8173ef 100644 --- a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/grey/GrayLoadBalancer.java +++ b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/grey/GrayLoadBalancer.java @@ -2,9 +2,9 @@ package com.njcn.msgpush.gateway.filter.grey; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.alibaba.cloud.nacos.balancer.NacosBalancer; import com.njcn.msgpush.framework.common.util.collection.CollectionUtils; import com.njcn.msgpush.gateway.util.EnvUtils; -import com.alibaba.cloud.nacos.balancer.NacosBalancer; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.ObjectProvider; @@ -79,7 +79,7 @@ public class GrayLoadBalancer implements ReactorServiceInstanceLoadBalancer { // 基于 tag 过滤实例列表 chooseInstances = filterTagServiceInstances(chooseInstances, headers); - // 随机 + 权重获取实例列表 TODO 芋艿:目前直接使用 Nacos 提供的方法,如果替换注册中心,需要重新失败该方法 + // 随机 + 权重获取实例列表 TODO 目前直接使用 Nacos 提供的方法,如果替换注册中心,需要重新失败该方法 return new DefaultResponse(NacosBalancer.getHostByRandomWeight3(chooseInstances)); } diff --git a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/grey/GrayReactiveLoadBalancerClientFilter.java b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/grey/GrayReactiveLoadBalancerClientFilter.java index 76ebede..7825ac1 100644 --- a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/grey/GrayReactiveLoadBalancerClientFilter.java +++ b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/grey/GrayReactiveLoadBalancerClientFilter.java @@ -55,7 +55,7 @@ public class GrayReactiveLoadBalancerClientFilter implements GlobalFilter, Order public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { URI url = exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR); String schemePrefix = exchange.getAttribute(GATEWAY_SCHEME_PREFIX_ATTR); - // 修改 by 灿能源码:将 lb 替换成 grayLb,表示灰度负载均衡 + // 修改:将 lb 替换成 grayLb,表示灰度负载均衡 if (url == null || (!"grayLb".equals(url.getScheme()) && !"grayLb".equals(schemePrefix))) { return chain.filter(exchange); } @@ -121,7 +121,7 @@ public class GrayReactiveLoadBalancerClientFilter implements GlobalFilter, Order private Mono> choose(Request lbRequest, String serviceId, Set supportedLifecycleProcessors) { - // 修改 by 灿能源码:直接创建 GrayLoadBalancer 对象 + // 修改:直接创建 GrayLoadBalancer 对象 GrayLoadBalancer loadBalancer = new GrayLoadBalancer( clientFactory.getLazyProvider(serviceId, ServiceInstanceListSupplier.class), serviceId); supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onStart(lbRequest)); diff --git a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/logging/AccessLogFilter.java b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/logging/AccessLogFilter.java index a8c5617..3d7f0b3 100644 --- a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/logging/AccessLogFilter.java +++ b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/logging/AccessLogFilter.java @@ -3,10 +3,11 @@ package com.njcn.msgpush.gateway.filter.logging; import cn.hutool.core.date.LocalDateTimeUtil; import cn.hutool.core.map.MapUtil; import cn.hutool.json.JSONUtil; +import com.alibaba.nacos.common.utils.StringUtils; import com.njcn.msgpush.framework.common.util.json.JsonUtils; import com.njcn.msgpush.gateway.util.SecurityFrameworkUtils; import com.njcn.msgpush.gateway.util.WebFrameworkUtils; -import com.alibaba.nacos.common.utils.StringUtils; +import jakarta.annotation.Resource; import lombok.extern.slf4j.Slf4j; import org.reactivestreams.Publisher; import org.springframework.cloud.gateway.filter.GatewayFilterChain; @@ -37,7 +38,6 @@ import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Flux; import reactor.core.publisher.Mono; -import jakarta.annotation.Resource; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.List; @@ -50,7 +50,7 @@ import static cn.hutool.core.date.DatePattern.NORM_DATETIME_MS_FORMATTER; * * 从功能上,它类似 msgpush-spring-boot-starter-web 的 ApiAccessLogFilter 过滤器 * - * TODO 芋艿:如果网关执行异常,不会记录访问日志,后续研究下 https://github.com/Silvmike/webflux-demo/blob/master/tests/src/test/java/ru/hardcoders/demo/webflux/web_handler/filters/logging + * TODO 如果网关执行异常,不会记录访问日志,后续研究下 https://github.com/Silvmike/webflux-demo/blob/master/tests/src/test/java/ru/hardcoders/demo/webflux/web_handler/filters/logging * * @author hongawen */ @@ -71,34 +71,34 @@ public class AccessLogFilter implements GlobalFilter, Ordered { // log.info("[writeAccessLog][日志内容:{}]", JsonUtils.toJsonString(gatewayLog)); // 方式二:调用远程服务,记录到数据库中 - // TODO 芋艿:暂未实现 + // TODO 暂未实现 // 方式三:打印到控制台,方便排查错误 - try { - Map values = MapUtil.newHashMap(15, true); // 手工拼接,保证排序;15 保证不用扩容 - values.put("userId", gatewayLog.getUserId()); - values.put("userType", gatewayLog.getUserType()); - values.put("routeId", gatewayLog.getRoute() != null ? gatewayLog.getRoute().getId() : null); - values.put("schema", gatewayLog.getSchema()); - values.put("requestUrl", gatewayLog.getRequestUrl()); - values.put("queryParams", gatewayLog.getQueryParams().toSingleValueMap()); - values.put("requestBody", JsonUtils.isJson(gatewayLog.getRequestBody()) ? // 保证 body 的展示好看 - JSONUtil.parse(gatewayLog.getRequestBody()) : gatewayLog.getRequestBody()); - values.put("requestHeaders", JsonUtils.toJsonString(gatewayLog.getRequestHeaders().toSingleValueMap())); - values.put("userIp", gatewayLog.getUserIp()); - values.put("responseBody", JsonUtils.isJson(gatewayLog.getResponseBody()) ? // 保证 body 的展示好看 - JSONUtil.parse(gatewayLog.getResponseBody()) : gatewayLog.getResponseBody()); - values.put("responseHeaders", gatewayLog.getResponseHeaders() != null ? - JsonUtils.toJsonString(gatewayLog.getResponseHeaders().toSingleValueMap()) : null); - values.put("httpStatus", gatewayLog.getHttpStatus()); - values.put("startTime", LocalDateTimeUtil.format(gatewayLog.getStartTime(), NORM_DATETIME_MS_FORMATTER)); - values.put("endTime", LocalDateTimeUtil.format(gatewayLog.getEndTime(), NORM_DATETIME_MS_FORMATTER)); - values.put("duration", gatewayLog.getDuration() != null ? gatewayLog.getDuration() + " ms" : null); - log.info("[writeAccessLog][网关日志:{}]", JsonUtils.toJsonPrettyString(values)); - } catch (Exception e) { - // 兜底处理,参见 https://gitee.com/zhijiantianya/msgpush-cloud/issues/IC9A70 - log.error("[writeAccessLog][打印网关日志时,发生异常]", e); - } +// try { +// Map values = MapUtil.newHashMap(15, true); // 手工拼接,保证排序;15 保证不用扩容 +// values.put("userId", gatewayLog.getUserId()); +// values.put("userType", gatewayLog.getUserType()); +// values.put("routeId", gatewayLog.getRoute() != null ? gatewayLog.getRoute().getId() : null); +// values.put("schema", gatewayLog.getSchema()); +// values.put("requestUrl", gatewayLog.getRequestUrl()); +// values.put("queryParams", gatewayLog.getQueryParams().toSingleValueMap()); +// values.put("requestBody", JsonUtils.isJson(gatewayLog.getRequestBody()) ? // 保证 body 的展示好看 +// JSONUtil.parse(gatewayLog.getRequestBody()) : gatewayLog.getRequestBody()); +// values.put("requestHeaders", JsonUtils.toJsonString(gatewayLog.getRequestHeaders().toSingleValueMap())); +// values.put("userIp", gatewayLog.getUserIp()); +// values.put("responseBody", JsonUtils.isJson(gatewayLog.getResponseBody()) ? // 保证 body 的展示好看 +// JSONUtil.parse(gatewayLog.getResponseBody()) : gatewayLog.getResponseBody()); +// values.put("responseHeaders", gatewayLog.getResponseHeaders() != null ? +// JsonUtils.toJsonString(gatewayLog.getResponseHeaders().toSingleValueMap()) : null); +// values.put("httpStatus", gatewayLog.getHttpStatus()); +// values.put("startTime", LocalDateTimeUtil.format(gatewayLog.getStartTime(), NORM_DATETIME_MS_FORMATTER)); +// values.put("endTime", LocalDateTimeUtil.format(gatewayLog.getEndTime(), NORM_DATETIME_MS_FORMATTER)); +// values.put("duration", gatewayLog.getDuration() != null ? gatewayLog.getDuration() + " ms" : null); +// log.info("[writeAccessLog][网关日志:{}]", JsonUtils.toJsonPrettyString(values)); +// } catch (Exception e) { +// // 兜底处理,参见 https://gitee.com/zhijiantianya/msgpush-cloud/issues/IC9A70 +// log.error("[writeAccessLog][打印网关日志时,发生异常]", e); +// } } @Override diff --git a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/security/LoginUser.java b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/security/LoginUser.java index 5a0a848..d6f2a61 100644 --- a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/security/LoginUser.java +++ b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/security/LoginUser.java @@ -6,36 +6,13 @@ import java.time.LocalDateTime; import java.util.List; import java.util.Map; -/** - * 登录用户信息 - * - * copy from msgpush-spring-boot-starter-security 的 LoginUser 类 - * - * @author hongawen - */ @Data public class LoginUser { - /** - * 用户编号 - */ private Long id; - /** - * 用户类型 - */ private Integer userType; - /** - * 额外的用户信息 - */ private Map info; - - /** - * 授权范围 - */ private List scopes; - /** - * 过期时间 - */ private LocalDateTime expiresTime; } diff --git a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/security/TokenAuthenticationFilter.java b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/security/TokenAuthenticationFilter.java index 9c815a5..42a835f 100644 --- a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/security/TokenAuthenticationFilter.java +++ b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/filter/security/TokenAuthenticationFilter.java @@ -1,22 +1,23 @@ package com.njcn.msgpush.gateway.filter.security; import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.common.core.KeyValue; +import com.fasterxml.jackson.core.type.TypeReference; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import com.njcn.msgpush.framework.common.biz.system.oauth2.OAuth2TokenCommonApi; +import com.njcn.msgpush.framework.common.biz.system.oauth2.dto.OAuth2AccessTokenCheckRespDTO; +import com.njcn.msgpush.framework.common.exception.ServiceException; +import com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants; import com.njcn.msgpush.framework.common.pojo.CommonResult; import com.njcn.msgpush.framework.common.util.date.LocalDateTimeUtils; import com.njcn.msgpush.framework.common.util.json.JsonUtils; import com.njcn.msgpush.gateway.util.SecurityFrameworkUtils; import com.njcn.msgpush.gateway.util.WebFrameworkUtils; -import com.njcn.msgpush.framework.common.biz.system.oauth2.OAuth2TokenCommonApi; -import com.njcn.msgpush.framework.common.biz.system.oauth2.dto.OAuth2AccessTokenCheckRespDTO; -import com.fasterxml.jackson.core.type.TypeReference; -import com.google.common.cache.CacheLoader; -import com.google.common.cache.LoadingCache; +import com.njcn.msgpush.module.system.enums.ErrorCodeConstants; import org.springframework.cloud.client.loadbalancer.reactive.ReactorLoadBalancerExchangeFilterFunction; import org.springframework.cloud.gateway.filter.GatewayFilterChain; import org.springframework.cloud.gateway.filter.GlobalFilter; import org.springframework.core.Ordered; -import org.springframework.http.HttpStatus; import org.springframework.stereotype.Component; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.server.ServerWebExchange; @@ -28,96 +29,72 @@ import java.util.function.Function; import static com.njcn.msgpush.framework.common.util.cache.CacheUtils.buildAsyncReloadingCache; -/** - * Token 过滤器,验证 token 的有效性 - * 1. 验证通过时,将 userId、userType通过 Header 转发给服务 - * 2. 验证不通过,还是会转发给服务。因为,接口是否需要登录的校验,还是交给服务自身处理 - * - * @author hongawen - */ @Component public class TokenAuthenticationFilter implements GlobalFilter, Ordered { - /** - * CommonResult 对应的 TypeReference 结果,用于解析 checkToken 的结果 - */ - private static final TypeReference> CHECK_RESULT_TYPE_REFERENCE - = new TypeReference>() { - }; + private static final TypeReference> CHECK_RESULT_TYPE_REFERENCE = + new TypeReference>() {}; - /** - * 空的 LoginUser 的结果 - *

- * 用于解决如下问题: - * 1. {@link #getLoginUser(ServerWebExchange, String)} 返回 Mono.empty() 时,会导致后续的 flatMap 无法进行处理的问题。 - * 2. {@link #buildUser(String)} 时,如果 Token 已经过期,返回 LOGIN_USER_EMPTY 对象,避免缓存无法刷新 - */ private static final LoginUser LOGIN_USER_EMPTY = new LoginUser(); private final WebClient webClient; - /** - * 登录用户的本地缓存 - *

- * key2:访问令牌 - */ private final LoadingCache loginUserCache = buildAsyncReloadingCache(Duration.ofMinutes(1), new CacheLoader() { + @Override public LoginUser load(String token) { String body = checkAccessToken(token).block(); - return buildUser(body); + return buildUser(body, token); } + }); public TokenAuthenticationFilter(ReactorLoadBalancerExchangeFilterFunction lbFunction) { - // Q:为什么不使用 OAuth2TokenApi 进行调用? - // A1:Spring Cloud OpenFeign 官方未内置 Reactive 的支持 https://docs.spring.io/spring-cloud-openfeign/docs/current/reference/html/#reactive-support - // 因此,这里采用 WebClient,通过 lbFunction 实现负载均衡 this.webClient = WebClient.builder().filter(lbFunction).build(); } @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { - // 移除 login-user 的请求头,避免伪造模拟 exchange = SecurityFrameworkUtils.removeLoginUser(exchange); - // 情况一,如果没有 Token 令牌,则直接继续 filter String token = SecurityFrameworkUtils.obtainAuthorization(exchange); if (StrUtil.isEmpty(token)) { return chain.filter(exchange); } - // 情况二,如果有 Token 令牌,则解析对应 userId、userType等字段,并通过 通过 Header 转发给服务 - // 重要说明:defaultIfEmpty 作用,保证 Mono.empty() 情况,可以继续执行 `flatMap 的 chain.filter(exchange)` 逻辑,避免返回给前端空的 Response!! ServerWebExchange finalExchange = exchange; - return getLoginUser(exchange, token).defaultIfEmpty(LOGIN_USER_EMPTY).flatMap(user -> { - // 1. 无用户,直接 filter 继续请求 - if (user == LOGIN_USER_EMPTY || // 下面 expiresTime 的判断,为了解决 token 实际已经过期的情况 - user.getExpiresTime() == null || LocalDateTimeUtils.beforeNow(user.getExpiresTime())) { - return chain.filter(finalExchange); - } + return getLoginUser(token) + .flatMap(user -> { + if (user.getExpiresTime() == null) { + return chain.filter(finalExchange); + } + if (LocalDateTimeUtils.beforeNow(user.getExpiresTime())) { + loginUserCache.invalidate(token); + return WebFrameworkUtils.writeJSON(finalExchange, + CommonResult.error(ErrorCodeConstants.OAUTH2_ACCESS_TOKEN_EXPIRE)); + } - // 2.1 有用户,则设置登录用户 - SecurityFrameworkUtils.setLoginUser(finalExchange, user); - // 2.2 将 user 并设置到 login-user 的请求头,使用 json 存储值 - ServerWebExchange newExchange = finalExchange.mutate() - .request(builder -> SecurityFrameworkUtils.setLoginUserHeader(builder, user)).build(); - return chain.filter(newExchange); - }); + SecurityFrameworkUtils.setLoginUser(finalExchange, user); + ServerWebExchange newExchange = finalExchange.mutate() + .request(builder -> SecurityFrameworkUtils.setLoginUserHeader(builder, user)) + .build(); + return chain.filter(newExchange); + }) + .switchIfEmpty(Mono.defer(() -> chain.filter(finalExchange))) + .onErrorResume(ServiceException.class, ex -> + WebFrameworkUtils.writeJSON(finalExchange, CommonResult.error(ex))); } - private Mono getLoginUser(ServerWebExchange exchange, String token) { + private Mono getLoginUser(String token) { LoginUser localUser = loginUserCache.getIfPresent(token); if (localUser != null) { - return Mono.just(localUser); + return localUser == LOGIN_USER_EMPTY ? Mono.empty() : Mono.just(localUser); } - // 缓存不存在,则请求远程服务 return checkAccessToken(token).flatMap((Function>) body -> { - LoginUser remoteUser = buildUser(body); + LoginUser remoteUser = buildUser(body, token); if (remoteUser != null) { - // 非空,则进行缓存 loginUserCache.put(token, remoteUser); return Mono.just(remoteUser); } @@ -128,33 +105,34 @@ public class TokenAuthenticationFilter implements GlobalFilter, Ordered { private Mono checkAccessToken(String token) { return webClient.get() .uri(OAuth2TokenCommonApi.URL_CHECK, uriBuilder -> uriBuilder.queryParam("accessToken", token).build()) - .retrieve().bodyToMono(String.class); + .retrieve() + .bodyToMono(String.class); } - private LoginUser buildUser(String body) { - // 处理结果,结果不正确 + private LoginUser buildUser(String body, String token) { CommonResult result = JsonUtils.parseObject(body, CHECK_RESULT_TYPE_REFERENCE); if (result == null) { return null; } if (result.isError()) { - // 特殊情况:令牌已经过期(code = 401),需要返回 LOGIN_USER_EMPTY,避免 Token 一直因为缓存,被误判为有效 - if (Objects.equals(result.getCode(), HttpStatus.UNAUTHORIZED.value())) { + if (Objects.equals(result.getCode(), GlobalErrorCodeConstants.UNAUTHORIZED.getCode())) { + loginUserCache.put(token, LOGIN_USER_EMPTY); return LOGIN_USER_EMPTY; } - return null; + throw new ServiceException(result.getCode(), result.getMsg()); } - // 创建登录用户 OAuth2AccessTokenCheckRespDTO tokenInfo = result.getData(); - return new LoginUser().setId(tokenInfo.getUserId()).setUserType(tokenInfo.getUserType()) - .setInfo(tokenInfo.getUserInfo()) // 额外的用户信息 + return new LoginUser().setId(tokenInfo.getUserId()) + .setUserType(tokenInfo.getUserType()) + .setInfo(tokenInfo.getUserInfo()) + .setScopes(tokenInfo.getScopes()) .setExpiresTime(tokenInfo.getExpiresTime()); } @Override public int getOrder() { - return -100; // 和 Spring Security Filter 的顺序对齐 + return -100; } } diff --git a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/handler/GlobalExceptionHandler.java b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/handler/GlobalExceptionHandler.java index 30d71d7..319df42 100644 --- a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/handler/GlobalExceptionHandler.java +++ b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/handler/GlobalExceptionHandler.java @@ -8,12 +8,14 @@ import org.springframework.core.annotation.Order; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.stereotype.Component; +import org.springframework.web.reactive.resource.NoResourceFoundException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.server.ResponseStatusException; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; import static com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR; +import static com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeConstants.NOT_FOUND; /** * Gateway 的全局异常处理器,将 Exception 翻译成 CommonResult + 对应的异常编号 @@ -27,6 +29,8 @@ import static com.njcn.msgpush.framework.common.exception.enums.GlobalErrorCodeC @Slf4j public class GlobalExceptionHandler implements ErrorWebExceptionHandler { + private static final String CHROME_DEVTOOLS_RESOURCE_PATH = "/.well-known/appspecific/com.chrome.devtools.json"; + @Override public Mono handle(ServerWebExchange exchange, Throwable ex) { // 已经 commit,则直接返回异常 @@ -37,7 +41,9 @@ public class GlobalExceptionHandler implements ErrorWebExceptionHandler { // 转换成 CommonResult CommonResult result; - if (ex instanceof ResponseStatusException) { + if (ex instanceof NoResourceFoundException) { + result = noResourceFoundExceptionHandler(exchange, (NoResourceFoundException) ex); + } else if (ex instanceof ResponseStatusException) { result = responseStatusExceptionHandler(exchange, (ResponseStatusException) ex); } else { result = defaultExceptionHandler(exchange, ex); @@ -52,12 +58,30 @@ public class GlobalExceptionHandler implements ErrorWebExceptionHandler { */ private CommonResult responseStatusExceptionHandler(ServerWebExchange exchange, ResponseStatusException ex) { - // TODO 芋艿:这里要精细化翻译,默认返回用户是看不懂的 + // TODO 这里要精细化翻译,默认返回用户是看不懂的 ServerHttpRequest request = exchange.getRequest(); log.error("[responseStatusExceptionHandler][uri({}/{}) 发生异常]", request.getURI(), request.getMethod(), ex); return CommonResult.error(ex.getStatusCode().value(), ex.getReason()); } + /** + * 处理 WebFlux 静态资源不存在异常 + */ + private CommonResult noResourceFoundExceptionHandler(ServerWebExchange exchange, + NoResourceFoundException ex) { + ServerHttpRequest request = exchange.getRequest(); + String path = request.getPath().value(); + log.debug("[noResourceFoundExceptionHandler][uri({}/{}) 请求地址不存在]", request.getURI(), request.getMethod()); + return CommonResult.error(NOT_FOUND.getCode(), buildNoResourceMessage(path)); + } + + private String buildNoResourceMessage(String path) { + if (CHROME_DEVTOOLS_RESOURCE_PATH.equals(path)) { + return "当前服务未提供浏览器调试探测资源"; + } + return String.format("请求地址不存在:%s", path); + } + /** * 处理系统异常,兜底处理所有的一切 */ @@ -66,7 +90,7 @@ public class GlobalExceptionHandler implements ErrorWebExceptionHandler { Throwable ex) { ServerHttpRequest request = exchange.getRequest(); log.error("[defaultExceptionHandler][uri({}/{}) 发生异常]", request.getURI(), request.getMethod(), ex); - // TODO 芋艿:是否要插入异常日志呢? + // TODO 是否要插入异常日志呢? // 返回 ERROR CommonResult return CommonResult.error(INTERNAL_SERVER_ERROR.getCode(), INTERNAL_SERVER_ERROR.getMsg()); } diff --git a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/jackson/GatewayJacksonAutoConfiguration.java b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/jackson/GatewayJacksonAutoConfiguration.java index 0f41073..bfa5f19 100644 --- a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/jackson/GatewayJacksonAutoConfiguration.java +++ b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/jackson/GatewayJacksonAutoConfiguration.java @@ -1,9 +1,5 @@ package com.njcn.msgpush.gateway.jackson; -import com.njcn.msgpush.framework.common.util.json.JsonUtils; -import com.njcn.msgpush.framework.common.util.json.databind.NumberSerializer; -import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; -import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; import com.fasterxml.jackson.databind.Module; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; @@ -11,11 +7,15 @@ import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; +import com.njcn.msgpush.framework.common.util.json.JsonUtils; +import com.njcn.msgpush.framework.common.util.json.databind.NumberSerializer; +import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeDeserializer; +import com.njcn.msgpush.framework.common.util.json.databind.TimestampLocalDateTimeSerializer; import lombok.extern.slf4j.Slf4j; -import org.springframework.context.annotation.Configuration; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.boot.web.codec.CodecCustomizer; import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; import org.springframework.http.codec.json.Jackson2JsonDecoder; import org.springframework.http.codec.json.Jackson2JsonEncoder; diff --git a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/util/WebFrameworkUtils.java b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/util/WebFrameworkUtils.java index 2b9b19c..835b9a4 100644 --- a/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/util/WebFrameworkUtils.java +++ b/msgpush-gateway/src/main/java/com/njcn/msgpush/gateway/util/WebFrameworkUtils.java @@ -2,73 +2,45 @@ package com.njcn.msgpush.gateway.util; import cn.hutool.core.net.NetUtil; import cn.hutool.core.util.ArrayUtil; -import cn.hutool.core.util.NumberUtil; import cn.hutool.extra.servlet.ServletUtil; import com.njcn.msgpush.framework.common.util.json.JsonUtils; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.route.Route; import org.springframework.cloud.gateway.support.ServerWebExchangeUtils; import org.springframework.core.io.buffer.DataBufferFactory; -import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; import org.springframework.http.server.reactive.ServerHttpResponse; import org.springframework.web.server.ServerWebExchange; import reactor.core.publisher.Mono; -/** - * Web 工具类 - * - * copy from msgpush-spring-boot-starter-web 的 WebFrameworkUtils 类 - * - * @author hongawen - */ @Slf4j public class WebFrameworkUtils { - private WebFrameworkUtils() {} - - /** - * 返回 JSON 字符串 - * - * @param exchange 响应 - * @param object 对象,会序列化成 JSON 字符串 - */ - @SuppressWarnings("deprecation") // 必须使用 APPLICATION_JSON_UTF8_VALUE,否则会乱码 + @SuppressWarnings("deprecation") public static Mono writeJSON(ServerWebExchange exchange, Object object) { - // 设置 header ServerHttpResponse response = exchange.getResponse(); response.getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8); - // 设置 body return response.writeWith(Mono.fromSupplier(() -> { DataBufferFactory bufferFactory = response.bufferFactory(); try { return bufferFactory.wrap(JsonUtils.toJsonByte(object)); } catch (Exception ex) { ServerHttpRequest request = exchange.getRequest(); - log.error("[writeJSON][uri({}/{}) 发生异常]", request.getURI(), request.getMethod(), ex); + log.error("[writeJSON][uri({}/{}) error]", request.getURI(), request.getMethod(), ex); return bufferFactory.wrap(new byte[0]); } })); } - /** - * 获得客户端 IP - * - * 参考 {@link ServletUtil} 的 getClientIP 方法 - * - * @param exchange 请求 - * @param otherHeaderNames 其它 header 名字的数组 - * @return 客户端 IP - */ public static String getClientIP(ServerWebExchange exchange, String... otherHeaderNames) { - String[] headers = { "X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP", "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR" }; + String[] headers = {"X-Forwarded-For", "X-Real-IP", "Proxy-Client-IP", "WL-Proxy-Client-IP", + "HTTP_CLIENT_IP", "HTTP_X_FORWARDED_FOR"}; if (ArrayUtil.isNotEmpty(otherHeaderNames)) { headers = ArrayUtil.addAll(headers, otherHeaderNames); } - // 方式一,通过 header 获取 String ip; for (String header : headers) { ip = exchange.getRequest().getHeaders().getFirst(header); @@ -76,8 +48,6 @@ public class WebFrameworkUtils { return NetUtil.getMultistageReverseProxyIp(ip); } } - - // 方式二,通过 remoteAddress 获取 if (exchange.getRequest().getRemoteAddress() == null) { return null; } @@ -85,12 +55,6 @@ public class WebFrameworkUtils { return NetUtil.getMultistageReverseProxyIp(ip); } - /** - * 获得请求匹配的 Route 路由 - * - * @param exchange 请求 - * @return 路由 - */ public static Route getGatewayRoute(ServerWebExchange exchange) { return exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR); } diff --git a/msgpush-gateway/src/main/resources/application-dev.yaml b/msgpush-gateway/src/main/resources/application-dev.yaml index f445a36..ce13756 100644 --- a/msgpush-gateway/src/main/resources/application-dev.yaml +++ b/msgpush-gateway/src/main/resources/application-dev.yaml @@ -1,5 +1,4 @@ ---- #################### 注册中心 + 配置中心相关配置 #################### - +#################### 注册中心 + 配置中心相关配置 #################### spring: cloud: nacos: @@ -7,14 +6,13 @@ spring: username: # Nacos 账号 password: # Nacos 密码 discovery: # 【配置中心】配置项 - namespace: dev # 命名空间。这里使用 dev 开发环境 + namespace: 7e15dd2b-2aa2-487d-9e80-1c01c7b9f742 # 命名空间。这里使用 dev 开发环境 group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP config: # 【注册中心】配置项 - namespace: dev # 命名空间。这里使用 dev 开发环境 + namespace: 7e15dd2b-2aa2-487d-9e80-1c01c7b9f742 # 命名空间。这里使用 dev 开发环境 group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP ---- #################### 监控相关配置 #################### - +#################### 监控相关配置 #################### # Actuator 监控端点的配置项 management: endpoints: diff --git a/msgpush-gateway/src/main/resources/application-local.yaml b/msgpush-gateway/src/main/resources/application-local.yaml index 91f0074..60a2d01 100644 --- a/msgpush-gateway/src/main/resources/application-local.yaml +++ b/msgpush-gateway/src/main/resources/application-local.yaml @@ -1,5 +1,4 @@ ---- #################### 注册中心 + 配置中心相关配置 #################### - +#################### 注册中心 + 配置中心相关配置 #################### spring: cloud: nacos: @@ -7,14 +6,13 @@ spring: username: # Nacos 账号 password: # Nacos 密码 discovery: # 【配置中心】配置项 - namespace: dev # 命名空间。这里使用 dev 开发环境 + namespace: 7e15dd2b-2aa2-487d-9e80-1c01c7b9f742 # 命名空间。这里使用 dev 开发环境 group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP config: # 【注册中心】配置项 - namespace: dev # 命名空间。这里使用 dev 开发环境 + namespace: 7e15dd2b-2aa2-487d-9e80-1c01c7b9f742 # 命名空间。这里使用 dev 开发环境 group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP ---- #################### 监控相关配置 #################### - +#################### 监控相关配置 #################### # Actuator 监控端点的配置项 management: endpoints: @@ -27,5 +25,5 @@ management: # 日志文件配置 logging: level: - org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示 + org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR diff --git a/msgpush-gateway/src/main/resources/application.yaml b/msgpush-gateway/src/main/resources/application.yaml index a302153..d074240 100644 --- a/msgpush-gateway/src/main/resources/application.yaml +++ b/msgpush-gateway/src/main/resources/application.yaml @@ -34,38 +34,22 @@ spring: routes: ## system-server 服务 - id: system-admin-api # 路由的编号 - uri: grayLb://system-server + uri: grayLb://msgpush-system-server predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组 - Path=/admin-api/system/** filters: - RewritePath=/admin-api/system/v3/api-docs, /v3/api-docs # 配置,保证转发到 /v3/api-docs - id: system-app-api # 路由的编号 - uri: grayLb://system-server + uri: grayLb://msgpush-system-server predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组 - Path=/app-api/system/** filters: - RewritePath=/app-api/system/v3/api-docs, /v3/api-docs - ## infra-server 服务 - - id: infra-admin-api # 路由的编号 - uri: grayLb://infra-server + - id: system-websocket # 路由的编号(WebSocket) + uri: grayLb://msgpush-system-server predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组 - - Path=/admin-api/infra/** - filters: - - RewritePath=/admin-api/infra/v3/api-docs, /v3/api-docs - - id: infra-app-api # 路由的编号 - uri: grayLb://infra-server - predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组 - - Path=/app-api/infra/** - filters: - - RewritePath=/app-api/infra/v3/api-docs, /v3/api-docs - - id: infra-spring-boot-admin # 路由的编号(Spring Boot Admin) - uri: grayLb://infra-server - predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组 - - Path=/admin/** - - id: infra-websocket # 路由的编号(WebSocket) - uri: grayLb://infra-server - predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组 - - Path=/infra/ws/** + - Path=/system/ws/** + ## push-server 服务 - id: push-admin-api # 路由的编号 uri: grayLb://push-server predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组 @@ -74,6 +58,8 @@ spring: - RewritePath=/admin-api/push/v3/api-docs, /v3/api-docs x-forwarded: prefix-enabled: false # 避免 Swagger 重复带上额外的 /admin-api/system 前缀 + default-filters: + - DedupeResponseHeader=Access-Control-Allow-Credentials Access-Control-Allow-Origin # 采用 https://github.com/spring-cloud/spring-cloud-gateway/pull/866 解决响应头重复问题 server: port: 48080 @@ -88,11 +74,8 @@ knife4j: enabled: true routes: - name: system-server - service-name: system-server + service-name: msgpush-system-server url: /admin-api/system/v3/api-docs - - name: infra-server - service-name: infra-server - url: /admin-api/infra/v3/api-docs - name: push-server service-name: push-server url: /admin-api/push/v3/api-docs @@ -101,4 +84,4 @@ knife4j: msgpush: info: - version: 1.0.0 \ No newline at end of file + version: 1.0.0 diff --git a/msgpush-gateway/src/main/resources/banner.txt b/msgpush-gateway/src/main/resources/banner.txt index 189c48d..452ee48 100644 --- a/msgpush-gateway/src/main/resources/banner.txt +++ b/msgpush-gateway/src/main/resources/banner.txt @@ -1,4 +1,3 @@ -灿能源码 http://www.iocoder.cn Application Version: ${msgpush.info.version} Spring Boot Version: ${spring-boot.version} diff --git a/msgpush-gateway/src/main/resources/logback-spring.xml b/msgpush-gateway/src/main/resources/logback-spring.xml index 15b28cf..d2888cd 100644 --- a/msgpush-gateway/src/main/resources/logback-spring.xml +++ b/msgpush-gateway/src/main/resources/logback-spring.xml @@ -34,17 +34,6 @@ - - - diff --git a/msgpush-module-infra/msgpush-module-infra-api/pom.xml b/msgpush-module-infra/msgpush-module-infra-api/pom.xml deleted file mode 100644 index 22e8003..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/pom.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - com.njcn - msgpush-module-infra - ${revision} - - 4.0.0 - msgpush-module-infra-api - jar - - ${project.artifactId} - - infra 模块 API,暴露给其它模块调用 - - - - - com.njcn - msgpush-common - - - - - org.springdoc - springdoc-openapi-starter-webmvc-ui - provided - - - - - org.springframework.boot - spring-boot-starter-validation - true - - - - - org.springframework.cloud - spring-cloud-starter-openfeign - true - - - - diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/file/FileApi.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/file/FileApi.java deleted file mode 100644 index b7405f8..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/file/FileApi.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.njcn.msgpush.module.infra.api.file; - -import com.njcn.msgpush.framework.common.pojo.CommonResult; -import com.njcn.msgpush.module.infra.api.file.dto.FileCreateReqDTO; -import com.njcn.msgpush.module.infra.enums.ApiConstants; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotEmpty; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestParam; - -@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory = -@Tag(name = "RPC 服务 - 文件") -public interface FileApi { - - String PREFIX = ApiConstants.PREFIX + "/file"; - - /** - * 保存文件,并返回文件的访问路径 - * - * @param content 文件内容 - * @return 文件路径 - */ - default String createFile(byte[] content) { - return createFile(content, null, null, null); - } - - /** - * 保存文件,并返回文件的访问路径 - * - * @param content 文件内容 - * @param name 文件名称,允许空 - * @return 文件路径 - */ - default String createFile(byte[] content, String name) { - return createFile(content, name, null, null); - } - - /** - * 保存文件,并返回文件的访问路径 - * - * @param content 文件内容 - * @param name 文件名称,允许空 - * @param directory 目录,允许空 - * @param type 文件的 MIME 类型,允许空 - * @return 文件路径 - */ - default String createFile(@NotEmpty(message = "文件内容不能为空") byte[] content, - String name, String directory, String type) { - return createFile(new FileCreateReqDTO().setName(name).setDirectory(directory).setType(type).setContent(content)).getCheckedData(); - } - - @PostMapping(PREFIX + "/create") - @Operation(summary = "保存文件,并返回文件的访问路径") - CommonResult createFile(@Valid @RequestBody FileCreateReqDTO createReqDTO); - - /** - * 生成文件预签名地址,用于读取 - * - * @param url 完整的文件访问地址 - * @param expirationSeconds 访问有效期,单位秒 - * @return 文件预签名地址 - */ - @GetMapping(PREFIX + "/presigned-url") - @Operation(summary = "生成文件预签名地址,用于读取") - CommonResult presignGetUrl(@NotEmpty(message = "URL 不能为空") @RequestParam("url") String url, - Integer expirationSeconds); - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/file/dto/FileCreateReqDTO.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/file/dto/FileCreateReqDTO.java deleted file mode 100644 index 68362da..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/file/dto/FileCreateReqDTO.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.njcn.msgpush.module.infra.api.file.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import jakarta.validation.constraints.NotEmpty; - -@Schema(description = "RPC 服务 - 文件创建 Request DTO") -@Data -public class FileCreateReqDTO { - - @Schema(description = "原文件名称", example = "xxx.png") - private String name; - - @Schema(description = "文件目录", example = "xxx") - private String directory; - - @Schema(description = "文件的 MIME 类型", example = "image/png") - private String type; - - @Schema(description = "文件内容", requiredMode = Schema.RequiredMode.REQUIRED) - @NotEmpty(message = "文件内容不能为空") - private byte[] content; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/package-info.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/package-info.java deleted file mode 100644 index 7029016..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * infra API 包,定义暴露给其它模块的 API - */ -package com.njcn.msgpush.module.infra.api; diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/websocket/WebSocketSenderApi.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/websocket/WebSocketSenderApi.java deleted file mode 100644 index 680c2f6..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/websocket/WebSocketSenderApi.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.njcn.msgpush.module.infra.api.websocket; - -import com.njcn.msgpush.framework.common.pojo.CommonResult; -import com.njcn.msgpush.framework.common.util.json.JsonUtils; -import com.njcn.msgpush.module.infra.api.websocket.dto.WebSocketSendReqDTO; -import com.njcn.msgpush.module.infra.enums.ApiConstants; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.cloud.openfeign.FeignClient; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; - -import jakarta.validation.Valid; - -@FeignClient(name = ApiConstants.NAME) // TODO 芋艿:fallbackFactory = -@Tag(name = "RPC 服务 - WebSocket 发送器的") // 对 WebSocketMessageSender 进行封装,提供给其它模块使用 -public interface WebSocketSenderApi { - - String PREFIX = ApiConstants.PREFIX + "/websocket"; - - @PostMapping(PREFIX + "/send") - @Operation(summary = "发送 WebSocket 消息") - CommonResult send(@Valid @RequestBody WebSocketSendReqDTO message); - - /** - * 发送消息给指定用户 - * - * @param userType 用户类型 - * @param userId 用户编号 - * @param messageType 消息类型 - * @param messageContent 消息内容,JSON 格式 - */ - default void send(Integer userType, Long userId, String messageType, String messageContent) { - send(new WebSocketSendReqDTO().setUserType(userType).setUserId(userId) - .setMessageType(messageType).setMessageContent(messageContent)).checkError(); - } - - /** - * 发送消息给指定用户类型 - * - * @param userType 用户类型 - * @param messageType 消息类型 - * @param messageContent 消息内容,JSON 格式 - */ - default void send(Integer userType, String messageType, String messageContent) { - send(new WebSocketSendReqDTO().setUserType(userType) - .setMessageType(messageType).setMessageContent(messageContent)).checkError(); - } - - /** - * 发送消息给指定 Session - * - * @param sessionId Session 编号 - * @param messageType 消息类型 - * @param messageContent 消息内容,JSON 格式 - */ - default void send(String sessionId, String messageType, String messageContent) { - send(new WebSocketSendReqDTO().setSessionId(sessionId) - .setMessageType(messageType).setMessageContent(messageContent)).checkError(); - } - - default void sendObject(Integer userType, Long userId, String messageType, Object messageContent) { - send(userType, userId, messageType, JsonUtils.toJsonString(messageContent)); - } - - default void sendObject(Integer userType, String messageType, Object messageContent) { - send(userType, messageType, JsonUtils.toJsonString(messageContent)); - } - - default void sendObject(String sessionId, String messageType, Object messageContent) { - send(sessionId, messageType, JsonUtils.toJsonString(messageContent)); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/websocket/dto/WebSocketSendReqDTO.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/websocket/dto/WebSocketSendReqDTO.java deleted file mode 100644 index 65de8c4..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/api/websocket/dto/WebSocketSendReqDTO.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.njcn.msgpush.module.infra.api.websocket.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import jakarta.validation.constraints.NotEmpty; - -@Schema(description = "RPC 服务 - WebSocket 消息发送 Request DTO") -@Data -public class WebSocketSendReqDTO { - - @Schema(description = "Session 编号", example = "abc") - private String sessionId; - @Schema(description = "用户编号", example = "1024") - private Long userId; - @Schema(description = "用户类型", example = "1") - private Integer userType; - - @Schema(description = "消息类型", example = "demo-message") - @NotEmpty(message = "消息类型不能为空") - private String messageType; - @Schema(description = "消息内容", example = "{\"name\":\"李四\"}}") - @NotEmpty(message = "消息内容不能为空") - private String messageContent; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/ApiConstants.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/ApiConstants.java deleted file mode 100644 index f0a5bf3..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/ApiConstants.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.njcn.msgpush.module.infra.enums; - -import com.njcn.msgpush.framework.common.enums.RpcConstants; - -/** - * API 相关的枚举 - * - * @author hongawen - */ -public class ApiConstants { - - /** - * 服务名 - * - * 注意,需要保证和 spring.application.name 保持一致 - */ - public static final String NAME = "infra-server"; - - public static final String PREFIX = RpcConstants.RPC_API_PREFIX + "/infra"; - - public static final String VERSION = "1.0.0"; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/DictTypeConstants.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/DictTypeConstants.java deleted file mode 100644 index cebd455..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/DictTypeConstants.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.njcn.msgpush.module.infra.enums; - -/** - * Infra 字典类型的枚举类 - * - * @author hongawen - */ -public interface DictTypeConstants { - - String USER_TYPE = "user_type"; // 用户类型 - - String JOB_STATUS = "infra_job_status"; // 定时任务状态的枚举 - String JOB_LOG_STATUS = "infra_job_log_status"; // 定时任务日志状态的枚举 - - String API_ERROR_LOG_PROCESS_STATUS = "infra_api_error_log_process_status"; // API 错误日志的处理状态的枚举 - - String CONFIG_TYPE = "infra_config_type"; // 参数配置类型 - String BOOLEAN_STRING = "infra_boolean_string"; // Boolean 是否类型 - - String OPERATE_TYPE = "infra_operate_type"; // 操作类型 - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/ErrorCodeConstants.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/ErrorCodeConstants.java deleted file mode 100644 index 7e25826..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/ErrorCodeConstants.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.njcn.msgpush.module.infra.enums; - -import com.njcn.msgpush.framework.common.exception.ErrorCode; - -/** - * Infra 错误码枚举类 - * - * infra 系统,使用 1-001-000-000 段 - */ -public interface ErrorCodeConstants { - - // ========== 参数配置 1-001-000-000 ========== - ErrorCode CONFIG_NOT_EXISTS = new ErrorCode(1_001_000_001, "参数配置不存在"); - ErrorCode CONFIG_KEY_DUPLICATE = new ErrorCode(1_001_000_002, "参数配置 key 重复"); - ErrorCode CONFIG_CAN_NOT_DELETE_SYSTEM_TYPE = new ErrorCode(1_001_000_003, "不能删除类型为系统内置的参数配置"); - ErrorCode CONFIG_GET_VALUE_ERROR_IF_VISIBLE = new ErrorCode(1_001_000_004, "获取参数配置失败,原因:不允许获取不可见配置"); - - - // ========== API 错误日志 1-001-002-000 ========== - ErrorCode API_ERROR_LOG_NOT_FOUND = new ErrorCode(1_001_002_000, "API 错误日志不存在"); - ErrorCode API_ERROR_LOG_PROCESSED = new ErrorCode(1_001_002_001, "API 错误日志已处理"); - - // ========= 文件相关 1-001-003-000 ================= - ErrorCode FILE_PATH_EXISTS = new ErrorCode(1_001_003_000, "文件路径已存在"); - ErrorCode FILE_NOT_EXISTS = new ErrorCode(1_001_003_001, "文件不存在"); - ErrorCode FILE_IS_EMPTY = new ErrorCode(1_001_003_002, "文件为空"); - - // ========== 代码生成器 1-001-004-000 ========== - ErrorCode CODEGEN_TABLE_EXISTS = new ErrorCode(1_001_004_002, "表定义已经存在"); - ErrorCode CODEGEN_IMPORT_TABLE_NULL = new ErrorCode(1_001_004_001, "导入的表不存在"); - ErrorCode CODEGEN_IMPORT_COLUMNS_NULL = new ErrorCode(1_001_004_002, "导入的字段不存在"); - ErrorCode CODEGEN_TABLE_NOT_EXISTS = new ErrorCode(1_001_004_004, "表定义不存在"); - ErrorCode CODEGEN_COLUMN_NOT_EXISTS = new ErrorCode(1_001_004_005, "字段义不存在"); - ErrorCode CODEGEN_SYNC_COLUMNS_NULL = new ErrorCode(1_001_004_006, "同步的字段不存在"); - ErrorCode CODEGEN_SYNC_NONE_CHANGE = new ErrorCode(1_001_004_007, "同步失败,不存在改变"); - ErrorCode CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL = new ErrorCode(1_001_004_008, "数据库的表注释未填写"); - ErrorCode CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL = new ErrorCode(1_001_004_009, "数据库的表字段({})注释未填写"); - ErrorCode CODEGEN_MASTER_TABLE_NOT_EXISTS = new ErrorCode(1_001_004_010, "主表(id={})定义不存在,请检查"); - ErrorCode CODEGEN_SUB_COLUMN_NOT_EXISTS = new ErrorCode(1_001_004_011, "子表的字段(id={})不存在,请检查"); - ErrorCode CODEGEN_MASTER_GENERATION_FAIL_NO_SUB_TABLE = new ErrorCode(1_001_004_012, "主表生成代码失败,原因:它没有子表"); - - // ========== 文件配置 1-001-006-000 ========== - ErrorCode FILE_CONFIG_NOT_EXISTS = new ErrorCode(1_001_006_000, "文件配置不存在"); - ErrorCode FILE_CONFIG_DELETE_FAIL_MASTER = new ErrorCode(1_001_006_001, "该文件配置不允许删除,原因:它是主配置,删除会导致无法上传文件"); - - // ========== 数据源配置 1-001-007-000 ========== - ErrorCode DATA_SOURCE_CONFIG_NOT_EXISTS = new ErrorCode(1_001_007_000, "数据源配置不存在"); - ErrorCode DATA_SOURCE_CONFIG_NOT_OK = new ErrorCode(1_001_007_001, "数据源配置不正确,无法进行连接"); - - - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java deleted file mode 100644 index 0b34105..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenColumnHtmlTypeEnum.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.njcn.msgpush.module.infra.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成器的字段 HTML 展示枚举 - */ -@AllArgsConstructor -@Getter -public enum CodegenColumnHtmlTypeEnum { - - INPUT("input"), // 文本框 - TEXTAREA("textarea"), // 文本域 - SELECT("select"), // 下拉框 - RADIO("radio"), // 单选框 - CHECKBOX("checkbox"), // 复选框 - DATETIME("datetime"), // 日期控件 - IMAGE_UPLOAD("imageUpload"), // 上传图片 - FILE_UPLOAD("fileUpload"), // 上传文件 - EDITOR("editor"), // 富文本控件 - ; - - /** - * 条件 - */ - private final String type; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenColumnListConditionEnum.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenColumnListConditionEnum.java deleted file mode 100644 index b713d8b..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenColumnListConditionEnum.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.njcn.msgpush.module.infra.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成器的字段过滤条件枚举 - */ -@AllArgsConstructor -@Getter -public enum CodegenColumnListConditionEnum { - - EQ("="), - NE("!="), - GT(">"), - GTE(">="), - LT("<"), - LTE("<="), - LIKE("LIKE"), - BETWEEN("BETWEEN"); - - /** - * 条件 - */ - private final String condition; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenFrontTypeEnum.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenFrontTypeEnum.java deleted file mode 100644 index 14c0d1e..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenFrontTypeEnum.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.njcn.msgpush.module.infra.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成的前端类型枚举 - * - * @author hongawen - */ -@AllArgsConstructor -@Getter -public enum CodegenFrontTypeEnum { - - VUE2_ELEMENT_UI(10), // Vue2 Element UI 标准模版 - - VUE3_ELEMENT_PLUS(20), // Vue3 Element Plus 标准模版 - - VUE3_VBEN2_ANTD_SCHEMA(30), // Vue3 VBEN2 + ANTD + Schema 模版 - - VUE3_VBEN5_ANTD_SCHEMA(40), // Vue3 VBEN5 + ANTD + schema 模版 - VUE3_VBEN5_ANTD_GENERAL(41), // Vue3 VBEN5 + ANTD 标准模版 - - VUE3_VBEN5_EP_SCHEMA(50), // Vue3 VBEN5 + EP + schema 模版 - VUE3_VBEN5_EP_GENERAL(51), // Vue3 VBEN5 + EP 标准模版 - - VUE3_ADMIN_UNIAPP_WOT(60), // Vue3 Admin + Uniapp + WOT 标准模版 - ; - - /** - * 类型 - */ - private final Integer type; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenSceneEnum.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenSceneEnum.java deleted file mode 100644 index f9c3e2e..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenSceneEnum.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.njcn.msgpush.module.infra.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -import static cn.hutool.core.util.ArrayUtil.firstMatch; - -/** - * 代码生成的场景枚举 - * - * @author hongawen - */ -@AllArgsConstructor -@Getter -public enum CodegenSceneEnum { - - ADMIN(1, "管理后台", "admin", ""), - APP(2, "用户 APP", "app", "App"); - - /** - * 场景 - */ - private final Integer scene; - /** - * 场景名 - */ - private final String name; - /** - * 基础包名 - */ - private final String basePackage; - /** - * Controller 和 VO 类的前缀 - */ - private final String prefixClass; - - public static CodegenSceneEnum valueOf(Integer scene) { - return firstMatch(sceneEnum -> sceneEnum.getScene().equals(scene), values()); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenTemplateTypeEnum.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenTemplateTypeEnum.java deleted file mode 100644 index 0e4e706..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenTemplateTypeEnum.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.njcn.msgpush.module.infra.enums.codegen; - -import com.njcn.msgpush.framework.common.util.object.ObjectUtils; -import lombok.AllArgsConstructor; -import lombok.Getter; - -import java.util.Objects; - -/** - * 代码生成模板类型 - * - * @author hongawen - */ -@AllArgsConstructor -@Getter -public enum CodegenTemplateTypeEnum { - - ONE(1), // 单表(增删改查) - TREE(2), // 树表(增删改查) - - MASTER_NORMAL(10), // 主子表 - 主表 - 普通模式 - MASTER_ERP(11), // 主子表 - 主表 - ERP 模式 - MASTER_INNER(12), // 主子表 - 主表 - 内嵌模式 - SUB(15), // 主子表 - 子表 - ; - - /** - * 类型 - */ - private final Integer type; - - /** - * 是否为主表 - * - * @param type 类型 - * @return 是否主表 - */ - public static boolean isMaster(Integer type) { - return ObjectUtils.equalsAny(type, - MASTER_NORMAL.type, MASTER_ERP.type, MASTER_INNER.type); - } - - /** - * 是否为树表 - * - * @param type 类型 - * @return 是否树表 - */ - public static boolean isTree(Integer type) { - return Objects.equals(type, TREE.type); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenVOTypeEnum.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenVOTypeEnum.java deleted file mode 100644 index a6c7e56..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/codegen/CodegenVOTypeEnum.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.njcn.msgpush.module.infra.enums.codegen; - -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 代码生成的 VO 类型枚举 - * - * 目前的作用:Controller 新增、修改、响应时,使用 VO 还是 DO - * 注意:不包括 Controller 的分页参数! - * - * @author hongawen - */ -@AllArgsConstructor -@Getter -public enum CodegenVOTypeEnum { - - VO(10, "VO"), - DO(20, "DO"); - - /** - * 场景 - */ - private final Integer type; - /** - * 场景名 - */ - private final String name; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/package-info.java b/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/package-info.java deleted file mode 100644 index cac4b82..0000000 --- a/msgpush-module-infra/msgpush-module-infra-api/src/main/java/com/njcn/msgpush/module/infra/enums/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位 - */ -package com.njcn.msgpush.module.infra.enums; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/InfraServerApplication.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/InfraServerApplication.java deleted file mode 100644 index 1c17d0b..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/InfraServerApplication.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.njcn.msgpush.module.infra; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.cloud.openfeign.EnableFeignClients; - -/** - * 项目的启动类 - *

- * - * @author hongawen - */ -@EnableFeignClients -@SpringBootApplication -public class InfraServerApplication { - - public static void main(String[] args) { - - SpringApplication.run(InfraServerApplication.class, args); - - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/file/FileApiImpl.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/file/FileApiImpl.java deleted file mode 100644 index 460dca2..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/file/FileApiImpl.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.njcn.msgpush.module.infra.api.file; - -import com.njcn.msgpush.framework.common.pojo.CommonResult; -import com.njcn.msgpush.module.infra.api.file.dto.FileCreateReqDTO; -import com.njcn.msgpush.module.infra.service.file.FileService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RestController; - -import jakarta.annotation.Resource; - -import static com.njcn.msgpush.framework.common.pojo.CommonResult.success; - -@RestController // 提供 RESTful API 接口,给 Feign 调用 -@Validated -public class FileApiImpl implements FileApi { - - @Resource - private FileService fileService; - - @Override - public CommonResult createFile(FileCreateReqDTO createReqDTO) { - return success(fileService.createFile(createReqDTO.getContent(), createReqDTO.getName(), - createReqDTO.getDirectory(), createReqDTO.getType())); - } - - @Override - public CommonResult presignGetUrl(String url, Integer expirationSeconds) { - return success(fileService.presignGetUrl(url, expirationSeconds)); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/package-info.java deleted file mode 100644 index fb642d5..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/package-info.java +++ /dev/null @@ -1 +0,0 @@ -package com.njcn.msgpush.module.infra.api; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/websocket/WebSocketSenderApiImpl.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/websocket/WebSocketSenderApiImpl.java deleted file mode 100644 index 436f1e2..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/api/websocket/WebSocketSenderApiImpl.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.njcn.msgpush.module.infra.api.websocket; - -import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.common.pojo.CommonResult; -import com.njcn.msgpush.framework.websocket.core.sender.WebSocketMessageSender; -import com.njcn.msgpush.module.infra.api.websocket.dto.WebSocketSendReqDTO; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.RestController; - -import jakarta.annotation.Resource; - -import static com.njcn.msgpush.framework.common.pojo.CommonResult.success; - -@RestController // 提供 RESTful API 接口,给 Feign 调用 -@Validated -public class WebSocketSenderApiImpl implements WebSocketSenderApi { - - @Resource - private WebSocketMessageSender webSocketMessageSender; - - @Override - public CommonResult send(WebSocketSendReqDTO message) { - if (StrUtil.isNotEmpty(message.getSessionId())) { - webSocketMessageSender.send(message.getSessionId(), - message.getMessageType(), message.getMessageContent()); - } else if (message.getUserType() != null && message.getUserId() != null) { - webSocketMessageSender.send(message.getUserType(), message.getUserId(), - message.getMessageType(), message.getMessageContent()); - } else if (message.getUserType() != null) { - webSocketMessageSender.send(message.getUserType(), - message.getMessageType(), message.getMessageContent()); - } - return success(true); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/CodegenController.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/CodegenController.java deleted file mode 100644 index 1bf134d..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/CodegenController.java +++ /dev/null @@ -1,160 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen; - -import cn.hutool.core.io.IoUtil; -import cn.hutool.core.util.ZipUtil; -import com.njcn.msgpush.framework.common.pojo.CommonResult; -import com.njcn.msgpush.framework.common.pojo.PageResult; -import com.njcn.msgpush.framework.common.util.object.BeanUtils; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.CodegenDetailRespVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.CodegenPreviewRespVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; -import com.njcn.msgpush.module.infra.convert.codegen.CodegenConvert; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenTableDO; -import com.njcn.msgpush.module.infra.service.codegen.CodegenService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Parameters; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.servlet.http.HttpServletResponse; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.util.List; -import java.util.Map; - -import static com.njcn.msgpush.framework.common.pojo.CommonResult.success; -import static com.njcn.msgpush.framework.security.core.util.SecurityFrameworkUtils.getLoginUserNickname; -import static com.njcn.msgpush.module.infra.framework.file.core.utils.FileTypeUtils.writeAttachment; - -@Tag(name = "管理后台 - 代码生成器") -@RestController -@RequestMapping("/infra/codegen") -@Validated -public class CodegenController { - - @Resource - private CodegenService codegenService; - - @GetMapping("/db/table/list") - @Operation(summary = "获得数据库自带的表定义列表", description = "会过滤掉已经导入 Codegen 的表") - @Parameters({ - @Parameter(name = "dataSourceConfigId", description = "数据源配置的编号", required = true, example = "1"), - @Parameter(name = "name", description = "表名,模糊匹配", example = "msgpush"), - @Parameter(name = "comment", description = "描述,模糊匹配", example = "灿能") - }) - @PreAuthorize("@ss.hasPermission('infra:codegen:query')") - public CommonResult> getDatabaseTableList( - @RequestParam(value = "dataSourceConfigId") Long dataSourceConfigId, - @RequestParam(value = "name", required = false) String name, - @RequestParam(value = "comment", required = false) String comment) { - return success(codegenService.getDatabaseTableList(dataSourceConfigId, name, comment)); - } - - @GetMapping("/table/list") - @Operation(summary = "获得表定义列表") - @Parameter(name = "dataSourceConfigId", description = "数据源配置的编号", required = true, example = "1") - @PreAuthorize("@ss.hasPermission('infra:codegen:query')") - public CommonResult> getCodegenTableList(@RequestParam(value = "dataSourceConfigId") Long dataSourceConfigId) { - List list = codegenService.getCodegenTableList(dataSourceConfigId); - return success(BeanUtils.toBean(list, CodegenTableRespVO.class)); - } - - @GetMapping("/table/page") - @Operation(summary = "获得表定义分页") - @PreAuthorize("@ss.hasPermission('infra:codegen:query')") - public CommonResult> getCodegenTablePage(@Valid CodegenTablePageReqVO pageReqVO) { - PageResult pageResult = codegenService.getCodegenTablePage(pageReqVO); - return success(BeanUtils.toBean(pageResult, CodegenTableRespVO.class)); - } - - @GetMapping("/detail") - @Operation(summary = "获得表和字段的明细") - @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:codegen:query')") - public CommonResult getCodegenDetail(@RequestParam("tableId") Long tableId) { - CodegenTableDO table = codegenService.getCodegenTable(tableId); - List columns = codegenService.getCodegenColumnListByTableId(tableId); - // 拼装返回 - return success(CodegenConvert.INSTANCE.convert(table, columns)); - } - - @Operation(summary = "基于数据库的表结构,创建代码生成器的表和字段定义") - @PostMapping("/create-list") - @PreAuthorize("@ss.hasPermission('infra:codegen:create')") - public CommonResult> createCodegenList(@Valid @RequestBody CodegenCreateListReqVO reqVO) { - return success(codegenService.createCodegenList(getLoginUserNickname(), reqVO)); - } - - @Operation(summary = "更新数据库的表和字段定义") - @PutMapping("/update") - @PreAuthorize("@ss.hasPermission('infra:codegen:update')") - public CommonResult updateCodegen(@Valid @RequestBody CodegenUpdateReqVO updateReqVO) { - codegenService.updateCodegen(updateReqVO); - return success(true); - } - - @Operation(summary = "基于数据库的表结构,同步数据库的表和字段定义") - @PutMapping("/sync-from-db") - @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:codegen:update')") - public CommonResult syncCodegenFromDB(@RequestParam("tableId") Long tableId) { - codegenService.syncCodegenFromDB(tableId); - return success(true); - } - - @Operation(summary = "删除数据库的表和字段定义") - @DeleteMapping("/delete") - @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:codegen:delete')") - public CommonResult deleteCodegen(@RequestParam("tableId") Long tableId) { - codegenService.deleteCodegen(tableId); - return success(true); - } - - @Operation(summary = "批量删除数据库的表和字段定义") - @DeleteMapping("/delete-list") - @Parameter(name = "tableIds", description = "表编号列表", required = true) - @PreAuthorize("@ss.hasPermission('infra:codegen:delete')") - public CommonResult deleteCodegenList(@RequestParam("tableIds") List tableIds) { - codegenService.deleteCodegenList(tableIds); - return success(true); - } - - @Operation(summary = "预览生成代码") - @GetMapping("/preview") - @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:codegen:preview')") - public CommonResult> previewCodegen(@RequestParam("tableId") Long tableId) { - Map codes = codegenService.generationCodes(tableId); - return success(CodegenConvert.INSTANCE.convert(codes)); - } - - @Operation(summary = "下载生成代码") - @GetMapping("/download") - @Parameter(name = "tableId", description = "表编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:codegen:download')") - public void downloadCodegen(@RequestParam("tableId") Long tableId, - HttpServletResponse response) throws IOException { - // 生成代码 - Map codes = codegenService.generationCodes(tableId); - // 构建 zip 包 - String[] paths = codes.keySet().toArray(new String[0]); - ByteArrayInputStream[] ins = codes.values().stream().map(IoUtil::toUtf8Stream).toArray(ByteArrayInputStream[]::new); - ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - ZipUtil.zip(outputStream, paths, ins); - // 输出 - writeAttachment(response, "codegen.zip", outputStream.toByteArray()); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java deleted file mode 100644 index e450907..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenCreateListReqVO.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import jakarta.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "管理后台 - 基于数据库的表结构,创建代码生成器的表和字段定义 Request VO") -@Data -public class CodegenCreateListReqVO { - - @Schema(description = "数据源配置的编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "数据源配置的编号不能为空") - private Long dataSourceConfigId; - - @Schema(description = "表名数组", requiredMode = Schema.RequiredMode.REQUIRED, example = "[1, 2, 3]") - @NotNull(message = "表名数组不能为空") - private List tableNames; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java deleted file mode 100644 index 6be584a..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenDetailRespVO.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen.vo; - -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.column.CodegenColumnRespVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Schema(description = "管理后台 - 代码生成表和字段的明细 Response VO") -@Data -public class CodegenDetailRespVO { - - @Schema(description = "表定义") - private CodegenTableRespVO table; - - @Schema(description = "字段定义") - private List columns; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java deleted file mode 100644 index bda1ced..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenPreviewRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 代码生成预览 Response VO,注意,每个文件都是一个该对象") -@Data -public class CodegenPreviewRespVO { - - @Schema(description = "文件路径", requiredMode = Schema.RequiredMode.REQUIRED, example = "java/com.njcn.msgpush/adminserver/modules/system/controller/test/SysTestDemoController.java") - private String filePath; - - @Schema(description = "代码", requiredMode = Schema.RequiredMode.REQUIRED, example = "Hello World") - private String code; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java deleted file mode 100644 index 0c12b3e..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/CodegenUpdateReqVO.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen.vo; - -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.column.CodegenColumnSaveReqVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.CodegenTableSaveReqVO; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; -import java.util.List; - -@Schema(description = "管理后台 - 代码生成表和字段的修改 Request VO") -@Data -public class CodegenUpdateReqVO { - - @Valid // 校验内嵌的字段 - @NotNull(message = "表定义不能为空") - private CodegenTableSaveReqVO table; - - @Valid // 校验内嵌的字段 - @NotNull(message = "字段定义不能为空") - private List columns; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java deleted file mode 100644 index 9e0c776..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/column/CodegenColumnRespVO.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen.vo.column; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 代码生成字段定义 Response VO") -@Data -public class CodegenColumnRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "表编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long tableId; - - @Schema(description = "字段名", requiredMode = Schema.RequiredMode.REQUIRED, example = "user_age") - private String columnName; - - @Schema(description = "字段类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "int(11)") - private String dataType; - - @Schema(description = "字段描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "年龄") - private String columnComment; - - @Schema(description = "是否允许为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean nullable; - - @Schema(description = "是否主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - private Boolean primaryKey; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - private Integer ordinalPosition; - - @Schema(description = "Java 属性类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "userAge") - private String javaType; - - @Schema(description = "Java 属性名", requiredMode = Schema.RequiredMode.REQUIRED, example = "Integer") - private String javaField; - - @Schema(description = "字典类型", example = "sys_gender") - private String dictType; - - @Schema(description = "数据示例", example = "1024") - private String example; - - @Schema(description = "是否为 Create 创建操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean createOperation; - - @Schema(description = "是否为 Update 更新操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - private Boolean updateOperation; - - @Schema(description = "是否为 List 查询操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean listOperation; - - @Schema(description = "List 查询操作的条件类型,参见 CodegenColumnListConditionEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "LIKE") - private String listOperationCondition; - - @Schema(description = "是否为 List 查询操作的返回字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - private Boolean listOperationResult; - - @Schema(description = "显示类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "input") - private String htmlType; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java deleted file mode 100644 index 14000a6..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/column/CodegenColumnSaveReqVO.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen.vo.column; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import jakarta.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 代码生成字段定义创建/修改 Request VO") -@Data -public class CodegenColumnSaveReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "表编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "表编号不能为空") - private Long tableId; - - @Schema(description = "字段名", requiredMode = Schema.RequiredMode.REQUIRED, example = "user_age") - @NotNull(message = "字段名不能为空") - private String columnName; - - @Schema(description = "字段类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "int(11)") - @NotNull(message = "字段类型不能为空") - private String dataType; - - @Schema(description = "字段描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "年龄") - @NotNull(message = "字段描述不能为空") - private String columnComment; - - @Schema(description = "是否允许为空", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否允许为空不能为空") - private Boolean nullable; - - @Schema(description = "是否主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是否主键不能为空") - private Boolean primaryKey; - - @Schema(description = "排序", requiredMode = Schema.RequiredMode.REQUIRED, example = "10") - @NotNull(message = "排序不能为空") - private Integer ordinalPosition; - - @Schema(description = "Java 属性类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "userAge") - @NotNull(message = "Java 属性类型不能为空") - private String javaType; - - @Schema(description = "Java 属性名", requiredMode = Schema.RequiredMode.REQUIRED, example = "Integer") - @NotNull(message = "Java 属性名不能为空") - private String javaField; - - @Schema(description = "字典类型", example = "sys_gender") - private String dictType; - - @Schema(description = "数据示例", example = "1024") - private String example; - - @Schema(description = "是否为 Create 创建操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否为 Create 创建操作的字段不能为空") - private Boolean createOperation; - - @Schema(description = "是否为 Update 更新操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "false") - @NotNull(message = "是否为 Update 更新操作的字段不能为空") - private Boolean updateOperation; - - @Schema(description = "是否为 List 查询操作的字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否为 List 查询操作的字段不能为空") - private Boolean listOperation; - - @Schema(description = "List 查询操作的条件类型,参见 CodegenColumnListConditionEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "LIKE") - @NotNull(message = "List 查询操作的条件类型不能为空") - private String listOperationCondition; - - @Schema(description = "是否为 List 查询操作的返回字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "true") - @NotNull(message = "是否为 List 查询操作的返回字段不能为空") - private Boolean listOperationResult; - - @Schema(description = "显示类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "input") - @NotNull(message = "显示类型不能为空") - private String htmlType; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java deleted file mode 100644 index 5e29cab..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTablePageReqVO.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table; - -import com.njcn.msgpush.framework.common.pojo.PageParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import org.springframework.format.annotation.DateTimeFormat; - -import java.time.LocalDateTime; - -import static com.njcn.msgpush.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; - -@Schema(description = "管理后台 - 表定义分页 Request VO") -@Data -public class CodegenTablePageReqVO extends PageParam { - - @Schema(description = "表名称,模糊匹配", example = "msgpush") - private String tableName; - - @Schema(description = "表描述,模糊匹配", example = "灿能") - private String tableComment; - - @Schema(description = "实体,模糊匹配", example = "Msgpush") - private String className; - - @Schema(description = "创建时间", example = "[2022-07-01 00:00:00,2022-07-01 23:59:59]") - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private LocalDateTime[] createTime; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java deleted file mode 100644 index 4c55f69..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTableRespVO.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 代码生成表定义 Response VO") -@Data -public class CodegenTableRespVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "生成场景,参见 CodegenSceneEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer scene; - - @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "msgpush") - private String tableName; - - @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能") - private String tableComment; - - @Schema(description = "备注", example = "我是备注") - private String remark; - - @Schema(description = "模块名", requiredMode = Schema.RequiredMode.REQUIRED, example = "system") - private String moduleName; - - @Schema(description = "业务名", requiredMode = Schema.RequiredMode.REQUIRED, example = "codegen") - private String businessName; - - @Schema(description = "类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "CodegenTable") - private String className; - - @Schema(description = "类描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "代码生成器的表定义") - private String classComment; - - @Schema(description = "作者", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能源码") - private String author; - - @Schema(description = "模板类型,参见 CodegenTemplateTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Integer templateType; - - @Schema(description = "前端类型,参见 CodegenFrontTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - private Integer frontType; - - @Schema(description = "父菜单编号", example = "1024") - private Long parentMenuId; - - @Schema(description = "主表的编号", example = "2048") - private Long masterTableId; - @Schema(description = "子表关联主表的字段编号", example = "4096") - private Long subJoinColumnId; - @Schema(description = "主表与子表是否一对多", example = "4096") - private Boolean subJoinMany; - - @Schema(description = "树表的父字段编号", example = "8192") - private Long treeParentColumnId; - @Schema(description = "树表的名字字段编号", example = "16384") - private Long treeNameColumnId; - - @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Integer dataSourceConfigId; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - - @Schema(description = "更新时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime updateTime; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java deleted file mode 100644 index 2dfdb0d..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/CodegenTableSaveReqVO.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table; - -import cn.hutool.core.util.ObjectUtil; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenSceneEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenTemplateTypeEnum; -import com.fasterxml.jackson.annotation.JsonIgnore; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import jakarta.validation.constraints.AssertTrue; -import jakarta.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 代码生成表定义创建/修改 Response VO") -@Data -public class CodegenTableSaveReqVO { - - @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - private Long id; - - @Schema(description = "生成场景,参见 CodegenSceneEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "导入类型不能为空") - private Integer scene; - - @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "msgpush") - @NotNull(message = "表名称不能为空") - private String tableName; - - @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能") - @NotNull(message = "表描述不能为空") - private String tableComment; - - @Schema(description = "备注", example = "我是备注") - private String remark; - - @Schema(description = "模块名", requiredMode = Schema.RequiredMode.REQUIRED, example = "system") - @NotNull(message = "模块名不能为空") - private String moduleName; - - @Schema(description = "业务名", requiredMode = Schema.RequiredMode.REQUIRED, example = "codegen") - @NotNull(message = "业务名不能为空") - private String businessName; - - @Schema(description = "类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "CodegenTable") - @NotNull(message = "类名称不能为空") - private String className; - - @Schema(description = "类描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "代码生成器的表定义") - @NotNull(message = "类描述不能为空") - private String classComment; - - @Schema(description = "作者", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能源码") - @NotNull(message = "作者不能为空") - private String author; - - @Schema(description = "模板类型,参见 CodegenTemplateTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "1") - @NotNull(message = "模板类型不能为空") - private Integer templateType; - - @Schema(description = "前端类型,参见 CodegenFrontTypeEnum 枚举", requiredMode = Schema.RequiredMode.REQUIRED, example = "20") - @NotNull(message = "前端类型不能为空") - private Integer frontType; - - @Schema(description = "父菜单编号", example = "1024") - private Long parentMenuId; - - @Schema(description = "主表的编号", example = "2048") - private Long masterTableId; - @Schema(description = "子表关联主表的字段编号", example = "4096") - private Long subJoinColumnId; - @Schema(description = "主表与子表是否一对多", example = "4096") - private Boolean subJoinMany; - - @Schema(description = "树表的父字段编号", example = "8192") - private Long treeParentColumnId; - @Schema(description = "树表的名字字段编号", example = "16384") - private Long treeNameColumnId; - - @AssertTrue(message = "上级菜单不能为空,请前往 [修改生成配置 -> 生成信息] 界面,设置“上级菜单”字段") - @JsonIgnore - public boolean isParentMenuIdValid() { - // 生成场景为管理后台时,必须设置上级菜单,不然生成的菜单 SQL 是无父级菜单的 - return ObjectUtil.notEqual(getScene(), CodegenSceneEnum.ADMIN.getScene()) - || getParentMenuId() != null; - } - - @AssertTrue(message = "关联的父表信息不全") - @JsonIgnore - public boolean isSubValid() { - return ObjectUtil.notEqual(getTemplateType(), CodegenTemplateTypeEnum.SUB) - || (ObjectUtil.isAllNotEmpty(masterTableId, subJoinColumnId, subJoinMany)); - } - - @AssertTrue(message = "关联的树表信息不全") - @JsonIgnore - public boolean isTreeValid() { - return ObjectUtil.notEqual(templateType, CodegenTemplateTypeEnum.TREE) - || (ObjectUtil.isAllNotEmpty(treeParentColumnId, treeNameColumnId)); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java deleted file mode 100644 index 9b772ce..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/codegen/vo/table/DatabaseTableRespVO.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Schema(description = "管理后台 - 数据库的表定义 Response VO") -@Data -public class DatabaseTableRespVO { - - @Schema(description = "表名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "yuanma") - private String name; - - @Schema(description = "表描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "灿能源码") - private String comment; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/DataSourceConfigController.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/DataSourceConfigController.java deleted file mode 100644 index 8d49d1f..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/DataSourceConfigController.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.db; - -import com.njcn.msgpush.framework.common.pojo.CommonResult; -import com.njcn.msgpush.framework.common.util.object.BeanUtils; -import com.njcn.msgpush.module.infra.controller.admin.db.vo.DataSourceConfigRespVO; -import com.njcn.msgpush.module.infra.controller.admin.db.vo.DataSourceConfigSaveReqVO; -import com.njcn.msgpush.module.infra.dal.dataobject.db.DataSourceConfigDO; -import com.njcn.msgpush.module.infra.service.db.DataSourceConfigService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import jakarta.annotation.Resource; -import jakarta.validation.Valid; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static com.njcn.msgpush.framework.common.pojo.CommonResult.success; - -@Tag(name = "管理后台 - 数据源配置") -@RestController -@RequestMapping("/infra/data-source-config") -@Validated -public class DataSourceConfigController { - - @Resource - private DataSourceConfigService dataSourceConfigService; - - @PostMapping("/create") - @Operation(summary = "创建数据源配置") - @PreAuthorize("@ss.hasPermission('infra:data-source-config:create')") - public CommonResult createDataSourceConfig(@Valid @RequestBody DataSourceConfigSaveReqVO createReqVO) { - return success(dataSourceConfigService.createDataSourceConfig(createReqVO)); - } - - @PutMapping("/update") - @Operation(summary = "更新数据源配置") - @PreAuthorize("@ss.hasPermission('infra:data-source-config:update')") - public CommonResult updateDataSourceConfig(@Valid @RequestBody DataSourceConfigSaveReqVO updateReqVO) { - dataSourceConfigService.updateDataSourceConfig(updateReqVO); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除数据源配置") - @Parameter(name = "id", description = "编号", required = true) - @PreAuthorize("@ss.hasPermission('infra:data-source-config:delete')") - public CommonResult deleteDataSourceConfig(@RequestParam("id") Long id) { - dataSourceConfigService.deleteDataSourceConfig(id); - return success(true); - } - - @DeleteMapping("/delete-list") - @Operation(summary = "批量删除数据源配置") - @Parameter(name = "ids", description = "编号列表", required = true) - @PreAuthorize("@ss.hasPermission('infra:data-source-config:delete')") - public CommonResult deleteDataSourceConfigList(@RequestParam("ids") List ids) { - dataSourceConfigService.deleteDataSourceConfigList(ids); - return success(true); - } - - @GetMapping("/get") - @Operation(summary = "获得数据源配置") - @Parameter(name = "id", description = "编号", required = true, example = "1024") - @PreAuthorize("@ss.hasPermission('infra:data-source-config:query')") - public CommonResult getDataSourceConfig(@RequestParam("id") Long id) { - DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(id); - return success(BeanUtils.toBean(config, DataSourceConfigRespVO.class)); - } - - @GetMapping("/list") - @Operation(summary = "获得数据源配置列表") - @PreAuthorize("@ss.hasPermission('infra:data-source-config:query')") - public CommonResult> getDataSourceConfigList() { - List list = dataSourceConfigService.getDataSourceConfigList(); - return success(BeanUtils.toBean(list, DataSourceConfigRespVO.class)); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java deleted file mode 100644 index 96deedd..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/vo/DataSourceConfigRespVO.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.db.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.time.LocalDateTime; - -@Schema(description = "管理后台 - 数据源配置 Response VO") -@Data -public class DataSourceConfigRespVO { - - @Schema(description = "主键编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024") - private Long id; - - @Schema(description = "数据源名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") - private String name; - - @Schema(description = "数据源连接", requiredMode = Schema.RequiredMode.REQUIRED, example = "jdbc:mysql://192.168.1.22:13306/msgpush") - private String url; - - @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "root") - private String username; - - @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED) - private LocalDateTime createTime; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/vo/DataSourceConfigSaveReqVO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/vo/DataSourceConfigSaveReqVO.java deleted file mode 100644 index f9b100d..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/admin/db/vo/DataSourceConfigSaveReqVO.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.njcn.msgpush.module.infra.controller.admin.db.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import jakarta.validation.constraints.NotNull; - -@Schema(description = "管理后台 - 数据源配置创建/修改 Request VO") -@Data -public class DataSourceConfigSaveReqVO { - - @Schema(description = "主键编号", example = "1024") - private Long id; - - @Schema(description = "数据源名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "test") - @NotNull(message = "数据源名称不能为空") - private String name; - - @Schema(description = "数据源连接", requiredMode = Schema.RequiredMode.REQUIRED, example = "jdbc:mysql://192.168.1.22:13306/msgpush") - @NotNull(message = "数据源连接不能为空") - private String url; - - @Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED, example = "root") - @NotNull(message = "用户名不能为空") - private String username; - - @Schema(description = "密码", requiredMode = Schema.RequiredMode.REQUIRED, example = "123456") - @NotNull(message = "密码不能为空") - private String password; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/app/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/app/package-info.java deleted file mode 100644 index 2496b6d..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/app/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位 - */ -package com.njcn.msgpush.module.infra.controller.app; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/package-info.java deleted file mode 100644 index 19c9932..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/controller/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 RESTful API 给前端: - * 1. admin 包:提供给管理后台 msgpush-ui-admin 前端项目 - * 2. app 包:提供给用户 APP msgpush-ui-app 前端项目,它的 Controller 和 VO 都要添加 App 前缀,用于和管理后台进行区分 - */ -package com.njcn.msgpush.module.infra.controller; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/convert/codegen/CodegenConvert.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/convert/codegen/CodegenConvert.java deleted file mode 100644 index f2f9b35..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/convert/codegen/CodegenConvert.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.njcn.msgpush.module.infra.convert.codegen; - -import com.njcn.msgpush.framework.common.util.collection.CollectionUtils; -import com.njcn.msgpush.framework.common.util.object.BeanUtils; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.CodegenDetailRespVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.CodegenPreviewRespVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.column.CodegenColumnRespVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.CodegenTableRespVO; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenTableDO; -import com.baomidou.mybatisplus.generator.config.po.TableField; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import org.apache.ibatis.type.JdbcType; -import org.mapstruct.Mapper; -import org.mapstruct.Mapping; -import org.mapstruct.Mappings; -import org.mapstruct.Named; -import org.mapstruct.factory.Mappers; - -import java.util.List; -import java.util.Map; - -@Mapper -public interface CodegenConvert { - - CodegenConvert INSTANCE = Mappers.getMapper(CodegenConvert.class); - - // ========== TableInfo 相关 ========== - - @Mappings({ - @Mapping(source = "name", target = "tableName"), - @Mapping(source = "comment", target = "tableComment"), - }) - CodegenTableDO convert(TableInfo bean); - - List convertList(List list); - - @Mappings({ - @Mapping(source = "name", target = "columnName"), - @Mapping(source = "metaInfo.jdbcType", target = "dataType", qualifiedByName = "getDataType"), - @Mapping(source = "comment", target = "columnComment"), - @Mapping(source = "metaInfo.nullable", target = "nullable"), - @Mapping(source = "keyFlag", target = "primaryKey"), - @Mapping(source = "columnType.type", target = "javaType"), - @Mapping(source = "propertyName", target = "javaField"), - }) - CodegenColumnDO convert(TableField bean); - - @Named("getDataType") - default String getDataType(JdbcType jdbcType) { - return jdbcType.name(); - } - - // ========== 其它 ========== - - default CodegenDetailRespVO convert(CodegenTableDO table, List columns) { - CodegenDetailRespVO respVO = new CodegenDetailRespVO(); - respVO.setTable(BeanUtils.toBean(table, CodegenTableRespVO.class)); - respVO.setColumns(BeanUtils.toBean(columns, CodegenColumnRespVO.class)); - return respVO; - } - - default List convert(Map codes) { - return CollectionUtils.convertList(codes.entrySet(), - entry -> new CodegenPreviewRespVO().setFilePath(entry.getKey()).setCode(entry.getValue())); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/convert/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/convert/package-info.java deleted file mode 100644 index eb324e6..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/convert/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 提供 POJO 类的实体转换 - * - * 目前使用 MapStruct 框架 - */ -package com.njcn.msgpush.module.infra.convert; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/codegen/CodegenColumnDO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/codegen/CodegenColumnDO.java deleted file mode 100644 index ae33931..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/codegen/CodegenColumnDO.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.njcn.msgpush.module.infra.dal.dataobject.codegen; - -import com.njcn.msgpush.framework.mybatis.core.dataobject.BaseDO; - -import com.njcn.msgpush.module.infra.enums.codegen.CodegenColumnHtmlTypeEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenColumnListConditionEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.generator.config.po.TableField; -import lombok.Data; - -/** - * 代码生成 column 字段定义 - * - * @author hongawen - */ -@TableName(value = "infra_codegen_column", autoResultMap = true) -@KeySequence("infra_codegen_column_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class CodegenColumnDO extends BaseDO { - - /** - * ID 编号 - */ - @TableId - private Long id; - /** - * 表编号 - *

- * 关联 {@link CodegenTableDO#getId()} - */ - private Long tableId; - - // ========== 表相关字段 ========== - - /** - * 字段名 - * - * 关联 {@link TableField#getName()} - */ - private String columnName; - /** - * 数据库字段类型 - * - * 关联 {@link TableField.MetaInfo#getJdbcType()} - */ - private String dataType; - /** - * 字段描述 - * - * 关联 {@link TableField#getComment()} - */ - private String columnComment; - /** - * 是否允许为空 - * - * 关联 {@link TableField.MetaInfo#isNullable()} - */ - private Boolean nullable; - /** - * 是否主键 - * - * 关联 {@link TableField#isKeyFlag()} - */ - private Boolean primaryKey; - /** - * 排序 - */ - private Integer ordinalPosition; - - // ========== Java 相关字段 ========== - - /** - * Java 属性类型 - * - * 例如说 String、Boolean 等等 - * - * 关联 {@link TableField#getColumnType()} - */ - private String javaType; - /** - * Java 属性名 - * - * 关联 {@link TableField#getPropertyName()} - */ - private String javaField; - /** - * 字典类型 - *

- * 关联 DictTypeDO 的 type 属性 - */ - private String dictType; - /** - * 数据示例,主要用于生成 Swagger 注解的 example 字段 - */ - private String example; - - // ========== CRUD 相关字段 ========== - - /** - * 是否为 Create 创建操作的字段 - */ - private Boolean createOperation; - /** - * 是否为 Update 更新操作的字段 - */ - private Boolean updateOperation; - /** - * 是否为 List 查询操作的字段 - */ - private Boolean listOperation; - /** - * List 查询操作的条件类型 - *

- * 枚举 {@link CodegenColumnListConditionEnum} - */ - private String listOperationCondition; - /** - * 是否为 List 查询操作的返回字段 - */ - private Boolean listOperationResult; - - // ========== UI 相关字段 ========== - - /** - * 显示类型 - *

- * 枚举 {@link CodegenColumnHtmlTypeEnum} - */ - private String htmlType; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/codegen/CodegenTableDO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/codegen/CodegenTableDO.java deleted file mode 100644 index 81babfc..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/codegen/CodegenTableDO.java +++ /dev/null @@ -1,155 +0,0 @@ -package com.njcn.msgpush.module.infra.dal.dataobject.codegen; - -import com.njcn.msgpush.framework.mybatis.core.dataobject.BaseDO; - -import com.njcn.msgpush.module.infra.dal.dataobject.db.DataSourceConfigDO; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenFrontTypeEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenSceneEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenTemplateTypeEnum; -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import lombok.Data; - -/** - * 代码生成 table 表定义 - * - * @author hongawen - */ -@TableName(value = "infra_codegen_table", autoResultMap = true) -@KeySequence("infra_codegen_table_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class CodegenTableDO extends BaseDO { - - /** - * ID 编号 - */ - @TableId - private Long id; - - /** - * 数据源编号 - * - * 关联 {@link DataSourceConfigDO#getId()} - */ - private Long dataSourceConfigId; - /** - * 生成场景 - * - * 枚举 {@link CodegenSceneEnum} - */ - private Integer scene; - - // ========== 表相关字段 ========== - - /** - * 表名称 - * - * 关联 {@link TableInfo#getName()} - */ - private String tableName; - /** - * 表描述 - * - * 关联 {@link TableInfo#getComment()} - */ - private String tableComment; - /** - * 备注 - */ - private String remark; - - // ========== 类相关字段 ========== - - /** - * 模块名,即一级目录 - * - * 例如说,system、infra、tool 等等 - */ - private String moduleName; - /** - * 业务名,即二级目录 - * - * 例如说,user、permission、dict 等等 - */ - private String businessName; - /** - * 类名称(首字母大写) - * - * 例如说,SysUser、SysMenu、SysDictData 等等 - */ - private String className; - /** - * 类描述 - */ - private String classComment; - /** - * 作者 - */ - private String author; - - // ========== 生成相关字段 ========== - - /** - * 模板类型 - * - * 枚举 {@link CodegenTemplateTypeEnum} - */ - private Integer templateType; - /** - * 代码生成的前端类型 - * - * 枚举 {@link CodegenFrontTypeEnum} - */ - private Integer frontType; - - // ========== 菜单相关字段 ========== - - /** - * 父菜单编号 - * - * 关联 MenuDO 的 id 属性 - */ - private Long parentMenuId; - - // ========== 主子表相关字段 ========== - - /** - * 主表的编号 - * - * 关联 {@link CodegenTableDO#getId()} - */ - private Long masterTableId; - /** - * 【自己】子表关联主表的字段编号 - * - * 关联 {@link CodegenColumnDO#getId()} - */ - private Long subJoinColumnId; - /** - * 主表与子表是否一对多 - * - * true:一对多 - * false:一对一 - */ - private Boolean subJoinMany; - - // ========== 树表相关字段 ========== - - /** - * 树表的父字段编号 - * - * 关联 {@link CodegenColumnDO#getId()} - */ - private Long treeParentColumnId; - /** - * 树表的名字字段编号 - * - * 名字的用途:新增或修改时,select 框展示的字段 - * - * 关联 {@link CodegenColumnDO#getId()} - */ - private Long treeNameColumnId; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/db/DataSourceConfigDO.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/db/DataSourceConfigDO.java deleted file mode 100644 index 68b74c2..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/dataobject/db/DataSourceConfigDO.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.njcn.msgpush.module.infra.dal.dataobject.db; - -import com.njcn.msgpush.framework.mybatis.core.dataobject.BaseDO; -import com.njcn.msgpush.framework.mybatis.core.type.EncryptTypeHandler; - -import com.baomidou.mybatisplus.annotation.KeySequence; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; - -/** - * 数据源配置 - * - * @author hongawen - */ -@TableName(value = "infra_data_source_config", autoResultMap = true) -@KeySequence("infra_data_source_config_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -public class DataSourceConfigDO extends BaseDO { - - /** - * 主键编号 - Master 数据源 - */ - public static final Long ID_MASTER = 0L; - - /** - * 主键编号 - */ - private Long id; - /** - * 连接名 - */ - private String name; - - /** - * 数据源连接 - */ - private String url; - /** - * 用户名 - */ - private String username; - /** - * 密码 - */ - @TableField(typeHandler = EncryptTypeHandler.class) - private String password; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/codegen/CodegenColumnMapper.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/codegen/CodegenColumnMapper.java deleted file mode 100644 index 5207768..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/codegen/CodegenColumnMapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.njcn.msgpush.module.infra.dal.mysql.codegen; - -import com.njcn.msgpush.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.msgpush.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenColumnDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.Collection; -import java.util.List; - -@Mapper -public interface CodegenColumnMapper extends BaseMapperX { - - default List selectListByTableId(Long tableId) { - return selectList(new LambdaQueryWrapperX() - .eq(CodegenColumnDO::getTableId, tableId) - .orderByAsc(CodegenColumnDO::getOrdinalPosition)); - } - - default void deleteListByTableId(Long tableId) { - delete(CodegenColumnDO::getTableId, tableId); - } - - default void deleteListByTableId(Collection tableIds) { - delete(new LambdaQueryWrapperX() - .in(CodegenColumnDO::getTableId, tableIds)); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/codegen/CodegenTableMapper.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/codegen/CodegenTableMapper.java deleted file mode 100644 index 9e63e30..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/codegen/CodegenTableMapper.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.njcn.msgpush.module.infra.dal.mysql.codegen; - -import com.njcn.msgpush.framework.common.pojo.PageResult; -import com.njcn.msgpush.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.msgpush.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenTableDO; -import org.apache.ibatis.annotations.Mapper; - -import java.util.List; - -@Mapper -public interface CodegenTableMapper extends BaseMapperX { - - default CodegenTableDO selectByTableNameAndDataSourceConfigId(String tableName, Long dataSourceConfigId) { - return selectOne(CodegenTableDO::getTableName, tableName, - CodegenTableDO::getDataSourceConfigId, dataSourceConfigId); - } - - default PageResult selectPage(CodegenTablePageReqVO pageReqVO) { - return selectPage(pageReqVO, new LambdaQueryWrapperX() - .likeIfPresent(CodegenTableDO::getTableName, pageReqVO.getTableName()) - .likeIfPresent(CodegenTableDO::getTableComment, pageReqVO.getTableComment()) - .likeIfPresent(CodegenTableDO::getClassName, pageReqVO.getClassName()) - .betweenIfPresent(CodegenTableDO::getCreateTime, pageReqVO.getCreateTime()) - .orderByDesc(CodegenTableDO::getUpdateTime) - ); - } - - default List selectListByDataSourceConfigId(Long dataSourceConfigId) { - return selectList(CodegenTableDO::getDataSourceConfigId, dataSourceConfigId); - } - - default List selectListByTemplateTypeAndMasterTableId(Integer templateType, Long masterTableId) { - return selectList(CodegenTableDO::getTemplateType, templateType, - CodegenTableDO::getMasterTableId, masterTableId); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/db/DataSourceConfigMapper.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/db/DataSourceConfigMapper.java deleted file mode 100644 index fec3094..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/dal/mysql/db/DataSourceConfigMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.njcn.msgpush.module.infra.dal.mysql.db; - -import com.njcn.msgpush.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.msgpush.module.infra.dal.dataobject.db.DataSourceConfigDO; -import org.apache.ibatis.annotations.Mapper; - -/** - * 数据源配置 Mapper - * - * @author hongawen - */ -@Mapper -public interface DataSourceConfigMapper extends BaseMapperX { -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/config/CodegenConfiguration.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/config/CodegenConfiguration.java deleted file mode 100644 index 29d5edd..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/config/CodegenConfiguration.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.njcn.msgpush.module.infra.framework.codegen.config; - -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Configuration; - -@Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(CodegenProperties.class) -public class CodegenConfiguration { -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/config/CodegenProperties.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/config/CodegenProperties.java deleted file mode 100644 index 6017178..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/config/CodegenProperties.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.njcn.msgpush.module.infra.framework.codegen.config; - -import com.njcn.msgpush.module.infra.enums.codegen.CodegenFrontTypeEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenVOTypeEnum; -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.validation.annotation.Validated; - -import jakarta.validation.constraints.NotEmpty; -import jakarta.validation.constraints.NotNull; -import java.util.Collection; - -@ConfigurationProperties(prefix = "msgpush.codegen") -@Validated -@Data -public class CodegenProperties { - - /** - * 生成的 Java 代码的基础包 - */ - @NotNull(message = "Java 代码的基础包不能为空") - private String basePackage; - - /** - * 数据库名数组 - */ - @NotEmpty(message = "数据库不能为空") - private Collection dbSchemas; - - /** - * 代码生成的前端类型(默认) - * - * 枚举 {@link CodegenFrontTypeEnum#getType()} - */ - @NotNull(message = "代码生成的前端类型不能为空") - private Integer frontType; - - /** - * 代码生成的 VO 类型 - * - * 枚举 {@link CodegenVOTypeEnum#getType()} - */ - @NotNull(message = "代码生成的 VO 类型不能为空") - private Integer voType; - - /** - * 是否生成批量删除接口 - */ - @NotNull(message = "是否生成批量删除接口不能为空") - private Boolean deleteBatchEnable; - - /** - * 是否生成单元测试 - */ - @NotNull(message = "是否生成单元测试不能为空") - private Boolean unitTestEnable; - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/package-info.java deleted file mode 100644 index dc44c91..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/codegen/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 代码生成器 - */ -package com.njcn.msgpush.module.infra.framework.codegen; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/file/core/enums/FileStorageEnum.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/file/core/enums/FileStorageEnum.java deleted file mode 100644 index 6c1dc0f..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/file/core/enums/FileStorageEnum.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.njcn.msgpush.module.infra.framework.file.core.enums; - -import cn.hutool.core.util.ArrayUtil; -import com.njcn.msgpush.module.infra.framework.file.core.client.FileClient; -import com.njcn.msgpush.module.infra.framework.file.core.client.FileClientConfig; -import com.njcn.msgpush.module.infra.framework.file.core.client.db.DBFileClient; -import com.njcn.msgpush.module.infra.framework.file.core.client.db.DBFileClientConfig; -import com.njcn.msgpush.module.infra.framework.file.core.client.ftp.FtpFileClient; -import com.njcn.msgpush.module.infra.framework.file.core.client.ftp.FtpFileClientConfig; -import com.njcn.msgpush.module.infra.framework.file.core.client.local.LocalFileClient; -import com.njcn.msgpush.module.infra.framework.file.core.client.local.LocalFileClientConfig; -import com.njcn.msgpush.module.infra.framework.file.core.client.s3.S3FileClient; -import com.njcn.msgpush.module.infra.framework.file.core.client.s3.S3FileClientConfig; -import com.njcn.msgpush.module.infra.framework.file.core.client.sftp.SftpFileClient; -import com.njcn.msgpush.module.infra.framework.file.core.client.sftp.SftpFileClientConfig; -import lombok.AllArgsConstructor; -import lombok.Getter; - -/** - * 文件存储器枚举 - * - * @author hongawen - */ -@AllArgsConstructor -@Getter -public enum FileStorageEnum { - - DB(1, DBFileClientConfig.class, DBFileClient.class), - - LOCAL(10, LocalFileClientConfig.class, LocalFileClient.class), - FTP(11, FtpFileClientConfig.class, FtpFileClient.class), - SFTP(12, SftpFileClientConfig.class, SftpFileClient.class), - - S3(20, S3FileClientConfig.class, S3FileClient.class), - ; - - /** - * 存储器 - */ - private final Integer storage; - - /** - * 配置类 - */ - private final Class configClass; - /** - * 客户端类 - */ - private final Class clientClass; - - public static FileStorageEnum getByStorage(Integer storage) { - return ArrayUtil.firstMatch(o -> o.getStorage().equals(storage), values()); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/package-info.java deleted file mode 100644 index 9181516..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/package-info.java +++ /dev/null @@ -1,6 +0,0 @@ -/** - * 属于 infra 模块的 framework 封装 - * - * @author hongawen - */ -package com.njcn.msgpush.module.infra.framework; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/rpc/config/RpcConfiguration.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/rpc/config/RpcConfiguration.java deleted file mode 100644 index f4b1b62..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/rpc/config/RpcConfiguration.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.njcn.msgpush.module.infra.framework.rpc.config; - -import org.springframework.cloud.openfeign.EnableFeignClients; -import org.springframework.context.annotation.Configuration; - -@Configuration(value = "infraRpcConfiguration", proxyBeanMethods = false) -@EnableFeignClients() -public class RpcConfiguration { -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/rpc/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/rpc/package-info.java deleted file mode 100644 index a262055..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/rpc/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位 - */ -package com.njcn.msgpush.module.infra.framework.rpc; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/security/config/SecurityConfiguration.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/security/config/SecurityConfiguration.java deleted file mode 100644 index 05402d0..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/security/config/SecurityConfiguration.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.njcn.msgpush.module.infra.framework.security.config; - -import com.njcn.msgpush.framework.security.config.AuthorizeRequestsCustomizer; -import com.njcn.msgpush.module.infra.enums.ApiConstants; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer; - -/** - * Infra 模块的 Security 配置 - */ -@Configuration(proxyBeanMethods = false, value = "infraSecurityConfiguration") -public class SecurityConfiguration { - - @Bean("infraAuthorizeRequestsCustomizer") - public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() { - return new AuthorizeRequestsCustomizer() { - - @Override - public void customize(AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry registry) { - // Swagger 接口文档 - registry.requestMatchers("/v3/api-docs/**").permitAll() - .requestMatchers("/webjars/**").permitAll() - .requestMatchers("/swagger-ui").permitAll() - .requestMatchers("/swagger-ui/**").permitAll(); - // Spring Boot Actuator 的安全配置 - registry.requestMatchers("/actuator").permitAll() - .requestMatchers("/actuator/**").permitAll(); - // Druid 监控 - registry.requestMatchers("/druid/**").permitAll(); - // 文件读取 - registry.requestMatchers(buildAdminApi("/infra/file/*/get/**")).permitAll(); - - // TODO 芋艿:这个每个项目都需要重复配置,得捉摸有没通用的方案 - // RPC 服务的安全配置 - registry.requestMatchers(ApiConstants.PREFIX + "/**").permitAll(); - } - - }; - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/security/core/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/security/core/package-info.java deleted file mode 100644 index b5778ac..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/framework/security/core/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 占位 - */ -package com.njcn.msgpush.module.infra.framework.security.core; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/consumer/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/consumer/package-info.java deleted file mode 100644 index 3aa3643..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/consumer/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 消息队列的消费者 - */ -package com.njcn.msgpush.module.infra.mq.consumer; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/message/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/message/package-info.java deleted file mode 100644 index 644fe03..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/message/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 消息队列的消息 - */ -package com.njcn.msgpush.module.infra.mq.message; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/producer/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/producer/package-info.java deleted file mode 100644 index a6c5f87..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/mq/producer/package-info.java +++ /dev/null @@ -1,4 +0,0 @@ -/** - * 消息队列的生产者 - */ -package com.njcn.msgpush.module.infra.mq.producer; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/package-info.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/package-info.java deleted file mode 100644 index e6ef010..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * infra 模块,主要提供两块能力: - * 1. 我们放基础设施的运维与管理,支撑上层的通用与核心业务。 例如说:定时任务的管理、服务器的信息等等 - * 2. 研发工具,提升研发效率与质量。 例如说:代码生成器、接口文档等等 - * - * 1. Controller URL:以 /infra/ 开头,避免和其它 Module 冲突 - * 2. DataObject 表名:以 infra_ 开头,方便在数据库中区分 - */ -package com.njcn.msgpush.module.infra; diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/CodegenService.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/CodegenService.java deleted file mode 100644 index 26ec718..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/CodegenService.java +++ /dev/null @@ -1,108 +0,0 @@ -package com.njcn.msgpush.module.infra.service.codegen; - -import com.njcn.msgpush.framework.common.pojo.PageResult; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenTableDO; - -import java.util.List; -import java.util.Map; - -/** - * 代码生成 Service 接口 - * - * @author hongawen - */ -public interface CodegenService { - - /** - * 基于数据库的表结构,创建代码生成器的表定义 - * - * @param author 作者 - * @param reqVO 表信息 - * @return 创建的表定义的编号数组 - */ - List createCodegenList(String author, CodegenCreateListReqVO reqVO); - - /** - * 更新数据库的表和字段定义 - * - * @param updateReqVO 更新信息 - */ - void updateCodegen(CodegenUpdateReqVO updateReqVO); - - /** - * 基于数据库的表结构,同步数据库的表和字段定义 - * - * @param tableId 表编号 - */ - void syncCodegenFromDB(Long tableId); - - /** - * 删除数据库的表和字段定义 - * - * @param tableId 数据编号 - */ - void deleteCodegen(Long tableId); - - /** - * 批量删除数据库的表和字段定义 - * - * @param tableIds 数据编号列表 - */ - void deleteCodegenList(List tableIds); - - /** - * 获得表定义列表 - * - * @param dataSourceConfigId 数据源配置的编号 - * @return 表定义列表 - */ - List getCodegenTableList(Long dataSourceConfigId); - - /** - * 获得表定义分页 - * - * @param pageReqVO 分页条件 - * @return 表定义分页 - */ - PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO); - - /** - * 获得表定义 - * - * @param id 表编号 - * @return 表定义 - */ - CodegenTableDO getCodegenTable(Long id); - - /** - * 获得指定表的字段定义数组 - * - * @param tableId 表编号 - * @return 字段定义数组 - */ - List getCodegenColumnListByTableId(Long tableId); - - /** - * 执行指定表的代码生成 - * - * @param tableId 表编号 - * @return 生成结果。key 为文件路径,value 为对应的代码内容 - */ - Map generationCodes(Long tableId); - - /** - * 获得数据库自带的表定义列表 - * - * @param dataSourceConfigId 数据源的配置编号 - * @param name 表名称 - * @param comment 表描述 - * @return 表定义列表 - */ - List getDatabaseTableList(Long dataSourceConfigId, String name, String comment); - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/CodegenServiceImpl.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/CodegenServiceImpl.java deleted file mode 100644 index e90caed..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/CodegenServiceImpl.java +++ /dev/null @@ -1,310 +0,0 @@ -package com.njcn.msgpush.module.infra.service.codegen; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.common.pojo.PageResult; -import com.njcn.msgpush.framework.common.util.object.BeanUtils; -import com.njcn.msgpush.framework.mybatis.core.util.JdbcUtils; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.CodegenCreateListReqVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.CodegenUpdateReqVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.CodegenTablePageReqVO; -import com.njcn.msgpush.module.infra.controller.admin.codegen.vo.table.DatabaseTableRespVO; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenTableDO; -import com.njcn.msgpush.module.infra.dal.dataobject.db.DataSourceConfigDO; -import com.njcn.msgpush.module.infra.dal.mysql.codegen.CodegenColumnMapper; -import com.njcn.msgpush.module.infra.dal.mysql.codegen.CodegenTableMapper; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenSceneEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenTemplateTypeEnum; -import com.njcn.msgpush.module.infra.framework.codegen.config.CodegenProperties; -import com.njcn.msgpush.module.infra.service.codegen.inner.CodegenBuilder; -import com.njcn.msgpush.module.infra.service.codegen.inner.CodegenEngine; -import com.njcn.msgpush.module.infra.service.db.DataSourceConfigService; -import com.njcn.msgpush.module.infra.service.db.DatabaseTableService; -import com.baomidou.mybatisplus.annotation.DbType; -import com.baomidou.mybatisplus.generator.config.po.TableField; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.google.common.annotations.VisibleForTesting; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import java.util.function.BiPredicate; -import java.util.stream.Collectors; -import java.util.stream.IntStream; - -import static com.njcn.msgpush.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.njcn.msgpush.framework.common.util.collection.CollectionUtils.convertMap; -import static com.njcn.msgpush.framework.common.util.collection.CollectionUtils.convertSet; -import static com.njcn.msgpush.module.infra.enums.ErrorCodeConstants.*; - -/** - * 代码生成 Service 实现类 - * - * @author hongawen - */ -@Service -public class CodegenServiceImpl implements CodegenService { - - @Resource - private DatabaseTableService databaseTableService; - @Resource - private DataSourceConfigService dataSourceConfigService; - - @Resource - private CodegenTableMapper codegenTableMapper; - @Resource - private CodegenColumnMapper codegenColumnMapper; - - @Resource - private CodegenBuilder codegenBuilder; - @Resource - private CodegenEngine codegenEngine; - - @Resource - private CodegenProperties codegenProperties; - - @Override - @Transactional(rollbackFor = Exception.class) - public List createCodegenList(String author, CodegenCreateListReqVO reqVO) { - List ids = new ArrayList<>(reqVO.getTableNames().size()); - // 遍历添加。虽然效率会低一点,但是没必要做成完全批量,因为不会这么大量 - reqVO.getTableNames().forEach(tableName -> ids.add(createCodegen(author, reqVO.getDataSourceConfigId(), tableName))); - return ids; - } - - private Long createCodegen(String author, Long dataSourceConfigId, String tableName) { - // 从数据库中,获得数据库表结构 - TableInfo tableInfo = databaseTableService.getTable(dataSourceConfigId, tableName); - // 导入 - return createCodegen0(author, dataSourceConfigId, tableInfo); - } - - private Long createCodegen0(String author, Long dataSourceConfigId, TableInfo tableInfo) { - // 校验导入的表和字段非空 - validateTableInfo(tableInfo); - // 校验是否已经存在 - if (codegenTableMapper.selectByTableNameAndDataSourceConfigId(tableInfo.getName(), - dataSourceConfigId) != null) { - throw exception(CODEGEN_TABLE_EXISTS); - } - - // 构建 CodegenTableDO 对象,插入到 DB 中 - CodegenTableDO table = codegenBuilder.buildTable(tableInfo); - table.setDataSourceConfigId(dataSourceConfigId); - table.setScene(CodegenSceneEnum.ADMIN.getScene()); // 默认配置下,使用管理后台的模板 - table.setFrontType(codegenProperties.getFrontType()); - table.setAuthor(author); - codegenTableMapper.insert(table); - - // 构建 CodegenColumnDO 数组,插入到 DB 中 - List columns = codegenBuilder.buildColumns(table.getId(), tableInfo.getFields()); - // 如果没有主键,则使用第一个字段作为主键 - if (!tableInfo.isHavePrimaryKey()) { - columns.get(0).setPrimaryKey(true); - } - codegenColumnMapper.insertBatch(columns); - return table.getId(); - } - - @VisibleForTesting - void validateTableInfo(TableInfo tableInfo) { - if (tableInfo == null) { - throw exception(CODEGEN_IMPORT_TABLE_NULL); - } - if (StrUtil.isEmpty(tableInfo.getComment())) { - throw exception(CODEGEN_TABLE_INFO_TABLE_COMMENT_IS_NULL); - } - if (CollUtil.isEmpty(tableInfo.getFields())) { - throw exception(CODEGEN_IMPORT_COLUMNS_NULL); - } - tableInfo.getFields().forEach(field -> { - if (StrUtil.isEmpty(field.getComment())) { - throw exception(CODEGEN_TABLE_INFO_COLUMN_COMMENT_IS_NULL, field.getName()); - } - }); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void updateCodegen(CodegenUpdateReqVO updateReqVO) { - // 校验是否已经存在 - if (codegenTableMapper.selectById(updateReqVO.getTable().getId()) == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - // 校验主表字段存在 - if (Objects.equals(updateReqVO.getTable().getTemplateType(), CodegenTemplateTypeEnum.SUB.getType())) { - if (codegenTableMapper.selectById(updateReqVO.getTable().getMasterTableId()) == null) { - throw exception(CODEGEN_MASTER_TABLE_NOT_EXISTS, updateReqVO.getTable().getMasterTableId()); - } - if (CollUtil.findOne(updateReqVO.getColumns(), // 关联主表的字段不存在 - column -> column.getId().equals(updateReqVO.getTable().getSubJoinColumnId())) == null) { - throw exception(CODEGEN_SUB_COLUMN_NOT_EXISTS, updateReqVO.getTable().getSubJoinColumnId()); - } - } - - // 更新 table 表定义 - CodegenTableDO updateTableObj = BeanUtils.toBean(updateReqVO.getTable(), CodegenTableDO.class); - codegenTableMapper.updateById(updateTableObj); - // 更新 column 字段定义 - List updateColumnObjs = BeanUtils.toBean(updateReqVO.getColumns(), CodegenColumnDO.class); - updateColumnObjs.forEach(updateColumnObj -> codegenColumnMapper.updateById(updateColumnObj)); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void syncCodegenFromDB(Long tableId) { - // 校验是否已经存在 - CodegenTableDO table = codegenTableMapper.selectById(tableId); - if (table == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - // 从数据库中,获得数据库表结构 - TableInfo tableInfo = databaseTableService.getTable(table.getDataSourceConfigId(), table.getTableName()); - // 执行同步 - syncCodegen0(tableId, tableInfo); - } - - private void syncCodegen0(Long tableId, TableInfo tableInfo) { - // 1. 校验导入的表和字段非空 - validateTableInfo(tableInfo); - List tableFields = tableInfo.getFields(); - - // 2. 构建 CodegenColumnDO 数组,只同步新增的字段 - List codegenColumns = codegenColumnMapper.selectListByTableId(tableId); - Set codegenColumnNames = convertSet(codegenColumns, CodegenColumnDO::getColumnName); - - // 3.1 计算需要【修改】的字段,插入时重新插入,删除时将原来的删除 - Map codegenColumnDOMap = convertMap(codegenColumns, CodegenColumnDO::getColumnName); - BiPredicate primaryKeyPredicate = - (tableField, codegenColumn) -> tableField.getMetaInfo().getJdbcType().name().equals(codegenColumn.getDataType()) - && tableField.getMetaInfo().isNullable() == codegenColumn.getNullable() - && tableField.isKeyFlag() == codegenColumn.getPrimaryKey() - && tableField.getComment().equals(codegenColumn.getColumnComment()); - Set modifyFieldNames = IntStream.range(0, tableFields.size()).mapToObj(index -> { - TableField tableField = tableFields.get(index); - String columnName = tableField.getColumnName(); - CodegenColumnDO codegenColumn = codegenColumnDOMap.get(columnName); - if (codegenColumn == null) { - return null; - } - if (!primaryKeyPredicate.test(tableField, codegenColumn) || codegenColumn.getOrdinalPosition() != index) { - return columnName; - } - return null; - }).filter(Objects::nonNull).collect(Collectors.toSet()); - // 3.2 计算需要【删除】的字段 - Set tableFieldNames = convertSet(tableFields, TableField::getName); - Set deleteColumnIds = codegenColumns.stream() - .filter(column -> (!tableFieldNames.contains(column.getColumnName())) || modifyFieldNames.contains(column.getColumnName())) - .map(CodegenColumnDO::getId).collect(Collectors.toSet()); - // 移除已经存在的字段 - tableFields.removeIf(column -> codegenColumnNames.contains(column.getColumnName()) && (!modifyFieldNames.contains(column.getColumnName()))); - if (CollUtil.isEmpty(tableFields) && CollUtil.isEmpty(deleteColumnIds)) { - throw exception(CODEGEN_SYNC_NONE_CHANGE); - } - - // 4.1 插入新增的字段 - List columns = codegenBuilder.buildColumns(tableId, tableFields); - codegenColumnMapper.insertBatch(columns); - // 4.2 删除不存在的字段 - if (CollUtil.isNotEmpty(deleteColumnIds)) { - codegenColumnMapper.deleteByIds(deleteColumnIds); - } - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteCodegen(Long tableId) { - // 校验是否已经存在 - if (codegenTableMapper.selectById(tableId) == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - - // 删除 table 表定义 - codegenTableMapper.deleteById(tableId); - // 删除 column 字段定义 - codegenColumnMapper.deleteListByTableId(tableId); - } - - @Override - @Transactional(rollbackFor = Exception.class) - public void deleteCodegenList(List tableIds) { - // 批量删除 table 表定义 - codegenTableMapper.deleteByIds(tableIds); - // 批量删除 column 字段定义 - codegenColumnMapper.deleteListByTableId(tableIds); - } - - @Override - public List getCodegenTableList(Long dataSourceConfigId) { - return codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId); - } - - @Override - public PageResult getCodegenTablePage(CodegenTablePageReqVO pageReqVO) { - return codegenTableMapper.selectPage(pageReqVO); - } - - @Override - public CodegenTableDO getCodegenTable(Long id) { - return codegenTableMapper.selectById(id); - } - - @Override - public List getCodegenColumnListByTableId(Long tableId) { - return codegenColumnMapper.selectListByTableId(tableId); - } - - @Override - public Map generationCodes(Long tableId) { - // 校验是否已经存在 - CodegenTableDO table = codegenTableMapper.selectById(tableId); - if (table == null) { - throw exception(CODEGEN_TABLE_NOT_EXISTS); - } - List columns = codegenColumnMapper.selectListByTableId(tableId); - if (CollUtil.isEmpty(columns)) { - throw exception(CODEGEN_COLUMN_NOT_EXISTS); - } - - // 如果是主子表,则加载对应的子表信息 - List subTables = null; - List> subColumnsList = null; - if (CodegenTemplateTypeEnum.isMaster(table.getTemplateType())) { - // 校验子表存在 - subTables = codegenTableMapper.selectListByTemplateTypeAndMasterTableId( - CodegenTemplateTypeEnum.SUB.getType(), tableId); - if (CollUtil.isEmpty(subTables)) { - throw exception(CODEGEN_MASTER_GENERATION_FAIL_NO_SUB_TABLE); - } - // 校验子表的关联字段存在 - subColumnsList = new ArrayList<>(); - for (CodegenTableDO subTable : subTables) { - List subColumns = codegenColumnMapper.selectListByTableId(subTable.getId()); - if (CollUtil.findOne(subColumns, column -> column.getId().equals(subTable.getSubJoinColumnId())) == null) { - throw exception(CODEGEN_SUB_COLUMN_NOT_EXISTS, subTable.getId()); - } - subColumnsList.add(subColumns); - } - } - - // 获取数据源对应的数据库类型 - DataSourceConfigDO dataSourceConfig = dataSourceConfigService.getDataSourceConfig(table.getDataSourceConfigId()); - DbType dbType = JdbcUtils.getDbType(dataSourceConfig.getUrl()); - // 执行生成 - return codegenEngine.execute(dbType, table, columns, subTables, subColumnsList); - } - - @Override - public List getDatabaseTableList(Long dataSourceConfigId, String name, String comment) { - List tables = databaseTableService.getTableList(dataSourceConfigId, name, comment); - // 移除在 Codegen 中,已经存在的 - Set existsTables = convertSet( - codegenTableMapper.selectListByDataSourceConfigId(dataSourceConfigId), CodegenTableDO::getTableName); - tables.removeIf(table -> existsTables.contains(table.getName())); - return BeanUtils.toBean(tables, DatabaseTableRespVO.class); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenBuilder.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenBuilder.java deleted file mode 100644 index 9f655b7..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenBuilder.java +++ /dev/null @@ -1,216 +0,0 @@ -package com.njcn.msgpush.module.infra.service.codegen.inner; - -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ReflectUtil; -import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.mybatis.core.dataobject.BaseDO; -import com.njcn.msgpush.module.infra.convert.codegen.CodegenConvert; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenTableDO; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenColumnHtmlTypeEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenColumnListConditionEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenTemplateTypeEnum; -import com.baomidou.mybatisplus.generator.config.po.TableField; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.google.common.collect.Sets; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.util.*; - -import static cn.hutool.core.text.CharSequenceUtil.*; -import static cn.hutool.core.util.RandomUtil.randomEle; -import static cn.hutool.core.util.RandomUtil.randomInt; - -/** - * 代码生成器的 Builder,负责: - * 1. 将数据库的表 {@link TableInfo} 定义,构建成 {@link CodegenTableDO} - * 2. 将数据库的列 {@link TableField} 构定义,建成 {@link CodegenColumnDO} - */ -@Component -public class CodegenBuilder { - - /** - * 字段名与 {@link CodegenColumnListConditionEnum} 的默认映射 - * 注意,字段的匹配以后缀的方式 - */ - private static final Map COLUMN_LIST_OPERATION_CONDITION_MAPPINGS = - MapUtil.builder() - .put("name", CodegenColumnListConditionEnum.LIKE) - .put("time", CodegenColumnListConditionEnum.BETWEEN) - .put("date", CodegenColumnListConditionEnum.BETWEEN) - .build(); - - /** - * 字段名与 {@link CodegenColumnHtmlTypeEnum} 的默认映射 - * 注意,字段的匹配以后缀的方式 - */ - private static final Map COLUMN_HTML_TYPE_MAPPINGS = - MapUtil.builder() - .put("status", CodegenColumnHtmlTypeEnum.RADIO) - .put("sex", CodegenColumnHtmlTypeEnum.RADIO) - .put("type", CodegenColumnHtmlTypeEnum.SELECT) - .put("image", CodegenColumnHtmlTypeEnum.IMAGE_UPLOAD) - .put("file", CodegenColumnHtmlTypeEnum.FILE_UPLOAD) - .put("content", CodegenColumnHtmlTypeEnum.EDITOR) - .put("description", CodegenColumnHtmlTypeEnum.EDITOR) - .put("demo", CodegenColumnHtmlTypeEnum.EDITOR) - .put("time", CodegenColumnHtmlTypeEnum.DATETIME) - .put("date", CodegenColumnHtmlTypeEnum.DATETIME) - .build(); - - - /** - * {@link com.njcn.msgpush.framework.mybatis.core.dataobject.BaseDO} 的字段 - */ - public static final Set BASE_DO_FIELDS = new HashSet<>(); - /** - * 新增操作,不需要传递的字段 - */ - private static final Set CREATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); - /** - * 修改操作,不需要传递的字段 - */ - private static final Set UPDATE_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet(); - /** - * 列表操作的条件,不需要传递的字段 - */ - private static final Set LIST_OPERATION_EXCLUDE_COLUMN = Sets.newHashSet("id"); - /** - * 列表操作的结果,不需要返回的字段 - */ - private static final Set LIST_OPERATION_RESULT_EXCLUDE_COLUMN = Sets.newHashSet(); - - static { - Arrays.stream(ReflectUtil.getFields(BaseDO.class)).forEach(field -> BASE_DO_FIELDS.add(field.getName())); - // 处理 OPERATION 相关的字段 - CREATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - UPDATE_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是可能需要传递的 - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.addAll(BASE_DO_FIELDS); - LIST_OPERATION_RESULT_EXCLUDE_COLUMN.remove("createTime"); // 创建时间,还是需要返回的 - } - - public CodegenTableDO buildTable(TableInfo tableInfo) { - CodegenTableDO table = CodegenConvert.INSTANCE.convert(tableInfo); - initTableDefault(table); - return table; - } - - /** - * 初始化 Table 表的默认字段 - * - * @param table 表定义 - */ - private void initTableDefault(CodegenTableDO table) { - // 以 system_dept 举例子。moduleName 为 system、businessName 为 dept、className 为 Dept - // 如果希望以 System 前缀,则可以手动在【代码生成 - 修改生成配置 - 基本信息】,将实体类名称改为 SystemDept 即可 - String tableName = table.getTableName().toLowerCase(); - // 第一步,_ 前缀的前面,作为 module 名字;第二步,moduleName 必须小写; - table.setModuleName(subBefore(tableName, '_', false).toLowerCase()); - // 第一步,第一个 _ 前缀的后面,作为 module 名字; 第二步,可能存在多个 _ 的情况,转换成驼峰; 第三步,businessName 必须小写; - table.setBusinessName(toCamelCase(subAfter(tableName, '_', false)).toLowerCase()); - // 驼峰 + 首字母大写;第一步,第一个 _ 前缀的后面,作为 class 名字;第二步,驼峰命名 - table.setClassName(upperFirst(toCamelCase(subAfter(tableName, '_', false)))); - // 去除结尾的表,作为类描述 - table.setClassComment(StrUtil.removeSuffixIgnoreCase(table.getTableComment(), "表")); - table.setTemplateType(CodegenTemplateTypeEnum.ONE.getType()); - } - - public List buildColumns(Long tableId, List tableFields) { - List columns = CodegenConvert.INSTANCE.convertList(tableFields); - int index = 1; - for (CodegenColumnDO column : columns) { - column.setTableId(tableId); - column.setOrdinalPosition(index++); - // 特殊处理:Byte => Integer - if (Byte.class.getSimpleName().equals(column.getJavaType())) { - column.setJavaType(Integer.class.getSimpleName()); - } - // 初始化 Column 列的默认字段 - processColumnOperation(column); // 处理 CRUD 相关的字段的默认值 - processColumnUI(column); // 处理 UI 相关的字段的默认值 - processColumnExample(column); // 处理字段的 swagger example 示例 - } - return columns; - } - - private void processColumnOperation(CodegenColumnDO column) { - // 处理 createOperation 字段 - column.setCreateOperation(!CREATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - && !column.getPrimaryKey()); // 对于主键,创建时无需传递 - // 处理 updateOperation 字段 - column.setUpdateOperation(!UPDATE_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - || column.getPrimaryKey()); // 对于主键,更新时需要传递 - // 处理 listOperation 字段 - column.setListOperation(!LIST_OPERATION_EXCLUDE_COLUMN.contains(column.getJavaField()) - && !column.getPrimaryKey()); // 对于主键,列表过滤不需要传递 - // 处理 listOperationCondition 字段 - COLUMN_LIST_OPERATION_CONDITION_MAPPINGS.entrySet().stream() - .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) - .findFirst().ifPresent(entry -> column.setListOperationCondition(entry.getValue().getCondition())); - if (column.getListOperationCondition() == null) { - column.setListOperationCondition(CodegenColumnListConditionEnum.EQ.getCondition()); - } - // 处理 listOperationResult 字段 - column.setListOperationResult(!LIST_OPERATION_RESULT_EXCLUDE_COLUMN.contains(column.getJavaField())); - } - - private void processColumnUI(CodegenColumnDO column) { - // 基于后缀进行匹配 - COLUMN_HTML_TYPE_MAPPINGS.entrySet().stream() - .filter(entry -> StrUtil.endWithIgnoreCase(column.getJavaField(), entry.getKey())) - .findFirst().ifPresent(entry -> column.setHtmlType(entry.getValue().getType())); - // 如果是 Boolean 类型时,设置为 radio 类型. - if (Boolean.class.getSimpleName().equals(column.getJavaType())) { - column.setHtmlType(CodegenColumnHtmlTypeEnum.RADIO.getType()); - } - // 如果是 LocalDateTime 类型,则设置为 datetime 类型 - if (LocalDateTime.class.getSimpleName().equals(column.getJavaType())) { - column.setHtmlType(CodegenColumnHtmlTypeEnum.DATETIME.getType()); - } - // 兜底,设置默认为 input 类型 - if (column.getHtmlType() == null) { - column.setHtmlType(CodegenColumnHtmlTypeEnum.INPUT.getType()); - } - } - - /** - * 处理字段的 swagger example 示例 - * - * @param column 字段 - */ - private void processColumnExample(CodegenColumnDO column) { - // id、price、count 等可能是整数的后缀 - if (StrUtil.endWithAnyIgnoreCase(column.getJavaField(), "id", "price", "count")) { - column.setExample(String.valueOf(randomInt(1, Short.MAX_VALUE))); - return; - } - // name - if (StrUtil.endWithIgnoreCase(column.getJavaField(), "name")) { - column.setExample(randomEle(new String[]{"张三", "李四", "王五", "赵六", "芋艿"})); - return; - } - // status - if (StrUtil.endWithAnyIgnoreCase(column.getJavaField(), "status", "type")) { - column.setExample(randomEle(new String[]{"1", "2"})); - return; - } - // url - if (StrUtil.endWithIgnoreCase(column.getColumnName(), "url")) { - column.setExample("https://www.iocoder.cn"); - return; - } - // reason - if (StrUtil.endWithIgnoreCase(column.getColumnName(), "reason")) { - column.setExample(randomEle(new String[]{"不喜欢", "不对", "不好", "不香"})); - return; - } - // description、memo、remark - if (StrUtil.endWithAnyIgnoreCase(column.getColumnName(), "description", "memo", "remark")) { - column.setExample(randomEle(new String[]{"你猜", "随便", "你说的对"})); - } - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenEngine.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenEngine.java deleted file mode 100644 index 4ccd918..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/codegen/inner/CodegenEngine.java +++ /dev/null @@ -1,679 +0,0 @@ -package com.njcn.msgpush.module.infra.service.codegen.inner; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import cn.hutool.extra.template.TemplateConfig; -import cn.hutool.extra.template.TemplateEngine; -import cn.hutool.extra.template.engine.velocity.VelocityEngine; -import cn.hutool.system.SystemUtil; -import com.njcn.msgpush.framework.apilog.core.annotation.ApiAccessLog; -import com.njcn.msgpush.framework.apilog.core.enums.OperateTypeEnum; -import com.njcn.msgpush.framework.common.exception.util.ServiceExceptionUtil; -import com.njcn.msgpush.framework.common.pojo.CommonResult; -import com.njcn.msgpush.framework.common.pojo.PageParam; -import com.njcn.msgpush.framework.common.pojo.PageResult; -import com.njcn.msgpush.framework.common.util.collection.CollectionUtils; -import com.njcn.msgpush.framework.common.util.date.DateUtils; -import com.njcn.msgpush.framework.common.util.date.LocalDateTimeUtils; -import com.njcn.msgpush.framework.common.util.object.BeanUtils; -import com.njcn.msgpush.framework.common.util.object.ObjectUtils; -import com.njcn.msgpush.framework.common.util.string.StrUtils; -import com.njcn.msgpush.framework.excel.core.annotations.DictFormat; -import com.njcn.msgpush.framework.excel.core.convert.DictConvert; -import com.njcn.msgpush.framework.excel.core.util.ExcelUtils; -import com.njcn.msgpush.framework.mybatis.core.dataobject.BaseDO; -import com.njcn.msgpush.framework.mybatis.core.mapper.BaseMapperX; -import com.njcn.msgpush.framework.mybatis.core.query.LambdaQueryWrapperX; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenColumnDO; -import com.njcn.msgpush.module.infra.dal.dataobject.codegen.CodegenTableDO; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenFrontTypeEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenSceneEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenTemplateTypeEnum; -import com.njcn.msgpush.module.infra.enums.codegen.CodegenVOTypeEnum; -import com.njcn.msgpush.module.infra.framework.codegen.config.CodegenProperties; -import com.baomidou.mybatisplus.annotation.DbType; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.collect.ImmutableTable; -import com.google.common.collect.Maps; -import com.google.common.collect.Table; -import jakarta.annotation.PostConstruct; -import jakarta.annotation.Resource; -import lombok.Setter; -import org.springframework.stereotype.Component; -import org.springframework.util.ClassUtils; - -import java.util.*; - -import static cn.hutool.core.map.MapUtil.getStr; -import static cn.hutool.core.text.CharSequenceUtil.*; - -/** - * 代码生成的引擎,用于具体生成代码 - * 目前基于 {@link org.apache.velocity.app.Velocity} 模板引擎实现 - * - * 考虑到 Java 模板引擎的框架非常多,Freemarker、Velocity、Thymeleaf 等等,所以我们采用 hutool 封装的 {@link cn.hutool.extra.template.Template} 抽象 - * - * @author hongawen - */ -@Component -public class CodegenEngine { - - /** - * 后端的模板配置 - * - * key:模板在 resources 的地址 - * value:生成的路径 - */ - private static final Map SERVER_TEMPLATES = MapUtil.builder(new LinkedHashMap<>()) // 有序 - // Java module-biz(server) Main - .put(javaTemplatePath("controller/vo/pageReqVO"), javaModuleImplVOFilePath("PageReqVO")) - .put(javaTemplatePath("controller/vo/listReqVO"), javaModuleImplVOFilePath("ListReqVO")) - .put(javaTemplatePath("controller/vo/respVO"), javaModuleImplVOFilePath("RespVO")) - .put(javaTemplatePath("controller/vo/saveReqVO"), javaModuleImplVOFilePath("SaveReqVO")) - .put(javaTemplatePath("controller/controller"), javaModuleImplControllerFilePath()) - .put(javaTemplatePath("dal/do"), - javaModuleImplMainFilePath("dal/dataobject/${table.businessName}/${table.className}DO")) - .put(javaTemplatePath("dal/do_sub"), // 特殊:主子表专属逻辑 - javaModuleImplMainFilePath("dal/dataobject/${table.businessName}/${subTable.className}DO")) - .put(javaTemplatePath("dal/mapper"), - javaModuleImplMainFilePath("dal/mysql/${table.businessName}/${table.className}Mapper")) - .put(javaTemplatePath("dal/mapper_sub"), // 特殊:主子表专属逻辑 - javaModuleImplMainFilePath("dal/mysql/${table.businessName}/${subTable.className}Mapper")) - .put(javaTemplatePath("dal/mapper.xml"), mapperXmlFilePath()) - .put(javaTemplatePath("service/serviceImpl"), - javaModuleImplMainFilePath("service/${table.businessName}/${table.className}ServiceImpl")) - .put(javaTemplatePath("service/service"), - javaModuleImplMainFilePath("service/${table.businessName}/${table.className}Service")) - // Java module-biz(server) Test - .put(javaTemplatePath("test/serviceTest"), - javaModuleImplTestFilePath("service/${table.businessName}/${table.className}ServiceImplTest")) - // Java module-api Main - .put(javaTemplatePath("enums/errorcode"), javaModuleApiMainFilePath("enums/ErrorCodeConstants_手动操作")) - // SQL - .put("codegen/sql/sql.vm", "sql/sql.sql") - .put("codegen/sql/h2.vm", "sql/h2.sql") - .build(); - - /** - * 前端的配置模版 - * - * key1:UI 模版的类型 {@link CodegenFrontTypeEnum#getType()} - * key2:模板在 resources 的地址 - * value:生成的路径 - */ - private static final Table FRONT_TEMPLATES = ImmutableTable.builder() - // VUE2_ELEMENT_UI - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/index.vue"), - vueFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("api/api.js"), - vueFilePath("api/${table.moduleName}/${table.businessName}/index.js")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/form.vue"), - vueFilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/components/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/components/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/components/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/components/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) - .put(CodegenFrontTypeEnum.VUE2_ELEMENT_UI.getType(), vueTemplatePath("views/components/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vueFilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) - // VUE3_ELEMENT_PLUS - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/index.vue"), - vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/form.vue"), - vue3FilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/components/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/components/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/components/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}Form.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/components/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("views/components/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3FilePath("views/${table.moduleName}/${table.businessName}/components/${subSimpleClassName}List.vue")) - .put(CodegenFrontTypeEnum.VUE3_ELEMENT_PLUS.getType(), vue3TemplatePath("api/api.ts"), - vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType(), vue3AdminUniappTemplatePath("api/api.ts"), - vue3UniappFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType(), vue3AdminUniappTemplatePath("views/index.vue"), - vue3UniappFilePath("pages-${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType(), vue3AdminUniappTemplatePath("components/search-form.vue"), - vue3UniappFilePath("pages-${table.moduleName}/${table.businessName}/components/search-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType(), vue3AdminUniappTemplatePath("views/form/index.vue"), - vue3UniappFilePath("pages-${table.moduleName}/${table.businessName}/form/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_ADMIN_UNIAPP_WOT.getType(), vue3AdminUniappTemplatePath("views/detail/index.vue"), - vue3UniappFilePath("pages-${table.moduleName}/${table.businessName}/detail/index.vue")) - // VUE3_VBEN2_ANTD_SCHEMA - .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("views/data.ts"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/${classNameVar}.data.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("views/index.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("views/form.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/${simpleClassName}Modal.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN2_ANTD_SCHEMA.getType(), vue3VbenTemplatePath("api/api.ts"), - vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - // VUE3_VBEN5_ANTD_SCHEMA - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/data.ts"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/data.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/index.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/form.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("api/api.ts"), - vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - // VUE3_VBEN5_ANTD - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/index.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/form.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("api/api.ts"), - vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_GENERAL.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - // VUE3_VBEN5_EP_SCHEMA - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/data.ts"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/data.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/index.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/form.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("api/api.ts"), - vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_SCHEMA.getType(), vue3Vben5EpSchemaTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - // VUE3_VBEN5_EP - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/index.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/index.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/form.vue"), - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("api/api.ts"), - vue3VbenFilePath("api/${table.moduleName}/${table.businessName}/index.ts")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - .put(CodegenFrontTypeEnum.VUE3_VBEN5_EP_GENERAL.getType(), vue3Vben5EpGeneralTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 - vue3VbenFilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) - .build(); - - @Resource - private CodegenProperties codegenProperties; - - /** - * 是否使用 jakarta 包,用于解决 Spring Boot 2.X 和 3.X 的兼容性问题 - * - * true - 使用 jakarta.validation.constraints.* - * false - 使用 javax.validation.constraints.* - */ - @Setter // 允许设置的原因,是因为单测需要手动改变 - private Boolean jakartaEnable; - - /** - * 是否为 msgpush-cloud 项目,用于解决 Boot 和 Cloud 的 api 模块兼容性问题 - * - * true - 需要有 msgpush-module-xxx-api 模块 - * false - 不需要有,使用 api、enum 包即可 - */ - @Setter - private Boolean cloudEnable; - - /** - * 模板引擎,由 hutool 实现 - */ - private final TemplateEngine templateEngine; - /** - * 全局通用变量映射 - */ - private final Map globalBindingMap = new HashMap<>(); - - public CodegenEngine() { - // 初始化 TemplateEngine 属性 - TemplateConfig config = new TemplateConfig(); - config.setResourceMode(TemplateConfig.ResourceMode.CLASSPATH); - this.templateEngine = new VelocityEngine(config); - // 设置 javaxEnable,按照是否使用 JDK17 来判断 - this.jakartaEnable = SystemUtil.getJavaInfo().isJavaVersionAtLeast(1700) // 17.00 * 100 - && ClassUtils.isPresent("jakarta.annotation.Resource", ClassUtils.getDefaultClassLoader()); - // 设置 cloudEnable,按照是否使用 Spring Cloud 来判断 - this.cloudEnable = ClassUtils.isPresent("com.njcn.msgpush.module.infra.framework.rpc.config.RpcConfiguration", - ClassUtils.getDefaultClassLoader()); - } - - @PostConstruct - @VisibleForTesting - void initGlobalBindingMap() { - // 全局配置 - globalBindingMap.put("basePackage", codegenProperties.getBasePackage()); - globalBindingMap.put("baseFrameworkPackage", codegenProperties.getBasePackage() - + '.' + "framework"); // 用于后续获取测试类的 package 地址 - globalBindingMap.put("jakartaPackage", jakartaEnable ? "jakarta" : "javax"); - globalBindingMap.put("voType", codegenProperties.getVoType()); - globalBindingMap.put("deleteBatchEnable", codegenProperties.getDeleteBatchEnable()); - // 全局 Java Bean - globalBindingMap.put("CommonResultClassName", CommonResult.class.getName()); - globalBindingMap.put("PageResultClassName", PageResult.class.getName()); - // VO 类,独有字段 - globalBindingMap.put("PageParamClassName", PageParam.class.getName()); - globalBindingMap.put("DictFormatClassName", DictFormat.class.getName()); - // DO 类,独有字段 - globalBindingMap.put("BaseDOClassName", BaseDO.class.getName()); - globalBindingMap.put("baseDOFields", CodegenBuilder.BASE_DO_FIELDS); - globalBindingMap.put("QueryWrapperClassName", LambdaQueryWrapperX.class.getName()); - globalBindingMap.put("BaseMapperClassName", BaseMapperX.class.getName()); - // Util 工具类 - globalBindingMap.put("ServiceExceptionUtilClassName", ServiceExceptionUtil.class.getName()); - globalBindingMap.put("DateUtilsClassName", DateUtils.class.getName()); - globalBindingMap.put("ExcelUtilsClassName", ExcelUtils.class.getName()); - globalBindingMap.put("LocalDateTimeUtilsClassName", LocalDateTimeUtils.class.getName()); - globalBindingMap.put("ObjectUtilsClassName", ObjectUtils.class.getName()); - globalBindingMap.put("DictConvertClassName", DictConvert.class.getName()); - globalBindingMap.put("ApiAccessLogClassName", ApiAccessLog.class.getName()); - globalBindingMap.put("OperateTypeEnumClassName", OperateTypeEnum.class.getName()); - globalBindingMap.put("BeanUtils", BeanUtils.class.getName()); - globalBindingMap.put("CollectionUtilsClassName", CollectionUtils.class.getName()); - } - - /** - * 生成代码 - * - * @param dbType 数据库类型 - * @param table 表定义 - * @param columns table 的字段定义数组 - * @param subTables 子表数组,当且仅当主子表时使用 - * @param subColumnsList subTables 的字段定义数组 - * @return 生成的代码,key 是路径,value 是对应代码 - */ - public Map execute(DbType dbType, CodegenTableDO table, List columns, - List subTables, List> subColumnsList) { - // 1.1 初始化 bindMap 上下文 - Map bindingMap = initBindingMap(dbType, table, columns, subTables, subColumnsList); - // 1.2 获得模版 - Map templates = getTemplates(table.getFrontType()); - - // 2. 执行生成 - Map result = Maps.newLinkedHashMapWithExpectedSize(templates.size()); // 有序 - templates.forEach((vmPath, filePath) -> { - // 2.1 特殊:主子表专属逻辑 - if (isSubTemplate(vmPath)) { - generateSubCode(table, subTables, result, vmPath, filePath, bindingMap); - return; - // 2.2 特殊:树表专属逻辑 - } else if (isPageReqVOTemplate(vmPath)) { - // 减少多余的类生成,例如说 PageVO.java 类 - if (CodegenTemplateTypeEnum.isTree(table.getTemplateType())) { - return; - } - } else if (isListReqVOTemplate(vmPath)) { - // 减少多余的类生成,例如说 ListVO.java 类 - if (!CodegenTemplateTypeEnum.isTree(table.getTemplateType())) { - return; - } - } - // 2.3 默认生成 - generateCode(result, vmPath, filePath, bindingMap); - }); - return result; - } - - private void generateCode(Map result, String vmPath, - String filePath, Map bindingMap) { - filePath = formatFilePath(filePath, bindingMap); - String content = templateEngine.getTemplate(vmPath).render(bindingMap); - // 格式化代码 - content = prettyCode(content, vmPath); - result.put(filePath, content); - } - - private void generateSubCode(CodegenTableDO table, List subTables, - Map result, String vmPath, - String filePath, Map bindingMap) { - // 没有子表,所以不生成 - if (CollUtil.isEmpty(subTables)) { - return; - } - // 主子表的模式匹配。目的:过滤掉个性化的模版 - if (vmPath.contains("_normal") - && ObjectUtil.notEqual(table.getTemplateType(), CodegenTemplateTypeEnum.MASTER_NORMAL.getType())) { - return; - } - if (vmPath.contains("_erp") - && ObjectUtil.notEqual(table.getTemplateType(), CodegenTemplateTypeEnum.MASTER_ERP.getType())) { - return; - } - if (vmPath.contains("_inner") - && ObjectUtil.notEqual(table.getTemplateType(), CodegenTemplateTypeEnum.MASTER_INNER.getType())) { - return; - } - - // 逐个生成 - for (int i = 0; i < subTables.size(); i++) { - bindingMap.put("subIndex", i); - generateCode(result, vmPath, filePath, bindingMap); - } - bindingMap.remove("subIndex"); - } - - /** - * 格式化生成后的代码 - * - * 因为尽量让 vm 模版简单,所以统一的处理都在这个方法。 - * 如果不处理,Vue 的 Pretty 格式校验可能会报错 - * - * @param content 格式化前的代码 - * @param vmPath 模板路径 - * @return 格式化后的代码 - */ - private String prettyCode(String content, String vmPath) { - // Vue 界面:去除字段后面多余的 , 逗号,解决前端的 Pretty 代码格式检查的报错(需要排除 vben5、vue3_admin_uniapp) - if (!StrUtil.containsAny(vmPath, "vben5", "vue3_admin_uniapp")) { - content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }"); - } - // Vue 界面:去除多的 dateFormatter,只有一个的情况下,说明没使用到 - if (StrUtil.count(content, "dateFormatter") == 1) { - content = StrUtils.removeLineContains(content, "dateFormatter"); - } - // Vue2 界面:修正 $refs - if (StrUtil.count(content, "this.refs") >= 1) { - content = content.replace("this.refs", "this.$refs"); - } - // Vue 界面:去除多的 dict 相关,只有一个的情况下,说明没使用到 - if (StrUtil.count(content, "getIntDictOptions") == 1) { - content = content.replace("getIntDictOptions, ", ""); - } - if (StrUtil.count(content, "getStrDictOptions") == 1) { - content = content.replace("getStrDictOptions, ", ""); - } - if (StrUtil.count(content, "getBoolDictOptions") == 1) { - content = content.replace("getBoolDictOptions, ", ""); - } - if (StrUtil.count(content, "DICT_TYPE.") == 0) { - content = StrUtils.removeLineContains(content, "DICT_TYPE"); - } - return content; - } - - private Map initBindingMap(DbType dbType, CodegenTableDO table, List columns, - List subTables, List> subColumnsList) { - // 创建 bindingMap - Map bindingMap = new HashMap<>(globalBindingMap); - bindingMap.put("dbType", dbType); - bindingMap.put("table", table); - bindingMap.put("columns", columns); - bindingMap.put("primaryColumn", CollectionUtils.findFirst(columns, CodegenColumnDO::getPrimaryKey)); // 主键字段 - bindingMap.put("sceneEnum", CodegenSceneEnum.valueOf(table.getScene())); - // className 相关 - // 去掉指定前缀,将 TestDictType 转换成 DictType. 因为在 create 等方法后,不需要带上 Test 前缀 - String className = table.getClassName(); - String simpleClassName = equalsAnyIgnoreCase(table.getClassName(), table.getModuleName()) ? table.getClassName() - : removePrefix(table.getClassName(), upperFirst(table.getModuleName())); - String classNameVar = lowerFirst(simpleClassName); - bindingMap.put("simpleClassName", simpleClassName); - bindingMap.put("simpleClassName_underlineCase", toUnderlineCase(simpleClassName)); // 将 DictType 转换成 dict_type - bindingMap.put("classNameVar", classNameVar); // 将 DictType 转换成 dictType,用于变量 - // 将 DictType 转换成 dict-type - String simpleClassNameStrikeCase = toSymbolCase(simpleClassName, '-'); - bindingMap.put("simpleClassName_strikeCase", simpleClassNameStrikeCase); - // permission 前缀 - bindingMap.put("permissionPrefix", table.getModuleName() + ":" + simpleClassNameStrikeCase); - - // 特殊:树表专属逻辑 - if (CodegenTemplateTypeEnum.isTree(table.getTemplateType())) { - CodegenColumnDO treeParentColumn = CollUtil.findOne(columns, - column -> Objects.equals(column.getId(), table.getTreeParentColumnId())); - bindingMap.put("treeParentColumn", treeParentColumn); - bindingMap.put("treeParentColumn_javaField_underlineCase", toUnderlineCase(treeParentColumn.getJavaField())); - CodegenColumnDO treeNameColumn = CollUtil.findOne(columns, - column -> Objects.equals(column.getId(), table.getTreeNameColumnId())); - bindingMap.put("treeNameColumn", treeNameColumn); - bindingMap.put("treeNameColumn_javaField_underlineCase", toUnderlineCase(treeNameColumn.getJavaField())); - } - - // 特殊:主子表专属逻辑 - if (CollUtil.isNotEmpty(subTables)) { - // 创建 bindingMap - bindingMap.put("subTables", subTables); - bindingMap.put("subColumnsList", subColumnsList); - List subPrimaryColumns = new ArrayList<>(); - List subJoinColumns = new ArrayList<>(); - List subJoinColumnStrikeCases = new ArrayList<>(); - List subSimpleClassNames = new ArrayList<>(); - List subClassNameVars = new ArrayList<>(); - List simpleClassNameUnderlineCases = new ArrayList<>(); - List subSimpleClassNameStrikeCases = new ArrayList<>(); - for (int i = 0; i < subTables.size(); i++) { - CodegenTableDO subTable = subTables.get(i); - List subColumns = subColumnsList.get(i); - subPrimaryColumns.add(CollectionUtils.findFirst(subColumns, CodegenColumnDO::getPrimaryKey)); // - CodegenColumnDO subColumn = CollectionUtils.findFirst(subColumns, // 关联的字段 - column -> Objects.equals(column.getId(), subTable.getSubJoinColumnId())); - subJoinColumns.add(subColumn); - subJoinColumnStrikeCases.add(toSymbolCase(subColumn.getJavaField(), '-')); // 将 DictType 转换成 dict-type - // className 相关 - String subSimpleClassName = removePrefix(subTable.getClassName(), upperFirst(subTable.getModuleName())); - subSimpleClassNames.add(subSimpleClassName); - simpleClassNameUnderlineCases.add(toUnderlineCase(subSimpleClassName)); // 将 DictType 转换成 dict_type - subClassNameVars.add(lowerFirst(subSimpleClassName)); // 将 DictType 转换成 dictType,用于变量 - subSimpleClassNameStrikeCases.add(toSymbolCase(subSimpleClassName, '-')); // 将 DictType 转换成 dict-type - } - bindingMap.put("subPrimaryColumns", subPrimaryColumns); - bindingMap.put("subJoinColumns", subJoinColumns); - bindingMap.put("subJoinColumn_strikeCases", subJoinColumnStrikeCases); - bindingMap.put("subSimpleClassNames", subSimpleClassNames); - bindingMap.put("simpleClassNameUnderlineCases", simpleClassNameUnderlineCases); - bindingMap.put("subClassNameVars", subClassNameVars); - bindingMap.put("subSimpleClassName_strikeCases", subSimpleClassNameStrikeCases); - } - - // 多个 vm 公用的 VO 变量 - if (ObjectUtil.equal(codegenProperties.getVoType(), CodegenVOTypeEnum.VO.getType())) { - String prefixClass = CodegenSceneEnum.valueOf(table.getScene()).getPrefixClass(); - bindingMap.put("saveReqVOClass", prefixClass + className + "SaveReqVO"); - bindingMap.put("updateReqVOClass", prefixClass + className + "SaveReqVO"); - bindingMap.put("respVOClass", prefixClass + className + "RespVO"); - bindingMap.put("saveReqVOVar", "createReqVO"); - bindingMap.put("updateReqVOVar", "updateReqVO"); - } else if (ObjectUtil.equal(codegenProperties.getVoType(), CodegenVOTypeEnum.DO.getType())) { - bindingMap.put("saveReqVOClass", className + "DO"); - bindingMap.put("updateReqVOClass", className + "DO"); - bindingMap.put("respVOClass", className + "DO"); - bindingMap.put("saveReqVOVar", classNameVar); - bindingMap.put("updateReqVOVar", classNameVar); - } - return bindingMap; - } - - private Map getTemplates(Integer frontType) { - Map templates = new LinkedHashMap<>(); - templates.putAll(SERVER_TEMPLATES); - templates.putAll(FRONT_TEMPLATES.row(frontType)); - // 如果是 Boot 项目,则不使用 api/server 模块 - if (Boolean.FALSE.equals(cloudEnable)) { - SERVER_TEMPLATES.forEach((templatePath, filePath) -> { - filePath = StrUtil.replace(filePath, "/msgpush-module-${table.moduleName}-api", ""); - filePath = StrUtil.replace(filePath, "/msgpush-module-${table.moduleName}-server", ""); - templates.put(templatePath, filePath); - }); - } - // 如果禁用单元测试,则移除对应的模版 - if (Boolean.FALSE.equals(codegenProperties.getUnitTestEnable())) { - templates.remove(javaTemplatePath("test/serviceTest")); - templates.remove("codegen/sql/h2.vm"); - } - // 如果禁用 VO 类型,则移除对应的模版 - if (ObjectUtil.notEqual(codegenProperties.getVoType(), CodegenVOTypeEnum.VO.getType())) { - templates.remove(javaTemplatePath("controller/vo/respVO")); - templates.remove(javaTemplatePath("controller/vo/saveReqVO")); - } - return templates; - } - - @SuppressWarnings("unchecked") - private String formatFilePath(String filePath, Map bindingMap) { - filePath = StrUtil.replace(filePath, "${basePackage}", - getStr(bindingMap, "basePackage").replaceAll("\\.", "/")); - filePath = StrUtil.replace(filePath, "${classNameVar}", - getStr(bindingMap, "classNameVar")); - filePath = StrUtil.replace(filePath, "${simpleClassName}", - getStr(bindingMap, "simpleClassName")); - // sceneEnum 包含的字段 - CodegenSceneEnum sceneEnum = (CodegenSceneEnum) bindingMap.get("sceneEnum"); - filePath = StrUtil.replace(filePath, "${sceneEnum.prefixClass}", sceneEnum.getPrefixClass()); - filePath = StrUtil.replace(filePath, "${sceneEnum.basePackage}", sceneEnum.getBasePackage()); - // table 包含的字段 - CodegenTableDO table = (CodegenTableDO) bindingMap.get("table"); - filePath = StrUtil.replace(filePath, "${table.moduleName}", table.getModuleName()); - filePath = StrUtil.replace(filePath, "${table.businessName}", table.getBusinessName()); - filePath = StrUtil.replace(filePath, "${table.className}", table.getClassName()); - // 特殊:主子表专属逻辑 - Integer subIndex = (Integer) bindingMap.get("subIndex"); - if (subIndex != null) { - CodegenTableDO subTable = ((List) bindingMap.get("subTables")).get(subIndex); - filePath = StrUtil.replace(filePath, "${subTable.moduleName}", subTable.getModuleName()); - filePath = StrUtil.replace(filePath, "${subTable.businessName}", subTable.getBusinessName()); - filePath = StrUtil.replace(filePath, "${subTable.className}", subTable.getClassName()); - filePath = StrUtil.replace(filePath, "${subSimpleClassName}", - ((List) bindingMap.get("subSimpleClassNames")).get(subIndex)); - filePath = StrUtil.replace(filePath, "${subSimpleClassName_strikeCase}", - ((List) bindingMap.get("subSimpleClassName_strikeCases")).get(subIndex)); - } - return filePath; - } - - private static String javaTemplatePath(String path) { - return "codegen/java/" + path + ".vm"; - } - - private static String javaModuleImplVOFilePath(String path) { - return javaModuleFilePath("controller/${sceneEnum.basePackage}/${table.businessName}/" + - "vo/${sceneEnum.prefixClass}${table.className}" + path, "server", "main"); - } - - private static String javaModuleImplControllerFilePath() { - return javaModuleFilePath("controller/${sceneEnum.basePackage}/${table.businessName}/" + - "${sceneEnum.prefixClass}${table.className}Controller", "server", "main"); - } - - private static String javaModuleImplMainFilePath(String path) { - return javaModuleFilePath(path, "server", "main"); - } - - private static String javaModuleApiMainFilePath(String path) { - return javaModuleFilePath(path, "api", "main"); - } - - private static String javaModuleImplTestFilePath(String path) { - return javaModuleFilePath(path, "server", "test"); - } - - private static String javaModuleFilePath(String path, String module, String src) { - return "msgpush-module-${table.moduleName}/" + // 顶级模块 - "msgpush-module-${table.moduleName}-" + module + "/" + // 子模块 - "src/" + src + "/java/${basePackage}/module/${table.moduleName}/" + path + ".java"; - } - - private static String mapperXmlFilePath() { - return "msgpush-module-${table.moduleName}/" + // 顶级模块 - "msgpush-module-${table.moduleName}-server/" + // 子模块 - "src/main/resources/mapper/${table.businessName}/${table.className}Mapper.xml"; - } - - private static String vueTemplatePath(String path) { - return "codegen/vue/" + path + ".vm"; - } - - private static String vueFilePath(String path) { - return "msgpush-ui-${sceneEnum.basePackage}-vue2/" + // 顶级目录 - "src/" + path; - } - - private static String vue3TemplatePath(String path) { - return "codegen/vue3/" + path + ".vm"; - } - - private static String vue3FilePath(String path) { - return "msgpush-ui-${sceneEnum.basePackage}-vue3/" + // 顶级目录 - "src/" + path; - } - - private static String vue3AdminUniappTemplatePath(String path) { - return "codegen/vue3_admin_uniapp/" + path + ".vm"; - } - - private static String vue3UniappFilePath(String path) { - return "msgpush-ui-${sceneEnum.basePackage}-uniapp/" + // 顶级目录 - "src/" + path; - } - - private static String vue3VbenFilePath(String path) { - return "msgpush-ui-${sceneEnum.basePackage}-vben/" + // 顶级目录 - "src/" + path; - } - - private static String vue3VbenTemplatePath(String path) { - return "codegen/vue3_vben/" + path + ".vm"; - } - - private static String vue3Vben5AntdSchemaTemplatePath(String path) { - return "codegen/vue3_vben5_antd/schema/" + path + ".vm"; - } - - private static String vue3Vben5AntdGeneralTemplatePath(String path) { - return "codegen/vue3_vben5_antd/general/" + path + ".vm"; - } - - private static String vue3Vben5EpSchemaTemplatePath(String path) { - return "codegen/vue3_vben5_ele/schema/" + path + ".vm"; - } - - private static String vue3Vben5EpGeneralTemplatePath(String path) { - return "codegen/vue3_vben5_ele/general/" + path + ".vm"; - } - - private static boolean isSubTemplate(String path) { - return path.contains("_sub"); - } - - private static boolean isPageReqVOTemplate(String path) { - return path.contains("pageReqVO"); - } - - private static boolean isListReqVOTemplate(String path) { - return path.contains("listReqVO"); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DataSourceConfigService.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DataSourceConfigService.java deleted file mode 100644 index 4a3add8..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DataSourceConfigService.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.njcn.msgpush.module.infra.service.db; - -import com.njcn.msgpush.module.infra.controller.admin.db.vo.DataSourceConfigSaveReqVO; -import com.njcn.msgpush.module.infra.dal.dataobject.db.DataSourceConfigDO; -import jakarta.validation.Valid; - -import java.util.List; - -/** - * 数据源配置 Service 接口 - * - * @author hongawen - */ -public interface DataSourceConfigService { - - /** - * 创建数据源配置 - * - * @param createReqVO 创建信息 - * @return 编号 - */ - Long createDataSourceConfig(@Valid DataSourceConfigSaveReqVO createReqVO); - - /** - * 更新数据源配置 - * - * @param updateReqVO 更新信息 - */ - void updateDataSourceConfig(@Valid DataSourceConfigSaveReqVO updateReqVO); - - /** - * 删除数据源配置 - * - * @param id 编号 - */ - void deleteDataSourceConfig(Long id); - - /** - * 批量删除数据源配置 - * - * @param ids 编号列表 - */ - void deleteDataSourceConfigList(List ids); - - /** - * 获得数据源配置 - * - * @param id 编号 - * @return 数据源配置 - */ - DataSourceConfigDO getDataSourceConfig(Long id); - - /** - * 获得数据源配置列表 - * - * @return 数据源配置列表 - */ - List getDataSourceConfigList(); - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DataSourceConfigServiceImpl.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DataSourceConfigServiceImpl.java deleted file mode 100644 index 80ce9d3..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DataSourceConfigServiceImpl.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.njcn.msgpush.module.infra.service.db; - -import com.njcn.msgpush.framework.common.util.object.BeanUtils; -import com.njcn.msgpush.framework.mybatis.core.util.JdbcUtils; -import com.njcn.msgpush.module.infra.controller.admin.db.vo.DataSourceConfigSaveReqVO; -import com.njcn.msgpush.module.infra.dal.dataobject.db.DataSourceConfigDO; -import com.njcn.msgpush.module.infra.dal.mysql.db.DataSourceConfigMapper; -import com.baomidou.dynamic.datasource.creator.DataSourceProperty; -import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceProperties; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; -import org.springframework.validation.annotation.Validated; - -import java.util.List; -import java.util.Objects; - -import static com.njcn.msgpush.framework.common.exception.util.ServiceExceptionUtil.exception; -import static com.njcn.msgpush.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_EXISTS; -import static com.njcn.msgpush.module.infra.enums.ErrorCodeConstants.DATA_SOURCE_CONFIG_NOT_OK; - -/** - * 数据源配置 Service 实现类 - * - * @author hongawen - */ -@Service -@Validated -public class DataSourceConfigServiceImpl implements DataSourceConfigService { - - @Resource - private DataSourceConfigMapper dataSourceConfigMapper; - - @Resource - private DynamicDataSourceProperties dynamicDataSourceProperties; - - @Override - public Long createDataSourceConfig(DataSourceConfigSaveReqVO createReqVO) { - DataSourceConfigDO config = BeanUtils.toBean(createReqVO, DataSourceConfigDO.class); - validateConnectionOK(config); - - // 插入 - dataSourceConfigMapper.insert(config); - // 返回 - return config.getId(); - } - - @Override - public void updateDataSourceConfig(DataSourceConfigSaveReqVO updateReqVO) { - // 校验存在 - validateDataSourceConfigExists(updateReqVO.getId()); - DataSourceConfigDO updateObj = BeanUtils.toBean(updateReqVO, DataSourceConfigDO.class); - validateConnectionOK(updateObj); - - // 更新 - dataSourceConfigMapper.updateById(updateObj); - } - - @Override - public void deleteDataSourceConfig(Long id) { - // 校验存在 - validateDataSourceConfigExists(id); - // 删除 - dataSourceConfigMapper.deleteById(id); - } - - @Override - public void deleteDataSourceConfigList(List ids) { - dataSourceConfigMapper.deleteByIds(ids); - } - - private void validateDataSourceConfigExists(Long id) { - if (dataSourceConfigMapper.selectById(id) == null) { - throw exception(DATA_SOURCE_CONFIG_NOT_EXISTS); - } - } - - @Override - public DataSourceConfigDO getDataSourceConfig(Long id) { - // 如果 id 为 0,默认为 master 的数据源 - if (Objects.equals(id, DataSourceConfigDO.ID_MASTER)) { - return buildMasterDataSourceConfig(); - } - // 从 DB 中读取 - return dataSourceConfigMapper.selectById(id); - } - - @Override - public List getDataSourceConfigList() { - List result = dataSourceConfigMapper.selectList(); - // 补充 master 数据源 - result.add(0, buildMasterDataSourceConfig()); - return result; - } - - private void validateConnectionOK(DataSourceConfigDO config) { - boolean success = JdbcUtils.isConnectionOK(config.getUrl(), config.getUsername(), config.getPassword()); - if (!success) { - throw exception(DATA_SOURCE_CONFIG_NOT_OK); - } - } - - private DataSourceConfigDO buildMasterDataSourceConfig() { - String primary = dynamicDataSourceProperties.getPrimary(); - DataSourceProperty dataSourceProperty = dynamicDataSourceProperties.getDatasource().get(primary); - return new DataSourceConfigDO().setId(DataSourceConfigDO.ID_MASTER).setName(primary) - .setUrl(dataSourceProperty.getUrl()) - .setUsername(dataSourceProperty.getUsername()) - .setPassword(dataSourceProperty.getPassword()); - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DatabaseTableService.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DatabaseTableService.java deleted file mode 100644 index 89053fd..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DatabaseTableService.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.njcn.msgpush.module.infra.service.db; - -import com.baomidou.mybatisplus.generator.config.po.TableInfo; - -import java.util.List; - -/** - * 数据库表 Service - * - * @author hongawen - */ -public interface DatabaseTableService { - - /** - * 获得表列表,基于表名称 + 表描述进行模糊匹配 - * - * @param dataSourceConfigId 数据源配置的编号 - * @param nameLike 表名称,模糊匹配 - * @param commentLike 表描述,模糊匹配 - * @return 表列表 - */ - List getTableList(Long dataSourceConfigId, String nameLike, String commentLike); - - /** - * 获得指定表名 - * - * @param dataSourceConfigId 数据源配置的编号 - * @param tableName 表名称 - * @return 表 - */ - TableInfo getTable(Long dataSourceConfigId, String tableName); - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DatabaseTableServiceImpl.java b/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DatabaseTableServiceImpl.java deleted file mode 100644 index 1c0fe9f..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/java/com/njcn/msgpush/module/infra/service/db/DatabaseTableServiceImpl.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.njcn.msgpush.module.infra.service.db; - -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.lang.Assert; -import cn.hutool.core.util.StrUtil; -import com.njcn.msgpush.framework.mybatis.core.util.JdbcUtils; -import com.njcn.msgpush.module.infra.dal.dataobject.db.DataSourceConfigDO; -import com.baomidou.mybatisplus.generator.config.DataSourceConfig; -import com.baomidou.mybatisplus.generator.config.GlobalConfig; -import com.baomidou.mybatisplus.generator.config.StrategyConfig; -import com.baomidou.mybatisplus.generator.config.builder.ConfigBuilder; -import com.baomidou.mybatisplus.generator.config.po.TableInfo; -import com.baomidou.mybatisplus.generator.config.rules.DateType; -import com.baomidou.mybatisplus.generator.query.SQLQuery; -import jakarta.annotation.Resource; -import org.springframework.stereotype.Service; - -import java.util.Comparator; -import java.util.List; -import java.util.stream.Collectors; - -/** - * 数据库表 Service 实现类 - * - * @author hongawen - */ -@Service -public class DatabaseTableServiceImpl implements DatabaseTableService { - - @Resource - private DataSourceConfigService dataSourceConfigService; - - @Override - public List getTableList(Long dataSourceConfigId, String nameLike, String commentLike) { - List tables = getTableList0(dataSourceConfigId, null); - return tables.stream().filter(tableInfo -> (StrUtil.isEmpty(nameLike) || tableInfo.getName().contains(nameLike)) - && (StrUtil.isEmpty(commentLike) || tableInfo.getComment().contains(commentLike))) - .collect(Collectors.toList()); - } - - @Override - public TableInfo getTable(Long dataSourceConfigId, String name) { - return CollUtil.getFirst(getTableList0(dataSourceConfigId, name)); - } - - private List getTableList0(Long dataSourceConfigId, String name) { - // 获得数据源配置 - DataSourceConfigDO config = dataSourceConfigService.getDataSourceConfig(dataSourceConfigId); - Assert.notNull(config, "数据源({}) 不存在!", dataSourceConfigId); - - // 使用 MyBatis Plus Generator 解析表结构 - DataSourceConfig.Builder dataSourceConfigBuilder = new DataSourceConfig.Builder(config.getUrl(), config.getUsername(), - config.getPassword()); - if (JdbcUtils.isSQLServer(config.getUrl())) { // 特殊:SQLServer jdbc 非标准,参见 https://github.com/baomidou/mybatis-plus/issues/5419 - dataSourceConfigBuilder.databaseQueryClass(SQLQuery.class); - } - StrategyConfig.Builder strategyConfig = new StrategyConfig.Builder().enableSkipView(); // 忽略视图,业务上一般用不到 - if (StrUtil.isNotEmpty(name)) { - strategyConfig.addInclude(name); - } else { - // 移除工作流和定时任务前缀的表名 - strategyConfig.addExclude("ACT_[\\S\\s]+|QRTZ_[\\S\\s]+|FLW_[\\S\\s]+"); - // 移除 ORACLE 相关的系统表 - strategyConfig.addExclude("IMPDP_[\\S\\s]+|ALL_[\\S\\s]+|HS_[\\S\\\\s]+"); - strategyConfig.addExclude("[\\S\\s]+\\$[\\S\\s]+|[\\S\\s]+\\$"); // 表里不能有 $,一般有都是系统的表 - } - - GlobalConfig globalConfig = new GlobalConfig.Builder().dateType(DateType.TIME_PACK).build(); // 只使用 LocalDateTime 类型,不使用 LocalDate - ConfigBuilder builder = new ConfigBuilder(null, dataSourceConfigBuilder.build(), strategyConfig.build(), - null, globalConfig, null); - // 按照名字排序 - List tables = builder.getTableInfoList(); - tables.sort(Comparator.comparing(TableInfo::getName)); - return tables; - } - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application-dev.yaml b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application-dev.yaml deleted file mode 100644 index 3617d0e..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application-dev.yaml +++ /dev/null @@ -1,89 +0,0 @@ ---- #################### 注册中心 + 配置中心相关配置 #################### - -spring: - cloud: - nacos: - server-addr: 192.168.1.103:18848 # Nacos 服务器地址 - username: # Nacos 账号 - password: # Nacos 密码 - discovery: # 【配置中心】配置项 - namespace: dev # 命名空间。这里使用 dev 开发环境 - group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP - metadata: - version: 1.0.0 # 服务实例的版本号,可用于灰度发布 - config: # 【注册中心】配置项 - namespace: dev # 命名空间。这里使用 dev 开发环境 - group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP - ---- #################### 数据库相关配置 #################### -spring: - # 数据源配置项 - autoconfigure: - exclude: - datasource: - druid: # Druid 【监控】相关的全局配置 - web-stat-filter: - enabled: true - stat-view-servlet: - enabled: true - allow: # 设置白名单,不填则允许所有访问 - url-pattern: /druid/* - login-username: # 控制台管理用户名和密码 - login-password: - filter: - stat: - enabled: true - log-slow-sql: true # 慢 SQL 记录 - slow-sql-millis: 100 - merge-sql: true - wall: - config: - multi-statement-allow: true - dynamic: # 多数据源配置 - druid: # Druid 【连接池】相关的全局配置 - initial-size: 5 # 初始连接数 - min-idle: 10 # 最小连接池数量 - max-active: 20 # 最大连接池数量 - max-wait: 60000 # 配置获取连接等待超时的时间,单位:毫秒(1 分钟) - time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒(1 分钟) - min-evictable-idle-time-millis: 600000 # 配置一个连接在池中最小生存的时间,单位:毫秒(10 分钟) - max-evictable-idle-time-millis: 1800000 # 配置一个连接在池中最大生存的时间,单位:毫秒(30 分钟) - validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效 - test-while-idle: true - test-on-borrow: false - test-on-return: false - pool-prepared-statements: true # 是否开启 PreparedStatement 缓存 - max-pool-prepared-statement-per-connection-size: 20 # 每个连接缓存的 PreparedStatement 数量 - primary: master - datasource: - master: - url: jdbc:mysql://192.168.1.22:13306/msgpush?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 - username: root - password: njcnpqs - - - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 - data: - redis: - host: 127.0.0.1 # 地址 - port: 16379 # 端口 - database: 1 # 数据库索引 -# password: njcnpqs # 密码,建议生产环境开启 - - ---- #################### 监控相关配置 #################### - -# Actuator 监控端点的配置项 -management: - endpoints: - web: - base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - - ---- #################### 灿能相关配置 #################### - -# 灿能配置项,设置当前项目所有自定义的配置 -msgpush: - demo: true # 开启演示模式 diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application-local.yaml b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application-local.yaml deleted file mode 100644 index 33985c3..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application-local.yaml +++ /dev/null @@ -1,103 +0,0 @@ ---- #################### 注册中心 + 配置中心相关配置 #################### - -spring: - cloud: - nacos: - server-addr: 192.168.1.103:18848 # Nacos 服务器地址 - username: # Nacos 账号 - password: # Nacos 密码 - discovery: # 【配置中心】配置项 - namespace: dev # 命名空间。这里使用 dev 开发环境 - group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP - metadata: - version: 1.0.0 # 服务实例的版本号,可用于灰度发布 - config: # 【注册中心】配置项 - namespace: dev # 命名空间。这里使用 dev 开发环境 - group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP - ---- #################### 数据库相关配置 #################### -spring: - - # 数据源配置项 - autoconfigure: - exclude: - datasource: - druid: # Druid 【监控】相关的全局配置 - web-stat-filter: - enabled: true - stat-view-servlet: - enabled: true - allow: # 设置白名单,不填则允许所有访问 - url-pattern: /druid/* - login-username: # 控制台管理用户名和密码 - login-password: - filter: - stat: - enabled: true - log-slow-sql: true # 慢 SQL 记录 - slow-sql-millis: 100 - merge-sql: true - wall: - config: - multi-statement-allow: true - dynamic: # 多数据源配置 - druid: # Druid 【连接池】相关的全局配置 - initial-size: 1 # 初始连接数 - min-idle: 1 # 最小连接池数量 - max-active: 20 # 最大连接池数量 - max-wait: 60000 # 配置获取连接等待超时的时间,单位:毫秒(1 分钟) - time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒(1 分钟) - min-evictable-idle-time-millis: 600000 # 配置一个连接在池中最小生存的时间,单位:毫秒(10 分钟) - max-evictable-idle-time-millis: 1800000 # 配置一个连接在池中最大生存的时间,单位:毫秒(30 分钟) - validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效 - test-while-idle: true - test-on-borrow: false - test-on-return: false - pool-prepared-statements: true # 是否开启 PreparedStatement 缓存 - max-pool-prepared-statement-per-connection-size: 20 # 每个连接缓存的 PreparedStatement 数量 - primary: master - datasource: - master: - url: jdbc:mysql://192.168.1.22:13306/msgpush?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例 - username: root - password: njcnpqs - - - # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优 - data: - redis: - host: 127.0.0.1 # 地址 - port: 16379 # 端口 - database: 0 # 数据库索引 -# password: njcnpqs # 密码,建议生产环境开启 - ---- #################### 监控相关配置 #################### - -# Actuator 监控端点的配置项 -management: - endpoints: - web: - base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - - -# 日志文件配置 -logging: - level: - # 配置自己写的 MyBatis Mapper 打印日志 - com.njcn.msgpush.module.infra.dal.mysql: debug - com.njcn.msgpush.module.infra.dal.mysql.logger.ApiErrorLogMapper: INFO # 配置 ApiErrorLogMapper 的日志级别为 info,避免和 GlobalExceptionHandler 重复打印 - com.njcn.msgpush.module.infra.dal.mysql.file.FileConfigMapper: INFO # 配置 FileConfigMapper 的日志级别为 info - org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 芋艿:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示 - ---- #################### 灿能相关配置 #################### - -# 灿能配置项,设置当前项目所有自定义的配置 -msgpush: - env: # 多环境的配置项 - tag: ${HOSTNAME} - security: - mock-enable: true - access-log: # 访问日志的配置项 - enable: true \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application.yaml b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application.yaml deleted file mode 100644 index f799958..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/application.yaml +++ /dev/null @@ -1,111 +0,0 @@ -spring: - application: - name: infra-server - profiles: - active: local - main: - allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。 - allow-bean-definition-overriding: true # 允许 Bean 覆盖,例如说 Feign 等会存在重复定义的服务 - config: - import: - - optional:classpath:application-${spring.profiles.active}.yaml # 加载【本地】配置 - - optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 加载【Nacos】的配置 - # Servlet 配置 - servlet: - # 文件上传相关配置项 - multipart: - max-file-size: 16MB # 单个文件大小 - max-request-size: 32MB # 设置总上传的文件大小 - # Jackson 配置项 - jackson: - serialization: - write-dates-as-timestamps: true # 设置 LocalDateTime 的格式,使用时间戳 - write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401 - write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳 - fail-on-empty-beans: false # 允许序列化无属性的 Bean - # Cache 配置项 - cache: - type: REDIS - redis: - time-to-live: 1h # 设置过期时间为 1 小时 - data: - redis: - repositories: - enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度 - -server: - port: 48082 - -logging: - file: - name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径 - ---- #################### 接口文档配置 #################### - -springdoc: - api-docs: - enabled: true # 1. 是否开启 Swagger 接文档的元数据 - path: /v3/api-docs - swagger-ui: - enabled: true # 2.1 是否开启 Swagger 文档的官方 UI 界面 - path: /swagger-ui - default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档 -knife4j: - enable: true - setting: - language: zh_cn - -# MyBatis Plus 的配置项 -mybatis-plus: - configuration: - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - global-config: - db-config: - id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。 - # id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库 - # id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库 - # id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解 - logic-delete-value: 1 # 逻辑已删除值(默认为 1) - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - banner: false # 关闭控制台的 Banner 打印 - type-aliases-package: ${msgpush.info.base-package}.dal.dataobject - encryptor: - password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成 - -mybatis-plus-join: - banner: false # 关闭控制台的 Banner 打印 - -# VO 转换(数据翻译)相关 -easy-trans: - is-enable-global: false # 【默认禁用,对性能确认压力大】启用全局翻译(拦截所有 SpringMVC ResponseBody 进行自动翻译 )。如果对于性能要求很高可关闭此配置,或通过 @IgnoreTrans 忽略某个接口 - - - -msgpush: - info: - version: 1.0.0 - base-package: com.njcn.msgpush.module.infra - web: - admin-ui: - url: http://localhost # Admin 管理后台 UI 的地址 - xss: - enable: false - exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系 - - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求 - websocket: - enable: true # websocket的开关 - path: /infra/ws # 路径 - sender-type: local - swagger: - title: 管理后台 - description: 提供管理员管理的所有功能 - version: ${msgpush.info.version} - codegen: - base-package: com.njcn.msgpush - db-schemas: ${spring.datasource.dynamic.datasource.master.name} - front-type: 20 # 前端模版的类型,参见 CodegenFrontTypeEnum 枚举类 - vo-type: 10 # VO 的类型,参见 CodegenVOTypeEnum 枚举类 - delete-batch-enable: true # 是否生成批量删除接口 - unit-test-enable: false # 是否生成单元测试 - -debug: false diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/controller.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/controller.vm deleted file mode 100644 index 9f63e24..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/controller.vm +++ /dev/null @@ -1,271 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}; - -import org.springframework.web.bind.annotation.*; -import ${jakartaPackage}.annotation.Resource; -import org.springframework.validation.annotation.Validated; -#if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end - -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.Operation; - -import ${jakartaPackage}.validation.constraints.*; -import ${jakartaPackage}.validation.*; -import ${jakartaPackage}.servlet.http.*; -import java.util.*; -import java.io.IOException; - -import ${PageParamClassName}; -import ${PageResultClassName}; -import ${CommonResultClassName}; -import ${BeanUtils}; -import static ${CommonResultClassName}.success; - -import ${ExcelUtilsClassName}; - -import ${ApiAccessLogClassName}; -import static ${OperateTypeEnumClassName}.*; - -import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; -import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; -#end -import ${basePackage}.module.${table.moduleName}.service.${table.businessName}.${table.className}Service; - -@Tag(name = "${sceneEnum.name} - ${table.classComment}") -@RestController -##二级的 businessName 暂时不算在 HTTP 路径上,可以根据需要写 -@RequestMapping("/${table.moduleName}/${simpleClassName_strikeCase}") -@Validated -public class ${sceneEnum.prefixClass}${table.className}Controller { - - @Resource - private ${table.className}Service ${classNameVar}Service; - - @PostMapping("/create") - @Operation(summary = "创建${table.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')") -#end - public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${saveReqVOClass} ${saveReqVOVar}) { - return success(${classNameVar}Service.create${simpleClassName}(${saveReqVOVar})); - } - - @PutMapping("/update") - @Operation(summary = "更新${table.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')") -#end - public CommonResult update${simpleClassName}(@Valid @RequestBody ${updateReqVOClass} ${updateReqVOVar}) { - ${classNameVar}Service.update${simpleClassName}(${updateReqVOVar}); - return success(true); - } - - @DeleteMapping("/delete") - @Operation(summary = "删除${table.classComment}") - @Parameter(name = "id", description = "编号", required = true) -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") -#end - public CommonResult delete${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { - ${classNameVar}Service.delete${simpleClassName}(id); - return success(true); - } - -#if ( $table.templateType != 2 && $deleteBatchEnable) - @DeleteMapping("/delete-list") - @Parameter(name = "ids", description = "编号", required = true) - @Operation(summary = "批量删除${table.classComment}") - #if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") - #end - public CommonResult delete${simpleClassName}List(@RequestParam("ids") List<${primaryColumn.javaType}> ids) { - ${classNameVar}Service.delete${simpleClassName}ListByIds(ids); - return success(true); - } -#end - - @GetMapping("/get") - @Operation(summary = "获得${table.classComment}") - @Parameter(name = "id", description = "编号", required = true, example = "1024") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult<${respVOClass}> get${simpleClassName}(@RequestParam("id") ${primaryColumn.javaType} id) { - ${table.className}DO ${classNameVar} = ${classNameVar}Service.get${simpleClassName}(id); -#if ($voType == 10) - return success(BeanUtils.toBean(${classNameVar}, ${respVOClass}.class)); -#else - return success(${classNameVar}); -#end - } - -#if ( $table.templateType != 2 ) - @GetMapping("/page") - @Operation(summary = "获得${table.classComment}分页") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult> get${simpleClassName}Page(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { - PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO); -#if ($voType == 10) - return success(BeanUtils.toBean(pageResult, ${respVOClass}.class)); -#else - return success(pageResult); -#end - } - -## 特殊:树表专属逻辑(树不需要分页接口) -#else - @GetMapping("/list") - @Operation(summary = "获得${table.classComment}列表") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult> get${simpleClassName}List(@Valid ${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) { - List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(listReqVO); -#if ($voType == 10) - return success(BeanUtils.toBean(list, ${respVOClass}.class)); -#else - return success(list); -#end - } - -#end - @GetMapping("/export-excel") - @Operation(summary = "导出${table.classComment} Excel") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')") -#end - @ApiAccessLog(operateType = EXPORT) -#if ( $table.templateType != 2 ) - public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO, - HttpServletResponse response) throws IOException { - pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE); - List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}Page(pageReqVO).getList(); - // 导出 Excel - ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${respVOClass}.class, - BeanUtils.toBean(list, ${respVOClass}.class)); - } -## 特殊:树表专属逻辑(树不需要分页接口) -#else - public void export${simpleClassName}Excel(@Valid ${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO, - HttpServletResponse response) throws IOException { - List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(listReqVO); - // 导出 Excel - ExcelUtils.write(response, "${table.classComment}.xls", "数据", ${table.className}RespVO.class, - BeanUtils.toBean(list, ${table.className}RespVO.class)); - } -#end - -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 -#set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) -#set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) -#set ($subClassNameVar = $subClassNameVars.get($index)) - // ==================== 子表($subTable.classComment) ==================== - -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) - @GetMapping("/${subSimpleClassName_strikeCase}/page") - @Operation(summary = "获得${subTable.classComment}分页") - @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult> get${subSimpleClassName}Page(PageParam pageReqVO, - @RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return success(${classNameVar}Service.get${subSimpleClassName}Page(pageReqVO, ${subJoinColumn.javaField})); - } - -## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else - #if ( $subTable.subJoinMany ) - @GetMapping("/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}") - @Operation(summary = "获得${subTable.classComment}列表") - @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult> get${subSimpleClassName}ListBy${SubJoinColumnName}(@RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return success(${classNameVar}Service.get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField})); - } - - #else - @GetMapping("/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}") - @Operation(summary = "获得${subTable.classComment}") - @Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult<${subTable.className}DO> get${subSimpleClassName}By${SubJoinColumnName}(@RequestParam("${subJoinColumn.javaField}") ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return success(${classNameVar}Service.get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField})); - } - - #end -#end -## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 -#if ( $table.templateType == 11 ) - @PostMapping("/${subSimpleClassName_strikeCase}/create") - @Operation(summary = "创建${subTable.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')") -#end - public CommonResult<${subPrimaryColumn.javaType}> create${subSimpleClassName}(@Valid @RequestBody ${subTable.className}DO ${subClassNameVar}) { - return success(${classNameVar}Service.create${subSimpleClassName}(${subClassNameVar})); - } - - @PutMapping("/${subSimpleClassName_strikeCase}/update") - @Operation(summary = "更新${subTable.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')") -#end - public CommonResult update${subSimpleClassName}(@Valid @RequestBody ${subTable.className}DO ${subClassNameVar}) { - ${classNameVar}Service.update${subSimpleClassName}(${subClassNameVar}); - return success(true); - } - - @DeleteMapping("/${subSimpleClassName_strikeCase}/delete") - @Parameter(name = "id", description = "编号", required = true) - @Operation(summary = "删除${subTable.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") -#end - public CommonResult delete${subSimpleClassName}(@RequestParam("id") ${subPrimaryColumn.javaType} id) { - ${classNameVar}Service.delete${subSimpleClassName}(id); - return success(true); - } - -#if ($deleteBatchEnable) - @DeleteMapping("/${subSimpleClassName_strikeCase}/delete-list") - @Parameter(name = "ids", description = "编号", required = true) - @Operation(summary = "批量删除${subTable.classComment}") -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')") -#end - public CommonResult delete${subSimpleClassName}List(@RequestParam("ids") List<${subPrimaryColumn.javaType}> ids) { - ${classNameVar}Service.delete${subSimpleClassName}ListByIds(ids); - return success(true); - } -#end - - @GetMapping("/${subSimpleClassName_strikeCase}/get") - @Operation(summary = "获得${subTable.classComment}") - @Parameter(name = "id", description = "编号", required = true) -#if ($sceneEnum.scene == 1) - @PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')") -#end - public CommonResult<${subTable.className}DO> get${subSimpleClassName}(@RequestParam("id") ${subPrimaryColumn.javaType} id) { - return success(${classNameVar}Service.get${subSimpleClassName}(id)); - } - -#end -#end -} \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/listReqVO.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/listReqVO.vm deleted file mode 100644 index 46b6a25..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/listReqVO.vm +++ /dev/null @@ -1,45 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; - -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; -import ${PageParamClassName}; -#foreach ($column in $columns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#break -#end -#end -## 处理 LocalDateTime 字段的引入 -#foreach ($column in $columns) -#if (${column.listOperation} && ${column.javaType} == "LocalDateTime") -import java.time.LocalDateTime; -import org.springframework.format.annotation.DateTimeFormat; - -import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -#break -#end -#end -## 字段模板 -#macro(columnTpl $prefix $prefixStr) - @Schema(description = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) - private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; -#end - -@Schema(description = "${sceneEnum.name} - ${table.classComment}列表 Request VO") -@Data -public class ${sceneEnum.prefixClass}${table.className}ListReqVO { - -#foreach ($column in $columns) -#if (${column.listOperation})##查询操作 -#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 - @Schema(description = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private ${column.javaType}[] ${column.javaField}; -#else##情况二,非 Between 的时间 - #columnTpl('', '') -#end - -#end -#end -} \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/pageReqVO.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/pageReqVO.vm deleted file mode 100644 index d0367a3..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/pageReqVO.vm +++ /dev/null @@ -1,45 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; - -import lombok.*; -import java.util.*; -import io.swagger.v3.oas.annotations.media.Schema; -import ${PageParamClassName}; -#foreach ($column in $columns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#break -#end -#end -## 处理 LocalDateTime 字段的引入 -#foreach ($column in $columns) -#if (${column.listOperationCondition} && ${column.javaType} == "LocalDateTime") -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; - -import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND; -#break -#end -#end -## 字段模板 -#macro(columnTpl $prefix $prefixStr) - @Schema(description = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) - private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end; -#end - -@Schema(description = "${sceneEnum.name} - ${table.classComment}分页 Request VO") -@Data -public class ${sceneEnum.prefixClass}${table.className}PageReqVO extends PageParam { - -#foreach ($column in $columns) -#if (${column.listOperation})##查询操作 -#if (${column.listOperationCondition} == "BETWEEN")## 情况一,Between 的时候 - @Schema(description = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end) - @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND) - private ${column.javaType}[] ${column.javaField}; -#else##情况二,非 Between 的时间 - #columnTpl('', '') -#end - -#end -#end -} \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/respVO.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/respVO.vm deleted file mode 100644 index eae083a..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/respVO.vm +++ /dev/null @@ -1,53 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -## 处理 BigDecimal 字段的引入 -#foreach ($column in $columns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#break -#end -#end -## 处理 LocalDateTime 字段的引入 -#foreach ($column in $columns) -#if (${column.listOperationResult} && ${column.javaType} == "LocalDateTime") -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; -#break -#end -#end -## 处理 Excel 导出 -import cn.idev.excel.annotation.*; -#foreach ($column in $columns) -#if ("$!column.dictType" != "")## 有设置数据字典 -import ${DictFormatClassName}; -import ${DictConvertClassName}; -#break -#end -#end - -@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO") -@Data -@ExcelIgnoreUnannotated -public class ${sceneEnum.prefixClass}${table.className}RespVO { - -## 逐个处理字段 -#foreach ($column in $columns) -#if (${column.listOperationResult}) -## 1. 处理 Swagger 注解 - @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) -## 2. 处理 Excel 导出 -#if ("$!column.dictType" != "")##处理枚举值 - @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class) - @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 -#else - @ExcelProperty("${column.columnComment}") -#end -## 3. 处理字段定义 - private ${column.javaType} ${column.javaField}; - -#end -#end -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/saveReqVO.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/saveReqVO.vm deleted file mode 100644 index b432c75..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/controller/vo/saveReqVO.vm +++ /dev/null @@ -1,64 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.*; -import java.util.*; -import ${jakartaPackage}.validation.constraints.*; -## 处理 BigDecimal 字段的引入 -#foreach ($column in $columns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#break -#end -#end -## 处理 LocalDateTime 字段的引入 -#foreach ($column in $columns) -#if ((${column.createOperation} || ${column.updateOperation}) && ${column.javaType} == "LocalDateTime") -import org.springframework.format.annotation.DateTimeFormat; -import java.time.LocalDateTime; -#break -#end -#end -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; -#end - -@Schema(description = "${sceneEnum.name} - ${table.classComment}新增/修改 Request VO") -@Data -public class ${sceneEnum.prefixClass}${table.className}SaveReqVO { - -## 逐个处理字段 -#foreach ($column in $columns) -#if (${column.createOperation} || ${column.updateOperation}) -## 1. 处理 Swagger 注解 - @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) -## 2. 处理 Validator 参数校验 -#if (!${column.nullable} && !${column.primaryKey}) -#if (${column.javaType} == 'String') - @NotEmpty(message = "${column.columnComment}不能为空") -#else - @NotNull(message = "${column.columnComment}不能为空") -#end -#end -## 3. 处理字段定义 - private ${column.javaType} ${column.javaField}; - -#end -#end -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) - #if ( $subTable.subJoinMany) - @Schema(description = "${subTable.classComment}列表") - private List<${subTable.className}DO> ${subClassNameVars.get($index)}s; - - #else - @Schema(description = "${subTable.classComment}") - private ${subTable.className}DO ${subClassNameVars.get($index)}; - - #end -#end -#end -} \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/do.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/do.vm deleted file mode 100644 index f15ada4..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/do.vm +++ /dev/null @@ -1,103 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}; - -import lombok.*; -import java.util.*; -#foreach ($column in $columns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#end -#if (${column.javaType} == "LocalDateTime") -import java.time.LocalDateTime; -#end -#end -import com.baomidou.mybatisplus.annotation.*; -import ${BaseDOClassName}; -## 处理 Excel 导出 + Schema 注解(仅 DO 模式) -#if ($voType == 20) -import io.swagger.v3.oas.annotations.media.Schema; -import cn.idev.excel.annotation.*; -#foreach ($column in $columns) - #if ("$!column.dictType" != "")## 有设置数据字典 - import ${DictFormatClassName}; - import ${DictConvertClassName}; - #break - #end -#end -#end - -/** - * ${table.classComment} DO - * - * @author ${table.author} - */ -@TableName("${table.tableName.toLowerCase()}") -@KeySequence("${table.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -## 处理 Excel 导出 + Schema 注解(仅 DO 模式) -#if ($voType == 20) -@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO") -@ExcelIgnoreUnannotated -#end -public class ${table.className}DO extends BaseDO { - -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) - public static final Long ${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT = 0L; - -#end -#foreach ($column in $columns) -#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段 - /** - * ${column.columnComment} - #if ("$!column.dictType" != "")##处理枚举值 - * - * 枚举 {@link TODO ${column.dictType} 对应的类} - #end - */ - #if (${column.primaryKey})##处理主键 - @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end - #end -#if ($voType == 20) -## 1. 处理 Swagger 注解 - @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) -## 2. 处理 Excel 导出 -#if ("$!column.dictType" != "")##处理枚举值 - @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class) - @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中 -#else - @ExcelProperty("${column.columnComment}") -#end -#end -## 3. 处理字段定义 - private ${column.javaType} ${column.javaField}; -#end -#end - -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $voType == 20 && $subTables && $subTables.size() > 0 && $table.templateType != 11 ) - #foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #if ( $subTable.subJoinMany) - /** - * ${subTable.classComment}列表 - */ - @Schema(description = "${subTable.classComment}列表") - @TableField(exist = false) - private List<${subTable.className}DO> ${subClassNameVars.get($index)}s; - #else - /** - * ${subTable.classComment} - */ - @Schema(description = "${subTable.classComment}") - @TableField(exist = false) - private ${subTable.className}DO ${subClassNameVars.get($index)}; - #end - #end -#end - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/do_sub.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/do_sub.vm deleted file mode 100644 index 0dfc38f..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/do_sub.vm +++ /dev/null @@ -1,69 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -package ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}; - -import lombok.*; -import java.util.*; -#foreach ($column in $subColumns) -#if (${column.javaType} == "BigDecimal") -import java.math.BigDecimal; -#end -#if (${column.javaType} == "LocalDateTime") -import java.time.LocalDateTime; -#end -#end -import com.baomidou.mybatisplus.annotation.*; -import ${BaseDOClassName}; -## 处理 Schema 注解(仅 DO 模式) -#if ($voType == 20) -import io.swagger.v3.oas.annotations.media.Schema; -#foreach ($column in $columns) - #if ("$!column.dictType" != "")## 有设置数据字典 - import ${DictFormatClassName}; - import ${DictConvertClassName}; - #break - #end -#end -#end - -/** - * ${subTable.classComment} DO - * - * @author ${subTable.author} - */ -@TableName("${subTable.tableName.toLowerCase()}") -@KeySequence("${subTable.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。 -@Data -@EqualsAndHashCode(callSuper = true) -@ToString(callSuper = true) -@Builder -@NoArgsConstructor -@AllArgsConstructor -## 处理 Schema 注解(仅 DO 模式) -#if ($voType == 20) -@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO") -#end -public class ${subTable.className}DO extends BaseDO { - -#foreach ($column in $subColumns) -#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段 - /** - * ${column.columnComment} - #if ("$!column.dictType" != "")##处理枚举值 - * - * 枚举 {@link TODO ${column.dictType} 对应的类} - #end - */ - #if (${column.primaryKey})##处理主键 - @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end - #end -#if ($voType == 20) -## 1. 处理 Swagger 注解 - @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end) -#end -## 2. 处理字段定义 - private ${column.javaType} ${column.javaField}; -#end -#end - -} \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper.vm deleted file mode 100644 index b98b471..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper.vm +++ /dev/null @@ -1,82 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}; - -import java.util.*; - -import ${PageResultClassName}; -import ${QueryWrapperClassName}; -import ${BaseMapperClassName}; -import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -import org.apache.ibatis.annotations.Mapper; -import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; - -## 字段模板 -#macro(listCondition) -#foreach ($column in $columns) -#if (${column.listOperation}) -#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 -#if (${column.listOperationCondition} == "=")##情况一,= 的时候 - .eqIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == "!=")##情况二,!= 的时候 - .neIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == ">")##情况三,> 的时候 - .gtIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == ">=")##情况四,>= 的时候 - .geIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == "<")##情况五,< 的时候 - .ltIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == "<=")##情况五,<= 的时候 - .leIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == "LIKE")##情况七,Like 的时候 - .likeIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#if (${column.listOperationCondition} == "BETWEEN")##情况八,Between 的时候 - .betweenIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}()) -#end -#end -#end -#end -/** - * ${table.classComment} Mapper - * - * @author ${table.author} - */ -@Mapper -public interface ${table.className}Mapper extends BaseMapperX<${table.className}DO> { - -## 特殊:树表专属逻辑(树不需要分页接口) -#if ( $table.templateType != 2 ) - default PageResult<${table.className}DO> selectPage(${sceneEnum.prefixClass}${table.className}PageReqVO reqVO) { - return selectPage(reqVO, new LambdaQueryWrapperX<${table.className}DO>() - #listCondition() - .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 - - } -#else - default List<${table.className}DO> selectList(${sceneEnum.prefixClass}${table.className}ListReqVO reqVO) { - return selectList(new LambdaQueryWrapperX<${table.className}DO>() - #listCondition() - .orderByDesc(${table.className}DO::getId));## 大多数情况下,id 倒序 - - } -#end - -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 -#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 - default ${table.className}DO selectBy${TreeParentJavaField}And${TreeNameJavaField}(Long ${treeParentColumn.javaField}, String ${treeNameColumn.javaField}) { - return selectOne(${table.className}DO::get${TreeParentJavaField}, ${treeParentColumn.javaField}, ${table.className}DO::get${TreeNameJavaField}, ${treeNameColumn.javaField}); - } - - default Long selectCountBy${TreeParentJavaField}(${treeParentColumn.javaType} ${treeParentColumn.javaField}) { - return selectCount(${table.className}DO::get${TreeParentJavaField}, ${treeParentColumn.javaField}); - } - -#end -} \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper.xml.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper.xml.vm deleted file mode 100644 index 290378d..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper.xml.vm +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper_sub.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper_sub.vm deleted file mode 100644 index 40f2ff5..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/dal/mapper_sub.vm +++ /dev/null @@ -1,63 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subJoinColumnsList.get($subIndex))##当前字段数组 -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 -package ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.businessName}; - -import java.util.*; - -import ${PageResultClassName}; -import ${PageParamClassName}; -import ${QueryWrapperClassName}; -import ${BaseMapperClassName}; -import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; -import org.apache.ibatis.annotations.Mapper; - -/** - * ${subTable.classComment} Mapper - * - * @author ${subTable.author} - */ -@Mapper -public interface ${subTable.className}Mapper extends BaseMapperX<${subTable.className}DO> { - -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) - default PageResult<${subTable.className}DO> selectPage(PageParam reqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return selectPage(reqVO, new LambdaQueryWrapperX<${subTable.className}DO>() - .eq(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}) - .orderByDesc(${subTable.className}DO::getId));## 大多数情况下,id 倒序 - - } -## 主表与子表是一对一时 - #if (!$subTable.subJoinMany) - default ${subTable.className}DO selectBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return selectOne(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); - } - #end - -## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else - #if ( $subTable.subJoinMany) - default List<${subTable.className}DO> selectListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return selectList(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); - } - - #else - default ${subTable.className}DO selectBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return selectOne(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); - } - - #end - #end - default int deleteBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return delete(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}); - } - -#if ( $table.templateType != 2 && $deleteBatchEnable) - default int deleteBy${SubJoinColumnName}s(List<${subJoinColumn.javaType}> ${subJoinColumn.javaField}s) { - return deleteBatch(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField}s); - } -#end - -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/enums/errorcode.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/enums/errorcode.vm deleted file mode 100644 index e85b8ba..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/enums/errorcode.vm +++ /dev/null @@ -1,22 +0,0 @@ -// TODO 待办:请将下面的错误码复制到 msgpush-module-${table.moduleName} 模块的 ErrorCodeConstants 类中。注意,请给“TODO 补充编号”设置一个错误码编号!!! -// ========== ${table.classComment} TODO 补充编号 ========== -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${table.classComment}不存在"); -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_EXITS_CHILDREN = new ErrorCode(TODO 补充编号, "存在存在子${table.classComment},无法删除"); -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_NOT_EXITS = new ErrorCode(TODO 补充编号,"父级${table.classComment}不存在"); -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_ERROR = new ErrorCode(TODO 补充编号, "不能设置自己为父${table.classComment}"); -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE = new ErrorCode(TODO 补充编号, "已经存在该${treeNameColumn.columnComment}的${table.classComment}"); -ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_IS_CHILD = new ErrorCode(TODO 补充编号, "不能设置自己的子${table.className}为父${table.className}"); -#end -## 特殊:主子表专属逻辑 -#if ( $table.templateType == 11 )## 特殊:ERP 情况 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($simpleClassNameUnderlineCase = $simpleClassNameUnderlineCases.get($index)) -ErrorCode ${simpleClassNameUnderlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${subTable.classComment}不存在"); -#if ( !$subTable.subJoinMany ) -ErrorCode ${simpleClassNameUnderlineCase.toUpperCase()}_EXISTS = new ErrorCode(TODO 补充编号, "${subTable.classComment}已存在"); -#end -#end -#end \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/service/service.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/service/service.vm deleted file mode 100644 index 1cc68bf..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/service/service.vm +++ /dev/null @@ -1,165 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; - -import java.util.*; -import ${jakartaPackage}.validation.*; -import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; -import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; -#end -import ${PageResultClassName}; -import ${PageParamClassName}; - -/** - * ${table.classComment} Service 接口 - * - * @author ${table.author} - */ -public interface ${table.className}Service { - - /** - * 创建${table.classComment} - * - * @param ${saveReqVOVar} 创建信息 - * @return 编号 - */ - ${primaryColumn.javaType} create${simpleClassName}(@Valid ${saveReqVOClass} ${saveReqVOVar}); - - /** - * 更新${table.classComment} - * - * @param ${updateReqVOVar} 更新信息 - */ - void update${simpleClassName}(@Valid ${updateReqVOClass} ${updateReqVOVar}); - - /** - * 删除${table.classComment} - * - * @param id 编号 - */ - void delete${simpleClassName}(${primaryColumn.javaType} id); - -#if ( $table.templateType != 2 && $deleteBatchEnable) - /** - * 批量删除${table.classComment} - * - * @param ids 编号 - */ - void delete${simpleClassName}ListByIds(List<${primaryColumn.javaType}> ids); -#end - - /** - * 获得${table.classComment} - * - * @param id 编号 - * @return ${table.classComment} - */ - ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id); - -## 特殊:树表专属逻辑(树不需要分页接口) -#if ( $table.templateType != 2 ) - /** - * 获得${table.classComment}分页 - * - * @param pageReqVO 分页查询 - * @return ${table.classComment}分页 - */ - PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO); -#else - /** - * 获得${table.classComment}列表 - * - * @param listReqVO 查询条件 - * @return ${table.classComment}列表 - */ - List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO); -#end - -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 -#set ($subClassNameVar = $subClassNameVars.get($index)) - // ==================== 子表($subTable.classComment) ==================== - -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) - /** - * 获得${subTable.classComment}分页 - * - * @param pageReqVO 分页查询 - * @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment} - * @return ${subTable.classComment}分页 - */ - PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}); - -## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else - #if ( $subTable.subJoinMany ) - /** - * 获得${subTable.classComment}列表 - * - * @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment} - * @return ${subTable.classComment}列表 - */ - List<${subTable.className}DO> get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}); - - #else - /** - * 获得${subTable.classComment} - * - * @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment} - * @return ${subTable.classComment} - */ - ${subTable.className}DO get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}); - - #end -#end -## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 -#if ( $table.templateType == 11 ) - /** - * 创建${subTable.classComment} - * - * @param ${subClassNameVar} 创建信息 - * @return 编号 - */ - ${subPrimaryColumn.javaType} create${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar}); - - /** - * 更新${subTable.classComment} - * - * @param ${subClassNameVar} 更新信息 - */ - void update${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar}); - - /** - * 删除${subTable.classComment} - * - * @param id 编号 - */ - void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id); - -#if ($deleteBatchEnable) - /** - * 批量删除${subTable.classComment} - * - * @param ids 编号 - */ - void delete${subSimpleClassName}ListByIds(List<${subPrimaryColumn.javaType}> ids); -#end - - /** - * 获得${subTable.classComment} - * - * @param id 编号 - * @return ${subTable.classComment} - */ - ${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id); - -#end -#end -} \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/service/serviceImpl.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/service/serviceImpl.vm deleted file mode 100644 index 42afdf9..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/service/serviceImpl.vm +++ /dev/null @@ -1,419 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; - -import cn.hutool.core.collection.CollUtil; -import org.springframework.stereotype.Service; -import ${jakartaPackage}.annotation.Resource; -import org.springframework.validation.annotation.Validated; -import org.springframework.transaction.annotation.Transactional; - -import java.util.*; -import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; -import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO; -#end -import ${PageResultClassName}; -import ${PageParamClassName}; -import ${BeanUtils}; - -import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -import ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.businessName}.${subTable.className}Mapper; -#end - -import static ${ServiceExceptionUtilClassName}.exception; -import static ${CollectionUtilsClassName}.convertList; -import static ${CollectionUtilsClassName}.diffList; -import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; - -/** - * ${table.classComment} Service 实现类 - * - * @author ${table.author} - */ -@Service -@Validated -public class ${table.className}ServiceImpl implements ${table.className}Service { - - @Resource - private ${table.className}Mapper ${classNameVar}Mapper; -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) - @Resource - private ${subTable.className}Mapper ${subClassNameVars.get($index)}Mapper; -#end - - @Override -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) - @Transactional(rollbackFor = Exception.class) -#end - public ${primaryColumn.javaType} create${simpleClassName}(${saveReqVOClass} ${saveReqVOVar}) { -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 -#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 - // 校验${treeParentColumn.columnComment}的有效性 - validateParent${simpleClassName}(null, ${saveReqVOVar}.get${TreeParentJavaField}()); - // 校验${treeNameColumn.columnComment}的唯一性 - validate${simpleClassName}${TreeNameJavaField}Unique(null, ${saveReqVOVar}.get${TreeParentJavaField}(), ${saveReqVOVar}.get${TreeNameJavaField}()); - -#end - // 插入 -#if ($voType == 10) - ${table.className}DO ${classNameVar} = BeanUtils.toBean(createReqVO, ${table.className}DO.class); - ${classNameVar}Mapper.insert(${classNameVar}); -#else - ${saveReqVOVar}.clean() // 清理掉创建、更新时间等相关属性值 - ${classNameVar}Mapper.insert(${saveReqVOVar}); -#end - -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) - - // 插入子表 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - #if ( $subTable.subJoinMany) - create${subSimpleClassName}List(${classNameVar}.getId(), ${saveReqVOVar}.get${subSimpleClassNames.get($index)}s()); - #else - create${subSimpleClassName}(${classNameVar}.getId(), ${saveReqVOVar}.get${subSimpleClassNames.get($index)}()); - #end -#end -#end - // 返回 - return ${classNameVar}.getId(); - } - - @Override -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 ) - @Transactional(rollbackFor = Exception.class) -#end - public void update${simpleClassName}(${updateReqVOClass} ${updateReqVOVar}) { - // 校验存在 - validate${simpleClassName}Exists(${updateReqVOVar}.getId()); -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 -#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 - // 校验${treeParentColumn.columnComment}的有效性 - validateParent${simpleClassName}(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${TreeParentJavaField}()); - // 校验${treeNameColumn.columnComment}的唯一性 - validate${simpleClassName}${TreeNameJavaField}Unique(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${TreeParentJavaField}(), ${updateReqVOVar}.get${TreeNameJavaField}()); - -#end - // 更新 -#if ($voType == 10) - ${table.className}DO updateObj = BeanUtils.toBean(updateReqVO, ${table.className}DO.class); - ${classNameVar}Mapper.updateById(updateObj); -#else - ${updateReqVOVar}.clean() // 清理掉创建、更新时间等相关属性值 - ${classNameVar}Mapper.updateById(${updateReqVOVar}); -#end -## 特殊:主子表专属逻辑(非 ERP 模式) -#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11) - - // 更新子表 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - #if ( $subTable.subJoinMany) - update${subSimpleClassName}List(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${subSimpleClassNames.get($index)}s()); - #else - update${subSimpleClassName}(${updateReqVOVar}.getId(), ${updateReqVOVar}.get${subSimpleClassNames.get($index)}()); - #end -#end -#end - } - - @Override -## 特殊:主子表专属逻辑 -#if ( $subTables && $subTables.size() > 0) - @Transactional(rollbackFor = Exception.class) -#end - public void delete${simpleClassName}(${primaryColumn.javaType} id) { - // 校验存在 - validate${simpleClassName}Exists(id); -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -#set ($ParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 - // 校验是否有子${table.classComment} - if (${classNameVar}Mapper.selectCountBy${ParentJavaField}(id) > 0) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_EXITS_CHILDREN); - } -#end - // 删除 - ${classNameVar}Mapper.deleteById(id); -## 特殊:主子表专属逻辑 -#if ( $subTables && $subTables.size() > 0) - - // 删除子表 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - delete${subSimpleClassName}By${SubJoinColumnName}(id); -#end -#end - } - -#if ( $table.templateType != 2 && $deleteBatchEnable) - @Override - ## 特殊:主子表专属逻辑 - #if ( $subTables && $subTables.size() > 0) - @Transactional(rollbackFor = Exception.class) - #end - public void delete${simpleClassName}ListByIds(List<${primaryColumn.javaType}> ids) { - // 删除 - ${classNameVar}Mapper.deleteByIds(ids); - ## 特殊:主子表专属逻辑 - #if ( $subTables && $subTables.size() > 0) - - // 删除子表 - #foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 - #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - delete${subSimpleClassName}By${SubJoinColumnName}s(ids); - #end - #end - } - -#end - - private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) { - if (${classNameVar}Mapper.selectById(id) == null) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); - } - } - -## 特殊:树表专属逻辑 -#if ( $table.templateType == 2 ) -#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写 -#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写 - private void validateParent${simpleClassName}(Long id, Long ${treeParentColumn.javaField}) { - if (${treeParentColumn.javaField} == null || ${simpleClassName}DO.${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT.equals(${treeParentColumn.javaField})) { - return; - } - // 1. 不能设置自己为父${table.classComment} - if (Objects.equals(id, ${treeParentColumn.javaField})) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_ERROR); - } - // 2. 父${table.classComment}不存在 - ${simpleClassName}DO parent${simpleClassName} = ${classNameVar}Mapper.selectById(${treeParentColumn.javaField}); - if (parent${simpleClassName} == null) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_NOT_EXITS); - } - // 3. 递归校验父${table.classComment},如果父${table.classComment}是自己的子${table.classComment},则报错,避免形成环路 - if (id == null) { // id 为空,说明新增,不需要考虑环路 - return; - } - for (int i = 0; i < Short.MAX_VALUE; i++) { - // 3.1 校验环路 - ${treeParentColumn.javaField} = parent${simpleClassName}.get${TreeParentJavaField}(); - if (Objects.equals(id, ${treeParentColumn.javaField})) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_IS_CHILD); - } - // 3.2 继续递归下一级父${table.classComment} - if (${treeParentColumn.javaField} == null || ${simpleClassName}DO.${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT.equals(${treeParentColumn.javaField})) { - break; - } - parent${simpleClassName} = ${classNameVar}Mapper.selectById(${treeParentColumn.javaField}); - if (parent${simpleClassName} == null) { - break; - } - } - } - - private void validate${simpleClassName}${TreeNameJavaField}Unique(Long id, Long ${treeParentColumn.javaField}, String ${treeNameColumn.javaField}) { - ${simpleClassName}DO ${classNameVar} = ${classNameVar}Mapper.selectBy${TreeParentJavaField}And${TreeNameJavaField}(${treeParentColumn.javaField}, ${treeNameColumn.javaField}); - if (${classNameVar} == null) { - return; - } - // 如果 id 为空,说明不用比较是否为相同 id 的${table.classComment} - if (id == null) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE); - } - if (!Objects.equals(${classNameVar}.getId(), id)) { - throw exception(${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE); - } - } - -#end - @Override - public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) { - return ${classNameVar}Mapper.selectById(id); - } - -## 特殊:树表专属逻辑(树不需要分页接口) -#if ( $table.templateType != 2 ) - @Override - public PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) { - return ${classNameVar}Mapper.selectPage(pageReqVO); - } -#else - @Override - public List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) { - return ${classNameVar}Mapper.selectList(listReqVO); - } -#end - -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($simpleClassNameUnderlineCase = $simpleClassNameUnderlineCases.get($index)) -#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 -#set ($subClassNameVar = $subClassNameVars.get($index)) - // ==================== 子表($subTable.classComment) ==================== - -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) - @Override - public PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return ${subClassNameVars.get($index)}Mapper.selectPage(pageReqVO, ${subJoinColumn.javaField}); - } - -## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else - #if ( $subTable.subJoinMany ) - @Override - public List<${subTable.className}DO> get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return ${subClassNameVars.get($index)}Mapper.selectListBy${SubJoinColumnName}(${subJoinColumn.javaField}); - } - - #else - @Override - public ${subTable.className}DO get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) { - return ${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subJoinColumn.javaField}); - } - - #end -#end -## 情况一:MASTER_ERP 时,支持单个的新增、修改、删除操作 -#if ( $table.templateType == 11 ) - @Override - public ${subPrimaryColumn.javaType} create${subSimpleClassName}(${subTable.className}DO ${subClassNameVar}) { -## 特殊:一对一时,需要保证只有一条,不能重复插入 -#if ( !$subTable.subJoinMany) - // 校验是否已经存在 - if (${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subClassNameVar}.get${SubJoinColumnName}()) != null) { - throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_EXISTS); - } - // 插入 -#end - ${subClassNameVar}.clean(); // 清理掉创建、更新时间等相关属性值 - ${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar}); - return ${subClassNameVar}.getId(); - } - - @Override - public void update${subSimpleClassName}(${subTable.className}DO ${subClassNameVar}) { - // 校验存在 - validate${subSimpleClassName}Exists(${subClassNameVar}.getId()); - // 更新 - ${subClassNameVar}.clean(); // 解决更新情况下:updateTime 不更新 - ${subClassNameVars.get($index)}Mapper.updateById(${subClassNameVar}); - } - - @Override - public void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id) { - // 删除 - ${subClassNameVars.get($index)}Mapper.deleteById(id); - } - -#if ($deleteBatchEnable) - @Override - public void delete${subSimpleClassName}ListByIds(List<${subPrimaryColumn.javaType}> ids) { - // 删除 - ${subClassNameVars.get($index)}Mapper.deleteByIds(ids); - } -#end - - @Override - public ${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id) { - return ${subClassNameVars.get($index)}Mapper.selectById(id); - } - - private void validate${subSimpleClassName}Exists(${subPrimaryColumn.javaType} id) { - if (${subClassNameVar}Mapper.selectById(id) == null) { - throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_NOT_EXISTS); - } - } - -## 情况二:非 MASTER_ERP 时,支持批量的新增、修改操作 -#else - #if ( $subTable.subJoinMany) - private void create${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) { - list.forEach(o -> o.set${SubJoinColumnName}(${subJoinColumn.javaField}).clean()); - ${subClassNameVars.get($index)}Mapper.insertBatch(list); - } - - private void update${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) { - list.forEach(o -> o.set${SubJoinColumnName}(${subJoinColumn.javaField}).clean()); - List<${subTable.className}DO> oldList = ${subClassNameVar}Mapper.selectListBy${SubJoinColumnName}(${subJoinColumn.javaField}); - List> diffList = diffList(oldList, list, (oldVal, newVal) -> { - boolean same = ObjectUtil.equal(oldVal.getId(), newVal.getId()); - if (same) { - newVal.setId(oldVal.getId()).clean(); // 解决更新情况下:updateTime 不更新 - } - return same; - }); - - // 第二步,批量添加、修改、删除 - if (CollUtil.isNotEmpty(diffList.get(0))) { - ${subClassNameVar}Mapper.insertBatch(diffList.get(0)); - } - if (CollUtil.isNotEmpty(diffList.get(1))) { - ${subClassNameVar}Mapper.updateBatch(diffList.get(1)); - } - if (CollUtil.isNotEmpty(diffList.get(2))) { - ${subClassNameVar}Mapper.deleteByIds(convertList(diffList.get(2), ${subTable.className}DO::getId)); - } - } - - #else - private void create${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) { - if (${subClassNameVar} == null) { - return; - } - ${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField}); - ${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar}); - } - - private void update${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) { - if (${subClassNameVar} == null) { - return; - } - ${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField}).clean();// 解决更新情况下:updateTime 不更新 - ${subClassNameVars.get($index)}Mapper.insertOrUpdate(${subClassNameVar}); - } - - #end -#end - private void delete${subSimpleClassName}By${SubJoinColumnName}(${primaryColumn.javaType} ${subJoinColumn.javaField}) { - ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}(${subJoinColumn.javaField}); - } - -#if ( $table.templateType != 2 && $deleteBatchEnable) - private void delete${subSimpleClassName}By${SubJoinColumnName}s(List<${primaryColumn.javaType}> ${subJoinColumn.javaField}s) { - ${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}s(${subJoinColumn.javaField}s); - } -#end - -#end -} \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/test/serviceTest.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/test/serviceTest.vm deleted file mode 100644 index 974e8e8..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/java/test/serviceTest.vm +++ /dev/null @@ -1,167 +0,0 @@ -package ${basePackage}.module.${table.moduleName}.service.${table.businessName}; - -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.Test; - -import ${jakartaPackage}.annotation.Resource; - -import ${baseFrameworkPackage}.test.core.ut.BaseDbUnitTest; - -import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*; -import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO; -import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper; -import ${PageResultClassName}; - -import ${jakartaPackage}.annotation.Resource; -import org.springframework.context.annotation.Import; -import java.util.*; -import java.time.LocalDateTime; - -import static cn.hutool.core.util.RandomUtil.*; -import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*; -import static ${baseFrameworkPackage}.test.core.util.AssertUtils.*; -import static ${baseFrameworkPackage}.test.core.util.RandomUtils.*; -import static ${LocalDateTimeUtilsClassName}.*; -import static ${ObjectUtilsClassName}.*; -import static ${DateUtilsClassName}.*; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; - -## 字段模板 -#macro(getPageCondition $VO) - // mock 数据 - ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class, o -> { // 等会查询到 - #foreach ($column in $columns) - #if (${column.listOperation}) - #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 - o.set$JavaField(null); - #end - #end - }); - ${classNameVar}Mapper.insert(db${simpleClassName}); - #foreach ($column in $columns) - #if (${column.listOperation}) - #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 - // 测试 ${column.javaField} 不匹配 - ${classNameVar}Mapper.insert(cloneIgnoreId(db${simpleClassName}, o -> o.set$JavaField(null))); - #end - #end - // 准备参数 - ${sceneEnum.prefixClass}${table.className}${VO} reqVO = new ${sceneEnum.prefixClass}${table.className}${VO}(); - #foreach ($column in $columns) - #if (${column.listOperation}) - #set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写 - #if (${column.listOperationCondition} == "BETWEEN")## BETWEEN 的情况 - reqVO.set${JavaField}(buildBetweenTime(2023, 2, 1, 2023, 2, 28)); - #else - reqVO.set$JavaField(null); - #end - #end - #end -#end -/** - * {@link ${table.className}ServiceImpl} 的单元测试类 - * - * @author ${table.author} - */ -@Import(${table.className}ServiceImpl.class) -public class ${table.className}ServiceImplTest extends BaseDbUnitTest { - - @Resource - private ${table.className}ServiceImpl ${classNameVar}Service; - - @Resource - private ${table.className}Mapper ${classNameVar}Mapper; - - @Test - public void testCreate${simpleClassName}_success() { - // 准备参数 - ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO = randomPojo(${sceneEnum.prefixClass}${table.className}SaveReqVO.class).setId(null); - - // 调用 - ${primaryColumn.javaType} ${classNameVar}Id = ${classNameVar}Service.create${simpleClassName}(createReqVO); - // 断言 - assertNotNull(${classNameVar}Id); - // 校验记录的属性是否正确 - ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(${classNameVar}Id); - assertPojoEquals(createReqVO, ${classNameVar}, "id"); - } - - @Test - public void testUpdate${simpleClassName}_success() { - // mock 数据 - ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); - ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 - // 准备参数 - ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO = randomPojo(${sceneEnum.prefixClass}${table.className}SaveReqVO.class, o -> { - o.setId(db${simpleClassName}.getId()); // 设置更新的 ID - }); - - // 调用 - ${classNameVar}Service.update${simpleClassName}(updateReqVO); - // 校验是否更新正确 - ${table.className}DO ${classNameVar} = ${classNameVar}Mapper.selectById(updateReqVO.getId()); // 获取最新的 - assertPojoEquals(updateReqVO, ${classNameVar}); - } - - @Test - public void testUpdate${simpleClassName}_notExists() { - // 准备参数 - ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO = randomPojo(${sceneEnum.prefixClass}${table.className}SaveReqVO.class); - - // 调用, 并断言异常 - assertServiceException(() -> ${classNameVar}Service.update${simpleClassName}(updateReqVO), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); - } - - @Test - public void testDelete${simpleClassName}_success() { - // mock 数据 - ${table.className}DO db${simpleClassName} = randomPojo(${table.className}DO.class); - ${classNameVar}Mapper.insert(db${simpleClassName});// @Sql: 先插入出一条存在的数据 - // 准备参数 - ${primaryColumn.javaType} id = db${simpleClassName}.getId(); - - // 调用 - ${classNameVar}Service.delete${simpleClassName}(id); - // 校验数据不存在了 - assertNull(${classNameVar}Mapper.selectById(id)); - } - - @Test - public void testDelete${simpleClassName}_notExists() { - // 准备参数 - ${primaryColumn.javaType} id = random${primaryColumn.javaType}Id(); - - // 调用, 并断言异常 - assertServiceException(() -> ${classNameVar}Service.delete${simpleClassName}(id), ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS); - } - -## 特殊:树表专属逻辑(树不需要分页接口) -#if ( $table.templateType != 2 ) - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGet${simpleClassName}Page() { - #getPageCondition("PageReqVO") - - // 调用 - PageResult<${table.className}DO> pageResult = ${classNameVar}Service.get${simpleClassName}Page(reqVO); - // 断言 - assertEquals(1, pageResult.getTotal()); - assertEquals(1, pageResult.getList().size()); - assertPojoEquals(db${simpleClassName}, pageResult.getList().get(0)); - } -#else - @Test - @Disabled // TODO 请修改 null 为需要的值,然后删除 @Disabled 注解 - public void testGet${simpleClassName}List() { - #getPageCondition("ListReqVO") - - // 调用 - List<${table.className}DO> list = ${classNameVar}Service.get${simpleClassName}List(reqVO); - // 断言 - assertEquals(1, list.size()); - assertPojoEquals(db${simpleClassName}, list.get(0)); - } -#end - -} \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/sql/h2.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/sql/h2.vm deleted file mode 100644 index 0e9fea4..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/sql/h2.vm +++ /dev/null @@ -1,35 +0,0 @@ --- 将该建表 SQL 语句,添加到 msgpush-module-${table.moduleName}-biz 模块的 test/resources/sql/create_tables.sql 文件里 -CREATE TABLE IF NOT EXISTS "${table.tableName.toLowerCase()}" ( -#foreach ($column in $columns) -#if (${column.javaType} == 'Long') - #set ($dataType='bigint') -#elseif (${column.javaType} == 'Integer') - #set ($dataType='int') -#elseif (${column.javaType} == 'Boolean') - #set ($dataType='bit') -#elseif (${column.javaType} == 'Date') - #set ($dataType='datetime') -#else - #set ($dataType='varchar') -#end - #if (${column.primaryKey})##处理主键 - "${column.javaField}"#if (${column.javaType} == 'String') ${dataType} NOT NULL#else ${dataType} NOT NULL GENERATED BY DEFAULT AS IDENTITY#end, - #else - #if (${column.columnName} == 'create_time') - "create_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, - #elseif (${column.columnName} == 'update_time') - "update_time" datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - #elseif (${column.columnName} == 'creator' || ${column.columnName} == 'updater') - "${column.columnName}" ${dataType} DEFAULT '', - #elseif (${column.columnName} == 'deleted') - "deleted" bit NOT NULL DEFAULT FALSE, - #else - "${column.columnName.toLowerCase()}" ${dataType}#if (${column.nullable} == false) NOT NULL#end, - #end - #end -#end - PRIMARY KEY ("${primaryColumn.columnName.toLowerCase()}") -) COMMENT '${table.tableComment}'; - --- 将该删表 SQL 语句,添加到 msgpush-module-${table.moduleName}-biz 模块的 test/resources/sql/clean.sql 文件里 -DELETE FROM "${table.tableName}"; \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/sql/sql.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/sql/sql.vm deleted file mode 100644 index 6e50837..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/sql/sql.vm +++ /dev/null @@ -1,181 +0,0 @@ -## 通用变量定义 -#set ($functionNames = ['查询', '创建', '更新', '删除', '导出']) -#set ($functionOps = ['query', 'create', 'update', 'delete', 'export']) -## -## 宏定义:生成按钮 SQL(通用部分) -#macro(insertButtonSql $parentIdVar) -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) - INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status - ) - VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, ${parentIdVar}, - '', '', '', 0 - ); -#end -#end -## -## ======================= MySQL / OceanBase ======================= -#if ($dbType.name() == 'MYSQL' || $dbType.name() == 'OCEAN_BASE') --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, - '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' -); - --- 按钮父菜单ID -SELECT @parentId := LAST_INSERT_ID(); - --- 按钮 SQL -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, - '', '', '', 0 -); -#end -## -## ======================= Oracle / 达梦 DM ======================= -#elseif ($dbType.name() == 'ORACLE' || $dbType.name() == 'DM') --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, - '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' -); - --- 按钮父菜单ID --- 说明:Oracle/达梦 使用序列获取上一个插入的 ID -DECLARE - v_parent_id NUMBER; -BEGIN - SELECT system_menu_seq.CURRVAL INTO v_parent_id FROM DUAL; - -- 按钮 SQL -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) - INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status - ) - VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, v_parent_id, - '', '', '', 0 - ); -#end -END; -/ -## -## ======================= PostgreSQL / 人大金仓 KingbaseES ======================= -#elseif ($dbType.name() == 'POSTGRE_SQL' || $dbType.name() == 'KINGBASE_ES') --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, - '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' -); - --- 按钮父菜单ID --- 说明:PostgreSQL/KingbaseES 使用 lastval() 获取上一个插入的序列值 -DO $$ -DECLARE - v_parent_id BIGINT; -BEGIN - v_parent_id := lastval(); - -- 按钮 SQL -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) - INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status - ) - VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, v_parent_id, - '', '', '', 0 - ); -#end -END $$; -## -## ======================= SQL Server ======================= -#elseif ($dbType.name() == 'SQL_SERVER' || $dbType.name() == 'SQL_SERVER2005') --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, - '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' -); - --- 按钮父菜单ID --- 说明:SQL Server 使用 SCOPE_IDENTITY() 获取上一个插入的自增 ID -DECLARE @parentId BIGINT; -SET @parentId = SCOPE_IDENTITY(); - --- 按钮 SQL -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, - '', '', '', 0 -); -#end -## -## ======================= 不支持的数据库类型 ======================= -#else --- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! --- 注意:当前数据库类型 ${dbType.name()} 暂不支持自动生成菜单 SQL --- 请参考以下 MySQL 语法,手动修改为您的数据库对应的语法 --- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - --- 菜单 SQL -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status, component_name -) -VALUES ( - '${table.classComment}管理', '', 2, 0, ${table.parentMenuId}, - '${simpleClassName_strikeCase}', '', '${table.moduleName}/${table.businessName}/index', 0, '${table.className}' -); - --- 按钮父菜单ID --- TODO: 请根据您的数据库类型,修改获取上一个插入 ID 的方式 --- MySQL: SELECT @parentId := LAST_INSERT_ID(); --- Oracle: SELECT system_menu_seq.CURRVAL INTO v_parent_id FROM DUAL; --- PostgreSQL: SELECT lastval() INTO v_parent_id; --- SQL Server: SET @parentId = SCOPE_IDENTITY(); -SELECT @parentId := LAST_INSERT_ID(); - --- 按钮 SQL -#foreach ($functionName in $functionNames) -#set ($index = $foreach.count - 1) -INSERT INTO system_menu( - name, permission, type, sort, parent_id, - path, icon, component, status -) -VALUES ( - '${table.classComment}${functionName}', '${permissionPrefix}:${functionOps.get($index)}', 3, $foreach.count, @parentId, - '', '', '', 0 -); -#end -#end diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/api/api.js.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/api/api.js.vm deleted file mode 100644 index 0d9b66f..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/api/api.js.vm +++ /dev/null @@ -1,160 +0,0 @@ -import request from '@/utils/request' -#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") - -// 创建${table.classComment} -export function create${simpleClassName}(data) { - return request({ - url: '${baseURL}/create', - method: 'post', - data: data - }) -} - -// 更新${table.classComment} -export function update${simpleClassName}(data) { - return request({ - url: '${baseURL}/update', - method: 'put', - data: data - }) -} - -// 删除${table.classComment} -export function delete${simpleClassName}(id) { - return request({ - url: '${baseURL}/delete?id=' + id, - method: 'delete' - }) -} - -#if ( $table.templateType != 2 && $deleteBatchEnable) -/** 批量删除${table.classComment} */ -export function delete${simpleClassName}List(ids) { - return request({ - url: `${baseURL}/delete-list?ids=${ids.join(',')}`, - method: 'delete' - }) -} -#end - -// 获得${table.classComment} -export function get${simpleClassName}(id) { - return request({ - url: '${baseURL}/get?id=' + id, - method: 'get' - }) -} - -#if ( $table.templateType != 2 ) -// 获得${table.classComment}分页 -export function get${simpleClassName}Page(params) { - return request({ - url: '${baseURL}/page', - method: 'get', - params - }) -} -#else -// 获得${table.classComment}列表 -export function get${simpleClassName}List(params) { - return request({ - url: '${baseURL}/list', - method: 'get', - params - }) -} -#end -// 导出${table.classComment} Excel -export function export${simpleClassName}Excel(params) { - return request({ - url: '${baseURL}/export-excel', - method: 'get', - params, - responseType: 'blob' - }) -} -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 - #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 - #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) - #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) - #set ($subClassNameVar = $subClassNameVars.get($index)) - -// ==================== 子表($subTable.classComment) ==================== - ## 情况一:MASTER_ERP 时,需要分查询页子表 - #if ($table.templateType == 11) - // 获得${subTable.classComment}分页 - export function get${subSimpleClassName}Page(params) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/page', - method: 'get', - params - }) - } - ## 情况二:非 MASTER_ERP 时,需要列表查询子表 - #else - #if ($subTable.subJoinMany) - // 获得${subTable.classComment}列表 - export function get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=' + ${subJoinColumn.javaField}, - method: 'get' - }) - } - #else - // 获得${subTable.classComment} - export function get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=' + ${subJoinColumn.javaField}, - method: 'get' - }) - } - #end - #end - ## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 - #if ($table.templateType == 11) - // 新增${subTable.classComment} - export function create${subSimpleClassName}(data) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/create', - method: 'post', - data - }) - } - // 修改${subTable.classComment} - export function update${subSimpleClassName}(data) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/update', - method: 'post', - data - }) - } - // 删除${subTable.classComment} - export function delete${subSimpleClassName}(id) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/delete?id=' + id, - method: 'delete' - }) - } - #if ($deleteBatchEnable) - /** 批量删除${subTable.classComment} */ - export function delete${subSimpleClassName}List(ids) { - return request({ - url: `${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}`, - method: 'delete' - }) - } - #end - // 获得${subTable.classComment} - export function get${subSimpleClassName}(id) { - return request({ - url: '${baseURL}/${subSimpleClassName_strikeCase}/get?id=' + id, - method: 'get' - }) - } - #end -#end \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm deleted file mode 100644 index 99aa91a..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_erp.vue.vm +++ /dev/null @@ -1,205 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 - - - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm deleted file mode 100644 index ca266be..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_inner.vue.vm +++ /dev/null @@ -1,2 +0,0 @@ -## 主表的 normal 和 inner 使用相同的 form 表单 -#parse("codegen/vue/views/components/form_sub_normal.vue.vm") \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm deleted file mode 100644 index 48a404a..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/form_sub_normal.vue.vm +++ /dev/null @@ -1,347 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - - - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm deleted file mode 100644 index 3f290cc..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/list_sub_erp.vue.vm +++ /dev/null @@ -1,210 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - - - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm deleted file mode 100644 index 90b8e41..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/components/list_sub_inner.vue.vm +++ /dev/null @@ -1,4 +0,0 @@ -## 子表的 erp 和 inner 使用相似的 list 列表,差异主要两点: -## 1)inner 使用 list 不分页,erp 使用 page 分页 -## 2)erp 支持单个子表的新增、修改、删除,inner 不支持 -#parse("codegen/vue/views/components/list_sub_erp.vue.vm") \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/form.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/form.vue.vm deleted file mode 100644 index 634d05d..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/form.vue.vm +++ /dev/null @@ -1,320 +0,0 @@ - - - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/index.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/index.vue.vm deleted file mode 100644 index bbc9131..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue/views/index.vue.vm +++ /dev/null @@ -1,386 +0,0 @@ - - - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm deleted file mode 100644 index c9f7361..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm +++ /dev/null @@ -1,166 +0,0 @@ -import request from '@/config/axios' -import type { Dayjs } from 'dayjs'; -#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") - -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subColumns = $subColumnsList.get($index))##当前字段数组 -/** ${subTable.classComment}信息 */ -export interface ${subSimpleClassName} { - #foreach ($column in $subColumns) - #if ($column.createOperation || $column.updateOperation) - #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment} - #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: string | Dayjs; // ${column.columnComment} - #else - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment} - #end - #end - #end -} - -#end -/** ${table.classComment}信息 */ -export interface ${simpleClassName} { - #foreach ($column in $columns) - #if ($column.createOperation || $column.updateOperation) - #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment} - #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: string | Dayjs; // ${column.columnComment} - #else - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment} - #end - #end - #end - #if ( $table.templateType == 2 ) - children?: ${simpleClassName}[]; - #end - ## 特殊:主子表专属逻辑 - #if ( $table.templateType == 10 || $table.templateType == 12 ) - #foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #if ( $subTable.subJoinMany ) - ${subSimpleClassName.toLowerCase()}s?: ${subSimpleClassName}[] - #else - ${subSimpleClassName.toLowerCase()}?: ${subSimpleClassName} - #end - #end - #end -} - -// ${table.classComment} API -export const ${simpleClassName}Api = { -#if ( $table.templateType != 2 ) - // 查询${table.classComment}分页 - get${simpleClassName}Page: async (params: any) => { - return await request.get({ url: `${baseURL}/page`, params }) - }, -#else - // 查询${table.classComment}列表 - get${simpleClassName}List: async (params) => { - return await request.get({ url: `${baseURL}/list`, params }) - }, -#end - - // 查询${table.classComment}详情 - get${simpleClassName}: async (id: number) => { - return await request.get({ url: `${baseURL}/get?id=` + id }) - }, - - // 新增${table.classComment} - create${simpleClassName}: async (data: ${simpleClassName}) => { - return await request.post({ url: `${baseURL}/create`, data }) - }, - - // 修改${table.classComment} - update${simpleClassName}: async (data: ${simpleClassName}) => { - return await request.put({ url: `${baseURL}/update`, data }) - }, - - // 删除${table.classComment} - delete${simpleClassName}: async (id: number) => { - return await request.delete({ url: `${baseURL}/delete?id=` + id }) - }, - -#if ( $table.templateType != 2 && $deleteBatchEnable) - /** 批量删除${table.classComment} */ - delete${simpleClassName}List: async (ids: number[]) => { - return await request.delete({ url: `${baseURL}/delete-list?ids=${ids.join(',')}` }) - }, -#end - - // 导出${table.classComment} Excel - export${simpleClassName}: async (params) => { - return await request.download({ url: `${baseURL}/export-excel`, params }) - }, -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) -#set ($index = $foreach.count - 1) -#set ($subSimpleClassName = $subSimpleClassNames.get($index)) -#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 -#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 -#set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) -#set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) -#set ($subClassNameVar = $subClassNameVars.get($index)) - -// ==================== 子表($subTable.classComment) ==================== -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) - - // 获得${subTable.classComment}分页 - get${subSimpleClassName}Page: async (params) => { - return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/page`, params }) - }, -## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else - #if ( $subTable.subJoinMany ) - - // 获得${subTable.classComment}列表 - get${subSimpleClassName}ListBy${SubJoinColumnName}: async (${subJoinColumn.javaField}) => { - return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=` + ${subJoinColumn.javaField} }) - }, - #else - - // 获得${subTable.classComment} - get${subSimpleClassName}By${SubJoinColumnName}: async (${subJoinColumn.javaField}) => { - return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=` + ${subJoinColumn.javaField} }) - }, - #end -#end -## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 -#if ( $table.templateType == 11 ) - // 新增${subTable.classComment} - create${subSimpleClassName}: async (data: ${subSimpleClassName}) => { - return await request.post({ url: `${baseURL}/${subSimpleClassName_strikeCase}/create`, data }) - }, - - // 修改${subTable.classComment} - update${subSimpleClassName}: async (data: ${subSimpleClassName}) => { - return await request.put({ url: `${baseURL}/${subSimpleClassName_strikeCase}/update`, data }) - }, - - // 删除${subTable.classComment} - delete${subSimpleClassName}: async (id: number) => { - return await request.delete({ url: `${baseURL}/${subSimpleClassName_strikeCase}/delete?id=` + id }) - }, - - #if ($deleteBatchEnable) - /** 批量删除${subTable.classComment} */ - delete${subSimpleClassName}List: async (ids: number[]) => { - return await request.delete({ url: `${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}` }) - }, - #end - - // 获得${subTable.classComment} - get${subSimpleClassName}: async (id: number) => { - return await request.get({ url: `${baseURL}/${subSimpleClassName_strikeCase}/get?id=` + id }) - }, -#end -#end -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm deleted file mode 100644 index 8277e9b..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_erp.vue.vm +++ /dev/null @@ -1,204 +0,0 @@ -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 - - \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm deleted file mode 100644 index d8542c3..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_inner.vue.vm +++ /dev/null @@ -1,2 +0,0 @@ -## 主表的 normal 和 inner 使用相同的 form 表单 -#parse("codegen/vue3/views/components/form_sub_normal.vue.vm") \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm deleted file mode 100644 index 2212d4a..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/form_sub_normal.vue.vm +++ /dev/null @@ -1,360 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - - \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm deleted file mode 100644 index 29df64d..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/list_sub_erp.vue.vm +++ /dev/null @@ -1,231 +0,0 @@ -#set ($subTable = $subTables.get($subIndex))##当前表 -#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组 -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) -#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段 -#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - - \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm deleted file mode 100644 index 3fe6488..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/components/list_sub_inner.vue.vm +++ /dev/null @@ -1,4 +0,0 @@ -## 子表的 erp 和 inner 使用相似的 list 列表,差异主要两点: -## 1)inner 使用 list 不分页,erp 使用 page 分页 -## 2)erp 支持单个子表的新增、修改、删除,inner 不支持 -#parse("codegen/vue3/views/components/list_sub_erp.vue.vm") \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/form.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/form.vue.vm deleted file mode 100644 index 466ea45..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/form.vue.vm +++ /dev/null @@ -1,300 +0,0 @@ - - \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/index.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/index.vue.vm deleted file mode 100644 index 857972a..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3/views/index.vue.vm +++ /dev/null @@ -1,424 +0,0 @@ - - - \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/components/search-form.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/components/search-form.vue.vm deleted file mode 100644 index 194f172..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/components/search-form.vue.vm +++ /dev/null @@ -1,297 +0,0 @@ - - - - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/detail/index.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/detail/index.vue.vm deleted file mode 100644 index b3302e5..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/detail/index.vue.vm +++ /dev/null @@ -1,151 +0,0 @@ - - - - - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/form/index.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/form/index.vue.vm deleted file mode 100644 index 60c8443..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/form/index.vue.vm +++ /dev/null @@ -1,253 +0,0 @@ - - - - - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/index.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/index.vue.vm deleted file mode 100644 index 2d7daab..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_admin_uniapp/views/index.vue.vm +++ /dev/null @@ -1,211 +0,0 @@ - - - - - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/api/api.ts.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/api/api.ts.vm deleted file mode 100644 index b7f2651..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/api/api.ts.vm +++ /dev/null @@ -1,32 +0,0 @@ -import { defHttp } from '@/utils/http/axios' -#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") - -// 查询${table.classComment}列表 -export function get${simpleClassName}Page(params) { - return defHttp.get({ url: '${baseURL}/page', params }) -} - -// 查询${table.classComment}详情 -export function get${simpleClassName}(id: number) { - return defHttp.get({ url: `${baseURL}/get?id=${id}` }) -} - -// 新增${table.classComment} -export function create${simpleClassName}(data) { - return defHttp.post({ url: '${baseURL}/create', data }) -} - -// 修改${table.classComment} -export function update${simpleClassName}(data) { - return defHttp.put({ url: '${baseURL}/update', data }) -} - -// 删除${table.classComment} -export function delete${simpleClassName}(id: number) { - return defHttp.delete({ url: `${baseURL}/delete?id=${id}` }) -} - -// 导出${table.classComment} Excel -export function export${simpleClassName}(params) { - return defHttp.download({ url: '${baseURL}/export-excel', params }, '${table.classComment}.xls') -} diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/data.ts.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/data.ts.vm deleted file mode 100644 index 56f4e82..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/data.ts.vm +++ /dev/null @@ -1,260 +0,0 @@ -import type {BasicColumn, FormSchema} from '@/components/Table' -import {useRender} from '@/components/Table' -import {DICT_TYPE, getDictOptions} from '@/utils/dict' - -export const columns: BasicColumn[] = [ -#foreach($column in $columns) -#if ($column.listOperationResult) - #set ($dictType=$column.dictType) - #set ($javaField = $column.javaField) - #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) - #set ($comment=$column.columnComment) -#if ($column.javaType == "LocalDateTime")## 时间类型 - { - title: '${comment}', - dataIndex: '${javaField}', - width: 180, - customRender: ({ text }) => { - return useRender.renderDate(text) - }, - }, -#elseif("" != $column.dictType)## 数据字典 - { - title: '${comment}', - dataIndex: '${javaField}', - width: 180, - customRender: ({ text }) => { - return useRender.renderDict(text, DICT_TYPE.$dictType.toUpperCase()) - }, - }, -#else - { - title: '${comment}', - dataIndex: '${javaField}', - width: 160, - }, -#end -#end -#end -] - -export const searchFormSchema: FormSchema[] = [ -#foreach($column in $columns) -#if ($column.listOperation) - #set ($dictType=$column.dictType) - #set ($javaType = $column.javaType) - #set ($javaField = $column.javaField) - #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) - #set ($comment=$column.columnComment) - #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") - #set ($dictMethod = "number") - #elseif ($javaType == "String") - #set ($dictMethod = "string") - #elseif ($javaType == "Boolean") - #set ($dictMethod = "boolean") - #end - { - label: '${comment}', - field: '${javaField}', - #if ($column.htmlType == "input") - component: 'Input', - #elseif ($column.htmlType == "select") - component: 'Select', - componentProps: { - #if ("" != $dictType)## 设置了 dictType 数据字典的情况 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else## 未设置 dictType 数据字典的情况 - options: [], - #end - }, - #elseif ($column.htmlType == "radio") - component: 'RadioButtonGroup', - componentProps: { - #if ("" != $dictType)## 设置了 dictType 数据字典的情况 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else## 未设置 dictType 数据字典的情况 - options: [], - #end - }, - #elseif($column.htmlType == "datetime") - component: 'RangePicker', - #end - colProps: { span: 8 }, - }, -#end -#end -] - -export const createFormSchema: FormSchema[] = [ - { - label: '编号', - field: 'id', - show: false, - component: 'Input', - }, -#foreach($column in $columns) -#if ($column.createOperation) - #set ($dictType = $column.dictType) - #set ($javaType = $column.javaType) - #set ($javaField = $column.javaField) - #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) - #set ($comment = $column.columnComment) - #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") - #set ($dictMethod = "number") - #elseif ($javaType == "String") - #set ($dictMethod = "string") - #elseif ($javaType == "Boolean") - #set ($dictMethod = "boolean") - #end -#if (!$column.primaryKey)## 忽略主键,不用在表单里 - { - label: '${comment}', - field: '${javaField}', - #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 - required: true, - #end - #if ($column.htmlType == "input") - component: 'Input', - #elseif($column.htmlType == "imageUpload")## 图片上传 - component: 'FileUpload', - componentProps: { - fileType: 'image', - maxCount: 1, - }, - #elseif($column.htmlType == "fileUpload")## 文件上传 - component: 'FileUpload', - componentProps: { - fileType: 'file', - maxCount: 1, - }, - #elseif($column.htmlType == "editor")## 文本编辑器 - component: 'Editor', - #elseif($column.htmlType == "select")## 下拉框 - component: 'Select', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "checkbox")## 多选框 - component: 'Checkbox', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "radio")## 单选框 - component: 'RadioButtonGroup', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "datetime")## 时间框 - component: 'DatePicker', - componentProps: { - showTime: true, - format: 'YYYY-MM-DD HH:mm:ss', - valueFormat: 'x', - }, - #elseif($column.htmlType == "textarea")## 文本域 - component: 'InputTextArea', - #end - }, -#end -#end -#end -] - -export const updateFormSchema: FormSchema[] = [ - { - label: '编号', - field: 'id', - show: false, - component: 'Input', - }, -#foreach($column in $columns) -#if ($column.updateOperation) -#set ($dictType = $column.dictType) -#set ($javaType = $column.javaType) -#set ($javaField = $column.javaField) -#set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) -#set ($comment = $column.columnComment) -#if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") - #set ($dictMethod = "number") -#elseif ($javaType == "String") - #set ($dictMethod = "string") -#elseif ($javaType == "Boolean") - #set ($dictMethod = "boolean") -#end - #if (!$column.primaryKey)## 忽略主键,不用在表单里 - { - label: '${comment}', - field: '${javaField}', - #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 - required: true, - #end - #if ($column.htmlType == "input") - component: 'Input', - #elseif($column.htmlType == "imageUpload")## 图片上传 - component: 'FileUpload', - componentProps: { - fileType: 'image', - maxCount: 1, - }, - #elseif($column.htmlType == "fileUpload")## 文件上传 - component: 'FileUpload', - componentProps: { - fileType: 'file', - maxCount: 1, - }, - #elseif($column.htmlType == "editor")## 文本编辑器 - component: 'Editor', - #elseif($column.htmlType == "select")## 下拉框 - component: 'Select', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "checkbox")## 多选框 - component: 'Checkbox', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "radio")## 单选框 - component: 'RadioButtonGroup', - componentProps: { - #if ("" != $dictType)## 有数据字典 - options: getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod'), - #else##没数据字典 - options:[], - #end - }, - #elseif($column.htmlType == "datetime")## 时间框 - component: 'DatePicker', - componentProps: { - showTime: true, - format: 'YYYY-MM-DD HH:mm:ss', - valueFormat: 'x', - }, - #elseif($column.htmlType == "textarea")## 文本域 - component: 'InputTextArea', - #end - }, - #end -#end -#end -] \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/form.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/form.vue.vm deleted file mode 100644 index 1804365..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/form.vue.vm +++ /dev/null @@ -1,58 +0,0 @@ - - \ No newline at end of file diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/index.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/index.vue.vm deleted file mode 100644 index 9e59b12..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben/views/index.vue.vm +++ /dev/null @@ -1,92 +0,0 @@ - - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm deleted file mode 100644 index c3691a8..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/api/api.ts.vm +++ /dev/null @@ -1,167 +0,0 @@ -import type { PageParam, PageResult } from '@vben/request'; -import type { Dayjs } from 'dayjs'; - -import { requestClient } from '#/api/request'; -#set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}") - -export namespace ${simpleClassName}Api { - ## 特殊:主子表专属逻辑 - #foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subColumns = $subColumnsList.get($index))##当前字段数组 - /** ${subTable.classComment}信息 */ - export interface ${subSimpleClassName} { - #foreach ($column in $subColumns) - #if ($column.createOperation || $column.updateOperation) - #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment} - #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: string | Dayjs; // ${column.columnComment} - #else - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment} - #end - #end - #end - } - - #end - /** ${table.classComment}信息 */ - export interface ${simpleClassName} { - #foreach ($column in $columns) - #if ($column.createOperation || $column.updateOperation) - #if(${column.javaType.toLowerCase()} == "long" || ${column.javaType.toLowerCase()} == "integer" || ${column.javaType.toLowerCase()} == "short" || ${column.javaType.toLowerCase()} == "double" || ${column.javaType.toLowerCase()} == "bigdecimal") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: number; // ${column.columnComment} - #elseif(${column.javaType.toLowerCase()} == "date" || ${column.javaType.toLowerCase()} == "localdate" || ${column.javaType.toLowerCase()} == "localdatetime") - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: string | Dayjs; // ${column.columnComment} - #else - ${column.javaField}#if($column.updateOperation && !$column.primaryKey && !$column.nullable)?#end: ${column.javaType.toLowerCase()}; // ${column.columnComment} - #end - #end - #end - #if ( $table.templateType == 2 ) - children?: ${simpleClassName}[]; - #end - ## 特殊:主子表专属逻辑 - #if ( $table.templateType == 10 || $table.templateType == 12 ) - #foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #if ( $subTable.subJoinMany ) - ${subSimpleClassName.toLowerCase()}s?: ${subSimpleClassName}[] - #else - ${subSimpleClassName.toLowerCase()}?: ${subSimpleClassName} - #end - #end - #end - } -} - -#if ( $table.templateType != 2 ) -/** 查询${table.classComment}分页 */ -export function get${simpleClassName}Page(params: PageParam) { - return requestClient.get>('${baseURL}/page', { params }); -} -#else -/** 查询${table.classComment}列表 */ -export function get${simpleClassName}List(params: any) { - return requestClient.get<${simpleClassName}Api.${simpleClassName}[]>('${baseURL}/list', { params }); -} -#end - -/** 查询${table.classComment}详情 */ -export function get${simpleClassName}(id: number) { - return requestClient.get<${simpleClassName}Api.${simpleClassName}>(`${baseURL}/get?id=${id}`); -} - -/** 新增${table.classComment} */ -export function create${simpleClassName}(data: ${simpleClassName}Api.${simpleClassName}) { - return requestClient.post('${baseURL}/create', data); -} - -/** 修改${table.classComment} */ -export function update${simpleClassName}(data: ${simpleClassName}Api.${simpleClassName}) { - return requestClient.put('${baseURL}/update', data); -} - -/** 删除${table.classComment} */ -export function delete${simpleClassName}(id: number) { - return requestClient.delete(`${baseURL}/delete?id=${id}`); -} - -#if ( $table.templateType != 2 && $deleteBatchEnable) -/** 批量删除${table.classComment} */ -export function delete${simpleClassName}List(ids: number[]) { - return requestClient.delete(`${baseURL}/delete-list?ids=${ids.join(',')}`) -} -#end - -/** 导出${table.classComment} */ -export function export${simpleClassName}(params: any) { - return requestClient.download('${baseURL}/export-excel', { params }); -} - -## 特殊:主子表专属逻辑 -#foreach ($subTable in $subTables) - #set ($index = $foreach.count - 1) - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) - #set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段 - #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段 - #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写 - #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index)) - #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) - #set ($subClassNameVar = $subClassNameVars.get($index)) - -// ==================== 子表($subTable.classComment) ==================== - -## 情况一:MASTER_ERP 时,需要分查询页子表 -#if ( $table.templateType == 11 ) -/** 获得${subTable.classComment}分页 */ -export function get${subSimpleClassName}Page(params: PageParam) { - return requestClient.get>(`${baseURL}/${subSimpleClassName_strikeCase}/page`, { params }); -} - ## 情况二:非 MASTER_ERP 时,需要列表查询子表 -#else -#if ( $subTable.subJoinMany ) -/** 获得${subTable.classComment}列表 */ -export function get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}: number) { - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}[]>(`${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`); -} -#else -/** 获得${subTable.classComment} */ -export function get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}: number) { - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`); -} -#end -#end -## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作 -#if ( $table.templateType == 11 ) -/** 新增${subTable.classComment} */ -export function create${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) { - return requestClient.post(`${baseURL}/${subSimpleClassName_strikeCase}/create`, data); -} - -/** 修改${subTable.classComment} */ -export function update${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) { - return requestClient.put(`${baseURL}/${subSimpleClassName_strikeCase}/update`, data); -} - -/** 删除${subTable.classComment} */ -export function delete${subSimpleClassName}(id: number) { - return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete?id=${id}`); -} - -#if ($deleteBatchEnable) -/** 批量删除${subTable.classComment} */ -export function delete${subSimpleClassName}List(ids: number[]) { - return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}`) -} -#end - -/** 获得${subTable.classComment} */ -export function get${subSimpleClassName}(id: number) { - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`); -} -#end -#end - diff --git a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm b/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm deleted file mode 100644 index 581eae0..0000000 --- a/msgpush-module-infra/msgpush-module-infra-server/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm +++ /dev/null @@ -1,325 +0,0 @@ - - -