From c32a0404ea4c7234d50c282b642188b88520b60e Mon Sep 17 00:00:00 2001 From: bynt <13586541001@163.com> Date: Tue, 28 May 2024 17:53:58 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 69 +- README.md | 1 + admin/.flattened-pom.xml | 128 ++ admin/pom.xml | 170 ++ .../main/java/com/baiye/AdminApplication.java | 26 + .../java/com/baiye/aspect/SysUserAspect.java | 118 ++ .../com/baiye/captcha/CaptchaController.java | 37 + .../ArithmeticCaptchaAbstractRewrite.java | 51 + .../config/ArithmeticCaptchaRewrite.java | 78 + .../baiye/captcha/config/CaptchaConfig.java | 47 + .../captcha/config/KaptchaTextCreator.java | 80 + .../com/baiye/captcha/enums/CaptchaEnum.java | 22 + .../captcha/impl/ValidateCodeServiceImpl.java | 60 + .../com/baiye/constant/CaptchaConstant.java | 20 + .../java/com/baiye/constant/PayConstants.java | 26 + .../com/baiye/constant/PrefixKeyConstant.java | 11 + .../com/baiye/constant/ResponseConstant.java | 17 + .../constant/UploadTemplateHeadConstant.java | 16 + .../java/com/baiye/constant/UrlConstant.java | 18 + .../constant/WeChatRequestConstants.java | 57 + .../baiye/event/system/RootApplication.java | 27 + .../controller/AliPayController.java | 57 + .../controller/LoginEquipmentController.java | 42 + .../controller/PayOrderController.java | 36 + .../controller/WeChatController.java | 133 ++ .../controller/WechatCallbackController.java | 36 + .../converter/PayOrderConverter.java | 23 + .../converter/WeChatAccountConverter.java | 23 + .../modules/distribute/dto/AliPayPcDTO.java | 34 + .../modules/distribute/dto/CreateCodeDTO.java | 21 + .../modules/distribute/dto/EquipmentDTO.java | 33 + .../modules/distribute/dto/PushCodeDTO.java | 18 + .../distribute/dto/WeChatAccountDTO.java | 29 + .../distribute/dto/WeChatAddFriendDTO.java | 40 + .../distribute/dto/WeChatFriendDTO.java | 42 + .../distribute/dto/WeChatStatisticsDTO.java | 25 + .../distribute/dto/WeChatUserLoginDTO.java | 24 + .../modules/distribute/entity/ClueEntity.java | 93 + .../distribute/entity/LoginEquipment.java | 50 + .../modules/distribute/entity/PayOrder.java | 72 + .../distribute/entity/WeChatAccount.java | 74 + .../distribute/entity/WeChatEquipment.java | 46 + .../distribute/entity/WeChatFriedRecord.java | 56 + .../mapper/LoginEquipmentMapper.java | 108 + .../distribute/mapper/PayOrderMapper.java | 55 + .../mapper/WeChatAccountMapper.java | 91 + .../mapper/WeChatEquipmentMapper.java | 31 + .../distribute/mapper/WeChatFriendMapper.java | 64 + .../modules/distribute/qo/AccountQo.java | 30 + .../modules/distribute/qo/PayOrderQo.java | 21 + .../distribute/service/AliPayService.java | 42 + .../service/LoginEquipmentService.java | 74 + .../distribute/service/PayOrderService.java | 23 + .../distribute/service/WeChatService.java | 131 ++ .../service/WechatCallbackService.java | 17 + .../service/WechatFriendService.java | 49 + .../service/impl/AliPayServiceImpl.java | 205 ++ .../impl/LoginEquipmentServiceImpl.java | 110 + .../service/impl/PayOrderServiceImpl.java | 29 + .../service/impl/WeChatServiceImpl.java | 340 +++ .../impl/WechatCallbackServiceImpl.java | 91 + .../service/impl/WechatFriendServiceImpl.java | 137 ++ .../distribute/vo/AccountStatisticsVO.java | 22 + .../modules/distribute/vo/AddFriendVo.java | 49 + .../modules/distribute/vo/PayOrderVO.java | 43 + .../distribute/vo/StatisticsFriendVO.java | 16 + .../distribute/vo/WeChatAccountVO.java | 86 + .../distribute/vo/WeChatAddFriendVo.java | 18 + .../java/com/baiye/properties/PayConfig.java | 40 + .../java/com/baiye/schedule/AccountTask.java | 64 + .../com/baiye/schedule/DynamicController.java | 79 + .../baiye/schedule/entity/JobDynamicTask.java | 46 + .../baiye/schedule/handler/DynamicJob.java | 34 + .../handler/ScanDynamicJobHandler.java | 41 + .../schedule/mapper/JobDynamicTaskMapper.java | 14 + .../schedule/service/ElasticJobService.java | 19 + .../service/impl/ElasticJobServiceImpl.java | 28 + admin/src/main/resources/application-dev.yml | 48 + admin/src/main/resources/application-prod.yml | 39 + admin/src/main/resources/application-test.yml | 26 + admin/src/main/resources/application.yml | 106 + admin/src/main/resources/file/template.xlsx | Bin 0 -> 10034 bytes admin/src/main/resources/logback-spring.xml | 88 + .../resources/mapper/LoginEquipmentMapper.xml | 80 + .../resources/mapper/WeChatFriendMapper.xml | 36 + marketing-scrm-admin/.flattened-pom.xml | 18 + .../admin-core/.flattened-pom.xml | 50 + marketing-scrm-admin/admin-core/pom.xml | 55 + .../com/baiye/upms/UpmsAutoConfiguration.java | 106 + .../config/mybatis/FillMetaObjectHandle.java | 42 + .../config/mybatis/MybatisPlusConfig.java | 62 + .../upms/config/task/MdcTaskDecorator.java | 34 + .../task/TaskExecutionConfiguration.java | 35 + .../com/baiye/upms/log/LogConfiguration.java | 78 + .../com/baiye/upms/log/LoginLogHandler.java | 8 + ...ingAuthorizationServerLoginLogHandler.java | 140 ++ .../main/resources/META-INF/spring.factories | 2 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../admin-websocket/.flattened-pom.xml | 31 + marketing-scrm-admin/admin-websocket/pom.xml | 32 + .../AdminWebSocketAutoConfiguration.java | 34 + ...emWebsocketEventListenerConfiguration.java | 25 + .../UserAttributeHandshakeInterceptor.java | 65 + .../component/UserSessionKeyGenerator.java | 32 + .../constant/AdminWebSocketConstants.java | 22 + .../NotifyWebsocketEventListener.java | 86 + .../SystemWebsocketEventListener.java | 34 + .../message/AnnouncementCloseMessage.java | 23 + .../com/baiye/message/DictChangeMessage.java | 25 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + marketing-scrm-admin/pom.xml | 17 + marketing-scrm-common/common-core/pom.xml | 85 + .../com/baiye/compose/ContextComponent.java | 26 + .../com/baiye/config/RedisCacheConfig.java | 46 + .../constant/DefaultNumberConstants.java | 244 +++ .../java/com/baiye/constant/FileConstant.java | 112 + .../com/baiye/constant/GlobalConstants.java | 32 + .../com/baiye/constant/HeaderConstants.java | 28 + .../com/baiye/constant/HttpsConstants.java | 100 + .../java/com/baiye/constant/MDCConstants.java | 19 + .../com/baiye/constant/SecretConstant.java | 27 + .../constant/WechatCallbackConstant.java | 46 + .../com/baiye/constant/enums/BooleanEnum.java | 35 + .../baiye/constant/enums/ImportModeEnum.java | 25 + .../baiye/constant/enums/ResponseCode.java | 225 ++ .../java/com/baiye/enums/ChannelTypeEnum.java | 50 + .../java/com/baiye/enums/PackageEnum.java | 43 + .../java/com/baiye/enums/SalesManEnum.java | 76 + .../java/com/baiye/enums/StatisticsEnum.java | 48 + .../baiye/exception/BadRequestException.java | 25 + .../baiye/exception/BusinessException.java | 57 + .../baiye/exception/SqlCheckedException.java | 30 + .../exception/handler/GlobalException.java | 58 + .../handler/GlobalExceptionHandler.java | 18 + .../com/baiye/https/CompatibleSSLFactory.java | 95 + .../https/SSLSocketFactoryInitException.java | 12 + .../baiye/jackson/CustomJavaTimeModule.java | 45 + .../jackson/NullArrayJsonSerializer.java | 32 + .../baiye/jackson/NullMapJsonSerializer.java | 32 + .../baiye/jackson/NullSerializerProvider.java | 120 ++ .../jackson/NullStringJsonSerializer.java | 26 + .../com/baiye/lock/JavaReentrantLock.java | 91 + .../com/baiye/markdown/MarkdownBuilder.java | 282 +++ .../com/baiye/pojo/SecretResponseBean.java | 43 + .../wrapper/ModifyParamMapRequestWrapper.java | 28 + .../wrapper/RepeatBodyRequestWrapper.java | 89 + .../spring/BallcatBeanPostProcessor.java | 64 + .../ContextComposeBeanPostProcessor.java | 24 + .../spring/compose/SpringContextClosed.java | 38 + .../thread/AbstractBlockingQueueThread.java | 39 + .../baiye/thread/AbstractDynamicTimer.java | 102 + .../com/baiye/thread/AbstractQueueThread.java | 212 ++ .../AbstractThreadContextComponent.java | 41 + .../java/com/baiye/thread/AbstractTimer.java | 85 + .../main/java/com/baiye/util/AppUtils.java | 90 + .../java/com/baiye/util/CompressUtil.java | 85 + .../java/com/baiye/util/DecryptPnoUtil.java | 106 + .../main/java/com/baiye/util/FileUtil.java | 406 ++++ .../main/java/com/baiye/util/MobileUtil.java | 105 + .../main/java/com/baiye/util/RedisUtils.java | 737 +++++++ .../src/main/java/com/baiye/util/RsaUtil.java | 248 +++ .../main/java/com/baiye/util/WebUtils.java | 45 + ...mptyCurlyToDefaultMessageInterpolator.java | 58 + .../validation/constraints/OneOfClasses.java | 48 + .../validation/constraints/OneOfInts.java | 48 + .../validation/constraints/OneOfStrings.java | 48 + .../validation/constraints/ValueOfEnum.java | 50 + .../baiye/validation/group/CreateGroup.java | 10 + .../baiye/validation/group/SubmitGroup.java | 7 + .../baiye/validation/group/UpdateGroup.java | 10 + .../validator/EnumValueValidatorOfClass.java | 37 + .../validator/EnumValueValidatorOfInt.java | 37 + .../validator/EnumValueValidatorOfString.java | 37 + .../validator/ValueOfEnumValidator.java | 58 + .../common-desensitize/pom.xml | 22 + .../com/baiye/AnnotationHandlerHolder.java | 100 + .../baiye/DesensitizationHandlerHolder.java | 87 + .../enums/RegexDesensitizationTypeEnum.java | 39 + .../enums/SlideDesensitizationTypeEnum.java | 54 + .../baiye/functions/DesensitizeFunction.java | 21 + .../baiye/handler/DesensitizationHandler.java | 11 + .../handler/RegexDesensitizationHandler.java | 34 + .../handler/SimpleDesensitizationHandler.java | 18 + .../SixAsteriskDesensitizationHandler.java | 21 + .../handler/SlideDesensitizationHandler.java | 62 + .../com/baiye/json/DesensitizeStrategy.java | 17 + .../com/baiye/json/JsonDesensitizeModule.java | 17 + .../baiye/json/JsonDesensitizeSerializer.java | 57 + .../JsonDesensitizeSerializerModifier.java | 57 + .../json/annotation/JsonRegexDesensitize.java | 37 + .../annotation/JsonSimpleDesensitize.java | 25 + .../json/annotation/JsonSlideDesensitize.java | 42 + ....upms.handler.SimpleDesensitizationHandler | 1 + ....upms.handler.SimpleDesensitizationHandler | 1 + .../common-idempotent/pom.xml | 70 + .../main/java/com/baiye/IdempotentAspect.java | 54 + .../java/com/baiye/annotation/Idempotent.java | 66 + .../baiye/exception/IdempotentException.java | 15 + .../DefaultIdempotentKeyGenerator.java | 55 + .../key/generator/IdempotentKeyGenerator.java | 25 + .../baiye/key/store/IdempotentKeyStore.java | 31 + .../key/store/InMemoryIdempotentKeyStore.java | 38 + .../key/store/RedisIdempotentKeyStore.java | 34 + .../main/java/com/baiye/polling/Balance.java | 18 + .../java/com/baiye/polling/QueueBalance.java | 26 + marketing-scrm-common/common-log/pom.xml | 32 + .../baiye/access/filter/AccessLogFilter.java | 117 ++ .../access/handler/AccessLogHandler.java | 42 + .../annotation/CreateOperationLogging.java | 44 + .../annotation/DeleteOperationLogging.java | 44 + .../annotation/OperationLogging.java | 43 + .../annotation/ReadOperationLogging.java | 44 + .../annotation/UpdateOperationLogging.java | 44 + .../operation/aspect/OperationLogAspect.java | 80 + .../baiye/operation/enums/LogStatusEnum.java | 26 + .../baiye/operation/enums/OperationTypes.java | 48 + .../handler/AbstractOperationLogHandler.java | 89 + .../handler/OperationLogHandler.java | 42 + .../main/java/com/baiye/util/LogUtils.java | 78 + marketing-scrm-common/common-model/pom.xml | 40 + .../main/java/com/baiye/domain/PageParam.java | 58 + .../java/com/baiye/domain/PageResult.java | 44 + .../com/baiye/domain/PageableConstants.java | 76 + .../java/com/baiye/domain/SelectData.java | 51 + .../java/com/baiye/entity/BaseEntity.java | 49 + .../java/com/baiye/entity/BaseMapStruct.java | 37 + .../baiye/entity/LogicDeletedBaseEntity.java | 27 + .../java/com/baiye/result/BaseResultCode.java | 50 + .../src/main/java/com/baiye/result/R.java | 65 + .../java/com/baiye/result/ResultCode.java | 22 + .../com/baiye/result/SystemResultCode.java | 88 + .../java/com/baiye/result/WeChatResponse.java | 29 + marketing-scrm-common/common-redis/pom.xml | 45 + .../src/main/java/com/baiye/RedisHelper.java | 1854 +++++++++++++++++ .../com/baiye/core/CacheStringAspect.java | 263 +++ .../java/com/baiye/core/KeyGenerator.java | 87 + .../com/baiye/core/annotation/CacheDel.java | 46 + .../com/baiye/core/annotation/CacheDels.java | 19 + .../com/baiye/core/annotation/CachePut.java | 38 + .../com/baiye/core/annotation/Cached.java | 38 + .../core/annotation/MetaCacheAnnotation.java | 15 + ...bstractDeletedKeyEventMessageListener.java | 30 + ...bstractExpiredKeyEventMessageListener.java | 34 + .../AbstractKeySpaceEventMessageListener.java | 75 + .../AbstractSetKeyEventMessageListener.java | 30 + ...DefaultDeletedKeyEventMessageListener.java | 59 + ...DefaultExpiredKeyEventMessageListener.java | 59 + .../DefaultSetKeyEventMessageListener.java | 59 + .../java/com/baiye/keyevent/package-info.java | 4 + .../KeyDeletedEventMessageTemplate.java | 11 + .../template/KeyEventMessageTemplate.java | 26 + .../KeyExpiredEventMessageTemplate.java | 11 + .../template/KeySetEventMessageTemplate.java | 11 + .../AbstractMessageEventListener.java | 51 + .../baiye/listener/MessageEventListener.java | 19 + .../src/main/java/com/baiye/lock/Action.java | 46 + .../main/java/com/baiye/lock/CacheLock.java | 86 + .../java/com/baiye/lock/DistributedLock.java | 106 + .../java/com/baiye/lock/StateHandler.java | 41 + .../baiye/lock/function/ExceptionHandler.java | 17 + .../baiye/lock/function/ThrowingExecutor.java | 18 + .../com/baiye/operation/AbstractCacheOps.java | 36 + .../java/com/baiye/operation/CacheDelOps.java | 27 + .../com/baiye/operation/CacheDelsOps.java | 27 + .../java/com/baiye/operation/CachePutOps.java | 28 + .../java/com/baiye/operation/CachedOps.java | 69 + .../operation/function/ResultMethod.java | 17 + .../baiye/operation/function/VoidMethod.java | 16 + .../baiye/prefix/IRedisPrefixConverter.java | 76 + .../impl/DefaultRedisPrefixConverter.java | 28 + .../com/baiye/serialize/CacheSerializer.java | 62 + .../baiye/serialize/JacksonSerializer.java | 42 + .../serialize/PrefixJdkRedisSerializer.java | 33 + .../PrefixStringRedisSerializer.java | 36 + .../com/baiye/thread/AbstractRedisThread.java | 166 ++ .../baiye/upms/config/CacheProperties.java | 55 + .../upms/config/CachePropertiesHolder.java | 46 + .../com/baiye/upms/config/KeyEventConfig.java | 18 + marketing-scrm-common/common-util/pom.xml | 52 + .../java/com/baiye/charset/GSMCharset.java | 126 ++ .../exception/CommandTimeoutException.java | 8 + .../main/java/com/baiye/queue/WaitQueue.java | 53 + .../main/java/com/baiye/system/Command.java | 161 ++ .../java/com/baiye/system/CommandResult.java | 96 + .../main/java/com/baiye/system/StopWatch.java | 72 + .../java/com/baiye/thread/ThreadPool.java | 92 + .../main/java/com/baiye/util/AESUtils.java | 234 +++ .../main/java/com/baiye/util/ArrayUtils.java | 35 + .../java/com/baiye/util/BooleanUtils.java | 41 + .../main/java/com/baiye/util/ClassUtils.java | 182 ++ .../java/com/baiye/util/EnvironmentUtils.java | 159 ++ .../main/java/com/baiye/util/FileUtils.java | 216 ++ .../main/java/com/baiye/util/HtmlUtils.java | 55 + .../main/java/com/baiye/util/ImageUtils.java | 297 +++ .../src/main/java/com/baiye/util/IpUtils.java | 69 + .../main/java/com/baiye/util/JsonUtils.java | 102 + .../com/baiye/util/LocalDateTimeUtils.java | 120 ++ .../main/java/com/baiye/util/SmsUtils.java | 78 + .../main/java/com/baiye/util/SpelUtils.java | 89 + .../main/java/com/baiye/util/SpringUtils.java | 123 ++ .../main/java/com/baiye/util/StreamUtils.java | 146 ++ .../main/java/com/baiye/util/SystemUtils.java | 91 + .../util/json/FastjsonJsonToolAdapter.java | 67 + .../baiye/util/json/GsonJsonToolAdapter.java | 53 + .../util/json/HuToolJsonToolAdapter.java | 47 + .../util/json/JacksonJsonToolAdapter.java | 60 + .../java/com/baiye/util/json/JsonTool.java | 44 + .../com/baiye/util/json/TypeReference.java | 41 + .../java/com/baiye/util/tree/TreeNode.java | 36 + .../java/com/baiye/util/tree/TreeUtils.java | 328 +++ .../common-websocket/pom.xml | 45 + .../com/baiye/WebSocketMessageSender.java | 44 + .../AbstractMessageDistributor.java | 65 + .../distribute/LocalMessageDistributor.java | 26 + .../java/com/baiye/distribute/MessageDO.java | 36 + .../baiye/distribute/MessageDistributor.java | 17 + .../distribute/RedisMessageDistributor.java | 56 + .../RedisMessageListenerInitializer.java | 27 + .../RocketmqMessageDistributor.java | 77 + .../exception/ErrorJsonMessageException.java | 14 + .../ConcurrentWebSocketSessionOptions.java | 34 + .../baiye/handler/CustomWebSocketHandler.java | 103 + .../com/baiye/handler/JsonMessageHandler.java | 31 + .../baiye/handler/PingJsonMessageHandler.java | 34 + .../baiye/handler/PlanTextMessageHandler.java | 22 + .../holder/JsonMessageHandlerHolder.java | 28 + .../holder/JsonMessageHandlerInitializer.java | 31 + .../baiye/message/JsonWebSocketMessage.java | 31 + .../message/PingJsonWebSocketMessage.java | 13 + .../message/PongJsonWebSocketMessage.java | 13 + .../message/WebSocketMessageTypeEnum.java | 18 + .../session/DefaultWebSocketSessionStore.java | 102 + .../MapSessionWebSocketHandlerDecorator.java | 57 + .../baiye/session/SessionKeyGenerator.java | 20 + .../baiye/session/WebSocketSessionStore.java | 43 + marketing-scrm-common/pom.xml | 48 + .../pom.xml | 56 + .../extend/mybatis/plus/alias/TableAlias.java | 25 + .../mybatis/plus/alias/TableAliasHelper.java | 79 + .../alias/TableAliasNotFoundException.java | 26 + .../plus/conditions/query/ColumnFunction.java | 22 + .../query/LambdaAliasQueryWrapperX.java | 91 + .../conditions/query/LambdaQueryWrapperX.java | 234 +++ .../converter/JsonStringArrayTypeHandler.java | 62 + .../ListIntToListLongTypeHandler.java | 74 + .../plus/injector/CustomSqlInjector.java | 27 + .../mybatis/plus/mapper/ExtendMapper.java | 36 + .../mybatis/plus/methods/BaseInsertBatch.java | 98 + .../InsertBatchSomeColumnByCollection.java | 92 + .../plus/methods/InsertIgnoreByBatch.java | 21 + .../plus/methods/InsertOrUpdateByBatch.java | 67 + .../methods/InsertOrUpdateFieldByBatch.java | 45 + .../mybatis/plus/service/ExtendService.java | 257 +++ .../plus/service/impl/ExtendServiceImpl.java | 251 +++ .../extend/mybatis/plus/toolkit/PageUtil.java | 35 + .../mybatis/plus/toolkit/WrappersX.java | 88 + .../plus/type/EnumNameTypeHandler.java | 92 + marketing-scrm-extends/pom.xml | 20 + .../distribute-notify-biz/pom.xml | 29 + .../notify/event/AnnouncementCloseEvent.java | 23 + .../notify/event/NotifyPublishEvent.java | 26 + .../notify/event/StationNotifyPushEvent.java | 28 + .../event/UserAnnouncementReadEvent.java | 28 + .../handler/AbstractNotifyInfoHandler.java | 71 + .../handler/NotifyInfoDelegateHandler.java | 53 + .../notify/handler/NotifyInfoHandler.java | 28 + .../impl/AnnouncementNotifyInfoHandler.java | 54 + .../handler/impl/AnnouncementPushMessage.java | 74 + .../AnnouncementLoginEventListener.java | 93 + .../listener/NotifyPublishEventListener.java | 37 + .../notify/mapper/AnnouncementMapper.java | 76 + .../notify/mapper/UserAnnouncementMapper.java | 76 + .../baiye/notify/push/MailNotifyPusher.java | 52 + .../baiye/notify/push/NotifyPushExecutor.java | 77 + .../com/baiye/notify/push/NotifyPusher.java | 33 + .../baiye/notify/push/SmsNotifyPusher.java | 45 + .../notify/push/StationNotifyPusher.java | 45 + .../notify/recipient/AllRecipientFilter.java | 62 + .../notify/recipient/RecipientFilter.java | 46 + .../notify/recipient/RecipientHandler.java | 60 + .../SpecifyOrganizationRecipientFilter.java | 65 + .../recipient/SpecifyRoleRecipientFilter.java | 79 + .../recipient/SpecifyUserRecipientFilter.java | 65 + .../SpecifyUserTypeRecipientFilter.java | 65 + .../notify/service/AnnouncementService.java | 79 + .../service/UserAnnouncementService.java | 61 + .../service/impl/AnnouncementServiceImpl.java | 214 ++ .../impl/UserAnnouncementEventListener.java | 34 + .../impl/UserAnnouncementServiceImpl.java | 87 + .../resources/mapper/AnnouncementMapper.xml | 62 + .../distribute-notify-controller/pom.xml | 26 + .../controller/AnnouncementController.java | 139 ++ .../UserAnnouncementController.java | 67 + .../distribute-notify-model/pom.xml | 41 + .../converter/AnnouncementConverter.java | 36 + .../notify/converter/NotifyInfoConverter.java | 24 + .../converter/UserAnnouncementConverter.java | 25 + .../notify/enums/AnnouncementStatusEnum.java | 33 + .../baiye/notify/enums/NotifyChannelEnum.java | 25 + .../enums/NotifyRecipientFilterTypeEnum.java | 29 + .../enums/UserAnnouncementStateEnum.java | 27 + .../model/domain/AnnouncementNotifyInfo.java | 106 + .../baiye/notify/model/domain/NotifyInfo.java | 46 + .../notify/model/dto/AnnouncementDTO.java | 85 + .../notify/model/entity/Announcement.java | 104 + .../notify/model/entity/UserAnnouncement.java | 96 + .../baiye/notify/model/qo/AnnouncementQO.java | 37 + .../notify/model/qo/UserAnnouncementQO.java | 44 + .../notify/model/vo/AnnouncementPageVO.java | 110 + .../model/vo/UserAnnouncementPageVO.java | 84 + marketing-scrm-notify/pom.xml | 18 + marketing-scrm-security/pom.xml | 25 + marketing-scrm-security/security-core/pom.xml | 24 + .../captcha/CaptchaValidateResult.java | 46 + .../captcha/IValidateCodeService.java | 24 + .../properties/SecurityProperties.java | 24 + .../pom.xml | 54 + ...h2AuthorizationObjectMapperCustomizer.java | 15 + .../EnableOauth2AuthorizationServer.java | 20 + ...h2ResourceOwnerAuthenticationProvider.java | 183 ++ ...Auth2ResourceOwnerAuthenticationToken.java | 50 + .../OAuth2AuthenticationProviderUtils.java | 84 + ...ceOwnerPasswordAuthenticationProvider.java | 70 + ...ourceOwnerPasswordAuthenticationToken.java | 45 + ...TokenRevocationAuthenticationProvider.java | 100 + ...th2TokenRevocationAuthenticationToken.java | 123 ++ ...2AuthorizationServerAutoConfiguration.java | 186 ++ ...rverConfigurerCustomizerConfiguration.java | 81 + ...erverExtensionConfigurerConfiguration.java | 44 + ...ationServerSecurityFilterChainBuilder.java | 76 + ...ationServerSecurityFilterChainBuilder.java | 21 + ...uthorizationServerExtensionConfigurer.java | 14 + .../configurer/OAuth2ConfigurerUtils.java | 207 ++ .../OAuth2LoginCaptchaConfigurer.java | 44 + .../OAuth2LoginPasswordDecoderConfigurer.java | 43 + .../FormLoginConfigurerCustomizer.java | 46 + ...orizationEndpointConfigurerCustomizer.java | 64 + ...thorizationServerConfigurerCustomizer.java | 22 + ...urceOwnerPasswordConfigurerCustomizer.java | 61 + ...enResponseEnhanceConfigurerCustomizer.java | 114 + ...evocationEndpointConfigurerCustomizer.java | 31 + .../OAuth2AuthorizationServerProperties.java | 50 + .../token/BallcatOAuth2TokenCustomizer.java | 62 + .../web/CookieBearerTokenResolver.java | 48 + .../authentication/OAuth2EndpointUtils.java | 55 + ...Auth2LoginUrlAuthenticationEntryPoint.java | 74 + ...eOwnerPasswordAuthenticationConverter.java | 87 + .../OAuth2TokenResponseEnhancer.java | 25 + .../OAuth2TokenRevocationResponseHandler.java | 36 + .../OAuth2SecurityContextRepository.java | 70 + .../web/filter/LoginCaptchaFilter.java | 83 + .../filter/LoginPasswordDecoderFilter.java | 102 + .../security-oauth2-core/pom.xml | 33 + .../java/com/baiye/security/ScopeNames.java | 21 + .../OAuth2UserAuthenticationToken.java | 40 + .../component/CustomPermissionEvaluator.java | 36 + .../constant/TokenAttributeNameConstants.java | 26 + .../constant/UserAttributeNameConstants.java | 26 + .../constant/UserInfoFiledNameConstants.java | 71 + .../baiye/security/jackson2/LongMixin.java | 20 + ...h2UserAuthenticationTokenDeserializer.java | 55 + .../OAuth2UserAuthenticationTokenMixin.java | 18 + .../security/jackson2/UserDeserializer.java | 100 + .../baiye/security/jackson2/UserMixin.java | 18 + .../security/userdetails/ClientPrincipal.java | 63 + .../com/baiye/security/userdetails/User.java | 131 ++ .../baiye/security/util/PasswordUtils.java | 86 + .../baiye/security/util/SecurityUtils.java | 80 + .../security-oauth2-resource-server/pom.xml | 56 + ...nonymousForeverAuthenticationProvider.java | 114 + ...OAuth2ResourceServerAutoConfiguration.java | 128 ++ .../EnableOauth2ResourceServer.java | 20 + ...ourceServerSecurityFilterChainBuilder.java | 77 + ...th2ResourceServerConfigurerCustomizer.java | 18 + ...uth2ResourceServerExtensionConfigurer.java | 14 + ...ourceServerSecurityFilterChainBuilder.java | 21 + .../BallcatRemoteOpaqueTokenIntrospector.java | 326 +++ ...erSharedStoredOpaqueTokenIntrospector.java | 93 + .../OAuth2ResourceServerProperties.java | 62 + .../web/CustomAuthenticationEntryPoint.java | 37 + .../marketing-scrm-starter-easyexcel/pom.xml | 78 + .../DefaultAnalysisEventProcessor.java | 157 ++ .../excel/ExcelHandlerConfiguration.java | 85 + .../excel/ResponseExcelAutoConfiguration.java | 98 + .../common/excel/annotation/RequestExcel.java | 47 + .../excel/annotation/ResponseExcel.java | 97 + .../baiye/common/excel/annotation/Sheet.java | 39 + .../common/excel/aop/DynamicNameAspect.java | 46 + .../aop/RequestExcelArgumentResolver.java | 92 + .../aop/ResponseExcelReturnValueHandler.java | 61 + .../excel/config/ExcelConfigProperties.java | 20 + .../converters/BooleanStringConverter.java | 47 + .../excel/converters/ChannelConverter.java | 47 + .../CustomStringStringConverter.java | 45 + .../converters/LocalDateStringConverter.java | 62 + .../converters/LocalDateTimeConverter.java | 41 + .../LocalDateTimeStringConverter.java | 93 + .../excel/converters/NidStringConverter.java | 54 + .../common/excel/converters/SexConverter.java | 35 + .../common/excel/domain/ErrorMessage.java | 41 + .../excel/domain/SheetBuildProperties.java | 53 + .../enhance/DefaultWriterBuilderEnhancer.java | 48 + .../excel/enhance/WriterBuilderEnhancer.java | 42 + .../handler/AbstractSheetWriteHandler.java | 257 +++ .../handler/DefaultAnalysisEventListener.java | 63 + .../handler/ListAnalysisEventListener.java | 27 + .../excel/handler/ManySheetWriteHandler.java | 104 + .../excel/handler/SheetWriteHandler.java | 44 + .../handler/SingleSheetWriteHandler.java | 86 + .../common/excel/head/EmptyHeadGenerator.java | 15 + .../common/excel/head/HeadGenerator.java | 22 + .../com/baiye/common/excel/head/HeadMeta.java | 31 + .../head/I18nHeaderCellWriteHandler.java | 61 + .../common/excel/kit/ExcelException.java | 15 + .../baiye/common/excel/kit/Validators.java | 37 + .../common/excel/processor/NameProcessor.java | 20 + .../NameSpelExpressionProcessor.java | 40 + .../main/resources/META-INF/spring.factories | 3 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../ballcat/excel/application/DemoData.java | 13 + .../ExcelExportTestController.java | 49 + .../application/ExcelFillTestController.java | 31 + .../ExcelImportTestController.java | 22 + .../application/ExcelTestApplication.java | 16 + .../test/resources/excel/fill-template.xlsx | Bin 0 -> 8846 bytes .../src/test/resources/excel/template.xlsx | Bin 0 -> 8791 bytes .../marketing-scrm-starter-file/pom.xml | 44 + .../starter/file/FileAutoConfiguration.java | 39 + .../baiye/starter/file/FileProperties.java | 77 + .../starter/file/core/AbstractFileClient.java | 30 + .../baiye/starter/file/core/FileClient.java | 36 + .../starter/file/exception/FileException.java | 27 + .../baiye/starter/file/ftp/FtpFileClient.java | 101 + .../com/baiye/starter/file/ftp/FtpMode.java | 24 + .../starter/file/local/LocalFileClient.java | 83 + .../main/resources/META-INF/spring.factories | 2 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + .../marketing-scrm-starter-job/pom.xml | 103 + .../job/config/DynamicElasticJobConfig.java | 66 + .../common/job/handler/ElasticJobHandler.java | 79 + .../job/lintener/ElasticJobListener.java | 25 + .../marketing-scrm-starter-redis/pom.xml | 44 + .../AddMessageEventListenerToContainer.java | 32 + .../redis/BallcatRedisAutoConfiguration.java | 118 ++ ...MessageEventListenerAutoConfiguration.java | 30 + .../redis/RedisKeyEventAutoConfiguration.java | 116 ++ .../main/resources/META-INF/spring.factories | 4 + ...ot.autoconfigure.AutoConfiguration.imports | 3 + .../marketing-scrm-starter-swagger/pom.xml | 45 + ...ngfoxHandlerProviderBeanPostProcessor.java | 53 + .../SwaggerAggregatorAutoConfiguration.java | 57 + .../baiye/swagger/SwaggerConfiguration.java | 57 + ...StatusReplaceEnvironmentPostProcessor.java | 69 + .../SwaggerProviderAutoConfiguration.java | 60 + .../annotation/EnableSwagger2Aggregator.java | 22 + .../annotation/EnableSwagger2Provider.java | 22 + .../swagger/builder/DocketBuildHelper.java | 126 ++ .../builder/MultiRequestHandlerSelectors.java | 92 + .../swagger/constant/SwaggerConstants.java | 26 + .../property/DocumentationTypeEnum.java | 29 + .../property/SwaggerAggregatorProperties.java | 24 + .../swagger/property/SwaggerProperties.java | 150 ++ .../property/SwaggerProviderProperties.java | 20 + .../main/resources/META-INF/spring.factories | 3 + ....boot.env.EnvironmentPostProcessor.imports | 1 + .../marketing-scrm-starter-web/pom.xml | 69 + .../ActuatorSecurityAutoConfiguration.java | 52 + .../web/actuate/ActuatorSecurityFilter.java | 98 + .../actuate/ActuatorSecurityProperties.java | 24 + .../event/ApplicationContextInitialized.java | 23 + .../com/baiye/web/event/EnvironmentPost.java | 23 + .../exception/ExceptionAutoConfiguration.java | 142 ++ .../exception/ExceptionHandleProperties.java | 103 + .../exception/domain/ExceptionMessage.java | 86 + .../domain/ExceptionNoticeResponse.java | 27 + .../enums/ExceptionHandleTypeEnum.java | 22 + .../AbstractNoticeGlobalExceptionHandler.java | 199 ++ .../DefaultGlobalExceptionHandler.java | 23 + .../DingTalkGlobalExceptionHandler.java | 34 + .../handler/MailGlobalExceptionHandler.java | 35 + .../handler/MultiGlobalExceptionHandler.java | 88 + .../GlobalHandlerExceptionResolver.java | 168 ++ .../SecurityHandlerExceptionResolver.java | 42 + .../CustomJacksonAutoConfiguration.java | 88 + .../DefaultPageParamArgumentResolver.java | 67 + .../pageable/PageParamArgumentResolver.java | 39 + .../PageParamArgumentResolverSupport.java | 244 +++ .../web/pageable/PageableProperties.java | 35 + .../web/servlet/WebMvcAutoConfiguration.java | 78 + .../com/baiye/web/servlet/WebProperties.java | 18 + .../com/baiye/web/trace/TraceIdFilter.java | 48 + .../com/baiye/web/trace/TraceIdGenerator.java | 20 + .../BallcatValidationAutoConfiguration.java | 45 + .../main/resources/META-INF/spring.factories | 8 + ...ot.autoconfigure.AutoConfiguration.imports | 3 + .../marketing-scrm-starter-websocket/pom.xml | 51 + .../MessageDistributorTypeConstants.java | 33 + .../websocket/SockJsServiceConfigurer.java | 18 + .../websocket/WebSocketAutoConfiguration.java | 95 + .../websocket/WebSocketProperties.java | 89 + .../config/LocalMessageDistributorConfig.java | 37 + .../config/RedisMessageDistributorConfig.java | 57 + .../RocketMqMessageDistributorConfig.java | 35 + .../config/WebSocketHandlerConfig.java | 48 + ...itional-spring-configuration-metadata.json | 32 + .../main/resources/META-INF/spring.factories | 2 + ...ot.autoconfigure.AutoConfiguration.imports | 1 + marketing-scrm-starters/pom.xml | 34 + marketing-scrm-system/pom.xml | 46 + marketing-scrm-system/system-biz/pom.xml | 52 + .../BallcatOAuth2TokenResponseEnhancer.java | 77 + .../DefaultUserInfoCoordinatorImpl.java | 20 + .../SysUserDetailsServiceImpl.java | 92 + .../authentication/UserInfoCoordinator.java | 23 + .../system/checker/AdminUserChecker.java | 42 + .../system/checker/AdminUserCheckerImpl.java | 54 + .../system/component/PasswordHelper.java | 77 + .../baiye/system/manager/SysDictManager.java | 253 +++ .../baiye/system/mapper/SysConfigMapper.java | 72 + .../system/mapper/SysDictItemMapper.java | 66 + .../baiye/system/mapper/SysDictMapper.java | 71 + .../baiye/system/mapper/SysMenuMapper.java | 85 + .../system/mapper/SysOrganizationMapper.java | 68 + .../baiye/system/mapper/SysRoleMapper.java | 63 + .../system/mapper/SysRoleMenuMapper.java | 52 + .../baiye/system/mapper/SysUserMapper.java | 247 +++ .../system/mapper/SysUserRoleMapper.java | 110 + .../mapper/SysUserRolePromiseMapper.java | 86 + .../system/properties/AliPayProperties.java | 30 + .../system/properties/BusinessProperties.java | 23 + .../system/properties/FileProperties.java | 54 + .../system/properties/SystemProperties.java | 60 + .../system/properties/WeChatProperties.java | 23 + .../system/service/SysConfigService.java | 47 + .../system/service/SysDictItemService.java | 48 + .../baiye/system/service/SysDictService.java | 49 + .../baiye/system/service/SysMenuService.java | 45 + .../service/SysOrganizationService.java | 59 + .../system/service/SysRoleMenuService.java | 46 + .../baiye/system/service/SysRoleService.java | 44 + .../service/SysUserRolePromiseService.java | 57 + .../system/service/SysUserRoleService.java | 77 + .../baiye/system/service/SysUserService.java | 239 +++ .../service/impl/SysConfigServiceImpl.java | 61 + .../service/impl/SysDictItemServiceImpl.java | 69 + .../service/impl/SysDictServiceImpl.java | 70 + .../service/impl/SysMenuServiceImpl.java | 146 ++ .../impl/SysOrganizationServiceImpl.java | 237 +++ .../service/impl/SysRoleMenuServiceImpl.java | 79 + .../service/impl/SysRoleServiceImpl.java | 94 + .../impl/SysUserRolePromiseServiceImpl.java | 126 ++ .../service/impl/SysUserRoleServiceImpl.java | 157 ++ .../service/impl/SysUserServiceImpl.java | 589 ++++++ .../main/resources/mapper/SysMenuMapper.xml | 75 + .../mapper/SysOrganizationMapper.xml | 68 + .../main/resources/mapper/SysRoleMapper.xml | 15 + .../main/resources/mapper/SysUserMapper.xml | 212 ++ .../resources/mapper/SysUserRoleMapper.xml | 44 + .../system-controller/pom.xml | 24 + .../controller/SysConfigController.java | 93 + .../system/controller/SysDictController.java | 199 ++ .../system/controller/SysMenuController.java | 159 ++ .../controller/SysOrganizationController.java | 126 ++ .../system/controller/SysRoleController.java | 197 ++ .../system/controller/SysUserController.java | 332 +++ marketing-scrm-system/system-model/pom.xml | 38 + .../com/baiye/system/constant/DateConst.java | 14 + .../baiye/system/constant/LetterConst.java | 17 + .../baiye/system/constant/SysRoleConst.java | 32 + .../baiye/system/constant/SysUserConst.java | 51 + .../constant/SystemRedisKeyConstants.java | 19 + .../system/converter/SysConfigConverter.java | 25 + .../system/converter/SysDictConverter.java | 25 + .../converter/SysDictItemConverter.java | 41 + .../system/converter/SysMenuConverter.java | 59 + .../converter/SysOrganizationConverter.java | 40 + .../system/converter/SysRoleConverter.java | 34 + .../system/converter/SysUserConverter.java | 43 + .../com/baiye/system/enums/RoleCodeEnum.java | 82 + .../com/baiye/system/enums/SysMenuType.java | 30 + .../java/com/baiye/system/enums/TagEnum.java | 18 + .../baiye/system/event/DictChangeEvent.java | 24 + .../baiye/system/event/UserCreatedEvent.java | 27 + .../com/baiye/system/event/UserDelEvent.java | 21 + .../event/UserOrganizationChangeEvent.java | 23 + .../model/dto/OrganizationMoveChildParam.java | 43 + .../system/model/dto/SysDictItemDTO.java | 86 + .../system/model/dto/SysMenuCreateDTO.java | 108 + .../system/model/dto/SysMenuUpdateDTO.java | 106 + .../system/model/dto/SysOrganizationDTO.java | 48 + .../system/model/dto/SysRoleUpdateDTO.java | 38 + .../baiye/system/model/dto/SysUserDTO.java | 114 + .../system/model/dto/SysUserNameRoleDTO.java | 18 + .../system/model/dto/SysUserPassDTO.java | 43 + .../baiye/system/model/dto/SysUserScope.java | 24 + .../baiye/system/model/dto/UserInfoDTO.java | 58 + .../baiye/system/model/entity/SysConfig.java | 59 + .../baiye/system/model/entity/SysDict.java | 61 + .../system/model/entity/SysDictItem.java | 78 + .../baiye/system/model/entity/SysMenu.java | 124 ++ .../system/model/entity/SysOrganization.java | 66 + .../baiye/system/model/entity/SysRole.java | 69 + .../system/model/entity/SysRoleMenu.java | 43 + .../baiye/system/model/entity/SysUser.java | 110 + .../system/model/entity/SysUserRole.java | 37 + .../model/entity/SysUserRolePromise.java | 64 + .../baiye/system/model/qo/RoleBindUserQO.java | 34 + .../baiye/system/model/qo/SysConfigQO.java | 37 + .../com/baiye/system/model/qo/SysDictQO.java | 33 + .../com/baiye/system/model/qo/SysMenuQO.java | 44 + .../system/model/qo/SysOrganizationQO.java | 27 + .../com/baiye/system/model/qo/SysRoleQO.java | 33 + .../com/baiye/system/model/qo/SysUserQO.java | 75 + .../com/baiye/system/model/vo/DictDataVO.java | 39 + .../com/baiye/system/model/vo/DictItemVO.java | 47 + .../baiye/system/model/vo/RoleBindUserVO.java | 38 + .../system/model/vo/SysConfigPageVO.java | 66 + .../system/model/vo/SysDictItemPageVO.java | 84 + .../baiye/system/model/vo/SysDictPageVO.java | 67 + .../baiye/system/model/vo/SysMenuGrantVO.java | 46 + .../baiye/system/model/vo/SysMenuPageVO.java | 120 ++ .../system/model/vo/SysMenuRouterVO.java | 88 + .../system/model/vo/SysOrganizationTree.java | 103 + .../system/model/vo/SysOrganizationVO.java | 60 + .../baiye/system/model/vo/SysRolePageVO.java | 50 + .../system/model/vo/SysUserBalanceVO.java | 37 + .../baiye/system/model/vo/SysUserInfo.java | 93 + .../baiye/system/model/vo/SysUserPageVO.java | 118 ++ pom.xml | 551 +++++ 729 files changed, 47803 insertions(+), 25 deletions(-) create mode 100644 admin/.flattened-pom.xml create mode 100644 admin/pom.xml create mode 100644 admin/src/main/java/com/baiye/AdminApplication.java create mode 100644 admin/src/main/java/com/baiye/aspect/SysUserAspect.java create mode 100644 admin/src/main/java/com/baiye/captcha/CaptchaController.java create mode 100644 admin/src/main/java/com/baiye/captcha/config/ArithmeticCaptchaAbstractRewrite.java create mode 100644 admin/src/main/java/com/baiye/captcha/config/ArithmeticCaptchaRewrite.java create mode 100644 admin/src/main/java/com/baiye/captcha/config/CaptchaConfig.java create mode 100644 admin/src/main/java/com/baiye/captcha/config/KaptchaTextCreator.java create mode 100644 admin/src/main/java/com/baiye/captcha/enums/CaptchaEnum.java create mode 100644 admin/src/main/java/com/baiye/captcha/impl/ValidateCodeServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/constant/CaptchaConstant.java create mode 100644 admin/src/main/java/com/baiye/constant/PayConstants.java create mode 100644 admin/src/main/java/com/baiye/constant/PrefixKeyConstant.java create mode 100644 admin/src/main/java/com/baiye/constant/ResponseConstant.java create mode 100644 admin/src/main/java/com/baiye/constant/UploadTemplateHeadConstant.java create mode 100644 admin/src/main/java/com/baiye/constant/UrlConstant.java create mode 100644 admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java create mode 100644 admin/src/main/java/com/baiye/event/system/RootApplication.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/controller/AliPayController.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/controller/LoginEquipmentController.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/controller/PayOrderController.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/controller/WeChatController.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/controller/WechatCallbackController.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/converter/PayOrderConverter.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/converter/WeChatAccountConverter.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/AliPayPcDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/CreateCodeDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/EquipmentDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/PushCodeDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAccountDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAddFriendDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/WeChatFriendDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/WeChatStatisticsDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/dto/WeChatUserLoginDTO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/entity/ClueEntity.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/entity/LoginEquipment.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/entity/PayOrder.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/entity/WeChatAccount.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/entity/WeChatEquipment.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/entity/WeChatFriedRecord.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/mapper/LoginEquipmentMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/mapper/PayOrderMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatAccountMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatEquipmentMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatFriendMapper.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/qo/AccountQo.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/qo/PayOrderQo.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/AliPayService.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/LoginEquipmentService.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/PayOrderService.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/WeChatService.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/WechatCallbackService.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/WechatFriendService.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/impl/AliPayServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/impl/LoginEquipmentServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/impl/PayOrderServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/impl/WeChatServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatCallbackServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatFriendServiceImpl.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/vo/AccountStatisticsVO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/vo/AddFriendVo.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/vo/PayOrderVO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/vo/StatisticsFriendVO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAccountVO.java create mode 100644 admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAddFriendVo.java create mode 100644 admin/src/main/java/com/baiye/properties/PayConfig.java create mode 100644 admin/src/main/java/com/baiye/schedule/AccountTask.java create mode 100644 admin/src/main/java/com/baiye/schedule/DynamicController.java create mode 100644 admin/src/main/java/com/baiye/schedule/entity/JobDynamicTask.java create mode 100644 admin/src/main/java/com/baiye/schedule/handler/DynamicJob.java create mode 100644 admin/src/main/java/com/baiye/schedule/handler/ScanDynamicJobHandler.java create mode 100644 admin/src/main/java/com/baiye/schedule/mapper/JobDynamicTaskMapper.java create mode 100644 admin/src/main/java/com/baiye/schedule/service/ElasticJobService.java create mode 100644 admin/src/main/java/com/baiye/schedule/service/impl/ElasticJobServiceImpl.java create mode 100644 admin/src/main/resources/application-dev.yml create mode 100644 admin/src/main/resources/application-prod.yml create mode 100644 admin/src/main/resources/application-test.yml create mode 100644 admin/src/main/resources/application.yml create mode 100644 admin/src/main/resources/file/template.xlsx create mode 100644 admin/src/main/resources/logback-spring.xml create mode 100644 admin/src/main/resources/mapper/LoginEquipmentMapper.xml create mode 100644 admin/src/main/resources/mapper/WeChatFriendMapper.xml create mode 100644 marketing-scrm-admin/.flattened-pom.xml create mode 100644 marketing-scrm-admin/admin-core/.flattened-pom.xml create mode 100644 marketing-scrm-admin/admin-core/pom.xml create mode 100644 marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/UpmsAutoConfiguration.java create mode 100644 marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/mybatis/FillMetaObjectHandle.java create mode 100644 marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/mybatis/MybatisPlusConfig.java create mode 100644 marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/task/MdcTaskDecorator.java create mode 100644 marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/task/TaskExecutionConfiguration.java create mode 100644 marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/LogConfiguration.java create mode 100644 marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/LoginLogHandler.java create mode 100644 marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/SpringAuthorizationServerLoginLogHandler.java create mode 100644 marketing-scrm-admin/admin-core/src/main/resources/META-INF/spring.factories create mode 100644 marketing-scrm-admin/admin-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 marketing-scrm-admin/admin-websocket/.flattened-pom.xml create mode 100644 marketing-scrm-admin/admin-websocket/pom.xml create mode 100644 marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/AdminWebSocketAutoConfiguration.java create mode 100644 marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/SystemWebsocketEventListenerConfiguration.java create mode 100644 marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/component/UserAttributeHandshakeInterceptor.java create mode 100644 marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/component/UserSessionKeyGenerator.java create mode 100644 marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/constant/AdminWebSocketConstants.java create mode 100644 marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/listener/NotifyWebsocketEventListener.java create mode 100644 marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/listener/SystemWebsocketEventListener.java create mode 100644 marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/message/AnnouncementCloseMessage.java create mode 100644 marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/message/DictChangeMessage.java create mode 100644 marketing-scrm-admin/admin-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 marketing-scrm-admin/pom.xml create mode 100644 marketing-scrm-common/common-core/pom.xml create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/compose/ContextComponent.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/config/RedisCacheConfig.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/DefaultNumberConstants.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/FileConstant.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/GlobalConstants.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/HeaderConstants.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/HttpsConstants.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/MDCConstants.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/SecretConstant.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/WechatCallbackConstant.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/BooleanEnum.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/ImportModeEnum.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/ResponseCode.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/enums/ChannelTypeEnum.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/enums/PackageEnum.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/enums/SalesManEnum.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/enums/StatisticsEnum.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/exception/BadRequestException.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/exception/BusinessException.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/exception/SqlCheckedException.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/exception/handler/GlobalException.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/exception/handler/GlobalExceptionHandler.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/https/CompatibleSSLFactory.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/https/SSLSocketFactoryInitException.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/CustomJavaTimeModule.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullArrayJsonSerializer.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullMapJsonSerializer.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullSerializerProvider.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullStringJsonSerializer.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/lock/JavaReentrantLock.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/markdown/MarkdownBuilder.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/pojo/SecretResponseBean.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/request/wrapper/ModifyParamMapRequestWrapper.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/request/wrapper/RepeatBodyRequestWrapper.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/spring/BallcatBeanPostProcessor.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/spring/compose/ContextComposeBeanPostProcessor.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/spring/compose/SpringContextClosed.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/thread/AbstractBlockingQueueThread.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/thread/AbstractDynamicTimer.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/thread/AbstractQueueThread.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/thread/AbstractThreadContextComponent.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/thread/AbstractTimer.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/util/AppUtils.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/util/CompressUtil.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/util/DecryptPnoUtil.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/util/FileUtil.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/util/MobileUtil.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/util/RedisUtils.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/util/RsaUtil.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/util/WebUtils.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/EmptyCurlyToDefaultMessageInterpolator.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/constraints/OneOfClasses.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/constraints/OneOfInts.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/constraints/OneOfStrings.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/constraints/ValueOfEnum.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/group/CreateGroup.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/group/SubmitGroup.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/group/UpdateGroup.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/validator/EnumValueValidatorOfClass.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/validator/EnumValueValidatorOfInt.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/validator/EnumValueValidatorOfString.java create mode 100644 marketing-scrm-common/common-core/src/main/java/com/baiye/validation/validator/ValueOfEnumValidator.java create mode 100644 marketing-scrm-common/common-desensitize/pom.xml create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/AnnotationHandlerHolder.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/DesensitizationHandlerHolder.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/enums/RegexDesensitizationTypeEnum.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/enums/SlideDesensitizationTypeEnum.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/functions/DesensitizeFunction.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/handler/DesensitizationHandler.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/handler/RegexDesensitizationHandler.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/handler/SimpleDesensitizationHandler.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/handler/SixAsteriskDesensitizationHandler.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/handler/SlideDesensitizationHandler.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/json/DesensitizeStrategy.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/json/JsonDesensitizeModule.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/json/JsonDesensitizeSerializer.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/json/JsonDesensitizeSerializerModifier.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/json/annotation/JsonRegexDesensitize.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/json/annotation/JsonSimpleDesensitize.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/java/com/baiye/json/annotation/JsonSlideDesensitize.java create mode 100644 marketing-scrm-common/common-desensitize/src/main/resources/META-INF/services/com.baiye.upms.handler.SimpleDesensitizationHandler create mode 100644 marketing-scrm-common/common-desensitize/src/test/resources/META-INF/services/com.baiye.upms.handler.SimpleDesensitizationHandler create mode 100644 marketing-scrm-common/common-idempotent/pom.xml create mode 100644 marketing-scrm-common/common-idempotent/src/main/java/com/baiye/IdempotentAspect.java create mode 100644 marketing-scrm-common/common-idempotent/src/main/java/com/baiye/annotation/Idempotent.java create mode 100644 marketing-scrm-common/common-idempotent/src/main/java/com/baiye/exception/IdempotentException.java create mode 100644 marketing-scrm-common/common-idempotent/src/main/java/com/baiye/key/generator/DefaultIdempotentKeyGenerator.java create mode 100644 marketing-scrm-common/common-idempotent/src/main/java/com/baiye/key/generator/IdempotentKeyGenerator.java create mode 100644 marketing-scrm-common/common-idempotent/src/main/java/com/baiye/key/store/IdempotentKeyStore.java create mode 100644 marketing-scrm-common/common-idempotent/src/main/java/com/baiye/key/store/InMemoryIdempotentKeyStore.java create mode 100644 marketing-scrm-common/common-idempotent/src/main/java/com/baiye/key/store/RedisIdempotentKeyStore.java create mode 100644 marketing-scrm-common/common-idempotent/src/main/java/com/baiye/polling/Balance.java create mode 100644 marketing-scrm-common/common-idempotent/src/main/java/com/baiye/polling/QueueBalance.java create mode 100644 marketing-scrm-common/common-log/pom.xml create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/access/filter/AccessLogFilter.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/access/handler/AccessLogHandler.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/operation/annotation/CreateOperationLogging.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/operation/annotation/DeleteOperationLogging.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/operation/annotation/OperationLogging.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/operation/annotation/ReadOperationLogging.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/operation/annotation/UpdateOperationLogging.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/operation/aspect/OperationLogAspect.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/operation/enums/LogStatusEnum.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/operation/enums/OperationTypes.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/operation/handler/AbstractOperationLogHandler.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/operation/handler/OperationLogHandler.java create mode 100644 marketing-scrm-common/common-log/src/main/java/com/baiye/util/LogUtils.java create mode 100644 marketing-scrm-common/common-model/pom.xml create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/domain/PageParam.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/domain/PageResult.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/domain/PageableConstants.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/domain/SelectData.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/entity/BaseEntity.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/entity/BaseMapStruct.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/entity/LogicDeletedBaseEntity.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/result/BaseResultCode.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/result/R.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/result/ResultCode.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/result/SystemResultCode.java create mode 100644 marketing-scrm-common/common-model/src/main/java/com/baiye/result/WeChatResponse.java create mode 100644 marketing-scrm-common/common-redis/pom.xml create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/RedisHelper.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/core/CacheStringAspect.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/core/KeyGenerator.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/core/annotation/CacheDel.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/core/annotation/CacheDels.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/core/annotation/CachePut.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/core/annotation/Cached.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/core/annotation/MetaCacheAnnotation.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/listener/AbstractDeletedKeyEventMessageListener.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/listener/AbstractExpiredKeyEventMessageListener.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/listener/AbstractKeySpaceEventMessageListener.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/listener/AbstractSetKeyEventMessageListener.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/listener/DefaultDeletedKeyEventMessageListener.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/listener/DefaultExpiredKeyEventMessageListener.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/listener/DefaultSetKeyEventMessageListener.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/package-info.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/template/KeyDeletedEventMessageTemplate.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/template/KeyEventMessageTemplate.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/template/KeyExpiredEventMessageTemplate.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/keyevent/template/KeySetEventMessageTemplate.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/listener/AbstractMessageEventListener.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/listener/MessageEventListener.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/lock/Action.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/lock/CacheLock.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/lock/DistributedLock.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/lock/StateHandler.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/lock/function/ExceptionHandler.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/lock/function/ThrowingExecutor.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/operation/AbstractCacheOps.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/operation/CacheDelOps.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/operation/CacheDelsOps.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/operation/CachePutOps.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/operation/CachedOps.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/operation/function/ResultMethod.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/operation/function/VoidMethod.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/prefix/IRedisPrefixConverter.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/prefix/impl/DefaultRedisPrefixConverter.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/serialize/CacheSerializer.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/serialize/JacksonSerializer.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/serialize/PrefixJdkRedisSerializer.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/serialize/PrefixStringRedisSerializer.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/thread/AbstractRedisThread.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/upms/config/CacheProperties.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/upms/config/CachePropertiesHolder.java create mode 100644 marketing-scrm-common/common-redis/src/main/java/com/baiye/upms/config/KeyEventConfig.java create mode 100644 marketing-scrm-common/common-util/pom.xml create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/charset/GSMCharset.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/exception/CommandTimeoutException.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/queue/WaitQueue.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/system/Command.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/system/CommandResult.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/system/StopWatch.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/thread/ThreadPool.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/AESUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/ArrayUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/BooleanUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/ClassUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/EnvironmentUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/FileUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/HtmlUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/ImageUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/IpUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/JsonUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/LocalDateTimeUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/SmsUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/SpelUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/SpringUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/StreamUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/SystemUtils.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/json/FastjsonJsonToolAdapter.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/json/GsonJsonToolAdapter.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/json/HuToolJsonToolAdapter.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/json/JacksonJsonToolAdapter.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/json/JsonTool.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/json/TypeReference.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/tree/TreeNode.java create mode 100644 marketing-scrm-common/common-util/src/main/java/com/baiye/util/tree/TreeUtils.java create mode 100644 marketing-scrm-common/common-websocket/pom.xml create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/WebSocketMessageSender.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/distribute/AbstractMessageDistributor.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/distribute/LocalMessageDistributor.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/distribute/MessageDO.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/distribute/MessageDistributor.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/distribute/RedisMessageDistributor.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/distribute/RedisMessageListenerInitializer.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/distribute/RocketmqMessageDistributor.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/exception/ErrorJsonMessageException.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/handler/ConcurrentWebSocketSessionOptions.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/handler/CustomWebSocketHandler.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/handler/JsonMessageHandler.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/handler/PingJsonMessageHandler.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/handler/PlanTextMessageHandler.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/holder/JsonMessageHandlerHolder.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/holder/JsonMessageHandlerInitializer.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/message/JsonWebSocketMessage.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/message/PingJsonWebSocketMessage.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/message/PongJsonWebSocketMessage.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/message/WebSocketMessageTypeEnum.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/session/DefaultWebSocketSessionStore.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/session/MapSessionWebSocketHandlerDecorator.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/session/SessionKeyGenerator.java create mode 100644 marketing-scrm-common/common-websocket/src/main/java/com/baiye/session/WebSocketSessionStore.java create mode 100644 marketing-scrm-common/pom.xml create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/pom.xml create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/alias/TableAlias.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/alias/TableAliasHelper.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/alias/TableAliasNotFoundException.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/conditions/query/ColumnFunction.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/conditions/query/LambdaAliasQueryWrapperX.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/conditions/query/LambdaQueryWrapperX.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/converter/JsonStringArrayTypeHandler.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/converter/ListIntToListLongTypeHandler.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/injector/CustomSqlInjector.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/mapper/ExtendMapper.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/methods/BaseInsertBatch.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/methods/InsertBatchSomeColumnByCollection.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/methods/InsertIgnoreByBatch.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/methods/InsertOrUpdateByBatch.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/methods/InsertOrUpdateFieldByBatch.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/service/ExtendService.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/service/impl/ExtendServiceImpl.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/toolkit/PageUtil.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/toolkit/WrappersX.java create mode 100644 marketing-scrm-extends/marketing-scrm-extend-mybatis-plus/src/main/java/com/baiye/extend/mybatis/plus/type/EnumNameTypeHandler.java create mode 100644 marketing-scrm-extends/pom.xml create mode 100644 marketing-scrm-notify/distribute-notify-biz/pom.xml create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/AnnouncementCloseEvent.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/NotifyPublishEvent.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/StationNotifyPushEvent.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/event/UserAnnouncementReadEvent.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/AbstractNotifyInfoHandler.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/NotifyInfoDelegateHandler.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/NotifyInfoHandler.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/impl/AnnouncementNotifyInfoHandler.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/handler/impl/AnnouncementPushMessage.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/listener/AnnouncementLoginEventListener.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/listener/NotifyPublishEventListener.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/mapper/AnnouncementMapper.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/mapper/UserAnnouncementMapper.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/MailNotifyPusher.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/NotifyPushExecutor.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/NotifyPusher.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/SmsNotifyPusher.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/push/StationNotifyPusher.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/AllRecipientFilter.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/RecipientFilter.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/RecipientHandler.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyOrganizationRecipientFilter.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyRoleRecipientFilter.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyUserRecipientFilter.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/recipient/SpecifyUserTypeRecipientFilter.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/AnnouncementService.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/UserAnnouncementService.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/impl/AnnouncementServiceImpl.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/impl/UserAnnouncementEventListener.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/java/com/baiye/notify/service/impl/UserAnnouncementServiceImpl.java create mode 100644 marketing-scrm-notify/distribute-notify-biz/src/main/resources/mapper/AnnouncementMapper.xml create mode 100644 marketing-scrm-notify/distribute-notify-controller/pom.xml create mode 100644 marketing-scrm-notify/distribute-notify-controller/src/main/java/com/baiye/notify/controller/AnnouncementController.java create mode 100644 marketing-scrm-notify/distribute-notify-controller/src/main/java/com/baiye/notify/controller/UserAnnouncementController.java create mode 100644 marketing-scrm-notify/distribute-notify-model/pom.xml create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/AnnouncementConverter.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/NotifyInfoConverter.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/converter/UserAnnouncementConverter.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/AnnouncementStatusEnum.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/NotifyChannelEnum.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/NotifyRecipientFilterTypeEnum.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/enums/UserAnnouncementStateEnum.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/domain/AnnouncementNotifyInfo.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/domain/NotifyInfo.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/dto/AnnouncementDTO.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/entity/Announcement.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/entity/UserAnnouncement.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/qo/AnnouncementQO.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/qo/UserAnnouncementQO.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/vo/AnnouncementPageVO.java create mode 100644 marketing-scrm-notify/distribute-notify-model/src/main/java/com/baiye/notify/model/vo/UserAnnouncementPageVO.java create mode 100644 marketing-scrm-notify/pom.xml create mode 100644 marketing-scrm-security/pom.xml create mode 100644 marketing-scrm-security/security-core/pom.xml create mode 100644 marketing-scrm-security/security-core/src/main/java/org/ballcat/security/captcha/CaptchaValidateResult.java create mode 100644 marketing-scrm-security/security-core/src/main/java/org/ballcat/security/captcha/IValidateCodeService.java create mode 100644 marketing-scrm-security/security-core/src/main/java/org/ballcat/security/properties/SecurityProperties.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/pom.xml create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/OAuth2AuthorizationObjectMapperCustomizer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/annotation/EnableOauth2AuthorizationServer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/authentication/AbstractOAuth2ResourceOwnerAuthenticationProvider.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/authentication/AbstractOAuth2ResourceOwnerAuthenticationToken.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/authentication/OAuth2AuthenticationProviderUtils.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/authentication/OAuth2ResourceOwnerPasswordAuthenticationProvider.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/authentication/OAuth2ResourceOwnerPasswordAuthenticationToken.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/authentication/OAuth2TokenRevocationAuthenticationProvider.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/authentication/OAuth2TokenRevocationAuthenticationToken.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/autoconfigure/OAuth2AuthorizationServerAutoConfiguration.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/autoconfigure/OAuth2AuthorizationServerConfigurerCustomizerConfiguration.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/autoconfigure/OAuth2AuthorizationServerExtensionConfigurerConfiguration.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/BallcatOAuth2AuthorizationServerSecurityFilterChainBuilder.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/OAuth2AuthorizationServerSecurityFilterChainBuilder.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/configurer/OAuth2AuthorizationServerExtensionConfigurer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/configurer/OAuth2ConfigurerUtils.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/configurer/OAuth2LoginCaptchaConfigurer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/configurer/OAuth2LoginPasswordDecoderConfigurer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/customizer/FormLoginConfigurerCustomizer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/customizer/OAuth2AuthorizationEndpointConfigurerCustomizer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/customizer/OAuth2AuthorizationServerConfigurerCustomizer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/customizer/OAuth2ResourceOwnerPasswordConfigurerCustomizer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/customizer/OAuth2TokenResponseEnhanceConfigurerCustomizer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/config/customizer/OAuth2TokenRevocationEndpointConfigurerCustomizer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/properties/OAuth2AuthorizationServerProperties.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/token/BallcatOAuth2TokenCustomizer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/web/CookieBearerTokenResolver.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/web/authentication/OAuth2EndpointUtils.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/web/authentication/OAuth2LoginUrlAuthenticationEntryPoint.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/web/authentication/OAuth2ResourceOwnerPasswordAuthenticationConverter.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/web/authentication/OAuth2TokenResponseEnhancer.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/web/authentication/OAuth2TokenRevocationResponseHandler.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/web/context/OAuth2SecurityContextRepository.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/web/filter/LoginCaptchaFilter.java create mode 100644 marketing-scrm-security/security-oauth2-authorization-server/src/main/java/org/ballcat/springsecurity/oauth2/server/authorization/web/filter/LoginPasswordDecoderFilter.java create mode 100644 marketing-scrm-security/security-oauth2-core/pom.xml create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/ScopeNames.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/authentication/OAuth2UserAuthenticationToken.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/component/CustomPermissionEvaluator.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/constant/TokenAttributeNameConstants.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/constant/UserAttributeNameConstants.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/constant/UserInfoFiledNameConstants.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/jackson2/LongMixin.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/jackson2/OAuth2UserAuthenticationTokenDeserializer.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/jackson2/OAuth2UserAuthenticationTokenMixin.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/jackson2/UserDeserializer.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/jackson2/UserMixin.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/userdetails/ClientPrincipal.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/userdetails/User.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/util/PasswordUtils.java create mode 100644 marketing-scrm-security/security-oauth2-core/src/main/java/com/baiye/security/util/SecurityUtils.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/pom.xml create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/authentication/AnonymousForeverAuthenticationProvider.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/oauth2/server/resource/OAuth2ResourceServerAutoConfiguration.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/oauth2/server/resource/annotation/EnableOauth2ResourceServer.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/oauth2/server/resource/configurer/BallcatOauth2ResourceServerSecurityFilterChainBuilder.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/oauth2/server/resource/configurer/OAuth2ResourceServerConfigurerCustomizer.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/oauth2/server/resource/configurer/OAuth2ResourceServerExtensionConfigurer.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/oauth2/server/resource/configurer/Oauth2ResourceServerSecurityFilterChainBuilder.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/oauth2/server/resource/introspection/BallcatRemoteOpaqueTokenIntrospector.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/oauth2/server/resource/introspection/SpringAuthorizationServerSharedStoredOpaqueTokenIntrospector.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/oauth2/server/resource/properties/OAuth2ResourceServerProperties.java create mode 100644 marketing-scrm-security/security-oauth2-resource-server/src/main/java/org/ballcat/springsecurity/oauth2/server/resource/web/CustomAuthenticationEntryPoint.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/pom.xml create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/alibaba/excel/read/processor/DefaultAnalysisEventProcessor.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/ExcelHandlerConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/ResponseExcelAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/annotation/RequestExcel.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/annotation/ResponseExcel.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/annotation/Sheet.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/aop/DynamicNameAspect.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/aop/RequestExcelArgumentResolver.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/aop/ResponseExcelReturnValueHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/config/ExcelConfigProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/converters/BooleanStringConverter.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/converters/ChannelConverter.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/converters/CustomStringStringConverter.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/converters/LocalDateStringConverter.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/converters/LocalDateTimeConverter.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/converters/LocalDateTimeStringConverter.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/converters/NidStringConverter.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/converters/SexConverter.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/domain/ErrorMessage.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/domain/SheetBuildProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/enhance/DefaultWriterBuilderEnhancer.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/enhance/WriterBuilderEnhancer.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/handler/AbstractSheetWriteHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/handler/DefaultAnalysisEventListener.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/handler/ListAnalysisEventListener.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/handler/ManySheetWriteHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/handler/SheetWriteHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/handler/SingleSheetWriteHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/head/EmptyHeadGenerator.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/head/HeadGenerator.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/head/HeadMeta.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/head/I18nHeaderCellWriteHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/kit/ExcelException.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/kit/Validators.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/processor/NameProcessor.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/java/com/baiye/common/excel/processor/NameSpelExpressionProcessor.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/resources/META-INF/spring.factories create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/test/java/hccake/ballcat/excel/application/DemoData.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/test/java/hccake/ballcat/excel/application/ExcelExportTestController.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/test/java/hccake/ballcat/excel/application/ExcelFillTestController.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/test/java/hccake/ballcat/excel/application/ExcelImportTestController.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/test/java/hccake/ballcat/excel/application/ExcelTestApplication.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/test/resources/excel/fill-template.xlsx create mode 100644 marketing-scrm-starters/marketing-scrm-starter-easyexcel/src/test/resources/excel/template.xlsx create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/pom.xml create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/src/main/java/com/baiye/starter/file/FileAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/src/main/java/com/baiye/starter/file/FileProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/src/main/java/com/baiye/starter/file/core/AbstractFileClient.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/src/main/java/com/baiye/starter/file/core/FileClient.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/src/main/java/com/baiye/starter/file/exception/FileException.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/src/main/java/com/baiye/starter/file/ftp/FtpFileClient.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/src/main/java/com/baiye/starter/file/ftp/FtpMode.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/src/main/java/com/baiye/starter/file/local/LocalFileClient.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/src/main/resources/META-INF/spring.factories create mode 100644 marketing-scrm-starters/marketing-scrm-starter-file/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 marketing-scrm-starters/marketing-scrm-starter-job/pom.xml create mode 100644 marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/config/DynamicElasticJobConfig.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/handler/ElasticJobHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-job/src/main/java/com/baiye/common/job/lintener/ElasticJobListener.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-redis/pom.xml create mode 100644 marketing-scrm-starters/marketing-scrm-starter-redis/src/main/java/com/baiye/autoconfigure/redis/AddMessageEventListenerToContainer.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-redis/src/main/java/com/baiye/autoconfigure/redis/BallcatRedisAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-redis/src/main/java/com/baiye/autoconfigure/redis/MessageEventListenerAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-redis/src/main/java/com/baiye/autoconfigure/redis/RedisKeyEventAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-redis/src/main/resources/META-INF/spring.factories create mode 100644 marketing-scrm-starters/marketing-scrm-starter-redis/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/pom.xml create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/SpringfoxHandlerProviderBeanPostProcessor.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/SwaggerAggregatorAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/SwaggerConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/SwaggerEnabledStatusReplaceEnvironmentPostProcessor.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/SwaggerProviderAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/annotation/EnableSwagger2Aggregator.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/annotation/EnableSwagger2Provider.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/builder/DocketBuildHelper.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/builder/MultiRequestHandlerSelectors.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/constant/SwaggerConstants.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/property/DocumentationTypeEnum.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/property/SwaggerAggregatorProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/property/SwaggerProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/java/com/baiye/swagger/property/SwaggerProviderProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/resources/META-INF/spring.factories create mode 100644 marketing-scrm-starters/marketing-scrm-starter-swagger/src/main/resources/META-INF/spring/org.springframework.boot.env.EnvironmentPostProcessor.imports create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/pom.xml create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/actuate/ActuatorSecurityAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/actuate/ActuatorSecurityFilter.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/actuate/ActuatorSecurityProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/event/ApplicationContextInitialized.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/event/EnvironmentPost.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/ExceptionAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/ExceptionHandleProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/domain/ExceptionMessage.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/domain/ExceptionNoticeResponse.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/enums/ExceptionHandleTypeEnum.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/handler/AbstractNoticeGlobalExceptionHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/handler/DefaultGlobalExceptionHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/handler/DingTalkGlobalExceptionHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/handler/MailGlobalExceptionHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/handler/MultiGlobalExceptionHandler.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/resolver/GlobalHandlerExceptionResolver.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/exception/resolver/SecurityHandlerExceptionResolver.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/jackson/CustomJacksonAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/pageable/DefaultPageParamArgumentResolver.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/pageable/PageParamArgumentResolver.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/pageable/PageParamArgumentResolverSupport.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/pageable/PageableProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/servlet/WebMvcAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/servlet/WebProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/trace/TraceIdFilter.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/trace/TraceIdGenerator.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/java/com/baiye/web/validation/BallcatValidationAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/resources/META-INF/spring.factories create mode 100644 marketing-scrm-starters/marketing-scrm-starter-web/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/pom.xml create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/MessageDistributorTypeConstants.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/SockJsServiceConfigurer.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/WebSocketAutoConfiguration.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/WebSocketProperties.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/LocalMessageDistributorConfig.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/RedisMessageDistributorConfig.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/RocketMqMessageDistributorConfig.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/java/com/baiye/autoconfigure/websocket/config/WebSocketHandlerConfig.java create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/resources/META-INF/additional-spring-configuration-metadata.json create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/resources/META-INF/spring.factories create mode 100644 marketing-scrm-starters/marketing-scrm-starter-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports create mode 100644 marketing-scrm-starters/pom.xml create mode 100644 marketing-scrm-system/pom.xml create mode 100644 marketing-scrm-system/system-biz/pom.xml create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/authentication/BallcatOAuth2TokenResponseEnhancer.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/authentication/DefaultUserInfoCoordinatorImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/authentication/SysUserDetailsServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/authentication/UserInfoCoordinator.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/checker/AdminUserChecker.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/checker/AdminUserCheckerImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/component/PasswordHelper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/manager/SysDictManager.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/mapper/SysConfigMapper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/mapper/SysDictItemMapper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/mapper/SysDictMapper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/mapper/SysMenuMapper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/mapper/SysOrganizationMapper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/mapper/SysRoleMapper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/mapper/SysRoleMenuMapper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/mapper/SysUserMapper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/mapper/SysUserRoleMapper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/mapper/SysUserRolePromiseMapper.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/properties/AliPayProperties.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/properties/BusinessProperties.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/properties/FileProperties.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/properties/SystemProperties.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/properties/WeChatProperties.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/SysConfigService.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/SysDictItemService.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/SysDictService.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/SysMenuService.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/SysOrganizationService.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/SysRoleMenuService.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/SysRoleService.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/SysUserRolePromiseService.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/SysUserRoleService.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/SysUserService.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/impl/SysConfigServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/impl/SysDictItemServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/impl/SysDictServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/impl/SysMenuServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/impl/SysOrganizationServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/impl/SysRoleMenuServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/impl/SysRoleServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/impl/SysUserRolePromiseServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/impl/SysUserRoleServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/java/com/baiye/system/service/impl/SysUserServiceImpl.java create mode 100644 marketing-scrm-system/system-biz/src/main/resources/mapper/SysMenuMapper.xml create mode 100644 marketing-scrm-system/system-biz/src/main/resources/mapper/SysOrganizationMapper.xml create mode 100644 marketing-scrm-system/system-biz/src/main/resources/mapper/SysRoleMapper.xml create mode 100644 marketing-scrm-system/system-biz/src/main/resources/mapper/SysUserMapper.xml create mode 100644 marketing-scrm-system/system-biz/src/main/resources/mapper/SysUserRoleMapper.xml create mode 100644 marketing-scrm-system/system-controller/pom.xml create mode 100644 marketing-scrm-system/system-controller/src/main/java/com/baiye/system/controller/SysConfigController.java create mode 100644 marketing-scrm-system/system-controller/src/main/java/com/baiye/system/controller/SysDictController.java create mode 100644 marketing-scrm-system/system-controller/src/main/java/com/baiye/system/controller/SysMenuController.java create mode 100644 marketing-scrm-system/system-controller/src/main/java/com/baiye/system/controller/SysOrganizationController.java create mode 100644 marketing-scrm-system/system-controller/src/main/java/com/baiye/system/controller/SysRoleController.java create mode 100644 marketing-scrm-system/system-controller/src/main/java/com/baiye/system/controller/SysUserController.java create mode 100644 marketing-scrm-system/system-model/pom.xml create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/constant/DateConst.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/constant/LetterConst.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/constant/SysRoleConst.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/constant/SysUserConst.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/constant/SystemRedisKeyConstants.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/converter/SysConfigConverter.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/converter/SysDictConverter.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/converter/SysDictItemConverter.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/converter/SysMenuConverter.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/converter/SysOrganizationConverter.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/converter/SysRoleConverter.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/converter/SysUserConverter.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/enums/RoleCodeEnum.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/enums/SysMenuType.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/enums/TagEnum.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/event/DictChangeEvent.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/event/UserCreatedEvent.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/event/UserDelEvent.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/event/UserOrganizationChangeEvent.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/OrganizationMoveChildParam.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/SysDictItemDTO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/SysMenuCreateDTO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/SysMenuUpdateDTO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/SysOrganizationDTO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/SysRoleUpdateDTO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/SysUserDTO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/SysUserNameRoleDTO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/SysUserPassDTO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/SysUserScope.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/dto/UserInfoDTO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/entity/SysConfig.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/entity/SysDict.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/entity/SysDictItem.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/entity/SysMenu.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/entity/SysOrganization.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/entity/SysRole.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/entity/SysRoleMenu.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/entity/SysUser.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/entity/SysUserRole.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/entity/SysUserRolePromise.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/qo/RoleBindUserQO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/qo/SysConfigQO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/qo/SysDictQO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/qo/SysMenuQO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/qo/SysOrganizationQO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/qo/SysRoleQO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/qo/SysUserQO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/DictDataVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/DictItemVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/RoleBindUserVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysConfigPageVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysDictItemPageVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysDictPageVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysMenuGrantVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysMenuPageVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysMenuRouterVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysOrganizationTree.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysOrganizationVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysRolePageVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysUserBalanceVO.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysUserInfo.java create mode 100644 marketing-scrm-system/system-model/src/main/java/com/baiye/system/model/vo/SysUserPageVO.java create mode 100644 pom.xml diff --git a/.gitignore b/.gitignore index 9154f4c..9a7f05e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,45 @@ -# ---> Java -# Compiled class file -*.class - -# Log file -*.log - -# BlueJ files -*.ctxt - -# Mobile Tools for Java (J2ME) -.mtj.tmp/ - -# Package Files # -*.jar -*.war -*.nar -*.ear -*.zip -*.tar.gz -*.rar - -# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml -hs_err_pid* -replay_pid* +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ +!**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ + + +### custom ### +.flattened-pom.xml +/**/application-local.yml +/logs/ + +/log/ +*/log/ + diff --git a/README.md b/README.md index 51b19ee..9d907bf 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # marketing-scrm +百业营销 diff --git a/admin/.flattened-pom.xml b/admin/.flattened-pom.xml new file mode 100644 index 0000000..db1808a --- /dev/null +++ b/admin/.flattened-pom.xml @@ -0,0 +1,128 @@ + + + 4.0.0 + + com.baiye + marketing-scrm + 1.0.0 + + com.baiye + admin + 1.0.0 + + 3.0.3 + + + + com.baiye + security-oauth2-authorization-server + ${revision} + + + com.baiye + admin-websocket + + + com.baiye + marketing-scrm-starter-job + + + com.baiye + admin-core + ${revision} + + + org.springframework.boot + spring-boot-starter-web + + + com.baiye + common-redis + ${revision} + + + com.mysql + mysql-connector-j + + + org.springdoc + springdoc-openapi-ui + + + org.springdoc + springdoc-openapi-security + + + com.github.xiaoymin + knife4j-springdoc-ui + ${knife4j.version} + + + com.github.whvcse + easy-captcha + + + jakarta.xml.bind + jakarta.xml.bind-api + + + org.glassfish.jaxb + jaxb-runtime + + + cn.hutool + hutool-all + + + com.alibaba + easyexcel + + + org.springframework.boot + spring-boot-test + + + org.springframework + spring-test + test + + + junit + junit + test + + + com.google.code.gson + gson + + + com.baiye + marketing-scrm-starter-easyexcel + ${revision} + + + com.baiye + common-idempotent + + + com.alipay.sdk + alipay-easysdk + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + diff --git a/admin/pom.xml b/admin/pom.xml new file mode 100644 index 0000000..8f69cbc --- /dev/null +++ b/admin/pom.xml @@ -0,0 +1,170 @@ + + + + marketing-scrm + com.baiye + ${revision} + + 4.0.0 + + admin + + + 3.0.3 + + + + + + com.baiye + security-oauth2-authorization-server + ${revision} + + + + com.baiye + admin-websocket + + + + com.baiye + marketing-scrm-starter-job + + + + + com.baiye + admin-core + ${revision} + + + + org.springframework.boot + spring-boot-starter-web + + + + com.baiye + common-redis + ${revision} + + + + + com.mysql + mysql-connector-j + + + + + + + + + + + org.springdoc + springdoc-openapi-ui + + + org.springdoc + springdoc-openapi-security + + + + + com.github.xiaoymin + knife4j-springdoc-ui + ${knife4j.version} + + + + + com.github.whvcse + easy-captcha + + + + + + jakarta.xml.bind + jakarta.xml.bind-api + + + org.glassfish.jaxb + jaxb-runtime + + + + + cn.hutool + hutool-all + + + + com.alibaba + easyexcel + + + + + org.springframework.boot + spring-boot-test + + + + org.springframework + spring-test + test + + + + junit + junit + test + + + + com.google.code.gson + gson + + + + com.baiye + marketing-scrm-starter-easyexcel + ${revision} + + + + com.baiye + common-idempotent + + + + com.alipay.sdk + alipay-easysdk + + + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/admin/src/main/java/com/baiye/AdminApplication.java b/admin/src/main/java/com/baiye/AdminApplication.java new file mode 100644 index 0000000..11f0bff --- /dev/null +++ b/admin/src/main/java/com/baiye/AdminApplication.java @@ -0,0 +1,26 @@ +package com.baiye; + +import org.ballcat.springsecurity.oauth2.server.authorization.annotation.EnableOauth2AuthorizationServer; +import org.ballcat.springsecurity.oauth2.server.resource.annotation.EnableOauth2ResourceServer; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +/** + * @author Hccake + */ +@EnableTransactionManagement +@EnableOauth2AuthorizationServer +@EnableOauth2ResourceServer +@MapperScan({ "com.baiye.**.mapper" }) +@SpringBootApplication +@EnableScheduling +public class AdminApplication { + + public static void main(String[] args) { + SpringApplication.run(AdminApplication.class, args); + } + +} diff --git a/admin/src/main/java/com/baiye/aspect/SysUserAspect.java b/admin/src/main/java/com/baiye/aspect/SysUserAspect.java new file mode 100644 index 0000000..7a9d136 --- /dev/null +++ b/admin/src/main/java/com/baiye/aspect/SysUserAspect.java @@ -0,0 +1,118 @@ +//package com.baiye.aspect; +// +//import cn.hutool.core.collection.CollUtil; +//import com.baiye.modules.distribute.entity.*; +//import com.baiye.modules.distribute.mapper.ClueMapper; +//import com.baiye.modules.distribute.mapper.ClueStageMapper; +//import com.baiye.modules.distribute.mapper.LabelMapper; +//import com.baiye.modules.distribute.mapper.LabelOrganizeMapper; +//import com.baiye.modules.distribute.service.ClueRecordService; +//import com.baiye.modules.distribute.service.DistributeTaskService; +//import com.baiye.security.util.SecurityUtils; +//import com.baiye.system.mapper.SysUserMapper; +//import com.baiye.system.model.dto.SysUserDTO; +//import com.baiye.system.model.entity.SysUser; +//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +//import com.baomidou.mybatisplus.core.mapper.BaseMapper; +//import lombok.RequiredArgsConstructor; +//import lombok.extern.slf4j.Slf4j; +//import org.aspectj.lang.JoinPoint; +//import org.aspectj.lang.annotation.AfterReturning; +//import org.aspectj.lang.annotation.Aspect; +//import org.aspectj.lang.annotation.Before; +//import org.aspectj.lang.annotation.Pointcut; +//import org.springframework.stereotype.Component; +// +//import java.util.List; +//import java.util.stream.Collectors; +// +///** +// * 系统用户方法AOP +// */ +//@Aspect +//@Component +//@Slf4j +//@RequiredArgsConstructor +//public class SysUserAspect { +// +// private final ClueRecordService clueRecordService; +// +// private final ClueMapper clueMapper; +// +// private final SysUserMapper sysUserMapper; +// +// private final DistributeTaskService distributeTaskService; +// +// private final LabelMapper labelMapper; +// +// private final LabelOrganizeMapper labelOrganizeMapper; +// +// private final ClueStageMapper clueStageMapper; +// +// /** +// * 配置切入点 +// */ +// @Pointcut("execution(* com.baiye.system.service.impl.SysUserServiceImpl.addSysUser(..))") +// public void asyncAddSysUser() { +// } +// +// /** +// * 配置切入点 +// */ +// @Pointcut("execution(* com.baiye.system.service.impl.SysUserServiceImpl.deleteByUserId(..))") +// public void asyncDeleteByUserId() { +// } +// +// @AfterReturning("asyncAddSysUser()") +// public void beforeAddSysUser(JoinPoint joinPoint) { +// log.info("==========创建用户开始执行AOP切入业务=========="); +// // 获取目标对象方法参数,添加业务管理员账号的默认上传记录 +// if (SecurityUtils.getCurrentUserId() == 1) { +// Object[] args = joinPoint.getArgs(); +// if (args[0] != null && args[0] instanceof SysUserDTO) { +// SysUserDTO sysUserDTO = (SysUserDTO) args[0]; +// String username = sysUserDTO.getUsername(); +// SysUser sysUser = sysUserMapper.selectByUsername(username); +// if (sysUser != null && sysUser.getUserId() != null) { +// // 创建默认的文件记录 +// ClueRecordEntity entity = clueRecordService.addDefaultRecordService(sysUser.getUserId(), "资源推送", +// "资源推送"); +// // 创建默认的执行任务 +// distributeTaskService.addDefaultTask("资源推送", null, entity.getClueRecordId().toString(), +// sysUser.getUserId(), null); +// } +// } +// } +// } +// +// @Before("asyncDeleteByUserId()") +// public void beforeDeleteByUserId(JoinPoint joinPoint) { +// log.info("==========删除用户开始执行AOP切入业务=========="); +// Object[] args = joinPoint.getArgs(); +// Object obj = args[0]; +// if (obj instanceof Long) { +// // 查询下级是否有子用户 +// List userList = sysUserMapper +// .selectList(new LambdaQueryWrapper().eq(SysUser::getWhichUserId, obj)); +// if (CollUtil.isNotEmpty(userList)) { +// List userIdList = userList.stream().map(SysUser::getUserId).collect(Collectors.toList()); +// userIdList.add((Long) obj); +// clueMapper.delete(new LambdaQueryWrapper().in(ClueEntity::getAssignedBy, userIdList)); +// } +// clueMapper.delete(new LambdaQueryWrapper().eq(ClueEntity::getAssignedBy, obj)); +// +// // 删除用户的任务和上传记录 +// BaseMapper taskMapper = distributeTaskService.getBaseMapper(); +// taskMapper +// .delete(new LambdaQueryWrapper().eq(DistributeTaskEntity::getCreateBy, obj)); +// BaseMapper clueRecordMapper = clueRecordService.getBaseMapper(); +// clueRecordMapper.delete(new LambdaQueryWrapper().eq(ClueRecordEntity::getCreateBy, obj)); +// // 删除用户标签和标签组 - 阶段信息 +// labelMapper.delete(new LambdaQueryWrapper().eq(LabelEntity::getCreateBy, obj)); +// labelOrganizeMapper +// .delete(new LambdaQueryWrapper().eq(LabelOrganizeEntity::getCreateBy, obj)); +// clueStageMapper.delete(new LambdaQueryWrapper().eq(ClueStageEntity::getCreateBy, obj)); +// } +// } +// +//} diff --git a/admin/src/main/java/com/baiye/captcha/CaptchaController.java b/admin/src/main/java/com/baiye/captcha/CaptchaController.java new file mode 100644 index 0000000..fdce238 --- /dev/null +++ b/admin/src/main/java/com/baiye/captcha/CaptchaController.java @@ -0,0 +1,37 @@ +package com.baiye.captcha; + +import com.baiye.exception.BadRequestException; +import com.baiye.result.R; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.ballcat.security.captcha.IValidateCodeService; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +/** + * 验证码生成 + */ +@RequiredArgsConstructor +@RestController +@RequestMapping("/captcha") +@Tag(name = "验证码") +public class CaptchaController { + + private final IValidateCodeService codeService; + + @GetMapping("/code") + @Operation(summary = "获取验证码") + public R getCode() { + Map captcha; + try { + captcha = this.codeService.createCapcha(); + } catch (Exception e) { + throw new BadRequestException("生成验证码错误"); + } + return R.ok(captcha); + } +} diff --git a/admin/src/main/java/com/baiye/captcha/config/ArithmeticCaptchaAbstractRewrite.java b/admin/src/main/java/com/baiye/captcha/config/ArithmeticCaptchaAbstractRewrite.java new file mode 100644 index 0000000..7c60499 --- /dev/null +++ b/admin/src/main/java/com/baiye/captcha/config/ArithmeticCaptchaAbstractRewrite.java @@ -0,0 +1,51 @@ +package com.baiye.captcha.config; + +import com.wf.captcha.base.Captcha; + +import javax.script.ScriptEngine; +import javax.script.ScriptEngineManager; +import javax.script.ScriptException; + +/** + * 验证码源码复制重写{@link ArithmeticCaptchaRewrite} 待修改 + */ +public abstract class ArithmeticCaptchaAbstractRewrite extends Captcha { + private String arithmeticString; + + public ArithmeticCaptchaAbstractRewrite() { + this.setLen(2); + } + + protected char[] alphas() { + StringBuilder sb = new StringBuilder(); + + for (int i = 0; i < this.len; ++i) { + sb.append(num(10)); + if (i < this.len - 1) { + sb.append("+"); + } + } + + ScriptEngineManager manager = new ScriptEngineManager(); + ScriptEngine engine = manager.getEngineByName("javascript"); + + try { + this.chars = String.valueOf(engine.eval(sb.toString().replaceAll("x", "*"))); + } catch (ScriptException var5) { + var5.printStackTrace(); + } + + sb.append("=?"); + this.arithmeticString = sb.toString(); + return this.chars.toCharArray(); + } + + public String getArithmeticString() { + this.checkAlpha(); + return this.arithmeticString; + } + + public void setArithmeticString(String arithmeticString) { + this.arithmeticString = arithmeticString; + } +} diff --git a/admin/src/main/java/com/baiye/captcha/config/ArithmeticCaptchaRewrite.java b/admin/src/main/java/com/baiye/captcha/config/ArithmeticCaptchaRewrite.java new file mode 100644 index 0000000..09d90a4 --- /dev/null +++ b/admin/src/main/java/com/baiye/captcha/config/ArithmeticCaptchaRewrite.java @@ -0,0 +1,78 @@ +package com.baiye.captcha.config; + +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.io.OutputStream; + +/** + * 验证码源码复制重写{@link ArithmeticCaptchaAbstractRewrite} 待修改 + */ +public class ArithmeticCaptchaRewrite extends ArithmeticCaptchaAbstractRewrite { + public ArithmeticCaptchaRewrite() { + } + + public ArithmeticCaptchaRewrite(int width, int height) { + this(); + this.setWidth(width); + this.setHeight(height); + } + + public ArithmeticCaptchaRewrite(int width, int height, int len) { + this(width, height); + this.setLen(len); + } + + public ArithmeticCaptchaRewrite(int width, int height, int len, Font font) { + this(width, height, len); + this.setFont(font); + } + + public boolean out(OutputStream out) { + this.checkAlpha(); + return this.graphicsImage(this.getArithmeticString().toCharArray(), out); + } + + public String toBase64() { + return this.toBase64("data:image/png;base64,"); + } + + private boolean graphicsImage(char[] strs, OutputStream out) { + try { + BufferedImage bi = new BufferedImage(this.width, this.height, 1); + Graphics2D g2d = (Graphics2D)bi.getGraphics(); + g2d.setColor(Color.WHITE); + g2d.fillRect(0, 0, this.width, this.height); + g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + this.drawOval(2, g2d); + g2d.setFont(this.getFont()); + FontMetrics fontMetrics = g2d.getFontMetrics(); + int fW = this.width / strs.length; + int fSp = (fW - (int)fontMetrics.getStringBounds("8", g2d).getWidth()) / 2; + + for(int i = 0; i < strs.length; ++i) { + g2d.setColor(this.color()); + int fY = this.height - (this.height - (int)fontMetrics.getStringBounds(String.valueOf(strs[i]), g2d).getHeight() >> 1); + g2d.drawString(String.valueOf(strs[i]), i * fW + fSp + 3, fY - 3); + } + + g2d.dispose(); + ImageIO.write(bi, "png", out); + out.flush(); + boolean var20 = true; + return var20; + } catch (IOException var18) { + var18.printStackTrace(); + } finally { + try { + out.close(); + } catch (IOException var17) { + var17.printStackTrace(); + } + + } + + return false; + } +} diff --git a/admin/src/main/java/com/baiye/captcha/config/CaptchaConfig.java b/admin/src/main/java/com/baiye/captcha/config/CaptchaConfig.java new file mode 100644 index 0000000..d14372b --- /dev/null +++ b/admin/src/main/java/com/baiye/captcha/config/CaptchaConfig.java @@ -0,0 +1,47 @@ +package com.baiye.captcha.config; + +import com.baiye.captcha.enums.CaptchaEnum; +import lombok.Getter; +import lombok.Setter; +import org.springframework.context.annotation.Configuration; + +/** + * 验证码配置 + */ +@Getter +@Setter +@Configuration +public class CaptchaConfig { + /** + * 验证码配置 + */ + private CaptchaEnum codeType = CaptchaEnum.arithmetic; + /** + * 验证码有效期 分钟 + */ + private Long expiration = 2L; + /** + * 验证码内容长度 + */ + private int length = 2; + /** + * 验证码宽度 + */ + private int width = 111; + /** + * 验证码高度 + */ + private int height = 36; + /** + * 验证码字体 + */ + private String fontName; + /** + * 字体大小 + */ + private int fontSize = 25; + + public CaptchaEnum getCodeType() { + return codeType; + } +} diff --git a/admin/src/main/java/com/baiye/captcha/config/KaptchaTextCreator.java b/admin/src/main/java/com/baiye/captcha/config/KaptchaTextCreator.java new file mode 100644 index 0000000..da5ec65 --- /dev/null +++ b/admin/src/main/java/com/baiye/captcha/config/KaptchaTextCreator.java @@ -0,0 +1,80 @@ +package com.baiye.captcha.config; + +import com.baiye.captcha.enums.CaptchaEnum; +import com.wf.captcha.*; +import com.wf.captcha.base.Captcha; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Component; + +import java.awt.*; +import java.util.Objects; + +/** + * @description 验证码文本生成器 + */ +@Component +public class KaptchaTextCreator { + + private final CaptchaConfig captchaConfig; + + public KaptchaTextCreator(CaptchaConfig captchaConfig) { + this.captchaConfig = captchaConfig; + } + + /** + * 获取验证码生产类 + * + * @return / + */ + public Captcha getCaptcha() { + if (Objects.isNull(captchaConfig)) { + if (Objects.isNull(captchaConfig.getCodeType())) { + captchaConfig.setCodeType(CaptchaEnum.arithmetic); + } + } + return switchCaptcha(captchaConfig); + } + + /** + * 依据配置信息生产验证码 + * + * @param captchaConfig 验证码配置信息 + * @return / + */ + private Captcha switchCaptcha(CaptchaConfig captchaConfig) { + Captcha captcha; + synchronized (this) { + switch (captchaConfig.getCodeType()) { + case arithmetic: + // 算术类型 https://gitee.com/whvse/EasyCaptcha + //captcha = new ArithmeticCaptcha(captchaConfig.getWidth(), captchaConfig.getHeight()); + captcha = new ArithmeticCaptchaRewrite(captchaConfig.getWidth(), captchaConfig.getHeight()); + // 几位数运算,默认是两位 + captcha.setLen(captchaConfig.getLength()); + break; + case chinese: + captcha = new ChineseCaptcha(captchaConfig.getWidth(), captchaConfig.getHeight()); + captcha.setLen(captchaConfig.getLength()); + break; + case chinese_gif: + captcha = new ChineseGifCaptcha(captchaConfig.getWidth(), captchaConfig.getHeight()); + captcha.setLen(captchaConfig.getLength()); + break; + case gif: + captcha = new GifCaptcha(captchaConfig.getWidth(), captchaConfig.getHeight()); + captcha.setLen(captchaConfig.getLength()); + break; + case spec: + captcha = new SpecCaptcha(captchaConfig.getWidth(), captchaConfig.getHeight()); + captcha.setLen(captchaConfig.getLength()); + break; + default: + throw new IllegalArgumentException("验证码配置信息错误!正确配置查看 CaptchaEnum "); + } + } + if(StringUtils.isNotBlank(captchaConfig.getFontName())){ + captcha.setFont(new Font(captchaConfig.getFontName(), Font.PLAIN, captchaConfig.getFontSize())); + } + return captcha; + } +} diff --git a/admin/src/main/java/com/baiye/captcha/enums/CaptchaEnum.java b/admin/src/main/java/com/baiye/captcha/enums/CaptchaEnum.java new file mode 100644 index 0000000..7a880f7 --- /dev/null +++ b/admin/src/main/java/com/baiye/captcha/enums/CaptchaEnum.java @@ -0,0 +1,22 @@ +package com.baiye.captcha.enums; + +public enum CaptchaEnum { + /** + * 算数 + */ + arithmetic, + /** + * 中文 + */ + chinese, + /** + * 中文闪图 + */ + chinese_gif, + /** + * 闪图 + */ + gif, + + spec +} diff --git a/admin/src/main/java/com/baiye/captcha/impl/ValidateCodeServiceImpl.java b/admin/src/main/java/com/baiye/captcha/impl/ValidateCodeServiceImpl.java new file mode 100644 index 0000000..7a8f78c --- /dev/null +++ b/admin/src/main/java/com/baiye/captcha/impl/ValidateCodeServiceImpl.java @@ -0,0 +1,60 @@ +package com.baiye.captcha.impl; + +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.IdUtil; +import com.baiye.constant.CaptchaConstant; +import com.baiye.captcha.config.KaptchaTextCreator; +import com.baiye.exception.BadRequestException; +import com.baiye.util.RedisUtils; +import com.wf.captcha.base.Captcha; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.ballcat.security.captcha.IValidateCodeService; +import org.springframework.stereotype.Service; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +/** + * @description 验证码业务处理实现类 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ValidateCodeServiceImpl implements IValidateCodeService { + + private final RedisUtils redisUtils; + + private final KaptchaTextCreator kaptchaTextCreator; + + + @Override + public Map createCapcha() { + // 获取验证码 + Captcha captcha = this.kaptchaTextCreator.getCaptcha(); + // 生成一个唯一的id + String uuid = CaptchaConstant.CAPTCHA_CODE_KEY + IdUtil.simpleUUID(); + // 保存到redis中 + this.redisUtils.set(uuid, captcha.text(), CaptchaConstant.CAPTCHA_EXPIRATION, TimeUnit.MINUTES); + Map map = new HashMap<>(); + map.put("uuid", uuid); + map.put("img", captcha.toBase64()); + return map; + } + + @Override + public void checkCapcha(String key, String code) { + if (CharSequenceUtil.isBlank(code)) { + throw new BadRequestException("验证码不能为空"); + } + String captcha = (String) redisUtils.get(key); + if (CharSequenceUtil.isBlank(captcha)) { + throw new BadRequestException("验证码已失效"); + } + redisUtils.del(key); + if (!code.equalsIgnoreCase(captcha)) { + throw new BadRequestException("验证码错误"); + } + } +} diff --git a/admin/src/main/java/com/baiye/constant/CaptchaConstant.java b/admin/src/main/java/com/baiye/constant/CaptchaConstant.java new file mode 100644 index 0000000..55b6e13 --- /dev/null +++ b/admin/src/main/java/com/baiye/constant/CaptchaConstant.java @@ -0,0 +1,20 @@ +package com.baiye.constant; + +/** + * 通用常量信息 + * + * @author ruoyi + */ +public final class CaptchaConstant { + + /** + * 验证码 redis key + */ + public static final String CAPTCHA_CODE_KEY = "captcha_codes:"; + + /** + * 验证码有效期(分钟) + */ + public static final Integer CAPTCHA_EXPIRATION = 2; + +} diff --git a/admin/src/main/java/com/baiye/constant/PayConstants.java b/admin/src/main/java/com/baiye/constant/PayConstants.java new file mode 100644 index 0000000..ef2b6a3 --- /dev/null +++ b/admin/src/main/java/com/baiye/constant/PayConstants.java @@ -0,0 +1,26 @@ +package com.baiye.constant; + +/** + * 支付相关 常量定义 + * + * @author Enzo + * @date : 2021/6/16 + */ +public class PayConstants { + + private PayConstants() { + } + + /** + * 付款信息 反馈中文字段补充前缀 + */ + public static final String PAY_TITLE = "回跟营销系统支付订单:"; + + /** + * 返回的信息字段内容对应 key + */ + public static final String OUT_TRADE_NO = "out_trade_no"; + + + +} diff --git a/admin/src/main/java/com/baiye/constant/PrefixKeyConstant.java b/admin/src/main/java/com/baiye/constant/PrefixKeyConstant.java new file mode 100644 index 0000000..31cec0d --- /dev/null +++ b/admin/src/main/java/com/baiye/constant/PrefixKeyConstant.java @@ -0,0 +1,11 @@ +package com.baiye.constant; + +/** + * @Author YQY + * @Date 2023/8/17 + */ +public class PrefixKeyConstant { + + public static final String JOB_KEY = "ad_distribute_distributeTask_id_"; + +} diff --git a/admin/src/main/java/com/baiye/constant/ResponseConstant.java b/admin/src/main/java/com/baiye/constant/ResponseConstant.java new file mode 100644 index 0000000..432adb5 --- /dev/null +++ b/admin/src/main/java/com/baiye/constant/ResponseConstant.java @@ -0,0 +1,17 @@ +package com.baiye.constant; + +/** + * @author Enzo + * @date : 2023/11/6 + */ +public class ResponseConstant { + + public static final int SUCCESS = 200; + + + + public static final int OCENA_NO_PERMISSION = 40002; + + public static final int OCEAN_FAIL = 200; + +} diff --git a/admin/src/main/java/com/baiye/constant/UploadTemplateHeadConstant.java b/admin/src/main/java/com/baiye/constant/UploadTemplateHeadConstant.java new file mode 100644 index 0000000..eaf3c6d --- /dev/null +++ b/admin/src/main/java/com/baiye/constant/UploadTemplateHeadConstant.java @@ -0,0 +1,16 @@ +package com.baiye.constant; + +/** + * 上传文件模板头信息常量 + */ +public class UploadTemplateHeadConstant { + + public static final String HEAD_NID = "手机号"; + + public static final String HEAD_ORIGIN = "渠道来源"; + + public static final String HEAD_REMARK = "备注"; + + public static final String HEAD_DATE = "日期(****/**/** 00:00:00)"; + +} diff --git a/admin/src/main/java/com/baiye/constant/UrlConstant.java b/admin/src/main/java/com/baiye/constant/UrlConstant.java new file mode 100644 index 0000000..324d553 --- /dev/null +++ b/admin/src/main/java/com/baiye/constant/UrlConstant.java @@ -0,0 +1,18 @@ +package com.baiye.constant; + +/** + * @author Enzo + */ +public class UrlConstant { + + public static String CONNECT_OAUTH2_AUTHORIZE_URL = "https://ad.oceanengine.com/openapi/audit/oauth.html?app_id=%s&state=%s&material_auth=1&redirect_uri=%s&material_auth=1"; + public static String OAUTH2_ACCESS_TOKEN_URL = "https://ad.oceanengine.com/open_api/oauth2/access_token/"; + public static String OAUTH2_REFRESH_TOKEN_URL = "https://ad.oceanengine.com/open_api/oauth2/refresh_token/"; + public static String OAUTH2_AUTH_ADVERTISER_URL = "https://ad.oceanengine.com/open_api/oauth2/advertiser/get/?access_token=%s&app_id=%s&secret=%s"; + + public static String SYNC_CLUE_URL = "https://ad.oceanengine.com/open_api/2/tools/clue/get/"; + public static String GET_ADVERTISER = "https://ad.oceanengine.com/open_api/2/majordomo/advertiser/select/"; + + public static String CALL_BACK_CLUE_URL="https://ad.oceanengine.com/open_api/2/tools/clue/callback/"; + +} diff --git a/admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java b/admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java new file mode 100644 index 0000000..6675028 --- /dev/null +++ b/admin/src/main/java/com/baiye/constant/WeChatRequestConstants.java @@ -0,0 +1,57 @@ + +package com.baiye.constant; + +/** + * @author Enzo + * @date 2024-3-27 + */ +public interface WeChatRequestConstants { + + + /** + * 获取二维码 + */ + String GET_QR_CODE = "/api/qrCodeLogin/"; + + /** + * 批量下线 + */ + String ROBOT_LOGOUT = "/api/batchLogout/"; + + + + + + /** + * 全局设置 + */ + String GLOBAL_SETTING = "/api/global-settings/"; + + + + /** + * 弹窗登录 + */ + String GET_PUSH_LOGIN = "/api/pushLogin/"; + + /** + * 同步状态 + */ + String GET_ROBOT_TYPE = "/api/syncRobot/"; + + + + /** + * 创建设备 + */ + String CREATE_EQUIPMENT= "/api/addToScanRobotInfo/"; + + + + /** + * 添加好友 + */ + String WE_CHAT_ADD_FRIEND = "/api/add-now-friend-phone/"; + + +} diff --git a/admin/src/main/java/com/baiye/event/system/RootApplication.java b/admin/src/main/java/com/baiye/event/system/RootApplication.java new file mode 100644 index 0000000..46bc034 --- /dev/null +++ b/admin/src/main/java/com/baiye/event/system/RootApplication.java @@ -0,0 +1,27 @@ +package com.baiye.event.system; + +import com.baiye.schedule.handler.ScanDynamicJobHandler; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +/** + * @author Enzo + * @date : 2024/5/28 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class RootApplication implements CommandLineRunner { + + private final ScanDynamicJobHandler scanDynamicJobHandler; + + + @Override + public void run(String... args) throws Exception { + log.info(">>>>>>>>>>>>>>>服务启动执行,扫描动态任务列表,并添加任务<<<<<<<<<<<<<"); + scanDynamicJobHandler.scanAddJob(); + } +} + diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/AliPayController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/AliPayController.java new file mode 100644 index 0000000..599b7aa --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/AliPayController.java @@ -0,0 +1,57 @@ +package com.baiye.modules.distribute.controller; + + +import com.baiye.modules.distribute.dto.AliPayPcDTO; +import com.baiye.modules.distribute.entity.PayOrder; +import com.baiye.modules.distribute.service.AliPayService; +import com.baiye.result.R; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +/** + * @author Enzo + */ +@Tag(name = "支付宝支付") +@Slf4j +@RestController +@RequestMapping(value = "/pay/aliPay") +@AllArgsConstructor +public class AliPayController { + + private final AliPayService aliPayService; + + @Operation(summary = "创建pc订单") + @PostMapping(value = "/pcPay") + public R> pcPay(@Validated @RequestBody AliPayPcDTO aliPayPcDTO) { + return R.ok(aliPayService.aliPayPc(aliPayPcDTO)); + } + + + @Operation(summary = "订单号查找") + @GetMapping(value = "/find/order") + public R frontRcvResponse(@RequestParam("orderNo") String orderNo) { + return R.ok(aliPayService.findOrderByNo(orderNo)); + } + + + /** + * pc 回调接收参数 + * + * @param request request + * @return 返回结果 + */ + @Operation(summary = "订单回调") + @RequestMapping(value = "/pay-notify", produces = "text/html;charset=utf-8") + public String frontRcvResponse(HttpServletRequest request) { + return aliPayService.pcNotifyResponse(request); + } + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/LoginEquipmentController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/LoginEquipmentController.java new file mode 100644 index 0000000..62576eb --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/LoginEquipmentController.java @@ -0,0 +1,42 @@ +package com.baiye.modules.distribute.controller; + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.modules.distribute.qo.AccountQo; +import com.baiye.modules.distribute.service.LoginEquipmentService; +import com.baiye.modules.distribute.vo.WeChatAccountVO; +import com.baiye.result.R; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Enzo + * @date : 2024/4/1 + */ + +@Tag(name = "微信设备") +@Slf4j +@RestController +@RequestMapping(value = "/equipment") +@AllArgsConstructor +public class LoginEquipmentController { + + private LoginEquipmentService loginEquipmentService; + + @GetMapping("/page") + @Operation(summary = "分页查询记录") + public R> getClueRecordPage(@Validated PageParam pageParam, AccountQo qo) { + return R.ok(loginEquipmentService.queryPage(pageParam, qo)); + } + + + + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/PayOrderController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/PayOrderController.java new file mode 100644 index 0000000..436466c --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/PayOrderController.java @@ -0,0 +1,36 @@ +package com.baiye.modules.distribute.controller; + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.modules.distribute.qo.PayOrderQo; +import com.baiye.modules.distribute.service.PayOrderService; +import com.baiye.modules.distribute.vo.PayOrderVO; +import com.baiye.result.R; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Enzo + * @date + */ +@RequiredArgsConstructor +@RestController +@Tag(name = "订单记录") +@RequestMapping("/pay/order") +public class PayOrderController { + + private final PayOrderService payOrderService; + + @GetMapping("/page") + @Operation(summary = "分页查询记录") + public R> getClueRecordPage(@Validated PageParam pageParam, PayOrderQo qo) { + return R.ok(payOrderService.queryPage(pageParam, qo)); + } + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/WeChatController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/WeChatController.java new file mode 100644 index 0000000..25e0492 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/WeChatController.java @@ -0,0 +1,133 @@ +package com.baiye.modules.distribute.controller; + +import cn.hutool.http.HttpUtil; +import com.baiye.constant.WeChatRequestConstants; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.modules.distribute.dto.CreateCodeDTO; +import com.baiye.modules.distribute.dto.PushCodeDTO; +import com.baiye.modules.distribute.dto.WeChatAddFriendDTO; +import com.baiye.modules.distribute.dto.WeChatStatisticsDTO; +import com.baiye.modules.distribute.qo.AccountQo; +import com.baiye.modules.distribute.service.WeChatService; +import com.baiye.modules.distribute.service.WechatFriendService; +import com.baiye.modules.distribute.vo.AccountStatisticsVO; +import com.baiye.modules.distribute.vo.AddFriendVo; +import com.baiye.modules.distribute.vo.StatisticsFriendVO; +import com.baiye.modules.distribute.vo.WeChatAccountVO; +import com.baiye.result.R; +import com.baiye.security.util.SecurityUtils; +import com.google.common.collect.Maps; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.Data; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * @author Enzo + * @date : 2024/3/27 + */ +@RestController +@Tag(name = "微信账号") +@RequiredArgsConstructor +@RequestMapping("/wechat") +public class WeChatController { + + + private final WeChatService weChatService; + + private final WechatFriendService wechatFriendService; + + + @GetMapping("/page") + @Operation(summary = "分页查询账号") + public R> getClueRecordPage(@Validated PageParam pageParam, AccountQo qo) { + return R.ok(weChatService.queryPage(pageParam, qo)); + } + + + @GetMapping("/global/setting") + @Operation(summary = "全局设置") + public R getClueRecordPage(String callbackUrl) { + return R.ok(weChatService.globalSetting(callbackUrl)); + } + + + @PostMapping("/createCode") + @Operation(description = "创建二维码") + public R createCode(@RequestBody CreateCodeDTO createCodeDTO) { + return R.ok(weChatService.createQrCode(createCodeDTO)); + } + + + @Operation(description = "弹窗登录接口") + @PostMapping("/push/code") + public R pushCode(@Validated @RequestBody PushCodeDTO pushCodeDTO) { + return R.ok(weChatService.pushCode(pushCodeDTO)); + } + + @Operation(description = "添加好友") + @PostMapping("/addFriend") + public R addFriend(@Validated @RequestBody WeChatAddFriendDTO weChatFriendDTO) { + return R.ok(weChatService.addFriend(weChatFriendDTO)); + } + + + @GetMapping("/create/equipment") + @Operation(summary = "创建设备") + public R createEquipment(Integer num, Integer packageType) { + return Boolean.TRUE.equals(weChatService.createEquipment(num, packageType, SecurityUtils.getCurrentUserId())) ? R.ok() : R.failed("创建设备失败"); + } + + + @GetMapping("/friend/page") + @Operation(summary = "添加好友记录") + public R> getData(@Validated PageParam pageParam, AccountQo qo) { + return R.ok(weChatService.queryFirendData(pageParam, qo)); + } + + + @GetMapping("/query/friend") + @Operation(summary = "时间统计统计粉丝记录") + public R> getDateBy(Integer queryType) { + return R.ok(wechatFriendService.statisticsFriendByType(queryType)); + } + + + @PostMapping("/query/user/statistics") + @Operation(summary = "统计用户加粉数量") + public R> getDateBy(@RequestBody WeChatStatisticsDTO statisticsDTO) { + return R.ok(wechatFriendService.statisticsFriendByUserId(statisticsDTO)); + } + + + @GetMapping("/query/account/statistics") + @Operation(summary = "统计账号信息数量") + public R accountStatistics() { + return R.ok(weChatService.statisticsAccountByUserId(SecurityUtils.getCurrentUserId())); + } + + + @GetMapping("/update/remark") + @Operation(summary = "修改备注") + public R accountStatistics(String wxId, String remark) { + return R.ok(weChatService.updateRemarkByWechatId(wxId, remark)); + } + + + @GetMapping("/robot/logout") + @Operation(summary = "退出登录") + public R robotLogout(Integer robotId) { + return R.ok(weChatService.logoutByRobotId(robotId)); + } + + + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/controller/WechatCallbackController.java b/admin/src/main/java/com/baiye/modules/distribute/controller/WechatCallbackController.java new file mode 100644 index 0000000..487c7be --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/controller/WechatCallbackController.java @@ -0,0 +1,36 @@ +package com.baiye.modules.distribute.controller; + +import cn.hutool.json.JSONUtil; +import com.baiye.modules.distribute.service.WechatCallbackService; +import com.baiye.result.R; +import com.baiye.result.WeChatResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author Enzo + * @date 2022-8-11 + */ +@Slf4j +@RestController +@RequestMapping("/api/wechat") +@RequiredArgsConstructor +public class WechatCallbackController { + + private final WechatCallbackService wechatCallbackService; + + /** + * 请求三方微信操作回调 + */ + @PostMapping("/callback") + public R wechatCallback(@RequestBody WeChatResponse weChatResponse) { + log.info("================== the response {} ==================", JSONUtil.toJsonStr(weChatResponse)); + wechatCallbackService.analyticalData(weChatResponse); + return R.ok(); + } + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/converter/PayOrderConverter.java b/admin/src/main/java/com/baiye/modules/distribute/converter/PayOrderConverter.java new file mode 100644 index 0000000..5b3bd94 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/converter/PayOrderConverter.java @@ -0,0 +1,23 @@ +package com.baiye.modules.distribute.converter; + +import com.baiye.modules.distribute.entity.PayOrder; +import com.baiye.modules.distribute.vo.PayOrderVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * @author Enzo + * @date : 2024/3/28 + */ +@Mapper +public interface PayOrderConverter { + + PayOrderConverter INSTANCE = Mappers.getMapper(PayOrderConverter.class); + + /** + * 实体转vo + * @param payOrder + * @return + */ + PayOrderVO entityToVo(PayOrder payOrder); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/converter/WeChatAccountConverter.java b/admin/src/main/java/com/baiye/modules/distribute/converter/WeChatAccountConverter.java new file mode 100644 index 0000000..305bdf0 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/converter/WeChatAccountConverter.java @@ -0,0 +1,23 @@ +package com.baiye.modules.distribute.converter; + +import com.baiye.modules.distribute.entity.WeChatAccount; +import com.baiye.modules.distribute.vo.WeChatAccountVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +/** + * @author Enzo + * @date : 2024/3/29 + */ +@Mapper +public interface WeChatAccountConverter { + + WeChatAccountConverter INSTANCE = Mappers.getMapper(WeChatAccountConverter.class); + + /** + * 实体转vo + * @param weChatAccount + * @return + */ + WeChatAccountVO entityToVo(WeChatAccount weChatAccount); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/AliPayPcDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/AliPayPcDTO.java new file mode 100644 index 0000000..3aedb42 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/AliPayPcDTO.java @@ -0,0 +1,34 @@ +package com.baiye.modules.distribute.dto; + +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.Min; +import javax.validation.constraints.NotNull; +import java.io.Serializable; + +/** + * @author Enzo + * @date : 2022/3/16 + */ +@Data +@NoArgsConstructor +public class AliPayPcDTO implements Serializable { + + private static final long serialVersionUID = 6500373305956248683L; + + @NotNull(message = "套餐类型不能为空") + private Integer packageType; + + @NotNull(message = "数量不能为空") + @Min(value = 1,message = "最小为1") + private Integer num; + + @NotNull(message = "续费类型不能为空") + private Boolean isRenew; + + private Integer robotId; + + private String remark; + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/CreateCodeDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/CreateCodeDTO.java new file mode 100644 index 0000000..0ae3b51 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/CreateCodeDTO.java @@ -0,0 +1,21 @@ +package com.baiye.modules.distribute.dto; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/3/27 + */ +@Data +public class CreateCodeDTO { + + private String robotId; + + private String wxId; + + private String cityInfo; + + private String changedUid; + + private String robotVersion; +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/EquipmentDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/EquipmentDTO.java new file mode 100644 index 0000000..1b023bf --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/EquipmentDTO.java @@ -0,0 +1,33 @@ +package com.baiye.modules.distribute.dto; + +import lombok.*; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/4/1 + */ +@Data +public class EquipmentDTO { + + private Integer status; + + private List data; + + + /** + * + */ + @AllArgsConstructor + @NoArgsConstructor + @ToString + @Getter + @Setter + public static class RoBotDTO { + + private String robotAccount; + + private Integer robotId; + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/PushCodeDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/PushCodeDTO.java new file mode 100644 index 0000000..3edfb2f --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/PushCodeDTO.java @@ -0,0 +1,18 @@ +package com.baiye.modules.distribute.dto; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/3/27 + */ +@Data +public class PushCodeDTO { + + private Integer robotId; + + private String wxId; + + private String cityInfo; + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAccountDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAccountDTO.java new file mode 100644 index 0000000..e216871 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAccountDTO.java @@ -0,0 +1,29 @@ +package com.baiye.modules.distribute.dto; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/4/10 + */ +@Data +public class WeChatAccountDTO { + private String account; + + private String wxid; + + private String nickname; + + private String smallHeadImgUrl; + + private String pit; + + private String wxVersion; + + private String province; + + + private Integer status; + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAddFriendDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAddFriendDTO.java new file mode 100644 index 0000000..ed65c3b --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatAddFriendDTO.java @@ -0,0 +1,40 @@ +package com.baiye.modules.distribute.dto; + +import lombok.*; + +/** + * @author Enzo + * @date : 2022/6/27 + */ +@Data +@NoArgsConstructor +public class WeChatAddFriendDTO { + + @NonNull + private String robotWxId; + + + private AddFriendDTO addData; + + /** + * 实体 + */ + @AllArgsConstructor + @NoArgsConstructor + @ToString + @Getter + @Setter + public static class AddFriendDTO { + + private String scene; + + private String addKey; + + private String content; + + } + + + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatFriendDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatFriendDTO.java new file mode 100644 index 0000000..6eca382 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatFriendDTO.java @@ -0,0 +1,42 @@ +package com.baiye.modules.distribute.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author Enzo + * @date : 2022/6/27 + */ +@Data +public class WeChatFriendDTO { + + @Schema(title = "机器人微信ID") + private String robotWxId; + + @Schema(title = "添加好友方式") + private Integer addFriendType; + + @Schema(title = "省") + private String province; + + @Schema(title = "城市") + private String city; + + @Schema(title = "昵称") + private String nickName; + + @Schema(title = "性别") + private Integer sex; + + @Schema(title = "通过时间") + private Long addAcceptTime; + + + @Schema(title = "微信ID") + private String friendId; + + @Schema(title = "头像") + private String bigHeadImgUrl; + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatStatisticsDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatStatisticsDTO.java new file mode 100644 index 0000000..634d886 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatStatisticsDTO.java @@ -0,0 +1,25 @@ +package com.baiye.modules.distribute.dto; + +import lombok.*; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; +import java.util.List; + +/** + * @author Enzo + * @date : 2022/6/27 + */ +@Data +public class WeChatStatisticsDTO { + + private List weChatIdList; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatUserLoginDTO.java b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatUserLoginDTO.java new file mode 100644 index 0000000..7c523f8 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/dto/WeChatUserLoginDTO.java @@ -0,0 +1,24 @@ +package com.baiye.modules.distribute.dto; + +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Enzo + * @date : 2022/6/30 + */ +@Data +public class WeChatUserLoginDTO implements Serializable { + + + private String pit; + + private String wxId; + + private String nickname; + + private String bigHeadImgUrl; + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/ClueEntity.java b/admin/src/main/java/com/baiye/modules/distribute/entity/ClueEntity.java new file mode 100644 index 0000000..9db956d --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/ClueEntity.java @@ -0,0 +1,93 @@ +package com.baiye.modules.distribute.entity; + +import com.baiye.entity.LogicDeletedBaseEntity; +import com.baiye.extend.mybatis.plus.alias.TableAlias; +import com.baiye.extend.mybatis.plus.converter.JsonStringArrayTypeHandler; +import com.baiye.validation.group.UpdateGroup; +import com.baomidou.mybatisplus.annotation.*; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.NotNull; +import java.util.List; + +@Getter +@Setter +@ToString +@TableName(value = "tb_clue", autoResultMap = true) +@Schema(title = "线索") +@TableAlias("ce") +public class ClueEntity extends LogicDeletedBaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(type = IdType.INPUT) + @Schema(title = "线索ID") + @NotNull(message = "分发ID不能为空", groups = { UpdateGroup.class }) + private Long clueId; + + @Schema(title = "线索来源") + private String originName; + + @Schema(title = "手机号") + private String nid; + + @Schema(title = "线索时间") + private String clueTime; + + @Schema(title = "线索备注") + private String remark; + + @Schema(title = "记录ID") + private Long clueRecordId; + + @Schema(title = "其它线索(jsonStr格式)") + private String otherClue; + + @Schema(title = "分配人用户ID") + private Long assignedBy; + + @Schema(title = "分配人用户名") + private String assignedName; + + @Schema(title = "资源标签关联ID") + private String clueLabel; + + @Schema(title = "资源所打标签信息(jsonStr格式)") + private String clueLabelName; + + @Schema(title = "资源阶段关联ID") + private Long clueStageId; + + @Schema(title = "资源所打的阶段名称") + private String clueStageName; + + @Schema(title = "是否新线索") + private Boolean isNewClue; + + @Schema(title = "是否有效") + private Boolean isEffective; + + @Schema(title = "太空猫传递的线索ID") + private Long variable; + + @Schema(title = "公司管理员用户ID") + private Long companyId; + + @Schema(title = "性别(0-男,1-女)") + private Integer sex; + + @Schema(title = "客户资料") + @TableField(updateStrategy = FieldStrategy.IGNORED) + private String customInformation; + + @TableField(value = "channel_identifying", typeHandler = JsonStringArrayTypeHandler.class) + @Schema(title = "渠道标识") + private List channelIdentifying; + + @Schema(title = "渠道类型渠道类型(1 手动创建 2文件上传 3飞鱼回传 4话单回传 5 api回传)") + private Integer channelType; + + @Schema(title = "客户ID") + private Long customId; +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/LoginEquipment.java b/admin/src/main/java/com/baiye/modules/distribute/entity/LoginEquipment.java new file mode 100644 index 0000000..1b0aca8 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/LoginEquipment.java @@ -0,0 +1,50 @@ +package com.baiye.modules.distribute.entity; + +import com.baiye.entity.BaseEntity; +import com.baiye.extend.mybatis.plus.alias.TableAlias; +import com.baiye.validation.group.UpdateGroup; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @author Enzo + * @date : 2024/4/1 + */ +@Getter +@Setter +@TableAlias("le") +@TableName(value = "tb_login_equipment") +public class LoginEquipment extends BaseEntity { + + @TableId(type = IdType.AUTO) + @Schema(title = "id") + @NotNull(message = "id", groups = {UpdateGroup.class}) + private Long id; + + + @Schema(name = "user_id") + private Long userId; + + @Schema(name = "pit") + private String pit; + + @Schema(name = "package_type") + private Integer packageType; + + @Schema(name = "robot_id") + private Integer robotId; + + @Schema(name = "device_number") + private String deviceNumber; + + @Schema(name = "expiration_time") + private Date expirationTime; + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/PayOrder.java b/admin/src/main/java/com/baiye/modules/distribute/entity/PayOrder.java new file mode 100644 index 0000000..0a4d82b --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/PayOrder.java @@ -0,0 +1,72 @@ +package com.baiye.modules.distribute.entity; + +import cn.hutool.core.date.DatePattern; +import com.baiye.entity.BaseEntity; +import com.baiye.extend.mybatis.plus.alias.TableAlias; +import com.baiye.validation.group.UpdateGroup; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.io.Serializable; +import java.math.BigDecimal; +import java.util.Date; + +/** + * @author Enzo + * @date 2021-10-28 + */ +@Getter +@Setter +@TableAlias("po") +@TableName(value = "tb_pay_order") +public class PayOrder extends BaseEntity implements Serializable { + private static final long serialVersionUID = 2056458673691527927L; + + + @TableId(type = IdType.AUTO) + @Schema(title = "id") + @NotNull(message = "id", groups = {UpdateGroup.class}) + private Long id; + + @Schema(name = "pay_type") + private Integer payType; + + @Schema(name = "order_no") + private String orderNo; + + + @Schema(name = "status") + private Integer status; + + @Schema(name = "num") + private Integer num; + + @Schema(name = "purchaser") + private String purchaser; + + @Schema(name = "pay_time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN, timezone = "GMT+8") + private Date payTime; + + @Schema(name = "amount") + private BigDecimal amount; + + @Schema(name = "user_id") + private Long userId; + + + @Schema(name = "robot_id") + private Integer robotId; + + @Schema(name = "is_renew") + private Boolean isRenew; + + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatAccount.java b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatAccount.java new file mode 100644 index 0000000..5224517 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatAccount.java @@ -0,0 +1,74 @@ +package com.baiye.modules.distribute.entity; + +import com.baiye.entity.LogicDeletedBaseEntity; +import com.baiye.extend.mybatis.plus.alias.TableAlias; +import com.baiye.validation.group.UpdateGroup; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; + +import javax.validation.constraints.NotNull; +import java.util.Date; + +/** + * @author Enzo + * @date : 2024/3/26 + */ + +@Getter +@Setter +@ToString +@TableAlias("wa") +@TableName(value = "tb_wechat_account") +public class WeChatAccount extends LogicDeletedBaseEntity { + + @TableId(type = IdType.INPUT) + @Schema(title = "id") + @NotNull(message = "id", groups = {UpdateGroup.class}) + private Long id; + + @Schema(title = "用户id") + private Long userId; + + @Schema(title = "设备信息") + private String deviceInformation; + + @Schema(title = "用户名称") + private String username; + + @Schema(title = "用户id") + private String nickname; + + @Schema(title = "城市信息") + private String cityInfo; + + @Schema(title = "登录类型") + private Integer loginType; + + @Schema(name = "登录时间") + private Date loginDate; + + @Schema(name = "头像") + private String headerUrl; + + @Schema(name = "微信ID") + private String wxId; + + @Schema(name = "性别") + private Integer sex; + + + @Schema(title = "在线状态") + private Integer status; + + @Schema(title = "备注") + private String remark; + + @Schema(title = "微信号") + private String weChatNo; + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatEquipment.java b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatEquipment.java new file mode 100644 index 0000000..7146408 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatEquipment.java @@ -0,0 +1,46 @@ +package com.baiye.modules.distribute.entity; + +import com.baiye.extend.mybatis.plus.alias.TableAlias; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * + * @author Enzo + * + * + */ +@Data +@TableAlias("we") +@TableName("tb_wechat_equipment") +@Schema(title = "微信账号设备") +public class WeChatEquipment implements Serializable { + + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 用户ID + */ + @Schema(title = "用户id") + private Long accountId; + + /** + * 角色Code + */ + @Schema(title = "设备id") + private Long equipmentId; + + + @Schema(title = "用户ID") + private Long userId; + + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatFriedRecord.java b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatFriedRecord.java new file mode 100644 index 0000000..b0ed566 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/entity/WeChatFriedRecord.java @@ -0,0 +1,56 @@ +package com.baiye.modules.distribute.entity; + +import com.baiye.extend.mybatis.plus.alias.TableAlias; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.io.Serializable; + +/** + * @author Enzo + * @date : 2024/4/2 + */ +@Data +@TableAlias("we") +@TableName("tb_wechat_friend") +@Schema(title = "微信好友记录") +public class WeChatFriedRecord implements Serializable { + + @TableId + private Long id; + + @Schema(title = "机器人微信ID") + private String robotWxId; + + @Schema(title = "添加好友方式") + private Integer addFriendType; + + @Schema(title = "省") + private String province; + + @Schema(title = "城市") + private String city; + + @Schema(title = "昵称") + private String nickName; + + @Schema(title = "性别") + private Integer sex; + + @Schema(title = "通过时间") + private Long addAcceptTime; + + + @Schema(title = "微信ID") + private String friendId; + + @Schema(title = "头像") + private String bigHeadImgUrl; + + @Schema(title = "userId") + private Long userId; + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/LoginEquipmentMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/LoginEquipmentMapper.java new file mode 100644 index 0000000..2878408 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/LoginEquipmentMapper.java @@ -0,0 +1,108 @@ +package com.baiye.modules.distribute.mapper; + +import cn.hutool.core.date.DateTime; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX; +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.modules.distribute.entity.LoginEquipment; +import com.baiye.modules.distribute.entity.WeChatAccount; +import com.baiye.modules.distribute.qo.AccountQo; +import com.baiye.modules.distribute.vo.WeChatAccountVO; +import com.baiye.modules.distribute.vo.WeChatAddFriendVo; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * @author Enzo + * @date 2024-4-1 + */ +@Mapper +public interface LoginEquipmentMapper extends ExtendMapper { + + + default PageResult queryPage(PageParam pageParam, AccountQo qo) { + IPage page = this.prodPage(pageParam); + + LambdaQueryWrapperX wrapperX = WrappersX.lambdaQueryX(WeChatAccount.class); + if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) { + wrapperX.between(WeChatAccount::getCreateTime, qo.getStartTime(), qo.getEndTime()); + } + wrapperX.likeIfPresent(WeChatAccount::getNickname, qo.getNickname()).likeIfPresent + (WeChatAccount::getWxId, qo.getWxId()).eqIfPresent(WeChatAccount::getUserId, qo.getUserId()).likeIfPresent(WeChatAccount::getWxId, qo.getWxId()); + this.selectByPage(page, qo.getStartTime(), qo.getEndTime(), qo.getNickname(), qo.getWxId(), qo.getUserId()); + return new PageResult<>(page.getRecords(), page.getTotal()); + } + + /** + * 查询分页记录 + * + * @param page + * @param startTime + * @param endTime + * @param username + * @param wxId + * @param userId + * @return + */ + IPage selectByPage(IPage page, + @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("username") String username, @Param("wxId") String wxId, @Param("userId") Long userId); + + + /** + * 天数查询数据 + * + * @param dayNum + * @param currentUserId + * @param wxId + * @return + */ + List queryByDate(@Param("dayNum") Integer dayNum, @Param("userId") Long currentUserId, @Param("wxId") String wxId); + + /** + * 用户ID查询 + * + * @param currentUserId + * @return + */ + List queryByUserId(Long currentUserId); + + /** + * 统计数据 + * + * @param currentUserId + * @param number + * @return + */ + default Long countFreeEquipment(Long currentUserId, Integer number) { + return this.selectCount + (WrappersX.lambdaQueryX(LoginEquipment.class).eq + (LoginEquipment::getUserId, currentUserId).eq(LoginEquipment::getPackageType, number)); + + } + + + /** + * 机器人查询设备 + * + * @param wxId + * @return + */ + List findEquipmentByAccountId(@Param("wxId") String wxId); + + /** + * 时间查询设备 + * + * @param date + * @return + */ + default List selectListByTime(DateTime date) { + return this.selectList(WrappersX.lambdaQueryX(LoginEquipment.class).gt(LoginEquipment::getExpirationTime, date)); + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/PayOrderMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/PayOrderMapper.java new file mode 100644 index 0000000..0327015 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/PayOrderMapper.java @@ -0,0 +1,55 @@ +package com.baiye.modules.distribute.mapper; + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX; +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.modules.distribute.converter.PayOrderConverter; +import com.baiye.modules.distribute.entity.PayOrder; +import com.baiye.modules.distribute.qo.PayOrderQo; +import com.baiye.modules.distribute.vo.PayOrderVO; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * @author Enzo + * @date 2024-4-1 + */ +@Mapper +public interface PayOrderMapper extends ExtendMapper { + + + /** + * 订单号查询订单 + * + * @param orderNo + * @return + */ + default List findByOrderNumber(String orderNo) { + LambdaQueryWrapperX wrapperX = new LambdaQueryWrapperX<>(); + return this.selectList(wrapperX.eq(PayOrder::getOrderNo, orderNo).orderByDesc(PayOrder::getId)); + } + + /** + * 条件查询分页 + * + * @param pageParam + * @param qo + * @return + */ + default PageResult queryPage(PageParam pageParam, PayOrderQo qo) { + IPage page = this.prodPage(pageParam); + LambdaQueryWrapperX wrapperX = WrappersX.lambdaQueryX(PayOrder.class); + if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) { + wrapperX.between(PayOrder::getCreateTime, qo.getStartTime(), qo.getEndTime()); + } + wrapperX.eqIfPresent(PayOrder::getOrderNo, qo.getOrderNo()).eqIfPresent(PayOrder::getUserId, qo.getUserId()).orderByDesc(PayOrder::getId); + this.selectPage(page, wrapperX); + IPage voPage = page.convert(PayOrderConverter.INSTANCE::entityToVo); + return new PageResult<>(voPage.getRecords(), voPage.getTotal()); + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatAccountMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatAccountMapper.java new file mode 100644 index 0000000..0dbc2c2 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatAccountMapper.java @@ -0,0 +1,91 @@ +package com.baiye.modules.distribute.mapper; + +import cn.hutool.core.collection.CollUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.conditions.query.LambdaQueryWrapperX; +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.modules.distribute.converter.WeChatAccountConverter; +import com.baiye.modules.distribute.entity.WeChatAccount; +import com.baiye.modules.distribute.qo.AccountQo; +import com.baiye.modules.distribute.vo.WeChatAccountVO; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.StringUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.toolkit.SqlHelper; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * @author Enzo + * @date 2024-3-27 + */ +@Mapper +public interface WeChatAccountMapper extends ExtendMapper { + /** + * 微信id查找微信用户 + * + * @param wxId + * @return + */ + default WeChatAccount findByWxId(String wxId) { + List selectList = this.selectList(WrappersX.lambdaQueryX(WeChatAccount.class).eqIfPresent + (WeChatAccount::getWxId, wxId).eqIfPresent(WeChatAccount::getDeleted, DefaultNumberConstants.ZERO_NUMBER).orderByDesc(WeChatAccount::getId)); + if (CollUtil.isNotEmpty(selectList)) { + return selectList.get(DefaultNumberConstants.ZERO_NUMBER); + } + return new WeChatAccount(); + } + + + /** + * 分页查询数据 + * + * @param pageParam + * @param qo + * @return + */ + default PageResult queryPage(PageParam pageParam, AccountQo qo) { + IPage page = this.prodPage(pageParam); + LambdaQueryWrapperX wrapperX = WrappersX.lambdaQueryX(WeChatAccount.class); + if (StringUtils.isNotBlank(qo.getStartTime()) && StringUtils.isNotBlank(qo.getEndTime())) { + wrapperX.between(WeChatAccount::getCreateTime, qo.getStartTime(), qo.getEndTime()); + } + wrapperX.likeIfPresent(WeChatAccount::getNickname, qo.getNickname()).likeIfPresent(WeChatAccount::getWxId, qo.getWxId()). + eqIfPresent(WeChatAccount::getUserId, qo.getUserId()).orderByDesc(WeChatAccount::getId); + this.selectPage(page, wrapperX); + IPage voPage = page.convert(WeChatAccountConverter.INSTANCE::entityToVo); + return new PageResult<>(voPage.getRecords(), voPage.getTotal()); + } + + /** + * ID查询信息 + * + * @param currentUserId + * @return + */ + default List queryByUserId(Long currentUserId) { + LambdaQueryWrapperX wrapperX = WrappersX.lambdaQueryX(WeChatAccount.class); + return this.selectList(wrapperX.eq(WeChatAccount::getUserId, currentUserId)); + } + + /** + * 修改备注 + * + * @param wxId + * @param remark + * @return + */ + default Boolean updateRemark(String wxId, String remark) { + + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate() + .set(WeChatAccount::getRemark, remark) + .eq(WeChatAccount::getWxId, wxId) + .eq(WeChatAccount::getDeleted, DefaultNumberConstants.ZERO_NUMBER); + return SqlHelper.retBool(this.update(null, wrapper)); + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatEquipmentMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatEquipmentMapper.java new file mode 100644 index 0000000..a2116d7 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatEquipmentMapper.java @@ -0,0 +1,31 @@ +package com.baiye.modules.distribute.mapper; + +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.modules.distribute.entity.WeChatEquipment; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author Enzo + * @date 2024-4-1 + */ +@Mapper +public interface WeChatEquipmentMapper extends ExtendMapper { + + + /** + * 统计数据 + * + * @param accountId + * @param equipmentId + * @return + */ + default Long countEquipment(Long accountId, Long equipmentId) { + return this.selectCount + (WrappersX.lambdaQueryX(WeChatEquipment.class).eq + (WeChatEquipment::getAccountId, accountId).eq(WeChatEquipment::getEquipmentId, equipmentId)); + + } + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatFriendMapper.java b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatFriendMapper.java new file mode 100644 index 0000000..5db5262 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/mapper/WeChatFriendMapper.java @@ -0,0 +1,64 @@ +package com.baiye.modules.distribute.mapper; + +import cn.hutool.core.date.DateTime; +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.modules.distribute.entity.WeChatFriedRecord; +import com.baiye.modules.distribute.vo.StatisticsFriendVO; +import com.baiye.modules.distribute.vo.WeChatAddFriendVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * @author Enzo + * @date : 2024/4/2 + */ +@Mapper +public interface WeChatFriendMapper extends ExtendMapper { + + /** + * 时间类型查询 + * + * @param beginOfDay + * @param now + * @param currentUserId + * @return + */ + List queryByDate(@Param("startTime") DateTime beginOfDay, @Param("endTime") DateTime now, @Param("userId") Long currentUserId); + + /** + * 用户数据查询 + * + * @param weChatIdList + * @param dayNum + * @param currentUserId + * @param startTime + * @param endTime + * @return + */ + List queryByUserList(@Param("weChatIdList") List weChatIdList, + @Param("dayNum") Long dayNum, @Param("userId") Long currentUserId, + @Param("startTime") Date startTime, @Param("endTime") Date endTime); + + /** + * 用户id查找 + * + * @param currentUserId + * @return + */ + default Long queryByUserId(Long currentUserId) { + return this.selectCount(WrappersX.lambdaQueryX(WeChatFriedRecord.class).eq + (WeChatFriedRecord::getUserId, currentUserId)); + + } + + /** + * 账号id查询设备 + * @param id + * @return + */ + List findEquipmentByAccountId(Long id); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/qo/AccountQo.java b/admin/src/main/java/com/baiye/modules/distribute/qo/AccountQo.java new file mode 100644 index 0000000..09fbb8c --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/qo/AccountQo.java @@ -0,0 +1,30 @@ +package com.baiye.modules.distribute.qo; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/3/29 + */ +@Data +public class AccountQo { + + + @Parameter(description = "开始时间") + private String startTime; + + @Parameter(description = "结束时间") + private String endTime; + + @Parameter(description = "用户昵称") + private String nickname; + + @Schema(title = "用户ID") + private Long userId; + + @Schema(title = "微信id") + private String wxId; + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/qo/PayOrderQo.java b/admin/src/main/java/com/baiye/modules/distribute/qo/PayOrderQo.java new file mode 100644 index 0000000..d3cb6d7 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/qo/PayOrderQo.java @@ -0,0 +1,21 @@ +package com.baiye.modules.distribute.qo; + +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +@Data +public class PayOrderQo { + + @Schema(title = "订单号") + private String orderNo; + + @Parameter(description = "开始时间") + private String startTime; + + @Parameter(description = "结束时间") + private String endTime; + + @Schema(title = "用户ID") + private Long userId; +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/AliPayService.java b/admin/src/main/java/com/baiye/modules/distribute/service/AliPayService.java new file mode 100644 index 0000000..80e4534 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/AliPayService.java @@ -0,0 +1,42 @@ +package com.baiye.modules.distribute.service; + + +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.modules.distribute.dto.AliPayPcDTO; +import com.baiye.modules.distribute.entity.PayOrder; +import com.baiye.modules.distribute.entity.WeChatAccount; +import com.baiye.result.R; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Map; + +/** + * @author Enzo + * @date : 2021/6/16 + */ +public interface AliPayService extends ExtendService { + + + /** + * pc端创建支付宝订单 + * @param aliPayPcDTO + * @return + */ + Map aliPayPc(AliPayPcDTO aliPayPcDTO); + + /** + * 支付宝订单回调 + * + * @param request + * @return + */ + String pcNotifyResponse(HttpServletRequest request); + + /** + * 订单编号查询 + * @param orderNo + * @return + */ + PayOrder findOrderByNo(String orderNo); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/LoginEquipmentService.java b/admin/src/main/java/com/baiye/modules/distribute/service/LoginEquipmentService.java new file mode 100644 index 0000000..348f41d --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/LoginEquipmentService.java @@ -0,0 +1,74 @@ +package com.baiye.modules.distribute.service; + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.modules.distribute.entity.LoginEquipment; +import com.baiye.modules.distribute.qo.AccountQo; +import com.baiye.modules.distribute.vo.WeChatAccountVO; +import com.baiye.modules.distribute.vo.WeChatAddFriendVo; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/4/1 + */ +public interface LoginEquipmentService extends ExtendService { + + /** + * 分页查询数据 + * @param pageParam + * @param qo + * @return + */ + + PageResult queryPage(PageParam pageParam, AccountQo qo); + + /** + * 设备号查询用户ID + * @param pit + * @return + */ + LoginEquipment queryByRobot(String pit); + + + /** + * 时间查询数据 + * + * @param dayNum + * @param currentUserId + * @param wxId + * @return + */ + List queryByDate(Integer dayNum, Long currentUserId, String wxId); + + /** + * 机器人查询 + * @param robotId + * @return + */ + LoginEquipment queryByRobotId(Integer robotId); + + /** + * 用户查询账号 + * @param currentUserId + * @return + */ + List queryByUserId(Long currentUserId); + + /** + * 判断免费设备有多少 + * @param currentUserId + * @param number + * @return + */ + Long countFreeEquipment(Long currentUserId, Integer number); + + + /** + * 查询已经过期的设备 + * @return + */ + List findExpiredAccount(); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/PayOrderService.java b/admin/src/main/java/com/baiye/modules/distribute/service/PayOrderService.java new file mode 100644 index 0000000..ac82bc5 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/PayOrderService.java @@ -0,0 +1,23 @@ +package com.baiye.modules.distribute.service; + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.modules.distribute.entity.PayOrder; +import com.baiye.modules.distribute.qo.PayOrderQo; +import com.baiye.modules.distribute.vo.PayOrderVO; + +/** + * @author Enzo + * @date : 2024/3/28 + */ +public interface PayOrderService extends ExtendService { + + /** + * 分页查询数据 + * @param pageParam + * @param qo + * @return + */ + PageResult queryPage(PageParam pageParam, PayOrderQo qo); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/WeChatService.java b/admin/src/main/java/com/baiye/modules/distribute/service/WeChatService.java new file mode 100644 index 0000000..74c861f --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/WeChatService.java @@ -0,0 +1,131 @@ +package com.baiye.modules.distribute.service; + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.modules.distribute.dto.CreateCodeDTO; +import com.baiye.modules.distribute.dto.PushCodeDTO; +import com.baiye.modules.distribute.dto.WeChatAddFriendDTO; +import com.baiye.modules.distribute.dto.WeChatUserLoginDTO; +import com.baiye.modules.distribute.entity.WeChatAccount; +import com.baiye.modules.distribute.qo.AccountQo; +import com.baiye.modules.distribute.vo.AccountStatisticsVO; +import com.baiye.modules.distribute.vo.AddFriendVo; +import com.baiye.modules.distribute.vo.WeChatAccountVO; + +/** + * @author Enzo + * @date 2023/9/5 + */ +public interface WeChatService extends ExtendService { + + + /** + * 创建二维码 + * + * @param createCodeDTO + * @return + */ + String createQrCode(CreateCodeDTO createCodeDTO); + + /** + * 添加好友 + * + * @param weChatFriendDTO + * @return + */ + Boolean addFriend(WeChatAddFriendDTO weChatFriendDTO); + + /** + * 分页查询账号信息 + * @param pageParam + * @param qo + * @return + */ + PageResult queryPage(PageParam pageParam, AccountQo qo); + + /** + * 创建设备 + * + * @param num + * @param packageType + * @param userId + * @return + */ + Boolean createEquipment(Integer num, Integer packageType, Long userId); + + /** + * 弹窗登录 + * @param pushCodeDTO + * @return + */ + String pushCode(PushCodeDTO pushCodeDTO); + + /** + * 全局回调设置 + * @param callbackUrl + * @return + */ + String globalSetting(String callbackUrl); + + /** + * 登录微信账号 + * + * @param userLoginDTO + * @param status + * @param userId + * @param id + * @return + */ + Boolean weChatAccountLoginByRespon(WeChatUserLoginDTO userLoginDTO, Integer status, Long userId, Long id); + + + /** + * 分页数据 + * @param pageParam + * @param qo + * @return + */ + PageResult queryFirendData(PageParam pageParam, AccountQo qo); + + /** + * + * 设备续费 + * @param robotId + * @param payType + * @return + */ + Boolean equipmentRenewal(Integer robotId, Integer payType); + + + /** + * 微信ID查询 + * @param robotWxId + * @return + */ + WeChatAccount findByWxId(String robotWxId); + + /** + * 统计账号信息 + * @param currentUserId + * @return + */ + AccountStatisticsVO statisticsAccountByUserId(Long currentUserId); + + + /** + * 修改备注 + * @param wxId + * @param remark + * @return + */ + + Boolean updateRemarkByWechatId(String wxId, String remark); + + /** + * 退出登录 + * @param robotId + * @return + */ + Boolean logoutByRobotId(Integer robotId); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/WechatCallbackService.java b/admin/src/main/java/com/baiye/modules/distribute/service/WechatCallbackService.java new file mode 100644 index 0000000..a987486 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/WechatCallbackService.java @@ -0,0 +1,17 @@ +package com.baiye.modules.distribute.service; + +import com.baiye.result.WeChatResponse; + +/** + * @author Enzo + * @date : 2024/4/1 + */ +public interface WechatCallbackService { + + + /** + * 微信回调数据 + * @param body + */ + void analyticalData(WeChatResponse body); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/WechatFriendService.java b/admin/src/main/java/com/baiye/modules/distribute/service/WechatFriendService.java new file mode 100644 index 0000000..f77ed1e --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/WechatFriendService.java @@ -0,0 +1,49 @@ +package com.baiye.modules.distribute.service; + +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.modules.distribute.dto.WeChatFriendDTO; +import com.baiye.modules.distribute.dto.WeChatStatisticsDTO; +import com.baiye.modules.distribute.entity.WeChatFriedRecord; +import com.baiye.modules.distribute.vo.AddFriendVo; +import com.baiye.modules.distribute.vo.StatisticsFriendVO; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/4/2 + */ +public interface WechatFriendService extends ExtendService { + + /** + * 添加好友 + * + * @param weChatFriendDTO + */ + void addFriendByResponse(WeChatFriendDTO weChatFriendDTO); + + /** + * 根据类型查询数据 + * @param queryType + * @return + */ + List statisticsFriendByType(Integer queryType); + + + + /** + * 用户统计数量 + * @param currentUserId + * @return + */ + Long queryByUserId(Long currentUserId); + + /** + * 统计数据 + * + * @param statisticsDTO + * @return + */ + PageResult statisticsFriendByUserId(WeChatStatisticsDTO statisticsDTO); +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/AliPayServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/AliPayServiceImpl.java new file mode 100644 index 0000000..a393389 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/AliPayServiceImpl.java @@ -0,0 +1,205 @@ +package com.baiye.modules.distribute.service.impl; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.text.StrPool; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.NumberUtil; +import cn.hutool.core.util.ObjectUtil; +import com.alipay.easysdk.factory.Factory; +import com.alipay.easysdk.kernel.util.ResponseChecker; +import com.alipay.easysdk.payment.page.models.AlipayTradePagePayResponse; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.constant.PayConstants; +import com.baiye.constant.enums.ResponseCode; +import com.baiye.exception.BadRequestException; +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.modules.distribute.dto.AliPayPcDTO; +import com.baiye.modules.distribute.entity.PayOrder; +import com.baiye.modules.distribute.mapper.PayOrderMapper; +import com.baiye.modules.distribute.service.AliPayService; +import com.baiye.modules.distribute.service.LoginEquipmentService; +import com.baiye.modules.distribute.service.WeChatService; +import com.baiye.security.util.SecurityUtils; +import com.baiye.system.properties.AliPayProperties; +import com.google.common.collect.Maps; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.collections4.CollectionUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpServletRequest; +import java.math.BigDecimal; +import java.nio.charset.StandardCharsets; +import java.time.LocalTime; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author Enzo + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class AliPayServiceImpl extends ExtendServiceImpl implements AliPayService { + + + @Value("${snowflake.workerId}") + private int workerId; + + @Value("${snowflake.datacenterId}") + private int datacenterId; + + + private final AliPayProperties aliPay; + + + private final WeChatService weChatService; + + + private final LoginEquipmentService loginEquipmentService; + + + @Override + @Transactional(rollbackFor = Exception.class) + public String pcNotifyResponse(HttpServletRequest request) { + log.info("================ the pay notify enter date as {} ================", DateUtil.date()); + //获取支付宝GET过来反馈信息 + Map params = new HashMap<>(DefaultNumberConstants.SIXTEEN_NUMBER); + // 处理乱码问题 + checkParam(request, params); + Boolean flag; + try { + flag = Factory.Payment.Common().verifyNotify(params); + //商户订单号 + String orderNo = new String(request.getParameter(PayConstants.OUT_TRADE_NO).getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); + //前台回调验证签名 v1 or v2 + if (flag != null && flag) { + log.info("========== order verify signature success the orderNumber as {} ==========", orderNo); + List orderList = baseMapper.findByOrderNumber(orderNo); + if (CollUtil.isNotEmpty(orderList) && orderList.get(DefaultNumberConstants.ZERO_NUMBER).getStatus() == DefaultNumberConstants.ZERO_NUMBER) { + PayOrder order = orderList.get(DefaultNumberConstants.ZERO_NUMBER); + log.info("========== the order notify success date as {} ==========", DateUtil.date()); + order.setPayTime(DateUtil.date()); + order.setStatus(DefaultNumberConstants.ONE_NUMBER); + if (Boolean.FALSE.equals(order.getIsRenew())) { + // 创建设备 + weChatService.createEquipment(order.getNum(), order.getPayType(), order.getUserId()); + } + if (Boolean.TRUE.equals(order.getIsRenew())) { + // 续费操作设备 + weChatService.equipmentRenewal(order.getRobotId(), order.getPayType()); + } + + return this.updateById(order) ? ResponseCode.SUCCESS.getDesc() : ResponseCode.FAILURE.getDesc(); + } + } + } catch (Exception e) { + log.error("the pc response error time {}", LocalTime.now()); + throw new BadRequestException(ResponseCode.CALLBACK_FAILED.getDesc()); + } + return ResponseCode.FAILURE.getDesc(); + } + + + private void checkParam(HttpServletRequest request, Map params) { + Map requestParams = request.getParameterMap(); + if (CollectionUtils.isNotEmpty(requestParams.keySet())) { + for (Map.Entry stringEntry : requestParams.entrySet()) { + String[] values = stringEntry.getValue(); + String valueStr = CharSequenceUtil.EMPTY; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + StrPool.COMMA; + } + /* //乱码解决,这段代码在出现乱码时使用 + valueStr = new String(valueStr.getBytes + (StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);*/ + params.put(stringEntry.getKey(), valueStr); + } + } + } + + @Override + @Transactional(rollbackFor = Exception.class) + public Map aliPayPc(AliPayPcDTO aliPayPcDTO) { + Map map = Maps.newHashMap(); + Long userId = SecurityUtils.getCurrentUserId(); + BigDecimal amount = new BigDecimal(DefaultNumberConstants.ZERO_NUMBER); + Integer num = aliPayPcDTO.getNum(); + Integer robotId = aliPayPcDTO.getRobotId(); + Boolean isRenew = aliPayPcDTO.getIsRenew(); + Integer packageType = aliPayPcDTO.getPackageType(); + // 结算金额 + if (packageType == DefaultNumberConstants.TWO_NUMBER) { + // 季度 + amount = NumberUtil.mul + (String.valueOf(DefaultNumberConstants.THIRTY), String.valueOf(DefaultNumberConstants.THREE_NUMBER)); + } + if (packageType == DefaultNumberConstants.THREE_NUMBER) { + // 年度八折 + amount = NumberUtil.mul(NumberUtil.mul + (String.valueOf(DefaultNumberConstants.THIRTY), String.valueOf(DefaultNumberConstants.TWELVE_NUMBER)), 0.8); + } + amount = NumberUtil.mul(amount, num); + // 雪花算法id + String orderNo = String.valueOf(IdUtil.getSnowflake(workerId, datacenterId).nextId()); + // 创建订单 + savePayOrder(num, isRenew, robotId, packageType, amount, orderNo); + + if (packageType == DefaultNumberConstants.ONE_NUMBER) { + Long countFreeEquipment = loginEquipmentService.countFreeEquipment(userId, DefaultNumberConstants.ONE_NUMBER); + if (ObjectUtil.isNotNull(countFreeEquipment) + && countFreeEquipment + num > DefaultNumberConstants.THREE_NUMBER) { + throw new BadRequestException("至多创建三台免费设备!"); + } + // 创建设备 + weChatService.createEquipment(num, packageType, userId); + map.put("orderNo", orderNo); + return map; + } + + // 查询记录 + try { + // 生成返回对象 + AlipayTradePagePayResponse response = Factory.Payment.Page().pay(PayConstants.PAY_TITLE + orderNo, orderNo, String.valueOf(amount), aliPay.getReturnUrl()); + if (ResponseChecker.success(response)) { + map.put("payUrl", response.getBody()); + map.put("orderNo", orderNo); + return map; + } + } catch (Exception e) { + log.error("the order failed purchaser {} time {}", aliPayPcDTO.getRemark(), LocalTime.now()); + throw new BadRequestException(ResponseCode.ALI_PAY_ERROR.getDesc()); + } + throw new BadRequestException(ResponseCode.ALI_PAY_ERROR.getDesc()); + } + + private Boolean savePayOrder(Integer num, Boolean isRenew, Integer robotId, Integer packageType, BigDecimal amount, String orderNo) { + PayOrder order = new PayOrder(); + order.setNum(num); + order.setAmount(amount); + order.setRobotId(robotId); + order.setIsRenew(isRenew); + order.setOrderNo(orderNo); + order.setPayType(packageType); + order.setUserId(SecurityUtils.getCurrentUserId()); + order.setStatus(packageType > DefaultNumberConstants.ONE_NUMBER + ? DefaultNumberConstants.ZERO_NUMBER : DefaultNumberConstants.ONE_NUMBER); + return this.save(order); + } + + + @Override + public PayOrder findOrderByNo(String orderNo) { + List payOrderList = baseMapper.findByOrderNumber(orderNo); + if (CollUtil.isNotEmpty(payOrderList)) { + return payOrderList.get(DefaultNumberConstants.ZERO_NUMBER); + } + return new PayOrder(); + } + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/LoginEquipmentServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/LoginEquipmentServiceImpl.java new file mode 100644 index 0000000..d8ed376 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/LoginEquipmentServiceImpl.java @@ -0,0 +1,110 @@ +package com.baiye.modules.distribute.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpStatus; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.constant.WeChatRequestConstants; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.modules.distribute.dto.WeChatAccountDTO; +import com.baiye.modules.distribute.entity.LoginEquipment; +import com.baiye.modules.distribute.mapper.LoginEquipmentMapper; +import com.baiye.modules.distribute.qo.AccountQo; +import com.baiye.modules.distribute.service.LoginEquipmentService; +import com.baiye.modules.distribute.vo.WeChatAccountVO; +import com.baiye.modules.distribute.vo.WeChatAddFriendVo; +import com.baiye.result.WeChatResponse; +import com.baiye.security.util.SecurityUtils; +import com.baiye.system.properties.WeChatProperties; +import com.google.common.collect.Maps; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +/** + * @author Enzo + * @date : 2024/4/1 + */ +@Service +@RequiredArgsConstructor +public class LoginEquipmentServiceImpl extends ExtendServiceImpl implements + LoginEquipmentService { + + private final WeChatProperties weChatProperties; + + @Override + public PageResult queryPage(PageParam pageParam, AccountQo qo) { + Map map = Maps.newHashMap(); + qo.setUserId(SecurityUtils.getCurrentUserId()); + PageResult queryPage = baseMapper.queryPage(pageParam, qo); + queryPage.getRecords().forEach(accountVO -> { + // 默认离线状态 + accountVO.setStatus(DefaultNumberConstants.ZERO_NUMBER); + map.put("robotId", accountVO.getRobotId()); + String robotResult = HttpUtil.get + (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_ROBOT_TYPE) + .concat(weChatProperties.getAppKey()), map); + if (JSONUtil.isTypeJSON(robotResult)) { + WeChatResponse weChatResponse = JSONUtil.toBean(robotResult, WeChatResponse.class); + if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) { + WeChatAccountDTO dto = BeanUtil.toBean(weChatResponse.getData(), WeChatAccountDTO.class); + if (ObjectUtil.isNotNull(dto) && dto.getPit().equals(accountVO.getPit())) { + accountVO.setCityInfo(dto.getProvince()); + accountVO.setStatus(dto.getStatus()); + } + } + } + }); + return queryPage; + } + + @Override + public LoginEquipment queryByRobot(String pit) { + LoginEquipment loginEquipment = baseMapper.selectOne + (WrappersX.lambdaQueryX(LoginEquipment.class).eq(LoginEquipment::getPit, pit)); + if (ObjectUtil.isNotNull(loginEquipment) && ObjectUtil.isNotNull(loginEquipment.getUserId())) { + return loginEquipment; + } + return new LoginEquipment(); + } + + @Override + public List queryByDate(Integer dayNum, Long currentUserId, String wxId) { + return baseMapper.queryByDate(dayNum, currentUserId, wxId); + } + + @Override + public LoginEquipment queryByRobotId(Integer robotId) { + LoginEquipment loginEquipment = baseMapper.selectOne + (WrappersX.lambdaQueryX(LoginEquipment.class).eq(LoginEquipment::getRobotId, robotId)); + if (ObjectUtil.isNotNull(loginEquipment) && ObjectUtil.isNotNull(loginEquipment.getUserId())) { + return loginEquipment; + } + return new LoginEquipment(); + } + + @Override + public List queryByUserId(Long currentUserId) { + return baseMapper.queryByUserId(currentUserId); + } + + @Override + public Long countFreeEquipment(Long currentUserId, Integer number) { + return baseMapper.countFreeEquipment(currentUserId, number); + } + + @Override + public List findExpiredAccount() { + return baseMapper.selectListByTime(DateUtil.date()); + } + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/PayOrderServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/PayOrderServiceImpl.java new file mode 100644 index 0000000..f7c2c02 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/PayOrderServiceImpl.java @@ -0,0 +1,29 @@ +package com.baiye.modules.distribute.service.impl; + +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.modules.distribute.entity.PayOrder; +import com.baiye.modules.distribute.mapper.PayOrderMapper; +import com.baiye.modules.distribute.qo.PayOrderQo; +import com.baiye.modules.distribute.service.PayOrderService; +import com.baiye.modules.distribute.vo.PayOrderVO; +import com.baiye.security.util.SecurityUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * @author Enzo + * @date : 2024/3/28 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class PayOrderServiceImpl extends ExtendServiceImpl implements PayOrderService { + @Override + public PageResult queryPage(PageParam pageParam, PayOrderQo qo) { + qo.setUserId(SecurityUtils.getCurrentUserId()); + return baseMapper.queryPage(pageParam, qo); + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/WeChatServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WeChatServiceImpl.java new file mode 100644 index 0000000..ee91bc7 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WeChatServiceImpl.java @@ -0,0 +1,340 @@ +package com.baiye.modules.distribute.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.text.CharSequenceUtil; +import cn.hutool.core.util.IdUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.http.HttpStatus; +import cn.hutool.http.HttpUtil; +import cn.hutool.json.JSONUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.constant.ResponseConstant; +import com.baiye.constant.WeChatRequestConstants; +import com.baiye.constant.WechatCallbackConstant; +import com.baiye.constant.enums.ResponseCode; +import com.baiye.domain.PageParam; +import com.baiye.domain.PageResult; +import com.baiye.enums.PackageEnum; +import com.baiye.exception.BadRequestException; +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.modules.distribute.dto.*; +import com.baiye.modules.distribute.entity.LoginEquipment; +import com.baiye.modules.distribute.entity.WeChatAccount; +import com.baiye.modules.distribute.entity.WeChatEquipment; +import com.baiye.modules.distribute.mapper.WeChatAccountMapper; +import com.baiye.modules.distribute.mapper.WeChatEquipmentMapper; +import com.baiye.modules.distribute.qo.AccountQo; +import com.baiye.modules.distribute.service.LoginEquipmentService; +import com.baiye.modules.distribute.service.WeChatService; +import com.baiye.modules.distribute.service.WechatFriendService; +import com.baiye.modules.distribute.vo.AccountStatisticsVO; +import com.baiye.modules.distribute.vo.AddFriendVo; +import com.baiye.modules.distribute.vo.WeChatAccountVO; +import com.baiye.modules.distribute.vo.WeChatAddFriendVo; +import com.baiye.result.WeChatResponse; +import com.baiye.security.util.SecurityUtils; +import com.baiye.system.properties.WeChatProperties; +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author Enzo + * @date 2024-3-27 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WeChatServiceImpl extends ExtendServiceImpl implements WeChatService { + + + @Value("${snowflake.workerId}") + private int workerId; + + @Value("${snowflake.datacenterId}") + private int datacenterId; + + private final WeChatProperties weChatProperties; + + private final WechatFriendService wechatFriendService; + + private final LoginEquipmentService loginEquipmentService; + + private final WeChatEquipmentMapper weChatEquipmentMapper; + + + @Override + public String createQrCode(CreateCodeDTO createCodeDTO) { + Map beanToMap = BeanUtil.beanToMap(createCodeDTO); + String getQrCodeResult = HttpUtil.get + (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_QR_CODE) + .concat(weChatProperties.getAppKey()), beanToMap); + log.info("=============== the response as {} =============", getQrCodeResult); + if (StringUtils.isNotBlank(getQrCodeResult)) { + WeChatResponse weChatResponse = JSONUtil.toBean(getQrCodeResult, WeChatResponse.class); + return weChatResponse.getMsg(); + } + throw new BadRequestException("创建失败"); + } + + @Override + public Boolean addFriend(WeChatAddFriendDTO weChatFriendDTO) { + String addedFriendResult = HttpUtil.post(weChatProperties.getGatewayHost().concat + (WeChatRequestConstants.WE_CHAT_ADD_FRIEND).concat(weChatProperties.getAppKey()), JSONUtil.toJsonStr(weChatFriendDTO)); + log.info("=============== the response as {} =============", addedFriendResult); + if (addedFriendResult.contains(ResponseCode.SUCCESS.getDesc())) { + WeChatResponse weChatResponse = JSONUtil.toBean(addedFriendResult, WeChatResponse.class); + if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) { + return Boolean.TRUE; + } + throw new BadRequestException(weChatResponse.getMsg()); + } + return Boolean.FALSE; + } + + @Override + public PageResult queryPage(PageParam pageParam, AccountQo qo) { + qo.setUserId(SecurityUtils.getCurrentUserId()); + return baseMapper.queryPage(pageParam, qo); + } + + @Override + public Boolean createEquipment(Integer num, Integer packageType, Long userId) { + Map map = ImmutableMap.of("num", num); + String createEquipmentResult = HttpUtil.get + (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.CREATE_EQUIPMENT) + .concat(weChatProperties.getAppKey()), map); + log.info("=============== the response as {} =============", createEquipmentResult); + if (StringUtils.isNotBlank(createEquipmentResult)) { + WeChatResponse weChatResponse = JSONUtil.toBean(createEquipmentResult, WeChatResponse.class); + if (weChatResponse.getStatus() == ResponseConstant.SUCCESS) { + Integer dayNum = PackageEnum.find(packageType); + if (dayNum > DefaultNumberConstants.ZERO_NUMBER) { + EquipmentDTO dto = BeanUtil.toBean(weChatResponse.getData(), EquipmentDTO.class); + DateTime dateTime = DateUtil.endOfDay(DateUtil.offsetDay(DateUtil.date(), dayNum)); + for (EquipmentDTO.RoBotDTO botDTO : dto.getData()) { + // 创建账号 + LoginEquipment equipment = new LoginEquipment(); + equipment.setUserId(userId); + equipment.setPackageType(packageType); + equipment.setExpirationTime(dateTime); + equipment.setRobotId(botDTO.getRobotId()); + equipment.setPit(botDTO.getRobotAccount()); + // equipment.setDeviceNumber(botDTO.getRobotAccount()); + loginEquipmentService.save(equipment); + } + } + return Boolean.TRUE; + } + } + return Boolean.FALSE; + } + + @Override + public String pushCode(PushCodeDTO pushCodeDTO) { + LoginEquipment loginEquipment = loginEquipmentService.queryByRobotId(pushCodeDTO.getRobotId()); + if (ObjectUtil.isNotNull(loginEquipment) && ObjectUtil.isNotNull(loginEquipment.getExpirationTime())) { + if (loginEquipment.getExpirationTime().before(DateUtil.date())) { + throw new BadRequestException("当前设备已过期请续费后使用!"); + } + } + Map beanToMap = BeanUtil.beanToMap(pushCodeDTO); + String pushQrCodeResult = HttpUtil.get + (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_PUSH_LOGIN) + .concat(weChatProperties.getAppKey()), beanToMap); + log.info("=============== the response as {} =============", pushQrCodeResult); + if (StringUtils.isNotBlank(pushQrCodeResult)) { + WeChatResponse weChatResponse = JSONUtil.toBean(pushQrCodeResult, WeChatResponse.class); + return weChatResponse.getMsg(); + } + return CharSequenceUtil.EMPTY; + } + + @Override + public String globalSetting(String callbackUrl) { + List strings = Lists.newArrayList(callbackUrl); + Map map = ImmutableMap.of("callbackUrls", strings); + String globalSetting = HttpUtil.post + (weChatProperties.getGatewayHost().concat + (WeChatRequestConstants.GLOBAL_SETTING).concat(weChatProperties.getAppKey()), JSONUtil.toJsonStr(map)); + if (StringUtils.isNotBlank(globalSetting)) { + WeChatResponse weChatResponse = JSONUtil.toBean(globalSetting, WeChatResponse.class); + return weChatResponse.getMsg(); + } + return CharSequenceUtil.EMPTY; + } + + @Override + public Boolean weChatAccountLoginByRespon(WeChatUserLoginDTO userLoginDTO, Integer status, Long userId, Long id) { + WeChatAccount byWxId = this.baseMapper.findByWxId(userLoginDTO.getWxId()); + if (ObjectUtil.isNull(byWxId) || ObjectUtil.isNull(byWxId.getId())) { + Long saveId = IdUtil.getSnowflake(workerId, datacenterId).nextId(); + WeChatEquipment equipment = new WeChatEquipment(); + byWxId = new WeChatAccount(); + BeanUtil.copyProperties(userLoginDTO, byWxId); + byWxId.setHeaderUrl(userLoginDTO.getBigHeadImgUrl()); + byWxId.setId(saveId); + byWxId.setUserId(userId); + equipment.setUserId(userId); + equipment.setEquipmentId(id); + equipment.setAccountId(saveId); + weChatEquipmentMapper.insert(equipment); + return this.save(byWxId); + } + BeanUtil.copyProperties(userLoginDTO, byWxId); + byWxId.setUserId(userId); + Long counted = weChatEquipmentMapper.countEquipment(byWxId.getId(), id); + if (counted == DefaultNumberConstants.ZERO_NUMBER) { + WeChatEquipment equipment = new WeChatEquipment(); + equipment.setEquipmentId(id); + equipment.setUserId(userId); + equipment.setAccountId(byWxId.getId()); + weChatEquipmentMapper.insert(equipment); + } + byWxId.setStatus(status == WechatCallbackConstant.LOGIN_SUCCESS ? + DefaultNumberConstants.ONE_NUMBER : DefaultNumberConstants.MINUS_ONE_NUMBER); + return this.updateById(byWxId); + } + + + @Override + public PageResult queryFirendData(PageParam pageParam, AccountQo qo) { + qo.setUserId(SecurityUtils.getCurrentUserId()); + List addFriendVos = Lists.newArrayList(); + PageResult accountVo = baseMapper.queryPage(pageParam, qo); + for (WeChatAccountVO vo : accountVo.getRecords()) { + AddFriendVo addFriendVo = new AddFriendVo(); + BeanUtil.copyProperties(vo, addFriendVo); + // 查询数据天数据 + List weChatAddFriendVos = + loginEquipmentService.queryByDate(DefaultNumberConstants.FIFTEEN_NUMBER, SecurityUtils.getCurrentUserId(), vo.getWxId()); + // 转为map + Map> map = weChatAddFriendVos.stream().collect + (Collectors.groupingBy(WeChatAddFriendVo::getDayStr)); + Integer newFriendsInitiativeNum = DefaultNumberConstants.ZERO_NUMBER; + Integer newPassiveNum = DefaultNumberConstants.ZERO_NUMBER; + List newArrayList = Lists.newArrayList(); + for (int i = 0; i < DefaultNumberConstants.FIFTEEN_NUMBER; i++) { + // 时间格式 + String dateTime = DateUtil.format(DateUtil.offsetDay(DateUtil.date(), -i), "MM-dd"); + AddFriendVo.FriendDTO dto = new AddFriendVo.FriendDTO(); + dto.setDayStr(dateTime); + if (map.containsKey(dateTime)) { + List voList = map.get(dateTime); + Map voMap = + voList.stream().collect(Collectors.toMap + (WeChatAddFriendVo::getAddFriendType, chatAddFriendVo -> chatAddFriendVo)); + if (voMap.get(DefaultNumberConstants.ONE_NUMBER) != null) { + WeChatAddFriendVo weChatAddFriendVo = voMap.get(DefaultNumberConstants.ONE_NUMBER); + Integer num = weChatAddFriendVo.getNum(); + newFriendsInitiativeNum += num; + dto.setNewDayFriendsInitiativeNum(num); + } + if (voMap.get(DefaultNumberConstants.TWO_NUMBER) != null) { + WeChatAddFriendVo weChatAddFriendVo = voMap.get(DefaultNumberConstants.TWO_NUMBER); + Integer num = weChatAddFriendVo.getNum(); + newPassiveNum += num; + dto.setNewDayPassiveNum(num); + } + } + newArrayList.add(dto); + addFriendVo.setList(newArrayList); + } + + addFriendVo.setNewFriendsInitiativeNum(newFriendsInitiativeNum); + addFriendVo.setNewPassiveNum(newPassiveNum); + addFriendVos.add(addFriendVo); + } + return new PageResult<>(addFriendVos, accountVo.getTotal()); + } + + @Override + public Boolean equipmentRenewal(Integer robotId, Integer payType) { + // TODO 设备续费 + Integer dayNum = PackageEnum.find(payType); + if (dayNum > DefaultNumberConstants.ZERO_NUMBER) { + LoginEquipment loginEquipment = loginEquipmentService.queryByRobotId(robotId); + if (ObjectUtil.isNotNull(loginEquipment) && ObjectUtil.isNotNull(loginEquipment.getId())) { + DateTime dateTime = DateUtil.endOfDay(DateUtil.offsetDay(loginEquipment.getExpirationTime(), dayNum)); + loginEquipment.setExpirationTime(dateTime); + return loginEquipmentService.updateById(loginEquipment); + } + } + return Boolean.FALSE; + } + + @Override + public WeChatAccount findByWxId(String robotWxId) { + return baseMapper.findByWxId(robotWxId); + } + + + @Override + public AccountStatisticsVO statisticsAccountByUserId(Long currentUserId) { + List onlineList = Lists.newArrayList(); + AccountStatisticsVO vo = new AccountStatisticsVO(); + List weChatAccounts = loginEquipmentService.queryByUserId(currentUserId); + Long friendNum = wechatFriendService.queryByUserId(currentUserId); + Integer abnormalNum = DefaultNumberConstants.ZERO_NUMBER; + int onlineNum = DefaultNumberConstants.ZERO_NUMBER; + Map map = Maps.newHashMap(); + for (WeChatAccountVO weChatAccount : weChatAccounts) { + map.put("robotId", weChatAccount.getRobotId()); + String robotResult = HttpUtil.get + (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.GET_ROBOT_TYPE) + .concat(weChatProperties.getAppKey()), map); + if (JSONUtil.isTypeJSON(robotResult)) { + WeChatResponse weChatResponse = JSONUtil.toBean(robotResult, WeChatResponse.class); + if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) { + WeChatAccountDTO dto = BeanUtil.toBean(weChatResponse.getData(), WeChatAccountDTO.class); + if (ObjectUtil.isNotNull(dto) && + dto.getStatus() == DefaultNumberConstants.ONE_NUMBER + && !onlineList.contains(dto.getPit())) { + onlineList.add(dto.getPit()); + onlineNum += DefaultNumberConstants.ONE_NUMBER; + } + } + } + } + vo.setFriendNum(friendNum); + vo.setOnlineNum(onlineNum); + vo.setAbnormalNum(abnormalNum); + vo.setAccountNum(weChatAccounts.size()); + return vo; + } + + @Override + public Boolean updateRemarkByWechatId(String wxId, String remark) { + return this.baseMapper.updateRemark(wxId, remark); + } + + @Override + public Boolean logoutByRobotId(Integer robotId) { + List arrayList = Lists.newArrayList(robotId); + Map map = Maps.newHashMap(); + map.put("robotIds", arrayList); + String result = HttpUtil.post + (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.ROBOT_LOGOUT) + .concat(weChatProperties.getAppKey()), map); + log.info("=============== the response as {} =============", result); + if (StringUtils.isNotBlank(result) && result.contains(ResponseCode.SUCCESS.getDesc())) { + WeChatResponse weChatResponse = JSONUtil.toBean(result, WeChatResponse.class); + if (weChatResponse.getStatus() == HttpStatus.HTTP_OK) { + return Boolean.TRUE; + } + } + return Boolean.FALSE; + } + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatCallbackServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatCallbackServiceImpl.java new file mode 100644 index 0000000..5993de4 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatCallbackServiceImpl.java @@ -0,0 +1,91 @@ +package com.baiye.modules.distribute.service.impl; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.json.JSONUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.constant.WechatCallbackConstant; +import com.baiye.modules.distribute.dto.WeChatFriendDTO; +import com.baiye.modules.distribute.dto.WeChatUserLoginDTO; +import com.baiye.modules.distribute.entity.LoginEquipment; +import com.baiye.modules.distribute.entity.WeChatAccount; +import com.baiye.modules.distribute.service.LoginEquipmentService; +import com.baiye.modules.distribute.service.WeChatService; +import com.baiye.modules.distribute.service.WechatCallbackService; +import com.baiye.modules.distribute.service.WechatFriendService; +import com.baiye.notify.event.StationNotifyPushEvent; +import com.baiye.notify.model.domain.AnnouncementNotifyInfo; +import com.baiye.result.WeChatResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.ApplicationContext; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.Collections; + +/** + * @author Enzo + * @date : 2024/4/1 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatCallbackServiceImpl implements WechatCallbackService { + + + private final WeChatService weChatService; + + private final ApplicationContext publisher; + + + private final WechatFriendService wechatFriendService; + + private final LoginEquipmentService loginEquipmentService; + + + @Override + public void analyticalData(WeChatResponse weChatResponse) { + Integer status = weChatResponse.getStatus(); + switch (status) { + case WechatCallbackConstant.LOGIN_OUT: + case WechatCallbackConstant.LOGIN_SUCCESS: + wechatLogin(weChatResponse); + break; + case WechatCallbackConstant.LOGIN_FAIL: + // 登录失败接口 + break; + case WechatCallbackConstant.THROUGH_FRIENDS: + viaFriendRequest(weChatResponse); + break; + default: + } + } + + + + public void wechatLogin(WeChatResponse weChatResponse) { + WeChatUserLoginDTO userLoginDTO = + JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatUserLoginDTO.class); + LoginEquipment robot = loginEquipmentService.queryByRobot(userLoginDTO.getPit()); + if (ObjectUtil.isNotNull(robot) && ObjectUtil.isNotNull(robot.getUserId())) { + + weChatService.weChatAccountLoginByRespon(userLoginDTO, weChatResponse.getStatus(), robot.getUserId(), robot.getId()); + AnnouncementNotifyInfo notifyInfo = new AnnouncementNotifyInfo(); + notifyInfo.setTitle("新消息通知"); + notifyInfo.setMessageKey(String.valueOf(robot.getRobotId())); + notifyInfo.setContent("用户".concat(userLoginDTO.getNickname()).concat("登录成功")); + notifyInfo.setCreateTime(LocalDateTime.now()); + notifyInfo.setMessageType(DefaultNumberConstants.ONE_NUMBER); + log.info("============ send message {} ==============", JSONUtil.toJsonStr(notifyInfo)); + // 发送消息 + publisher.publishEvent(new StationNotifyPushEvent(notifyInfo, Collections.singletonList(robot.getUserId()))); + } + } + + + private void viaFriendRequest(WeChatResponse weChatResponse) { + WeChatFriendDTO weChatFriendDTO = + JSONUtil.toBean(JSONUtil.toJsonStr(weChatResponse.getData()), WeChatFriendDTO.class); + wechatFriendService.addFriendByResponse(weChatFriendDTO); + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatFriendServiceImpl.java b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatFriendServiceImpl.java new file mode 100644 index 0000000..0a64da6 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/service/impl/WechatFriendServiceImpl.java @@ -0,0 +1,137 @@ +package com.baiye.modules.distribute.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.domain.PageResult; +import com.baiye.enums.StatisticsEnum; +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.modules.distribute.dto.WeChatFriendDTO; +import com.baiye.modules.distribute.dto.WeChatStatisticsDTO; +import com.baiye.modules.distribute.entity.WeChatFriedRecord; +import com.baiye.modules.distribute.mapper.LoginEquipmentMapper; +import com.baiye.modules.distribute.mapper.WeChatFriendMapper; +import com.baiye.modules.distribute.service.WechatFriendService; +import com.baiye.modules.distribute.vo.AddFriendVo; +import com.baiye.modules.distribute.vo.StatisticsFriendVO; +import com.baiye.modules.distribute.vo.WeChatAccountVO; +import com.baiye.modules.distribute.vo.WeChatAddFriendVo; +import com.baiye.security.util.SecurityUtils; +import com.google.common.collect.Lists; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +/** + * @author Enzo + * @date : 2024/3/28 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class WechatFriendServiceImpl extends ExtendServiceImpl + implements WechatFriendService { + + + private final LoginEquipmentMapper loginEquipmentMapper; + + + @Override + public void addFriendByResponse(WeChatFriendDTO weChatFriendDTO) { + if (StringUtils.isNotBlank(weChatFriendDTO.getNickName())) { + List voList = loginEquipmentMapper.findEquipmentByAccountId(weChatFriendDTO.getRobotWxId()); + if (CollUtil.isNotEmpty(voList)) { + for (WeChatAccountVO vo : voList) { + if (ObjectUtil.isNotNull(vo.getExpirationTime()) && vo.getExpirationTime().after(DateUtil.date())) { + Long count = this.baseMapper.selectCount(WrappersX.lambdaQueryX(WeChatFriedRecord.class).eq + (WeChatFriedRecord::getRobotWxId, weChatFriendDTO.getRobotWxId()).eq + (WeChatFriedRecord::getFriendId, weChatFriendDTO.getFriendId()).eq(WeChatFriedRecord::getUserId, vo.getUserId())); + if (count == DefaultNumberConstants.ZERO_NUMBER && + vo.getWxId().equals(weChatFriendDTO.getRobotWxId())) { + WeChatFriedRecord weChatFriedRecord = new WeChatFriedRecord(); + BeanUtil.copyProperties(weChatFriendDTO, weChatFriedRecord); + weChatFriedRecord.setUserId(vo.getUserId()); + this.baseMapper.insert(weChatFriedRecord); + } + } + } + } + } + } + + @Override + public List statisticsFriendByType(Integer queryType) { + Integer num = StatisticsEnum.find(queryType); + if (num > DefaultNumberConstants.ZERO_NUMBER) { + DateTime now = DateUtil.date(); + DateTime beginOfDay = DateUtil.beginOfDay(DateUtil.offsetDay(DateUtil.date(), -num)); + return baseMapper.queryByDate(beginOfDay, now, SecurityUtils.getCurrentUserId()); + } + return Lists.newArrayList(); + } + + @Override + public PageResult statisticsFriendByUserId(WeChatStatisticsDTO statisticsDTO) { + Date endTime = statisticsDTO.getEndTime(); + Date startTime = statisticsDTO.getStartTime(); + List weChatIdList = statisticsDTO.getWeChatIdList(); + List addFriendVos = Lists.newArrayList(); + Long dayNum = DateUtil.betweenDay(startTime, endTime, Boolean.TRUE); + AddFriendVo addFriendVo = new AddFriendVo(); + List weChatAddFriendVos = baseMapper.queryByUserList(weChatIdList, dayNum, SecurityUtils.getCurrentUserId(), startTime, endTime); + + // 转为map + Map> map = weChatAddFriendVos.stream().collect + (Collectors.groupingBy(WeChatAddFriendVo::getDayStr)); + Integer newFriendsInitiativeNum = DefaultNumberConstants.ZERO_NUMBER; + Integer newPassiveNum = DefaultNumberConstants.ZERO_NUMBER; + List newArrayList = Lists.newArrayList(); + for (int i = 0; i <= dayNum; i++) { + // 时间格式 + String dateTime = DateUtil.format(DateUtil.offsetDay(startTime, i), "MM-dd"); + AddFriendVo.FriendDTO dto = new AddFriendVo.FriendDTO(); + dto.setDayStr(dateTime); + if (map.containsKey(dateTime)) { + List voList = map.get(dateTime); + Map voMap = + voList.stream().collect(Collectors.toMap + (WeChatAddFriendVo::getAddFriendType, chatAddFriendVo -> chatAddFriendVo)); + if (voMap.get(DefaultNumberConstants.ONE_NUMBER) != null) { + WeChatAddFriendVo weChatAddFriendVo = voMap.get(DefaultNumberConstants.ONE_NUMBER); + Integer num = weChatAddFriendVo.getNum(); + newFriendsInitiativeNum += num; + dto.setNewDayFriendsInitiativeNum(num); + } + if (voMap.get(DefaultNumberConstants.TWO_NUMBER) != null) { + WeChatAddFriendVo weChatAddFriendVo = voMap.get(DefaultNumberConstants.TWO_NUMBER); + Integer num = weChatAddFriendVo.getNum(); + newPassiveNum += num; + dto.setNewDayPassiveNum(num); + } + } + newArrayList.add(dto); + addFriendVo.setList(newArrayList); + } + addFriendVo.setNewFriendsInitiativeNum(newFriendsInitiativeNum); + addFriendVo.setNewPassiveNum(newPassiveNum); + addFriendVos.add(addFriendVo); + return new PageResult<>(addFriendVos, addFriendVos.size()); + } + + @Override + public Long queryByUserId(Long currentUserId) { + return this.baseMapper.queryByUserId(currentUserId); + } + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/vo/AccountStatisticsVO.java b/admin/src/main/java/com/baiye/modules/distribute/vo/AccountStatisticsVO.java new file mode 100644 index 0000000..2037309 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/vo/AccountStatisticsVO.java @@ -0,0 +1,22 @@ +package com.baiye.modules.distribute.vo; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/4/7 + */ +@Data +public class AccountStatisticsVO { + + private Integer accountNum; + + private Long friendNum; + + private Integer onlineNum; + + private Integer abnormalNum; + + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/vo/AddFriendVo.java b/admin/src/main/java/com/baiye/modules/distribute/vo/AddFriendVo.java new file mode 100644 index 0000000..b05d706 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/vo/AddFriendVo.java @@ -0,0 +1,49 @@ +package com.baiye.modules.distribute.vo; + +import com.baiye.constant.DefaultNumberConstants; +import lombok.*; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/4/3 + */ +@Data +public class AddFriendVo { + + private String wxId; + + private Integer robotId; + + private String username; + + private String nickname; + + private String robotWxNick; + + private String headerUrl; + + private Integer newPassiveNum; + + private List list; + + private Integer newFriendsInitiativeNum; + + /** + * list + */ + @AllArgsConstructor + @NoArgsConstructor + @ToString + @Getter + @Setter + public static class FriendDTO { + + private String dayStr; + + private Integer newDayFriendsInitiativeNum = DefaultNumberConstants.ZERO_NUMBER; + + private Integer newDayPassiveNum = DefaultNumberConstants.ZERO_NUMBER; + } +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/vo/PayOrderVO.java b/admin/src/main/java/com/baiye/modules/distribute/vo/PayOrderVO.java new file mode 100644 index 0000000..1e3c359 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/vo/PayOrderVO.java @@ -0,0 +1,43 @@ +package com.baiye.modules.distribute.vo; + +import cn.hutool.core.date.DatePattern; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; + +@Data +public class PayOrderVO { + + @Schema(name = "pay_type") + private Integer payType; + + @Schema(name = "order_number") + private String orderNumber; + + @Schema(name = "status") + private Integer status; + + @Schema(name = "purchaser") + private String purchaser; + + @Schema(name = "pay_time") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DatePattern.NORM_DATETIME_PATTERN, timezone = "GMT+8") + private Date payTime; + + @Schema(name = "amount") + private Double amount; + + @Schema(name = "user_id") + private Long userId; + + + @Schema(title = "创建时间") + private LocalDateTime createTime; + + @Schema(title = "修改时间") + private LocalDateTime updateTime; + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/vo/StatisticsFriendVO.java b/admin/src/main/java/com/baiye/modules/distribute/vo/StatisticsFriendVO.java new file mode 100644 index 0000000..9aa058a --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/vo/StatisticsFriendVO.java @@ -0,0 +1,16 @@ +package com.baiye.modules.distribute.vo; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/4/3 + */ +@Data +public class StatisticsFriendVO { + + + private Integer addFriendType; + + private Integer count; +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAccountVO.java b/admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAccountVO.java new file mode 100644 index 0000000..78d6839 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAccountVO.java @@ -0,0 +1,86 @@ +package com.baiye.modules.distribute.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; + +import java.time.LocalDateTime; +import java.util.Date; + +/** + * @author Enzo + * @date : 2024/3/26 + */ +@Data +public class WeChatAccountVO { + + @Schema(title = "id") + private Long id; + + + @Schema(title = "用户id") + private Long userId; + + + @Schema(title = "设备信息") + private String deviceInformation; + + @Schema(title = "用户名称") + private String username; + + @Schema(title = "用户id") + private String nickname; + + @Schema(title = "城市信息") + private String cityInfo; + + @Schema(title = "登录类型") + private Integer loginType; + + @Schema(name = "登录时间") + private Date loginDate; + + @Schema(name = "头像") + private String headerUrl; + + @Schema(name = "微信ID") + private String wxId; + + @Schema(name = "性别") + private Integer sex; + + @Schema(name = "拥有者") + private Long ownerId; + + + + @Schema(title = "创建时间") + private LocalDateTime createTime; + + + @Schema(title = "修改时间") + private LocalDateTime updateTime; + + @Schema(title = "在线状态") + private Integer status; + + + @Schema(title = "备注") + private String remark; + + @Schema(title = "pit") + private String pit; + + + @Schema(title = "微信号") + private String weChatNo; + + @Schema(title = "设备号") + private Integer robotId; + + private String deviceNumber; + + @Schema(title = "过期时间") + private Date expirationTime; + + +} diff --git a/admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAddFriendVo.java b/admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAddFriendVo.java new file mode 100644 index 0000000..10e7ec4 --- /dev/null +++ b/admin/src/main/java/com/baiye/modules/distribute/vo/WeChatAddFriendVo.java @@ -0,0 +1,18 @@ +package com.baiye.modules.distribute.vo; + +import lombok.Data; + +/** + * @author Enzo + * @date : 2024/4/3 + */ +@Data +public class WeChatAddFriendVo { + + private String dayStr; + + private Integer num; + + private Integer addFriendType; + +} diff --git a/admin/src/main/java/com/baiye/properties/PayConfig.java b/admin/src/main/java/com/baiye/properties/PayConfig.java new file mode 100644 index 0000000..6e11e51 --- /dev/null +++ b/admin/src/main/java/com/baiye/properties/PayConfig.java @@ -0,0 +1,40 @@ +package com.baiye.properties; + +import com.alipay.easysdk.factory.Factory; +import com.alipay.easysdk.kernel.Config; +import com.baiye.system.properties.AliPayProperties; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +/** + * @author Enzo + */ +@Component +@Configuration +@EnableConfigurationProperties({AliPayProperties.class}) +public class PayConfig { + + private final AliPayProperties aliPay; + + public PayConfig(AliPayProperties aliPay) { + this.aliPay = aliPay; + Config config = new Config(); + config.protocol = aliPay.getProtocol(); + config.gatewayHost = aliPay.getGatewayHost(); + config.signType = aliPay.getSignType(); + config.appId = aliPay.getAppId(); + /** + * 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中 + */ + config.merchantPrivateKey = aliPay.getMerchantPrivateKey(); + config.alipayPublicKey = aliPay.getAliPayPublicKey(); + config.notifyUrl = aliPay.getNotifyUrl(); + config.encryptKey = aliPay.getEncryptKey(); + Factory.setOptions(config); + } + + public AliPayProperties getConfig(){ + return aliPay; + } +} diff --git a/admin/src/main/java/com/baiye/schedule/AccountTask.java b/admin/src/main/java/com/baiye/schedule/AccountTask.java new file mode 100644 index 0000000..c47188b --- /dev/null +++ b/admin/src/main/java/com/baiye/schedule/AccountTask.java @@ -0,0 +1,64 @@ +package com.baiye.schedule; + +import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.http.HttpUtil; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.constant.WeChatRequestConstants; +import com.baiye.modules.distribute.entity.LoginEquipment; +import com.baiye.modules.distribute.service.LoginEquipmentService; +import com.baiye.system.properties.WeChatProperties; +import com.google.common.collect.Lists; +import com.google.common.collect.Maps; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +/** + * @author Enzo + * @date : 2024/4/10 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class AccountTask { + + + private final WeChatProperties weChatProperties; + + private final LoginEquipmentService loginEquipmentService; + + + /** + * 批量下线 + */ + @Scheduled(cron = "0 0 1 * * ? ") + public void updateAccountMassNum() { + List arrayList = Lists.newArrayList(); + List equipmentList = + loginEquipmentService.findExpiredAccount(); + if (CollUtil.isNotEmpty(equipmentList)) { + for (LoginEquipment equipment : equipmentList) { + DateTime dateTime = DateUtil.offsetDay + (equipment.getExpirationTime(), DefaultNumberConstants.FIFTEEN_NUMBER); + if (dateTime.before(DateUtil.date())) { + arrayList.add(equipment.getRobotId()); + } + } + if (CollUtil.isNotEmpty(arrayList)) { + Map map = Maps.newHashMap(); + map.put("robotIds", arrayList); + String result = HttpUtil.post + (weChatProperties.getGatewayHost().concat(WeChatRequestConstants.ROBOT_LOGOUT) + .concat(weChatProperties.getAppKey()), map); + log.info("========== the response as {} ==========", result); + } + } + + } +} diff --git a/admin/src/main/java/com/baiye/schedule/DynamicController.java b/admin/src/main/java/com/baiye/schedule/DynamicController.java new file mode 100644 index 0000000..a2e5690 --- /dev/null +++ b/admin/src/main/java/com/baiye/schedule/DynamicController.java @@ -0,0 +1,79 @@ +package com.baiye.schedule; + +import com.baiye.common.job.handler.ElasticJobHandler; +import com.baiye.result.R; +import com.baiye.schedule.handler.DynamicJob; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; +import java.util.Objects; + +/** + * @author Enzo + * @date : 2024/5/28 + */ +@Slf4j +@RestController +@RequestMapping("/dynamic") +public class DynamicController { + + @Autowired + private ElasticJobHandler elasticJobHandler; + + /** + * 创建动态定时任务 + * jobName 任务名称 + * cron cron表达式 0 * * * * ? * + * + * @param params + * @return + */ + @GetMapping("/createJob") + public R createJob(@RequestBody Map params) { + elasticJobHandler.addJob(params.get("jobName").toString(), params.get("cron").toString(), 1, new DynamicJob(), Objects.isNull(params.get("params")) ? "" : params.get("params").toString(), Objects.isNull(params.get("description")) ? "" : params.get("description").toString()); + return R.ok(); + } + + + /** + * 更新定时任务(似乎,好像,他内内的这个方法没用!!!) + * jobName + * cron cron表达式 0 0/5 * * * ? + * + * @return + */ + @GetMapping("/updateJob") + public R updateJob(@RequestBody Map params) { + if (Objects.isNull(params.get("jobName"))) { + return R.failed("jobName不能为空"); + } + + if (Objects.isNull(params.get("cron"))) { + return R.failed("cron不能为空"); + } + elasticJobHandler.updateJob(params.get("jobName").toString(), params.get("cron").toString()); + return R.ok("请求成功"); + } + + /** + * 删除定时任务 + * jobName 任务名称 + * + * @return + */ + @GetMapping("/removeJob") + public R removeJob(@RequestBody Map params) { + if (Objects.isNull(params.get("jobName"))) { + return R.failed("jobName不能为空"); + } + elasticJobHandler.removeJob(params.get("jobName").toString()); + return R.ok("请求成功"); + } + + +} diff --git a/admin/src/main/java/com/baiye/schedule/entity/JobDynamicTask.java b/admin/src/main/java/com/baiye/schedule/entity/JobDynamicTask.java new file mode 100644 index 0000000..c7b62c3 --- /dev/null +++ b/admin/src/main/java/com/baiye/schedule/entity/JobDynamicTask.java @@ -0,0 +1,46 @@ +package com.baiye.schedule.entity; + +import com.baiye.entity.BaseEntity; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.Getter; +import lombok.Setter; + +import java.io.Serializable; + +/** + * @author Enzo + * @date : 2024/5/28 + */ +@Getter +@Setter +@TableName(value = "tb_job_dynamic_task") +@Schema(title = "定时任务") +public class JobDynamicTask extends BaseEntity implements Serializable { + /** + * ID + */ + @TableId + @Schema(title = "ID") + private Long id; + + @Schema(title = "is_delete") + private Integer isDelete; + + @Schema(title = "job_name") + private String jobName; + + @Schema(title = "cron") + private String cron; + + @Schema(title = "description") + private String description; + + @Schema(title = "parameters") + private String parameters; + + @Schema(title = "status") + private Integer status; +} diff --git a/admin/src/main/java/com/baiye/schedule/handler/DynamicJob.java b/admin/src/main/java/com/baiye/schedule/handler/DynamicJob.java new file mode 100644 index 0000000..2fac3c1 --- /dev/null +++ b/admin/src/main/java/com/baiye/schedule/handler/DynamicJob.java @@ -0,0 +1,34 @@ +package com.baiye.schedule.handler; + +import cn.hutool.core.date.DatePattern; +import cn.hutool.core.date.DateUtil; +import com.dangdang.ddframe.job.api.ShardingContext; +import com.dangdang.ddframe.job.api.simple.SimpleJob; +import lombok.extern.slf4j.Slf4j; + +import java.util.Date; + +/** + * @author Enzo + * @date : 2024/5/28 + */ +@Slf4j +public class DynamicJob implements SimpleJob { + + /** + * 业务执行逻辑 + * + * @param shardingContext + */ + @Override + public void execute(ShardingContext shardingContext) { + log.info("{}动态定时任务执行逻辑start...", DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN)); + String jobName = shardingContext.getJobName(); + String jobParameter = shardingContext.getJobParameter(); + log.info("---------DynamicJob---------动态定时任务正在执行:jobName = {}, jobParameter = {}", jobName, jobParameter); + + //根据参数调用不同的业务接口处理,请远程调用业务模块处理,避免本服务与业务依赖过重... + + log.info("{}动态定时任务执行逻辑end...", DateUtil.format(new Date(), DatePattern.NORM_DATETIME_MS_PATTERN)); + } +} diff --git a/admin/src/main/java/com/baiye/schedule/handler/ScanDynamicJobHandler.java b/admin/src/main/java/com/baiye/schedule/handler/ScanDynamicJobHandler.java new file mode 100644 index 0000000..8327381 --- /dev/null +++ b/admin/src/main/java/com/baiye/schedule/handler/ScanDynamicJobHandler.java @@ -0,0 +1,41 @@ +package com.baiye.schedule.handler; + +import com.baiye.common.job.handler.ElasticJobHandler; +import com.baiye.schedule.entity.JobDynamicTask; +import com.baiye.schedule.service.ElasticJobService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * @author Enzo + * @date : 2024/5/28 + */ +@Slf4j +@Service +public class ScanDynamicJobHandler { + @Resource + private ElasticJobHandler elasticJobHandler; + @Resource + private ElasticJobService elasticJobService; + + /** + * 扫描动态任务列表,并添加任务 + *

+ * 循环执行的动态任务,本服务重启的时候,需要重新加载任务 + * + * @author songfayuan + * @date 2021/4/26 9:15 下午 + */ + public void scanAddJob() { + // 这里为从MySQL数据库读取job_dynamic_task表的数据,微服务项目中建议使用feign从业务服务获取,避免本服务过度依赖业务的问题,然后业务服务新增动态任务也通过feign调取本服务JobOperateController实现,从而相对独立本服务模块 + List jobDynamicTaskList = this.elasticJobService.getAllList(); + log.info("扫描动态任务列表,并添加任务:本次共扫描到{}条任务。", jobDynamicTaskList.size()); + for (JobDynamicTask jobDynamicTask : jobDynamicTaskList) { + // 创建任务 + elasticJobHandler.addJob(jobDynamicTask.getJobName(), jobDynamicTask.getCron(), 1, new DynamicJob(), jobDynamicTask.getParameters(), jobDynamicTask.getDescription()); + } + } +} diff --git a/admin/src/main/java/com/baiye/schedule/mapper/JobDynamicTaskMapper.java b/admin/src/main/java/com/baiye/schedule/mapper/JobDynamicTaskMapper.java new file mode 100644 index 0000000..dadcb03 --- /dev/null +++ b/admin/src/main/java/com/baiye/schedule/mapper/JobDynamicTaskMapper.java @@ -0,0 +1,14 @@ +package com.baiye.schedule.mapper; + +import com.baiye.extend.mybatis.plus.mapper.ExtendMapper; +import com.baiye.schedule.entity.JobDynamicTask; +import org.apache.ibatis.annotations.Mapper; + +/** + * @author Enzo + * @date : 2024/5/28 + */ +@Mapper +public interface JobDynamicTaskMapper extends ExtendMapper { + +} diff --git a/admin/src/main/java/com/baiye/schedule/service/ElasticJobService.java b/admin/src/main/java/com/baiye/schedule/service/ElasticJobService.java new file mode 100644 index 0000000..46e4644 --- /dev/null +++ b/admin/src/main/java/com/baiye/schedule/service/ElasticJobService.java @@ -0,0 +1,19 @@ +package com.baiye.schedule.service; + +import com.baiye.extend.mybatis.plus.service.ExtendService; +import com.baiye.schedule.entity.JobDynamicTask; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/5/28 + */ +public interface ElasticJobService extends ExtendService { + + /** + * 获取所有正在运行的 + * @return + */ + List getAllList(); +} diff --git a/admin/src/main/java/com/baiye/schedule/service/impl/ElasticJobServiceImpl.java b/admin/src/main/java/com/baiye/schedule/service/impl/ElasticJobServiceImpl.java new file mode 100644 index 0000000..737671e --- /dev/null +++ b/admin/src/main/java/com/baiye/schedule/service/impl/ElasticJobServiceImpl.java @@ -0,0 +1,28 @@ +package com.baiye.schedule.service.impl; + +import com.baiye.schedule.mapper.JobDynamicTaskMapper; +import com.baiye.constant.DefaultNumberConstants; +import com.baiye.extend.mybatis.plus.service.impl.ExtendServiceImpl; +import com.baiye.extend.mybatis.plus.toolkit.WrappersX; +import com.baiye.schedule.entity.JobDynamicTask; +import com.baiye.schedule.service.ElasticJobService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @author Enzo + * @date : 2024/5/28 + */ +@Slf4j +@Service +@RequiredArgsConstructor +public class ElasticJobServiceImpl extends ExtendServiceImpl implements ElasticJobService { + @Override + public List getAllList() { + return baseMapper.selectList(WrappersX.lambdaQueryX(JobDynamicTask.class).eq(JobDynamicTask::getStatus, DefaultNumberConstants.ONE_NUMBER)); + } + +} diff --git a/admin/src/main/resources/application-dev.yml b/admin/src/main/resources/application-dev.yml new file mode 100644 index 0000000..ecceb42 --- /dev/null +++ b/admin/src/main/resources/application-dev.yml @@ -0,0 +1,48 @@ +spring: + datasource: + url: jdbc:mysql://39.100.77.21:3306/marketing-scrm?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true + username: root + password: y7z7noq2 + redis: + host: 39.100.77.21 + password: sC33HXphkHBRj4Jb + port: 6379 + timeout: 5000 + database: 1 + + +alipay: + protocol: https + # 不需要加/gateway.do,这是新旧SDK的区别,切记 + # gatewayHost: openapi.alipaydev.com + gatewayHost: openapi.alipay.com + signType: RSA2 + # 填APPID + appId: 2021003125644167 + # 填应用私钥,注意是应用私钥,不要填成公钥了_(:з」∠)_ + merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCNIuelR5MHMY3vtl2KEgWUbhHMHuBwxHMVONuUYKlt4grOGJtaPKitgh9MxrvaxmAvH0LilQQKd5T07os9jC2XpNmH0BA6rNVNgBwjWNllqKo+jT8OiKvog9uBuZYfHdkLRhjObrTkSo97jO5Y32591GZHG+cQ/5bgMC0KXlQMOv5piLqUfKYDJ5pWBdS5gqcCkUABZsrW+C8nD7lvOuVglN1AGQiXQzj+Iu3K5xcUg+d3q0nWXhKPpotSolFGSakLEqUja/MnsILVHVw8MYMuq6LxzQ7DQ5fCzMPMIF5kYTynsAV5SoE90ilj1vmmI4aa7dc+9OmG/vXyFuoOEK1bAgMBAAECggEAH0K/9EfqNQmw2ouWJGLhgYLvxjqAk/mvU+AIItFWNdR/eC7TGiWdZvEPZb4PFeIio81Uz0MaZgceozHC/Zry7kfBNufK8HQfus7JbLrdTDsTmk9GzD1RdmreT9l/etztmiWokPDMeFRbe443rM+wdYZ6MP3pLEawcG+7SjSigSKrcpltAJ49NhHyfJxnnCye4mM8PevVGXe4nGv/vKJbAfzl5V8MsSY+SVktj6jOUTSa6nypISvQElyv8jeNH/bTDjg0DOHzL4tUHaVbTqHhtqbNo3n9VuKz4shVAp3I+9PpcTQTueTsM9L0Y+j84bV3VZlTIGGzDUD4qWDhUKPJ4QKBgQDQFNB2vLDJLeGfn+SnCncnr/wQo1xJez+deBqJXoDhDWDuZVcWNaEOWgfDronm8dIedWMYHD//WN0GtA5foAUdlaNq/jeKdJFgzJ/hoOtOveHY1OWqJHiJ/YMRBMuLn/E4Jit7q215JU6Jur1T+70HxrUFTQfY8GWdMvSDFHCKDwKBgQCto24hqgcEDKoR3/sm5sUKqYZTHLeQbniM0D5EcOkBNw7UXGYQSbz7mJ34XQKTfrOL71A+LkjxdMfs5q56yxeOQxR4EBO/Fpz8xPRlud5uIp4eTQVJ8I01meZyvojkF6mO5C4tbcXJOpnpU8ohoeTRu7th0oUYObGUYmn0qzuj9QKBgDCOOtsKSwKXF0hFanjkQ0vakCpdxIJNJVoclayqhc5+bbkTos/G8e9EaP1rtDhVA6Ah6l7M8M4oMWOIDraXw7nUmk60RcekTexVs5VWFLLKMnKDs5gRbKNeqgAFq23Ig+SDW7A/H4uefgY7skRvwPuYjdNP113zMvMM2evgkCZXAoGAP5przvz/EOaqrV2EG93QM3WhdHRCcS9mDP6CsINDdmR6lCM8Z577EJX4128KcIiqsAl7NSuzIG8MhKSDKQuXl07PAqOw+AAKhTSH6XNKHMGldaf01f69WvMCzOkqL5LTUzoWCCH7nxhOJH/CvMsWjBTeMJjyk8seVyIteaf3crkCgYEAmY8OC+Vdo/yop+ooedCnvBC7GVMfcqR6+rIQ+ZnKom7jhByIN6w7eEVAnmNa9dCv/pig7HaYbitWmCNf9tbqFfcdY6e5Svele3amgDM9iqtdJ9Rf1PpDPZw+gmjRIxGs6W8wnl1Sqvpk8pFUA/2xlT6sXpfxra9N09LS0ttU+cU= + # 填支付宝公钥,注意不是生成的应用公钥 + aliPayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyvegkGCrz1i5/K7VzQxvoZm4G73pSPNu9R5ET8YonIuDVoHkHaYvQQizLdRkTyBsYIik8FXsSDmVsw5MLMQ7OAlZ97nQBkz5TxOX6Px766nUpSVoWXoAz6cpIlWnwgir4t1ph88Ph56l+qmqW3gUj/U6MIuzjxBJlijTMHl96its95Nd4cEFx4j+sFuRYob6D0kcemC7xEFuty7bdupda51Z56GYI1YjuUTryTlFOHZbOSThc2ZMzNC1gPG25bn2Lx6sDuPByk4KW4rQ2v7mSfeUuZZRdjtVSC0WV2M2Cv5L8eLFvZRgNYnXrUJYhnRpT+OBAvJZXaWU2nv/bNe/UQIDAQAB + # 回调地址 + notifyUrl: http://39.100.77.21:8088/pay/aliPay/pay-notify + # 支付宝成功支付跳转页面 + returnUrl: https://count.byffp.top/statePage/success + # 可设置AES密钥,调用AES加解密相关接口时需要(可选) + encryptKey: + + +springdoc: + swagger-ui: + urls: + - { name: 'admin', url: '/v3/api-docs' } + - { name: 'api', url: 'http://ballcat-api/v3/api-docs' } + +#mybatis plus 设置 +mybatis-plus: + configuration: +# log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志 + log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl #关闭sql日志 + +wechat: + gatewayHost: https://fission-server.scrm-ai.com + appKey: SFkWRAued71GvCeClj8efDhAG6bJ2rzT diff --git a/admin/src/main/resources/application-prod.yml b/admin/src/main/resources/application-prod.yml new file mode 100644 index 0000000..dbfe044 --- /dev/null +++ b/admin/src/main/resources/application-prod.yml @@ -0,0 +1,39 @@ +spring: + datasource: + url: jdbc:mysql://localhost:3306/marketing-scrm?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true + username: root + password: CK8KyUngFSY + redis: + host: localhost + password: + port: 6379 + + + +# 生产环境关闭文档 +ballcat: + openapi: + enabled: false + +alipay: + protocol: https + # 不需要加/gateway.do,这是新旧SDK的区别,切记 + # gatewayHost: openapi.alipaydev.com + gatewayHost: openapi.alipay.com + signType: RSA2 + # 填APPID + appId: 2021003125644167 + # 填应用私钥,注意是应用私钥,不要填成公钥了_(:з」∠)_ + merchantPrivateKey: MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCNIuelR5MHMY3vtl2KEgWUbhHMHuBwxHMVONuUYKlt4grOGJtaPKitgh9MxrvaxmAvH0LilQQKd5T07os9jC2XpNmH0BA6rNVNgBwjWNllqKo+jT8OiKvog9uBuZYfHdkLRhjObrTkSo97jO5Y32591GZHG+cQ/5bgMC0KXlQMOv5piLqUfKYDJ5pWBdS5gqcCkUABZsrW+C8nD7lvOuVglN1AGQiXQzj+Iu3K5xcUg+d3q0nWXhKPpotSolFGSakLEqUja/MnsILVHVw8MYMuq6LxzQ7DQ5fCzMPMIF5kYTynsAV5SoE90ilj1vmmI4aa7dc+9OmG/vXyFuoOEK1bAgMBAAECggEAH0K/9EfqNQmw2ouWJGLhgYLvxjqAk/mvU+AIItFWNdR/eC7TGiWdZvEPZb4PFeIio81Uz0MaZgceozHC/Zry7kfBNufK8HQfus7JbLrdTDsTmk9GzD1RdmreT9l/etztmiWokPDMeFRbe443rM+wdYZ6MP3pLEawcG+7SjSigSKrcpltAJ49NhHyfJxnnCye4mM8PevVGXe4nGv/vKJbAfzl5V8MsSY+SVktj6jOUTSa6nypISvQElyv8jeNH/bTDjg0DOHzL4tUHaVbTqHhtqbNo3n9VuKz4shVAp3I+9PpcTQTueTsM9L0Y+j84bV3VZlTIGGzDUD4qWDhUKPJ4QKBgQDQFNB2vLDJLeGfn+SnCncnr/wQo1xJez+deBqJXoDhDWDuZVcWNaEOWgfDronm8dIedWMYHD//WN0GtA5foAUdlaNq/jeKdJFgzJ/hoOtOveHY1OWqJHiJ/YMRBMuLn/E4Jit7q215JU6Jur1T+70HxrUFTQfY8GWdMvSDFHCKDwKBgQCto24hqgcEDKoR3/sm5sUKqYZTHLeQbniM0D5EcOkBNw7UXGYQSbz7mJ34XQKTfrOL71A+LkjxdMfs5q56yxeOQxR4EBO/Fpz8xPRlud5uIp4eTQVJ8I01meZyvojkF6mO5C4tbcXJOpnpU8ohoeTRu7th0oUYObGUYmn0qzuj9QKBgDCOOtsKSwKXF0hFanjkQ0vakCpdxIJNJVoclayqhc5+bbkTos/G8e9EaP1rtDhVA6Ah6l7M8M4oMWOIDraXw7nUmk60RcekTexVs5VWFLLKMnKDs5gRbKNeqgAFq23Ig+SDW7A/H4uefgY7skRvwPuYjdNP113zMvMM2evgkCZXAoGAP5przvz/EOaqrV2EG93QM3WhdHRCcS9mDP6CsINDdmR6lCM8Z577EJX4128KcIiqsAl7NSuzIG8MhKSDKQuXl07PAqOw+AAKhTSH6XNKHMGldaf01f69WvMCzOkqL5LTUzoWCCH7nxhOJH/CvMsWjBTeMJjyk8seVyIteaf3crkCgYEAmY8OC+Vdo/yop+ooedCnvBC7GVMfcqR6+rIQ+ZnKom7jhByIN6w7eEVAnmNa9dCv/pig7HaYbitWmCNf9tbqFfcdY6e5Svele3amgDM9iqtdJ9Rf1PpDPZw+gmjRIxGs6W8wnl1Sqvpk8pFUA/2xlT6sXpfxra9N09LS0ttU+cU= + # 填支付宝公钥,注意不是生成的应用公钥 + aliPayPublicKey: MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAyvegkGCrz1i5/K7VzQxvoZm4G73pSPNu9R5ET8YonIuDVoHkHaYvQQizLdRkTyBsYIik8FXsSDmVsw5MLMQ7OAlZ97nQBkz5TxOX6Px766nUpSVoWXoAz6cpIlWnwgir4t1ph88Ph56l+qmqW3gUj/U6MIuzjxBJlijTMHl96its95Nd4cEFx4j+sFuRYob6D0kcemC7xEFuty7bdupda51Z56GYI1YjuUTryTlFOHZbOSThc2ZMzNC1gPG25bn2Lx6sDuPByk4KW4rQ2v7mSfeUuZZRdjtVSC0WV2M2Cv5L8eLFvZRgNYnXrUJYhnRpT+OBAvJZXaWU2nv/bNe/UQIDAQAB + # 回调地址 + notifyUrl: https://count.byffp.top/api/pay/aliPay/pay-notify + # 支付宝成功支付跳转页面 + returnUrl: https://count.byffp.top/statePage/success + # 可设置AES密钥,调用AES加解密相关接口时需要(可选) + encryptKey: + +wechat: + gatewayHost: https://fission-server.scrm-ai.com + appKey: uNE5DXdjwQa1iE8cBVZJbuvGfr5t9R73 diff --git a/admin/src/main/resources/application-test.yml b/admin/src/main/resources/application-test.yml new file mode 100644 index 0000000..04e7fd4 --- /dev/null +++ b/admin/src/main/resources/application-test.yml @@ -0,0 +1,26 @@ +spring: + datasource: + url: jdbc:mysql://39.100.77.21:3306/ad_distribute?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowMultiQueries=true + username: root + password: y7z7noq2 + redis: + host: 39.100.77.21 + password: sC33HXphkHBRj4Jb + port: 6379 + timeout: 5000 + database: 7 + + + +#mybatis plus 设置 +mybatis-plus: + configuration: + #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志 + log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl #关闭sql日志 + +springdoc: + swagger-ui: + urls: + - { name: 'admin', url: '/v3/api-docs' } + - { name: 'api', url: 'http://ballcat-api/v3/api-docs' } + diff --git a/admin/src/main/resources/application.yml b/admin/src/main/resources/application.yml new file mode 100644 index 0000000..81dd8c3 --- /dev/null +++ b/admin/src/main/resources/application.yml @@ -0,0 +1,106 @@ +server: + port: 8099 + +spring: + application: + name: @artifactId@ + profiles: + active: dev + jackson: + date-format: yyyy-MM-dd HH:mm:ss + time-zone: GMT+8 + + +# 天爱图形验证码 +captcha: + secondary: + enabled: true + +# mybatis-plus相关配置 +mybatis-plus: + mapper-locations: classpath*:/mapper/**/*Mapper.xml + global-config: + banner: false + db-config: + id-type: auto + insert-strategy: not_empty + update-strategy: not_empty + logic-delete-value: "NOW()" # 逻辑已删除值(使用当前时间标识) + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) + + +# BallCat 相关配置 +ballcat: + security: + # 前端传输密码的 AES 加密密钥 + password-secret-key: '==market-scrm===' + oauth2: + authorizationserver: + # 登陆验证码是否开启 + login-captcha-enabled: true + # 内嵌的表单登陆页是否开启 + login-page-enabled: false + resourceserver: + ## 忽略鉴权的 url 列表 + ignore-urls: + - /public/** + - /actuator/** + - /doc.html + - /v2/api-docs/** + - /v3/api-docs/** + - /swagger-resources/** + - /swagger-ui/** + - /webjars/** + - /bycdao-ui/** + - /favicon.ico + - /captcha/** + - /outside/** + - /wechat/global/setting + - /pay/aliPay/pay-notify + # 项目 redis 缓存的 key 前缀 + redis: + key-prefix: 'marketing:' + +springdoc: + # 开启 oauth2 端点显示 + show-oauth2-endpoints: true + swagger-ui: + oauth: + client-id: test + client-secret: test + display-request-duration: true + disable-swagger-default-url: true + persist-authorization: true + +# 文件存储路径 +file: + mac: + path: ~/file/ + avatar: ~/avatar/ + clueFilePath: ~/cluefile/ + systemSeparator: / + linux: + path: /home/marketing-scrm/file/ + avatar: /home/marketing-scrm/avatar/ + clueFilePath: /home/marketing-scrm/cluefile/ + systemSeparator: / + windows: + path: C:\marketing-scrm\file\ + avatar: C:\marketing-scrm\avatar\ + clueFilePath: C:\marketing-scrm\cluefile\ + systemSeparator: \ + # 文件大小 /M + maxSize: 300 + avatarMaxSize: 5 + + +elasticjob: + zookeeper: + namespace: springboot-elasticjob + server-list: localhost:2181 + +snowflake: + workerId: 10 + datacenterId: 10 + + diff --git a/admin/src/main/resources/file/template.xlsx b/admin/src/main/resources/file/template.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2847f8f65c8a942330cbfdef5e3b71b2ddf63449 GIT binary patch literal 10034 zcmeHtbxPq z_vfp6t7^~8o@rV0>ovW)x?5ff3>+5ZX@tnG3Ot?vJz#(rhBj~I?QLuw803Lu=)fD$ zKgq7)+#b1KfPmP5f`B0ZolM`>mfqFMGCg)k5{wBw=+gfPxw>*EIy62R9ncl2{;?rC zncGT_9OlbR_PNIQdSp*9wdP3wXnkW)C+Y?}mskf5PYTl1^1X02cFGZQ%&;#oc;*H1Q5Ek_Zp zkf-fofJEMSYK{+MKU$HEKa?D%6E7hVpWG|0zx)&Ely_1RY(SuSfk31D9q6|<_C`-g z2gT@0buglLEkU#h^?9V`IdKWjuMk|U3w+GE!i@b&H=9Qk=6ri${HYWTf}n%*(q)8~ z>LvFAIl*${u5^&8s642sqhhj5P)3Romsl9mckxAMNa|XsXw36#4Jul+^Z=+C4O@Vp z9C4p3xn^mztyBO~&+d>JQU4iTD;EHR%_xAZ=xP$)=I(*ZtPO7(bz*M2b_9 z=XtptfV>A4g2R?RPBKRK@c`pEc*K1bk5;IvZ?h)z_Pf$&bluhUMK?CA+vbrQgHV(o zN_W)_KDe?n37n2(AX6dUZw@=CRlleb+FYD}n(U9is*{&w5`NqM0*NrLKEg|cn|h?{ zK)XiRN%oYOtR{XFAwOdH6;UM_Uqkn`JLs<6t&ea@VLbbKIEI6>LK?n@lkAD9F-sd#2xp%gS)=&eU1lMSDaf z|C%(&K2)z!z_VIbio<)QHMx$bzJ*wGNY2^$))lwOI>xI#8bG1Fw7Fa!uA$P!5o{=g z6=AC^$dwDzN!6W4T2`<(#0}l8l;kVGHm=s9uQ|e1zron7ZUQ?&BPJw-dvn&8lL#Cf$M?IwEx_D4tba#Cw(;6t%Kx>C4L z4WQ5>-ABU{S7EVqpnpB!1llMW90cUm zf6)G9VR|xFr1HG=JR`gp!ABqDGo1n1ug(ao=uKI(z6g}l+8G$hQ9+W4o(f2yor?7>Go z*rCa&HE#~_TGop8jKd$C5jD(bzcw0e?(GlqM)F=i^YklR`9>^WkH+0~2>wzP+p$mT zlqOx`2Sy27t9O}PINcz2S*8!&$QjEsFz1CEoxZD1(N#&?zwVSn5aLm1i7)kF%tFS-#uy%l zE=%(ehvJVbmY%&95R8XC$E;|31)4F2evj`ks0dm$Vq2e4y|9`61+L6b)f!%h`-jx) z*{QoUxz9G%SK#goL<*ere72kHrjAIudT_y@s6vu?X++95%%u~)4#pd6z23rU=@=~G zsv23^iB$FxM2DQg4;}QIXP=VdwBhe{-=UCn(Tbao+M|4LHFXWMIAhi>H|HZUQ(@ML zO^}SLU7{ZdnvL}~-}=gRrs9!F*eJ2Vo?dBo`yyDy4VQA-6 zg>mJ5f`kp0Ki$H*=S5xv&@Gq&7w-RIxiSA-ZgB&^<%TSB32}o2eu=VCV74ouC_l?M zC*qg2^HxTRB#g07zfU3lY)?udX02V@FyAc{>Jl-e>mYY*|AnW#sZ?{n{c!8_EaiN{ zUC-r0m)J0<#JqSUrsM;--;%1$5<1C^(DsW^5q|`-qpPV&)D@$;GRW`DLOc#%5deGY0q3a!Q$g4=l7K_xiRkQTB7bG>wO6#4d;+ zkHVSY_EZM!9+!b&Y`*WkXHO?O?05#2TUP^9<~)>~DVLWtn!k%-;*rPk zj%;sDQcx>_=j(czNFJHn<{}tE6z5LsQYrrlgs{rCidJ*21DVTqpOi>k5!Pp^_@wYP zlHv!@|7&}*{C|7@zi#h;-g=%wUEtp2Xli6-^eog3yt#$Hf&c+&2Ks=f=-@B1pTs{m zoCA%aXdE{57LpVGh|R@A(xD#bDa%jSyMiwBDsi88$0X7sa7J7WxxWq}d=eui6$WU% zueTEr$X8ued`Jl*rc``{$T;Zhl*P@#49qf@Wyx6b@Fr-vyo;exBOqnv=+Z(?WN#nu zqJ+2QG9-zW#a=n^zHGOC1syhyl0(}SX&WWt>hySjS&_wywFVAFm>JGH3H_F;rYRkd zDNvu3z8b#p*lN(#pS1C`Z#XoUWi)j(-5!0)8C7_kQCtDk{3zqB{XS?I5u&RY-CR%H zP0p;7rgf|~kMG?VQw97q;yGx*WoY{O2^bb6It&Z}wtk+^%J4%1UhM}sg)e~V*u7m{ z`VVjs1xCCSnegEfGzsSU&hpzcAk;H<>F$No#TYlNAP6DL1yx;RUogC^HnErQnQ}vPT$_}3@oOEfP$4WSi}DLz)hN4%C1%}5xU7^4 zDv(NG_qql5m_pZD5lKR(fr}ZUO0hxBb@bj?2L~HiiOakUC89{S3?wjyhSe`VpZam6 z!|Q|H=>D*Nw^H*Xgg=Ad-SOcVDt7>dM|h_b)AM?$(8u#!;rMouBUr76b#LG>vc8+9?MX;2$rsyr0U?Wk2P%Hku9epMp$s-AJ4>X z_k?nwQbI1^PvK#4x8gVmd)1RW2e^a?Js!WP96IFwd||*B*U9qZoWstyCt{3zZ4pFE z%|Qd@aAZ8p$DXgot`3>&d}u+iIBss3HlRYnlUkF>d5|ZYGQreei5BcUQikcm)g>C4 zqN2yJH(Bp3)^`#B8j6khjo~t~8I_|rYVW{z6T-Z?u%VOmtiGa=J$62)7eDE35#{!s_9zx&f|zFyOv@LodBlk z9`oZ(L<3_{;28kzB~%q{u$W4B)}bh zP87NZ!)4OPm)fE~M%U+?R>j(;%P^R?HM!p+ z|C&s0p;5uw?*l#3iEBj2xN!knPQ9Ma57iE1fm9tHE;vZXZX2R3b1Ld7^bj%O){_?O z7wMC5T52jZZs!bPxVGd+s92W<@ofnmiBUnOm?T2lNd`hjFUfaU)u;VSb<}DrEi&wQ z3Xq}eIRk0h!8SrukPnf>j_s*@coeKuJw6@Rm8EH&s}16;1T{Kss_^(a%$6J#tS-*3 zwx1Z$mz*np5*OLAH`LLgz_^%74+r5W6f`mc^;d}Z_1o)xxoJ5NkoqA_Js|82tQ9ub zo{oY=Fapj@&w*e+PW@%9=$KK0@dOG)Y>%a3u$22kzePooCimvx$8B1gV!E9qjDZyc zriFIrffA8W{qwqV<}~oRR@Vqoj!OWW?HU;Ei4+0xRCyy`y+z|#NdmnysB^p;=;yRS zCK-)J=scr2`$;yd6++uKgi4FK&j&q{q~>s+XzXtHtX|B@=atNUL2t77F$}S;ssSgo z)^#CQBl1|T_XyDnd6_*>yVCC@n$L(Q5ODDb{%8EqfBycZm9g4)56GB;yOo?LaMjmli_?a^ z-5f&PpHvRwTsY$fS^Ip-wlOzTsZFz}x=1*`G~b@td^6mNv@~n*xQ((@UtSb6i#}Z{ zw`(N$c)!Xt-)daY+^$;KY{<>*$4CwkR;_!7_Hcsdf3Y`X!fhtIn+YnF`_dxwhW(V~ z{1!_OR>2wPtM<~G#PqxOM%9H?^N-o~g&XaRW8%Sc&3jOi(3T;z6TCX5CN(6%FIzmX z?}&JJ>oLys-!lR_NN=~1!=m;%1=Oo+S}i}efZ4})zOi*wSEDP1=1&yK+f1RQ@6^M9 zS1m3P!Ae`f`(YEah_`C18fHx7CQ7dPW_q1-7CT2WzA;?Hng3RT=Py*YH=7tE8uSFDLWXy^mISx&jtx?0RlB{4bnM?F8|P)p4MgO`qq9~s|MW(MMy+%z#muy{P8al+ zE%y!09!PGzWr^&qjqkN&u`-<*+rng`HYo8ejeSjC#p|Kohd1L9`;}xvj^j0VV_G^6 zDKYn-^02(*+c zJS#WajfoONAJHV#hx~&|8?f;^+Lb)y%?!K$}ARo$I?u+C7o;>=j#u)@~HrAa$FNlmDYyJ%GhV|9#~Ms{`fLuiBUR^6x3 ziNh?Zgh8>CLP;@KNLm=vro>2NhQvtUkBO1msSt2KfM8mp@yTjGB)V~`8PAP;Ax4$k z>Nh-h8h#%?Uq!3#k~_1L9p5xuA0LIT-#Buq!QqJ+QS@E##CpEMBQE~ikz*XJbu6m) zoCw^UZRrb*eNu}}Lo|A2(bO`n8l=dD#64U$-uVDBWp3znb`4*v4zbkolniHz$rQ&h z_Y9qUC;Qb54ZX}aCYd0hkF{dl$d8^R-EA&ScvsmAh&$zIh6z{w@;m02q5?sP{QMf% z(9}(j1||1Qf!cD%eeu!R)N|M+d= zwk50!nz#Oyhbmk1YocnFhncvQn#@j6QY9^4J^?1PttkQ>-`*1SPv z{afpk+bXtku`i@eZJvs;Z9>d>rFK~Eb*J%zEl0Y1o=i7WYqN+uOj^Obk31;BD}|X6 z49)ePjwieKELu34p_HGY4mhaIG=s{-WNw2Z_?|&T697TG&@ZBs| zR^d`bibwJ0aQQi&tz2)2wM3I`pJR~{BRpR9^?+DAUWS<>;IH*;N-BCYI>6%gCy6r{ z5C)8wi3qk9h>Nd>lFMk4f`^C-67#Z}EfN!Pu%e<~w`KSxOHW^Qb*$V6;;rwJhjXPl z^;Sa=Z)K9H3X5)!3r8|Mob9eE5EI*jZmyxy9M z#An9lQz-E0HaJR0KiKg#+-A<=){}q>_ZP3MZS|cPOpWHpzw&mE!DXlhe5hVIJ(Sbs z^GFE|)f&y$dgcA_?ds^#cder^nx6kg@9v!(ht&#-Y#YT6;q*IQh0pQH=E4=Nw18L< zhi2>;{@{52jcapZSwLn&R!n_dgp@WZCJ!Ht!h7rlVT5#AyQr#5VQIvM$s$`e;v;yf zBgNeIsa8zvk>Iqb2`vd&q(Fc?;f9I1ay@oTO>lfovBHYE@Fuq6W`Sr>DN3@1WHQZ) zq@o5wOwDmhW~nXk9w%I#uf$~D&&P1Dc_o3DWC~#Vt;Ov5QwpdUy)b*P*R8}tEen9c zw1C2fQxu2)5|)aMQ31IckRHpdhKiA;j*cN8gdxuPbXRoUQlkIc&uKbH{ad|e&fta# zCgUfhzIS!oku81S@vo+;zLxvpEJ`+)m3rQ$o@s#hdOJ?e599IYQSVYOdB5Y?d+`H( zx!w!Ac`8JVWx0hJI<4U*H=s$<>algauB5AJH_>c1zx<7vjZdi|`{l)D`5OfWb|3g; zA{(lC&Z)r}4>a{E)uO7pgtq(clrIx5D_;75bxZIE@+CF3F(}B)ECvwEiw|51+Y~km z7I#R0hJr^FCsUt+A>at`_f#|k<_sK6_3e!el^pHOtWADKgd$N);h+Fy5r;Nz)&z@a zNMb1$9Ow)Iq|w26*$&5Z4i%C^7|d^a40@(|)`YGETe!p3w82Nbe4aHN-I918SKjxw z8>aaQ_A8;7n&{W)L~drO^I$Yf24eEX=&uBWb>`zOGBCO07h)GP%ufn4 z@Un9cIR!K?qbeBW7izFij6s1W6ef1Iqbp14FRh+trmrkV)E}NLq!Wx}ejQtlcu4SB zal78No~fIr$NV$O-d8A+O`INmku(7fDnJH7!wwYr@_sXn&)Vsz@ zLsEn$R?b5%S1hLP-@agV3ll0McQ#B7GMn>RassVIn}{#Gb@KE)Y`WOLP*2!~Qc96R z(RbO_>lCJDp}#S>e&do=sZRbz!uKN*9U>vDjxs>lIB0%UE2={iEiinF& zUF2MTT3UeYLrD&#;3tX()d=GTy+LKN6Wpy}<#@R7OwuX@h{;<#MpDW6)a24)IqDJ! zy)zJ%Y#Af=I@Q`UC^=5|;xwaPv`o~+?4=Pni6XNh^6dL`D0+E_PM*tT%0f#gjLEtw zo{Gq`)-GvmH*_{aleRH^n?WW8p&wr(iU~|@@G&(rz(-8|=<(YiIpUZDfT&r-n5yv2 zuhcWzSsVeNugv?~6fTo3uqs9uxmmAXI+i}dB3S9xx3y&5t7>b4N>I^FPz05ki3C=x z1!1;DZ30rKa{^XT9x$NdW>17{7$v_OGTIB7Aosk^1$>mg)7z&%QU#peHm>Fx4OU)g zohVDtIj~3@i8Ns7HetF5&P_z51o(?_WI9DlVUzXEv$NQYICfqEl-nuM7n~{ z%rfL{>#LwRKD2AnzU<^H`@EzR+q~Sxr9*$S_A+&7bH!xQ3qO8{mc7yr=h$NJsT zmd}5w_do&{gs#1j+Y$+ZD7DAPy8G`X^gg~;wW-*Wb{s*C*ETjKd&A4T$+dw4P6UNOl-Bc z#f)jz4v2FFlI83@k}~&nt|z+jvFVE2pVF1OJUNm7nxFh9I0>%~v2KAdP6Epm*uXQ; z*Zd;;`P^Hs?g*rQA4)9U&79VBoj7X`-1eyXIQjp^MOKoU*I_3cAMt zZkP3J^{(YJ!vJ~D%S<2V?W^#hf;mXqMb2J#(sp*`UP$8u@lb$nh}#>C;1E?Ehn!b? zWVbzR2O7-neO|QZuH;hisccxyUK~o1y=Xo8BC(0m>{5(7k^19gN$cH=ACk`Y8H`*0 zbk8qE9JZO(7d=MI?_f;1RVY ztP>Gl(mGt1v~7eDs0nQEt1t+05GpGn;}XE6i{|vY!;!y(ZBfFFf-3E`j!IiMVfqDo z_ou&SVS-pZaz3iBCHI9%m$&%1vJ7L-R4I7cn73p>flqDN2dowk^(Wa@Q0GIh$1_CC zCA+#YnNVHQJcf3`v8}?@>XVt##9p zB#iu00IgW0shY(VMcNjE>dix7B(;~#>6xmay^zGwqvzzXsnfySp9Z6=iVL>_Xo8ZX zK-HWWb3=xO^UW%C6!Y*zKQJZ=CF|6sFU0{-~}dU8g;##6frKmKpm^rzD2&gqHgm(sU?@%;Rl{+qI= zYQnGar0i+@t&QeSea{A!nLp0hu1eE7|N z2K3Fp+5c*T_-`-$RNntJo?coG7!d$H(SKw36Qy?qe{)^WC;HsSJ?Z&{QuW{2{=?%v zm-9R>`z=Ql=bxjr=MtVL`F=~_2Daxs#d&|F{Qmdvz6V^hK-Pa(pZ;7S&+AXWHKGD{ z&%fAySEHU!`FW7`TL3-oPXT|2?Y~X>sXyb_c(SnVFAG00|JAMW=ggn?YdrD(vRc}I z@c!=Jcs~8-W%%Dx;Gq7R{=a7M^YpVQ|G$@V3;mB$ewKRWr67Jf4m9945eJ-e81a+# F{{gDML`whw literal 0 HcmV?d00001 diff --git a/admin/src/main/resources/logback-spring.xml b/admin/src/main/resources/logback-spring.xml new file mode 100644 index 0000000..77340d5 --- /dev/null +++ b/admin/src/main/resources/logback-spring.xml @@ -0,0 +1,88 @@ + + + elAdmin + + + + + + + + + + + %highlight([%-5level]) %cyan(%d{yyyy-MM-dd#HH:mm:ss.SSS}) %yellow([Thread:%thread]) %magenta([Logger:%logger]) -> %msg%n + utf-8 + + + + + + ${LOG_DIR}/log.log + + + + ${LOG_DIR}/history/%d{yyyy-MM-dd}.gz + 30 + + + true + + + ${LOG_PATTERN} + utf-8 + + + + + INFO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin/src/main/resources/mapper/LoginEquipmentMapper.xml b/admin/src/main/resources/mapper/LoginEquipmentMapper.xml new file mode 100644 index 0000000..840935b --- /dev/null +++ b/admin/src/main/resources/mapper/LoginEquipmentMapper.xml @@ -0,0 +1,80 @@ + + + + + wa.username, + wa.nickname, + wa.city_info, + wa.login_type, + wa.header_url, + wa.wx_id, + wa.sex, + wa.status, + wa.we_chat_no, + wa.remark, + wa.create_time, + wa.update_time, + wa.user_id, + le.id, + le.pit, + le.robot_id, + le.device_number, + le.expiration_time + + + + + + + + + diff --git a/admin/src/main/resources/mapper/WeChatFriendMapper.xml b/admin/src/main/resources/mapper/WeChatFriendMapper.xml new file mode 100644 index 0000000..414333d --- /dev/null +++ b/admin/src/main/resources/mapper/WeChatFriendMapper.xml @@ -0,0 +1,36 @@ + + + + + + + + diff --git a/marketing-scrm-admin/.flattened-pom.xml b/marketing-scrm-admin/.flattened-pom.xml new file mode 100644 index 0000000..6b2ddb9 --- /dev/null +++ b/marketing-scrm-admin/.flattened-pom.xml @@ -0,0 +1,18 @@ + + + 4.0.0 + + com.baiye + marketing-scrm + 1.0.0 + + com.baiye + marketing-scrm-admin + 1.0.0 + pom + + admin-core + admin-websocket + + diff --git a/marketing-scrm-admin/admin-core/.flattened-pom.xml b/marketing-scrm-admin/admin-core/.flattened-pom.xml new file mode 100644 index 0000000..585a7aa --- /dev/null +++ b/marketing-scrm-admin/admin-core/.flattened-pom.xml @@ -0,0 +1,50 @@ + + + 4.0.0 + + com.baiye + marketing-scrm-admin + 1.0.0 + + com.baiye + admin-core + 1.0.0 + + + com.baomidou + mybatis-plus-boot-starter + + + com.baiye + common-desensitize + + + com.baiye + common-model + + + com.baiye + security-oauth2-authorization-server + compile + + + com.baiye + security-oauth2-resource-server + + + com.baiye + system-controller + + + com.baiye + marketing-scrm-starter-web + ${revision} + + + com.baiye + marketing-scrm-notify-controller + ${revision} + + + diff --git a/marketing-scrm-admin/admin-core/pom.xml b/marketing-scrm-admin/admin-core/pom.xml new file mode 100644 index 0000000..bef4e74 --- /dev/null +++ b/marketing-scrm-admin/admin-core/pom.xml @@ -0,0 +1,55 @@ + + + + marketing-scrm-admin + com.baiye + ${revision} + + 4.0.0 + admin-core + + + + + com.baomidou + mybatis-plus-boot-starter + + + + com.baiye + common-desensitize + + + com.baiye + common-model + + + + com.baiye + security-oauth2-authorization-server + compile + + + com.baiye + security-oauth2-resource-server + + + com.baiye + system-controller + + + + com.baiye + marketing-scrm-starter-web + ${revision} + + + + + com.baiye + marketing-scrm-notify-controller + ${revision} + + + diff --git a/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/UpmsAutoConfiguration.java b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/UpmsAutoConfiguration.java new file mode 100644 index 0000000..ad346cc --- /dev/null +++ b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/UpmsAutoConfiguration.java @@ -0,0 +1,106 @@ +package com.baiye.upms; + +//import com.hccake.ballcat.admin.upms.log.LogConfiguration; +import com.baiye.system.authentication.BallcatOAuth2TokenResponseEnhancer; +import com.baiye.system.authentication.DefaultUserInfoCoordinatorImpl; +import com.baiye.system.authentication.SysUserDetailsServiceImpl; +import com.baiye.system.authentication.UserInfoCoordinator; +import com.baiye.system.properties.SystemProperties; +import com.baiye.system.service.SysUserService; +import org.ballcat.security.properties.SecurityProperties; +import org.ballcat.springsecurity.oauth2.server.authorization.web.authentication.OAuth2TokenResponseEnhancer; +import org.ballcat.springsecurity.oauth2.server.resource.introspection.SpringAuthorizationServerSharedStoredOpaqueTokenIntrospector; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +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.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService; +import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector; + +/** + * @author Hccake 2020/5/25 21:01 + */ +@EnableAsync +@AutoConfiguration +@MapperScan("com.baiye.**.mapper") +// @ComponentScan({ "com.hccake.ballcat.admin.upms", "com.hccake.ballcat.system", +// "com.hccake.ballcat.log", +// "com.hccake.ballcat.file", "com.hccake.ballcat.notify" }) +@ComponentScan({ "com.baiye.upms", "com.baiye.system" }) +@EnableConfigurationProperties({ SystemProperties.class, SecurityProperties.class }) +public class UpmsAutoConfiguration { + + /** + * 用户详情处理类 + * + * @author hccake + */ + @Configuration(proxyBeanMethods = false) + @ConditionalOnClass(SysUserService.class) + @ConditionalOnMissingBean(UserDetailsService.class) + static class UserDetailsServiceConfiguration { + + /** + * 用户详情处理类 + * @return SysUserDetailsServiceImpl + */ + @Bean + @ConditionalOnMissingBean + public UserDetailsService userDetailsService(SysUserService sysUserService, + UserInfoCoordinator userInfoCoordinator) { + return new SysUserDetailsServiceImpl(sysUserService, userInfoCoordinator); + } + + /** + * 用户信息协调者 + * @return UserInfoCoordinator + */ + @Bean + @ConditionalOnMissingBean + public UserInfoCoordinator userInfoCoordinator() { + return new DefaultUserInfoCoordinatorImpl(); + } + + } + + /** + * 新版本 spring-security-oauth2-authorization-server 使用配置类 + */ + @Configuration(proxyBeanMethods = false) + @ConditionalOnClass(OAuth2Authorization.class) + static class SpringOAuth2AuthorizationServerConfiguration { + + /** + * token 端点响应增强,追加一些自定义信息 + * @return TokenEnhancer Token增强处理器 + */ + @Bean + @ConditionalOnMissingBean + public OAuth2TokenResponseEnhancer oAuth2TokenResponseEnhancer() { + return new BallcatOAuth2TokenResponseEnhancer(); + } + + /** + * 当资源服务器和授权服务器的 token 共享存储时,直接使用 OAuth2AuthorizationService 读取 token 信息 + * @return SpringAuthorizationServerSharedStoredOpaqueTokenIntrospector + */ + @Bean + @ConditionalOnMissingBean + @ConditionalOnProperty(prefix = "ballcat.security.oauth2.resourceserver", name = "shared-stored-token", + havingValue = "true", matchIfMissing = true) + public OpaqueTokenIntrospector sharedStoredOpaqueTokenIntrospector( + OAuth2AuthorizationService authorizationService) { + return new SpringAuthorizationServerSharedStoredOpaqueTokenIntrospector(authorizationService); + } + + } + +} diff --git a/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/mybatis/FillMetaObjectHandle.java b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/mybatis/FillMetaObjectHandle.java new file mode 100644 index 0000000..b8549e9 --- /dev/null +++ b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/mybatis/FillMetaObjectHandle.java @@ -0,0 +1,42 @@ +package com.baiye.upms.config.mybatis; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baiye.constant.GlobalConstants; +import com.baiye.security.userdetails.User; +import com.baiye.security.util.SecurityUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.reflection.MetaObject; + +import java.time.LocalDateTime; + +/** + * @author Hccake 2019/7/26 14:41 + */ +@Slf4j +public class FillMetaObjectHandle implements MetaObjectHandler { + + @Override + public void insertFill(MetaObject metaObject) { + // 逻辑删除标识 + this.strictInsertFill(metaObject, "deleted", Long.class, GlobalConstants.NOT_DELETED_FLAG); + // 创建时间 + this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now()); + // 创建人 + User user = SecurityUtils.getUser(); + if (user != null) { + this.strictInsertFill(metaObject, "createBy", Long.class, user.getUserId()); + } + } + + @Override + public void updateFill(MetaObject metaObject) { + // 修改时间 + this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); + // 修改人 + User user = SecurityUtils.getUser(); + if (user != null) { + this.strictUpdateFill(metaObject, "updateBy", Long.class, user.getUserId()); + } + } + +} diff --git a/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/mybatis/MybatisPlusConfig.java b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/mybatis/MybatisPlusConfig.java new file mode 100644 index 0000000..e982996 --- /dev/null +++ b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/mybatis/MybatisPlusConfig.java @@ -0,0 +1,62 @@ +package com.baiye.upms.config.mybatis; + +import com.baomidou.mybatisplus.annotation.DbType; +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.core.injector.AbstractMethod; +import com.baomidou.mybatisplus.core.injector.ISqlInjector; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import com.baiye.extend.mybatis.plus.injector.CustomSqlInjector; +import com.baiye.extend.mybatis.plus.methods.InsertBatchSomeColumnByCollection; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.ArrayList; +import java.util.List; + +/** + * @author hccake + * @date 2020/04/19 默认配置MybatisPlus分页插件,通过conditional注解达到覆盖效用 + */ +@Configuration +public class MybatisPlusConfig { + + /** + * MybatisPlusInterceptor 插件,默认提供分页插件
+ * 如需其他MP内置插件,则需自定义该Bean + * @return MybatisPlusInterceptor + */ + @Bean + @ConditionalOnMissingBean(MybatisPlusInterceptor.class) + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); + return interceptor; + } + + /** + * 自动填充处理类 + * @return FillMetaObjectHandle + */ + @Bean + @ConditionalOnMissingBean(MetaObjectHandler.class) + public MetaObjectHandler fillMetaObjectHandle() { + return new FillMetaObjectHandle(); + } + + /** + * 自定义批量插入方法注入 + * @return ISqlInjector + */ + @Bean + @ConditionalOnMissingBean(ISqlInjector.class) + public ISqlInjector customSqlInjector() { + List list = new ArrayList<>(); + // 对于只在更新时进行填充的字段不做插入处理 + list.add(new InsertBatchSomeColumnByCollection(t -> t.getFieldFill() != FieldFill.UPDATE)); + return new CustomSqlInjector(list); + } + +} diff --git a/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/task/MdcTaskDecorator.java b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/task/MdcTaskDecorator.java new file mode 100644 index 0000000..d32fa76 --- /dev/null +++ b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/task/MdcTaskDecorator.java @@ -0,0 +1,34 @@ +package com.baiye.upms.config.task; + +import cn.hutool.core.map.MapUtil; +import org.slf4j.MDC; +import org.springframework.core.task.TaskDecorator; + +import java.util.Map; + +/** + * 使async异步任务支持traceId + * + * @author huyuanzhi 2021-11-06 23:14:27 + */ +public class MdcTaskDecorator implements TaskDecorator { + + @Override + public Runnable decorate(Runnable runnable) { + final Map copyOfContextMap = MDC.getCopyOfContextMap(); + return () -> { + if (MapUtil.isNotEmpty(copyOfContextMap)) { + // 现在:@Async线程上下文! 恢复Web线程上下文的MDC数据 + MDC.setContextMap(copyOfContextMap); + } + + try { + runnable.run(); + } + finally { + MDC.clear(); + } + }; + } + +} diff --git a/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/task/TaskExecutionConfiguration.java b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/task/TaskExecutionConfiguration.java new file mode 100644 index 0000000..fa3c9c6 --- /dev/null +++ b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/config/task/TaskExecutionConfiguration.java @@ -0,0 +1,35 @@ +package com.baiye.upms.config.task; + +import org.springframework.boot.task.TaskExecutorCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 线程池构建,原本的线程池的拒绝策略为直接抛出异常,不太友好 + * + * @see org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration + * @author hccake + */ +@Configuration(proxyBeanMethods = false) +public class TaskExecutionConfiguration { + + /** + * 修改 springboot 默认配置的 taskExecutor 的拒绝策略为使用当前线程执行 + * @return TaskExecutorCustomizer + */ + @Bean + public TaskExecutorCustomizer taskExecutorCustomizer() { + // AbortPolicy: 直接抛出java.util.concurrent.RejectedExecutionException异常 + // CallerRunsPolicy: 主线程直接执行该任务,执行完之后尝试添加下一个任务到线程池中,可以有效降低向线程池内添加任务的速度 + // DiscardOldestPolicy: 抛弃旧的任务、暂不支持;会导致被丢弃的任务无法再次被执行 + // DiscardPolicy: 抛弃当前任务、暂不支持;会导致被丢弃的任务无法再次被执行 + // 这里使用主线程直接执行该任务 + return (taskExecutor -> { + taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + taskExecutor.setTaskDecorator(new MdcTaskDecorator()); + }); + } + +} diff --git a/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/LogConfiguration.java b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/LogConfiguration.java new file mode 100644 index 0000000..806f551 --- /dev/null +++ b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/LogConfiguration.java @@ -0,0 +1,78 @@ +// package com.hccake.ballcat.admin.upms.log; +// +// import com.hccake.ballcat.common.log.access.handler.AccessLogHandler; +// import com.hccake.ballcat.common.log.operation.handler.OperationLogHandler; +// import com.hccake.ballcat.log.handler.CustomAccessLogHandler; +// import com.hccake.ballcat.log.handler.CustomOperationLogHandler; +// import com.hccake.ballcat.log.model.entity.AccessLog; +// import com.hccake.ballcat.log.model.entity.OperationLog; +// import com.hccake.ballcat.log.service.AccessLogService; +// import com.hccake.ballcat.log.service.LoginLogService; +// import com.hccake.ballcat.log.service.OperationLogService; +// import com.hccake.ballcat.log.thread.AccessLogSaveThread; +// import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; +// import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +// import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +// import org.springframework.context.annotation.Bean; +// import org.springframework.context.annotation.Configuration; +// import +// org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer; +// import +// org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings; +// +/// ** +// * @author hccake +// */ +// @Configuration(proxyBeanMethods = false) +// @ConditionalOnClass(LoginLogService.class) +// public class LogConfiguration { +// +// /** +// * 访问日志保存 +// * @param accessLogService 访问日志Service +// * @return CustomAccessLogHandler +// */ +// @Bean +// @ConditionalOnBean(AccessLogService.class) +// @ConditionalOnMissingBean(AccessLogHandler.class) +// public AccessLogHandler customAccessLogHandler(AccessLogService +// accessLogService) { +// return new CustomAccessLogHandler(new AccessLogSaveThread(accessLogService)); +// } +// +// /** +// * 操作日志处理器 +// * @param operationLogService 操作日志Service +// * @return CustomOperationLogHandler +// */ +// @Bean +// @ConditionalOnBean(OperationLogService.class) +// @ConditionalOnMissingBean(OperationLogHandler.class) +// public OperationLogHandler customOperationLogHandler(OperationLogService +// operationLogService) { +// return new CustomOperationLogHandler(operationLogService); +// } +// +// @ConditionalOnClass(OAuth2AuthorizationServerConfigurer.class) +// @ConditionalOnBean(LoginLogService.class) +// @ConditionalOnMissingBean(LoginLogHandler.class) +// @Configuration(proxyBeanMethods = false) +// static class SpringAuthorizationServerLoginLogConfiguration { +// +// /** +// * Spring Authorization Server 的登录日志处理,监听登录事件记录登录登出 +// * @param loginLogService 操作日志Service +// * @param authorizationServerSettings 授权服务器设置 +// * @return SpringAuthorizationServerLoginLogHandler +// */ +// @Bean +// public LoginLogHandler springAuthorizationServerLoginLogHandler(LoginLogService +// loginLogService, +// AuthorizationServerSettings authorizationServerSettings) { +// return new SpringAuthorizationServerLoginLogHandler(loginLogService, +// authorizationServerSettings); +// } +// +// } +// +// } \ No newline at end of file diff --git a/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/LoginLogHandler.java b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/LoginLogHandler.java new file mode 100644 index 0000000..646b19c --- /dev/null +++ b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/LoginLogHandler.java @@ -0,0 +1,8 @@ +package com.baiye.upms.log; + +/** + * @author hccake + */ +public interface LoginLogHandler { + +} diff --git a/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/SpringAuthorizationServerLoginLogHandler.java b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/SpringAuthorizationServerLoginLogHandler.java new file mode 100644 index 0000000..dd3cd6e --- /dev/null +++ b/marketing-scrm-admin/admin-core/src/main/java/com/baiye/upms/log/SpringAuthorizationServerLoginLogHandler.java @@ -0,0 +1,140 @@ +// package com.hccake.ballcat.admin.upms.log; +// +// import com.hccake.ballcat.common.core.util.WebUtils; +//// import com.hccake.ballcat.common.log.operation.enums.LogStatusEnum; +// import com.hccake.ballcat.common.security.util.SecurityUtils; +//// import com.hccake.ballcat.log.enums.LoginEventTypeEnum; +//// import com.hccake.ballcat.log.model.entity.LoginLog; +//// import com.hccake.ballcat.log.service.LoginLogService; +// import lombok.RequiredArgsConstructor; +// import +// org.ballcat.springsecurity.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationToken; +// import org.springframework.context.event.EventListener; +// import org.springframework.security.authentication.ProviderNotFoundException; +// import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +// import +// org.springframework.security.authentication.event.AbstractAuthenticationFailureEvent; +// import org.springframework.security.authentication.event.AuthenticationSuccessEvent; +// import org.springframework.security.authentication.event.LogoutSuccessEvent; +// import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; +// import +// org.springframework.security.oauth2.server.authorization.authentication.OAuth2AccessTokenAuthenticationToken; +// import +// org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken; +// import +// org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings; +// +// import javax.servlet.http.HttpServletRequest; +// +//// import static com.hccake.ballcat.log.handler.LoginLogUtils.prodLoginLog; +// +/// ** +// * spring 授权服务器的登录日志处理器 +// * +// * @author hccake +// */ +// @RequiredArgsConstructor +// public class SpringAuthorizationServerLoginLogHandler implements LoginLogHandler { +// +//// private final LoginLogService loginLogService; +// +// private final AuthorizationServerSettings authorizationServerSettings; +// +// /** +// * 登录成功事件监听 记录用户登录日志 +// * @param event 登录成功 event +// */ +// @EventListener(AuthenticationSuccessEvent.class) +// public void onAuthenticationSuccessEvent(AuthenticationSuccessEvent event) { +// Object source = event.getSource(); +// String username = null; +// +// String tokenEndpoint = authorizationServerSettings.getTokenEndpoint(); +// HttpServletRequest request = WebUtils.getRequest(); +// boolean isOauth2LoginRequest = request.getRequestURI().equals(tokenEndpoint); +// +// // Oauth2登录 和表单登录 处理分开 +// if (isOauth2LoginRequest && source instanceof OAuth2AccessTokenAuthenticationToken) { +// username = SecurityUtils.getAuthentication().getName(); +// } +// else if (!isOauth2LoginRequest && source instanceof +// UsernamePasswordAuthenticationToken) { +// username = ((UsernamePasswordAuthenticationToken) source).getName(); +// } +// +//// if (username != null) { +//// LoginLog loginLog = prodLoginLog(username).setMsg("登录成功") +//// .setStatus(LogStatusEnum.SUCCESS.getValue()) +//// .setEventType(LoginEventTypeEnum.LOGIN.getValue()); +//// loginLogService.save(loginLog); +//// } +// } +// +// /** +// * 监听鉴权失败事件,记录登录失败日志 +// * @param event the event +// */ +// @EventListener(AbstractAuthenticationFailureEvent.class) +// public void onAuthenticationFailureEvent(AbstractAuthenticationFailureEvent event) { +// if (event.getException().getClass().isAssignableFrom(ProviderNotFoundException.class)) +// { +// return; +// } +// +// Object source = event.getSource(); +// String username = null; +// +// String tokenEndpoint = authorizationServerSettings.getTokenEndpoint(); +// HttpServletRequest request = WebUtils.getRequest(); +// boolean isOauth2LoginRequest = request.getRequestURI().equals(tokenEndpoint); +// +// // Oauth2登录 和表单登录 处理分开 +// if (isOauth2LoginRequest && source instanceof +// OAuth2AuthorizationGrantAuthenticationToken) { +// username = ((OAuth2AuthorizationGrantAuthenticationToken) source).getName(); +// } +// else if (!isOauth2LoginRequest && source instanceof +// UsernamePasswordAuthenticationToken) { +// username = ((UsernamePasswordAuthenticationToken) source).getName(); +// } +// +//// if (username != null) { +//// LoginLog loginLog = prodLoginLog(username).setMsg(event.getException().getMessage()) +//// .setEventType(LoginEventTypeEnum.LOGIN.getValue()) +//// .setStatus(LogStatusEnum.FAIL.getValue()); +//// loginLogService.save(loginLog); +//// } +// } +// +// /** +// * 登出成功事件监听 +// * @param event the event +// */ +// @EventListener(LogoutSuccessEvent.class) +// public void onLogoutSuccessEvent(LogoutSuccessEvent event) { +// Object source = event.getSource(); +// String username = null; +// +// String tokenRevocationEndpoint = +// authorizationServerSettings.getTokenRevocationEndpoint(); +// HttpServletRequest request = WebUtils.getRequest(); +// boolean isOauth2Login = request.getRequestURI().equals(tokenRevocationEndpoint); +// +// // Oauth2撤销令牌 和表单登出 处理分开 +// if (isOauth2Login && source instanceof OAuth2TokenRevocationAuthenticationToken) { +// OAuth2Authorization authorization = ((OAuth2TokenRevocationAuthenticationToken) +// source).getAuthorization(); +// username = authorization.getPrincipalName(); +// } +// else if (!isOauth2Login && source instanceof UsernamePasswordAuthenticationToken) { +// username = ((UsernamePasswordAuthenticationToken) source).getName(); +// } +// +//// if (username != null) { +//// LoginLog loginLog = prodLoginLog(username).setMsg("登出成功") +//// .setEventType(LoginEventTypeEnum.LOGOUT.getValue()); +//// loginLogService.save(loginLog); +//// } +// } +// +// } diff --git a/marketing-scrm-admin/admin-core/src/main/resources/META-INF/spring.factories b/marketing-scrm-admin/admin-core/src/main/resources/META-INF/spring.factories new file mode 100644 index 0000000..44aa29b --- /dev/null +++ b/marketing-scrm-admin/admin-core/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ + com.baiye.upms.UpmsAutoConfiguration \ No newline at end of file diff --git a/marketing-scrm-admin/admin-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/marketing-scrm-admin/admin-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..8b53834 --- /dev/null +++ b/marketing-scrm-admin/admin-core/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.baiye.upms.UpmsAutoConfiguration \ No newline at end of file diff --git a/marketing-scrm-admin/admin-websocket/.flattened-pom.xml b/marketing-scrm-admin/admin-websocket/.flattened-pom.xml new file mode 100644 index 0000000..e2e2687 --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/.flattened-pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + + com.baiye + marketing-scrm-admin + 1.0.0 + + com.baiye + admin-websocket + 1.0.0 + + + com.baiye + admin-core + 1.0.0 + + + com.baiye + marketing-scrm-starter-websocket + 1.0.0 + + + com.baiye + distribute-notify-biz + 1.0.0 + compile + + + diff --git a/marketing-scrm-admin/admin-websocket/pom.xml b/marketing-scrm-admin/admin-websocket/pom.xml new file mode 100644 index 0000000..3cd0d34 --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/pom.xml @@ -0,0 +1,32 @@ + + + + marketing-scrm-admin + com.baiye + ${revision} + + 4.0.0 + admin-websocket + + + + com.baiye + admin-core + 1.0.0 + + + com.baiye + marketing-scrm-starter-websocket + 1.0.0 + + + + com.baiye + distribute-notify-biz + 1.0.0 + compile + + + + diff --git a/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/AdminWebSocketAutoConfiguration.java b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/AdminWebSocketAutoConfiguration.java new file mode 100644 index 0000000..5c8a6be --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/AdminWebSocketAutoConfiguration.java @@ -0,0 +1,34 @@ +package com.baiye; + +import com.baiye.component.UserAttributeHandshakeInterceptor; +import com.baiye.component.UserSessionKeyGenerator; +import com.baiye.session.SessionKeyGenerator; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.socket.server.HandshakeInterceptor; + +/** + * @author Hccake 2021/1/5 + * @version 1.0 + */ +@Import({ SystemWebsocketEventListenerConfiguration.class}) +@Configuration +@RequiredArgsConstructor +public class AdminWebSocketAutoConfiguration { + + + + @Bean + @ConditionalOnMissingBean(SessionKeyGenerator.class) + public SessionKeyGenerator userSessionKeyGenerator() { + return new UserSessionKeyGenerator(); + } + + @Bean + public HandshakeInterceptor authenticationHandshakeInterceptor() { + return new UserAttributeHandshakeInterceptor(); + } +} diff --git a/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/SystemWebsocketEventListenerConfiguration.java b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/SystemWebsocketEventListenerConfiguration.java new file mode 100644 index 0000000..9675c05 --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/SystemWebsocketEventListenerConfiguration.java @@ -0,0 +1,25 @@ +package com.baiye; + +import com.baiye.listener.SystemWebsocketEventListener; +import com.baiye.distribute.MessageDistributor; +import lombok.RequiredArgsConstructor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * @author Hccake + */ +@RequiredArgsConstructor +@ConditionalOnClass(SystemWebsocketEventListener.class) +@Configuration(proxyBeanMethods = false) +public class SystemWebsocketEventListenerConfiguration { + + private final MessageDistributor messageDistributor; + + @Bean + public SystemWebsocketEventListener systemWebsocketEventListener() { + return new SystemWebsocketEventListener(messageDistributor); + } + +} diff --git a/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/component/UserAttributeHandshakeInterceptor.java b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/component/UserAttributeHandshakeInterceptor.java new file mode 100644 index 0000000..902e30b --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/component/UserAttributeHandshakeInterceptor.java @@ -0,0 +1,65 @@ +package com.baiye.component; + +import com.baiye.constant.AdminWebSocketConstants; +import com.baiye.security.userdetails.User; +import com.baiye.security.util.SecurityUtils; +import lombok.RequiredArgsConstructor; +import org.springframework.http.server.ServerHttpRequest; +import org.springframework.http.server.ServerHttpResponse; +import org.springframework.http.server.ServletServerHttpRequest; +import org.springframework.web.socket.WebSocketHandler; +import org.springframework.web.socket.server.HandshakeInterceptor; + +import java.util.Map; + +/** + * WebSocket 握手拦截器 在握手时记录下当前 session 对应的用户Id和token信息 + * + * @author Hccake 2021/1/4 + * @version 1.0 + */ +@RequiredArgsConstructor +public class UserAttributeHandshakeInterceptor implements HandshakeInterceptor { + + /** + * Invoked before the handshake is processed. + * @param request the current request + * @param response the current response + * @param wsHandler the target WebSocket handler + * @param attributes the attributes from the HTTP handshake to associate with the + * WebSocket session; the provided attributes are copied, the original map is not + * used. + * @return whether to proceed with the handshake ({@code true}) or abort + * ({@code false}) + */ + @Override + public boolean beforeHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, + Map attributes) { + String accessToken = null; + // 获得 accessToken + if (request instanceof ServletServerHttpRequest) { + ServletServerHttpRequest serverRequest = (ServletServerHttpRequest) request; + accessToken = serverRequest.getServletRequest().getParameter(AdminWebSocketConstants.TOKEN_ATTR_NAME); + } + // 由于 WebSocket 握手是由 http 升级的,携带 token 已经被 Security 拦截验证了,所以可以直接获取到用户 + User user = SecurityUtils.getUser(); + attributes.put(AdminWebSocketConstants.TOKEN_ATTR_NAME, accessToken); + attributes.put(AdminWebSocketConstants.USER_KEY_ATTR_NAME, user.getUserId()); + return true; + } + + /** + * Invoked after the handshake is done. The response status and headers indicate the + * results of the handshake, i.e. whether it was successful or not. + * @param request the current request + * @param response the current response + * @param wsHandler the target WebSocket handler + * @param exception an exception raised during the handshake, or {@code null} if none + */ + @Override + public void afterHandshake(ServerHttpRequest request, ServerHttpResponse response, WebSocketHandler wsHandler, + Exception exception) { + // doNothing + } + +} diff --git a/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/component/UserSessionKeyGenerator.java b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/component/UserSessionKeyGenerator.java new file mode 100644 index 0000000..d8760f0 --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/component/UserSessionKeyGenerator.java @@ -0,0 +1,32 @@ +package com.baiye.component; + +import com.baiye.constant.AdminWebSocketConstants; +import com.baiye.session.SessionKeyGenerator; +import lombok.RequiredArgsConstructor; +import org.springframework.web.socket.WebSocketSession; + +/** + *

+ * 用户 WebSocketSession 唯一标识生成器 + *

+ * + * 此类主要使用当前 session 对应用户的唯一标识做为 session 的唯一标识 方便系统快速通过用户获取对应 session + * + * @author Hccake 2021/1/5 + * @version 1.0 + */ +@RequiredArgsConstructor +public class UserSessionKeyGenerator implements SessionKeyGenerator { + + /** + * 获取当前session的唯一标识,用户的唯一标识已经通过 + * @see UserAttributeHandshakeInterceptor 存储在当前 session 的属性中 + * @param webSocketSession 当前session + * @return session唯一标识 + */ + @Override + public Object sessionKey(WebSocketSession webSocketSession) { + return webSocketSession.getAttributes().get(AdminWebSocketConstants.USER_KEY_ATTR_NAME); + } + +} diff --git a/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/constant/AdminWebSocketConstants.java b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/constant/AdminWebSocketConstants.java new file mode 100644 index 0000000..183b2d1 --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/constant/AdminWebSocketConstants.java @@ -0,0 +1,22 @@ +package com.baiye.constant; + +/** + * @author Hccake 2021/1/5 + * @version 1.0 + */ +public final class AdminWebSocketConstants { + + private AdminWebSocketConstants() { + } + + /** + * 存储在 WebSocketSession Attribute 中的 token 属性名 + */ + public static final String TOKEN_ATTR_NAME = "access_token"; + + /** + * 存储在 WebSocketSession Attribute 中的 用户唯一标识 属性名 + */ + public static final String USER_KEY_ATTR_NAME = "userId"; + +} diff --git a/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/listener/NotifyWebsocketEventListener.java b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/listener/NotifyWebsocketEventListener.java new file mode 100644 index 0000000..e8aeadd --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/listener/NotifyWebsocketEventListener.java @@ -0,0 +1,86 @@ +package com.baiye.listener; + + +import com.baiye.distribute.MessageDO; +import com.baiye.distribute.MessageDistributor; +import com.baiye.message.AnnouncementCloseMessage; +import com.baiye.notify.event.AnnouncementCloseEvent; +import com.baiye.notify.event.StationNotifyPushEvent; +import com.baiye.notify.handler.NotifyInfoDelegateHandler; +import com.baiye.notify.model.domain.NotifyInfo; +import com.baiye.util.JsonUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Component; + +import java.time.LocalTime; +import java.util.List; + +/** + * @author Hccake 2021/1/5 + * @version 1.0 + */ +@Slf4j +@Component +@RequiredArgsConstructor +public class NotifyWebsocketEventListener { + + private final MessageDistributor messageDistributor; + + private final NotifyInfoDelegateHandler notifyInfoDelegateHandler; + + /** + * 公告关闭事件监听 + * + * @param event the AnnouncementCloseEvent + */ + @Async + @EventListener(AnnouncementCloseEvent.class) + public void onAnnouncementCloseEvent(AnnouncementCloseEvent event) { + // 构建公告关闭的消息体 + AnnouncementCloseMessage message = new AnnouncementCloseMessage(); + message.setId(event.getId()); + String msg = JsonUtils.toJson(message); + + // 广播公告关闭信息 + MessageDO messageDO = new MessageDO().setMessageText(msg).setNeedBroadcast(true); + messageDistributor.distribute(messageDO); + } + + /** + * 站内通知推送事件 + * + * @param event the StationNotifyPushEvent + */ + @Async + @EventListener(StationNotifyPushEvent.class) + public void onAnnouncementPublishEvent(StationNotifyPushEvent event) { + log.info("============ onAnnouncementPublishEvent time {} ============", LocalTime.now()); + NotifyInfo notifyInfo = event.getNotifyInfo(); + List userList = event.getUserIdList(); + notifyInfoDelegateHandler.handle(userList, notifyInfo); + } + + + + + /** + * 公告关闭事件监听 + * + * @param event the AnnouncementCloseEvent + */ + @Async + @EventListener(AnnouncementCloseEvent.class) + public void read(AnnouncementCloseEvent event) { + // 构建公告关闭的消息体 + AnnouncementCloseMessage message = new AnnouncementCloseMessage(); + message.setId(event.getId()); + String msg = JsonUtils.toJson(message); + + // 广播公告关闭信息 + MessageDO messageDO = new MessageDO().setMessageText(msg).setNeedBroadcast(true); + messageDistributor.distribute(messageDO); + } +} diff --git a/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/listener/SystemWebsocketEventListener.java b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/listener/SystemWebsocketEventListener.java new file mode 100644 index 0000000..3bd2718 --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/listener/SystemWebsocketEventListener.java @@ -0,0 +1,34 @@ +package com.baiye.listener; + +import com.baiye.util.JsonUtils; +import com.baiye.distribute.MessageDO; +import com.baiye.distribute.MessageDistributor; +import com.baiye.system.event.DictChangeEvent; +import com.baiye.message.DictChangeMessage; +import lombok.RequiredArgsConstructor; +import org.springframework.context.event.EventListener; +import org.springframework.scheduling.annotation.Async; + +@RequiredArgsConstructor +public class SystemWebsocketEventListener { + + private final MessageDistributor messageDistributor; + + /** + * 字典修改事件监听 + * @param event the `DictChangeEvent` + */ + @Async + @EventListener(DictChangeEvent.class) + public void onDictChangeEvent(DictChangeEvent event) { + // 构建字典修改的消息体 + DictChangeMessage dictChangeMessage = new DictChangeMessage(); + dictChangeMessage.setDictCode(event.getDictCode()); + String msg = JsonUtils.toJson(dictChangeMessage); + + // 广播修改信息 + MessageDO messageDO = new MessageDO().setMessageText(msg).setNeedBroadcast(true); + messageDistributor.distribute(messageDO); + } + +} diff --git a/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/message/AnnouncementCloseMessage.java b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/message/AnnouncementCloseMessage.java new file mode 100644 index 0000000..3381100 --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/message/AnnouncementCloseMessage.java @@ -0,0 +1,23 @@ +package com.baiye.message; + +import lombok.Getter; +import lombok.Setter; + +/** + * @author Hccake 2021/1/7 + * @version 1.0 + */ +@Getter +@Setter +public class AnnouncementCloseMessage extends JsonWebSocketMessage { + + public AnnouncementCloseMessage() { + super("announcement-close"); + } + + /** + * ID + */ + private Long id; + +} diff --git a/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/message/DictChangeMessage.java b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/message/DictChangeMessage.java new file mode 100644 index 0000000..3f4ba64 --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/src/main/java/com/baiye/message/DictChangeMessage.java @@ -0,0 +1,25 @@ +package com.baiye.message; + +import lombok.Getter; +import lombok.Setter; + +/** + * 字典修改消息 + * + * @author Hccake 2021/1/5 + * @version 1.0 + */ +@Getter +@Setter +public class DictChangeMessage extends JsonWebSocketMessage { + + public DictChangeMessage() { + super("dict-change"); + } + + /** + * 改动的字典标识 + */ + private String dictCode; + +} diff --git a/marketing-scrm-admin/admin-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/marketing-scrm-admin/admin-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports new file mode 100644 index 0000000..385abad --- /dev/null +++ b/marketing-scrm-admin/admin-websocket/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -0,0 +1 @@ +com.baiye.AdminWebSocketAutoConfiguration \ No newline at end of file diff --git a/marketing-scrm-admin/pom.xml b/marketing-scrm-admin/pom.xml new file mode 100644 index 0000000..46e7497 --- /dev/null +++ b/marketing-scrm-admin/pom.xml @@ -0,0 +1,17 @@ + + + + com.baiye + marketing-scrm + ${revision} + + 4.0.0 + marketing-scrm-admin + pom + + + admin-core + admin-websocket + + diff --git a/marketing-scrm-common/common-core/pom.xml b/marketing-scrm-common/common-core/pom.xml new file mode 100644 index 0000000..759c894 --- /dev/null +++ b/marketing-scrm-common/common-core/pom.xml @@ -0,0 +1,85 @@ + + + + marketing-scrm-common + com.baiye + ${revision} + + 4.0.0 + common-core + + + + + cn.hutool + hutool-all + + + + com.fasterxml.jackson.core + jackson-databind + + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 + + + com.baiye + common-model + ${revision} + + + com.baiye + common-util + ${revision} + + + jakarta.servlet + jakarta.servlet-api + compile + + + org.glassfish + jakarta.el + 3.0.3 + test + + + + org.slf4j + slf4j-api + + + org.springframework + spring-context + + + + org.springframework + spring-web + + + + com.google.guava + guava + 23.0 + + + + + org.springframework.boot + spring-boot-starter-data-redis + 2.3.2.RELEASE + + + + net.lingala.zip4j + zip4j + + + + + + + diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/compose/ContextComponent.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/compose/ContextComponent.java new file mode 100644 index 0000000..ba16307 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/compose/ContextComponent.java @@ -0,0 +1,26 @@ +package com.baiye.compose; + +/** + * 上下文组件, 在接入对应的上下文时(如: spring 的 bean) 便于在 开始和结束时执行对应的方法 + *

+ * 默认自动接入spring + *

+ *

+ * 一般用于线程类实例达成接入到对应的上下文环境时自动开启和结束线程 + *

+ * + * @author lingting 2022/10/15 17:55 + */ +public interface ContextComponent { + + /** + * 上下文准备好之后调用, 内部做一些线程的初始化以及线程启动 + */ + void onApplicationStart(); + + /** + * 在上下文销毁前调用, 内部做线程停止和数据缓存相关 + */ + void onApplicationStop(); + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/config/RedisCacheConfig.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/config/RedisCacheConfig.java new file mode 100644 index 0000000..2692869 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/config/RedisCacheConfig.java @@ -0,0 +1,46 @@ +package com.baiye.config; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; + + +/** + * redis 缓存配置 + */ +@Slf4j +@Configuration +public class RedisCacheConfig{ + //编写我们自己的RedisTemplate + // 自己定义了一个 RedisTemplate + @Bean + @SuppressWarnings("all") + public RedisTemplate redisTemplate(RedisConnectionFactory factory) { + // 我们为了自己开发方便,一般直接使用 + RedisTemplate template = new RedisTemplate(); + template.setConnectionFactory(factory); + // Json序列化配置 + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); + // String 的序列化 + StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); + // key采用String的序列化方式 + template.setKeySerializer(stringRedisSerializer); + // hash的key也采用String的序列化方式 + template.setHashKeySerializer(stringRedisSerializer); + // value序列化方式采用jackson + template.setValueSerializer(jackson2JsonRedisSerializer); + // hash的value序列化方式采用jackson + template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); + return template; + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/DefaultNumberConstants.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/DefaultNumberConstants.java new file mode 100644 index 0000000..94d2c4b --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/DefaultNumberConstants.java @@ -0,0 +1,244 @@ +package com.baiye.constant; + +/** + * 数值常量定义 + * + * @author Enzo + * @date : 2021/6/17 + */ +public class DefaultNumberConstants { + + private DefaultNumberConstants() { + + } + + /** + * -3 + */ + public static final int MINUS_THREE_NUMBER = -3; + + /** + * + */ + public static final int MINUS_FIFTEEN_NUMBER = -15; + + /** + * -2 + */ + public static final int MINUS_TWO_NUMBER = -2; + + /** + * -1 + */ + public static final int MINUS_ONE_NUMBER = -1; + + /** + * 0 + */ + public static final int ZERO_NUMBER = 0; + + /** + * 1 + */ + public static final int ONE_NUMBER = 1; + + /** + * 2 + */ + public static final int TWO_NUMBER = 2; + + /** + * 3 + */ + public static final int THREE_NUMBER = 3; + + /** + * 4 + */ + public static final int FOUR_NUMBER = 4; + + /** + * 5 + */ + public static final int FIVE_NUMBER = 5; + + /** + * 6 + */ + public static final int SIX_NUMBER = 6; + + /** + * 7 + */ + public static final int SEVEN_NUMBER = 7; + + /** + * 8 + */ + public static final int EIGHT_NUMBER = 8; + + /** + * 9 + */ + public static final int NINE_NUMBER = 9; + + /** + * 10 + */ + public static final int TEN_NUMBER = 10; + + /** + * 11 + */ + public static final int ELEVEN_NUMBER = 11; + + /** + * 21 + */ + public static final int TWELVE_NUMBER = 12; + + /** + * 14 + */ + public static final int FOURTEEN_NUMBER = 14; + + /** + * 15 + */ + public static final int FIFTEEN_NUMBER = 15; + + /** + * 16 + */ + public static final int SIXTEEN_NUMBER = 16; + + /** + * 20 + */ + public static final int TWENTY_NUMBER = 20; + + public static final int TWENTY_ONE = 21; + + /** + * 23 + */ + public static final int TWENTY_THREE = 23; + + /** + * 24 + */ + public static final int TWENTY_FOUR = 24; + + /** + * 30 + */ + public static final int THIRTY = 30; + + public static final int FORTY_EIGHT = 48; + + /** + * 60 + */ + public static final int FIFTY = 50; + + /** + * 60 + */ + public static final int SIXTY = 60; + + /** + * 90 + */ + public static final int NINETY = 90; + + /** + * 98 + */ + public static final int NINETY_EIGHT = 98; + + /** + * 99 + */ + public static final int NINETY_NINE = 99; + + /** + * 100 + */ + public static final int ONE_HUNDRED = 100; + + /** + * 200 + */ + public static final int TWO_HUNDRED = 200; + + /** + * 500 + */ + public static final int FIVE_HUNDRED = 500; + + /** + * 201 + */ + public static final int TWO_HUNDRED_ONE = 201; + + /** + * 1005 + */ + public static final int ONE_THOUSAND_AND_FIVE = 1005; + + /** + * 1000 + */ + public static final int ONE_THOUSAND = 1000; + + /** + * 5000 + */ + public static final int FIVE_THOUSAND = 5000; + + /** + * 1万 + */ + public static final int TEN_THOUSAND = 10000; + + /** + * 五万 + */ + public static final int FIFTY_THOUSAND = 50000; + + /** + * 十万 + */ + public static final int ONE_HUNDRED_THOUSAND = 100000; + + /** + * 999999 + */ + public static final int LESS_THAN_ONE_MILLION = 999999; + + /** + * 一百万 + */ + public static final int ONE_MILLION = 1000000; + + /** + * 9999999 + */ + public static final int TEN_MILLION = 9999999; + + /** + * @ + */ + public static final String ATTR_DELIMITER = "@"; + + /** + * % + */ + public static final String NAT_DELIM = "%"; + + /** + * % + */ + public static final String DOLLAR_DELIM = "${"; + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/FileConstant.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/FileConstant.java new file mode 100644 index 0000000..72261a7 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/FileConstant.java @@ -0,0 +1,112 @@ +package com.baiye.constant; + +/** + * @author + * 文件相关 常量类 + */ +public class FileConstant { + + /** + * 0,(自定义模板) + */ + public static final int ZERO_NUMBER = 0; + + /** + * 1,(UC) + */ + public static final int ONE_NUMBER = 1; + + /** + * 2,(快手) + */ + public static final int TWO_NUMBER = 2; + + /** + * 3,(抖音) + */ + public static final int THREE_NUMBER = 3; + + /** + * 4,(百度) + */ + public static final int FOUR_NUMBER = 4; + + /** + * 5,(动态任务自定义模板) + */ + public static final int FIVE_NUMBER = 5; + + /** + * 6,(拓客动态任务) + */ + public static final int SIX_NUMBER = 6; + + /** + * 1000 + */ + public static final int ONE_THOUSAND_NUMBER = 1000; + + /** + * 1000000 + */ + public static final int ONE_MILLION_NUMBER = 1000000; + + /** + * BY + */ + public static final String BY = "BY"; + + /** + * MM + */ + public static final String MM = "MM"; + + /** + * uc + */ + public static final String UC = "uc"; + + /** + * 快手 + */ + public static final String KS = "ks"; + + /** + * 抖音 + */ + public static final String DY = "dy"; + + /** + * 其它 + */ + public static final String QT = "qt"; + + + /** + * 以 xlsx 结尾的文件 + */ + public static final String XLSX_FILE_SUB_NAME = "xlsx"; + + /** + * 以 xls 结尾的文件 + */ + public static final String XLS_FILE_SUB_NAME = "xls"; + + /** + * 以 txt 结尾的文件 + */ + public static final String TXT_FILE_SUB_NAME = "txt"; + + /** + * 以 csv 结尾的文件 + */ + public static final String CSV_FILE_SUB_NAME = "csv"; + + + /** + * 以 zip 结尾的文件 + */ + public static final String ZIP_FILE_SUB_NAME = ".zip"; + + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/GlobalConstants.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/GlobalConstants.java new file mode 100644 index 0000000..56de7ed --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/GlobalConstants.java @@ -0,0 +1,32 @@ +package com.baiye.constant; + +/** + * @author Hccake 2020/6/9 17:17 + */ +public final class GlobalConstants { + + private GlobalConstants() { + } + + /** + * 未被逻辑删除的标识,即有效数据标识 逻辑删除标识,普通情况下可以使用 1 标识删除,0 标识存活 但在有唯一索引的情况下,会导致索引冲突,所以用 0 标识存活, + * 已删除数据记录为删除时间戳 + */ + public static final Long NOT_DELETED_FLAG = 0L; + + /** + * 生产环境 + */ + public static final String ENV_PROD = "prod"; + + /** + * 树根节点ID + */ + public static final Integer TREE_ROOT_ID = 0; + + /** + * 树根节点ID + */ + public static final Long TREE_ROOT_ID_LONG = Long.valueOf(TREE_ROOT_ID); + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/HeaderConstants.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/HeaderConstants.java new file mode 100644 index 0000000..17c49d7 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/HeaderConstants.java @@ -0,0 +1,28 @@ +package com.baiye.constant; + +/** + * @author Hccake + * @version 1.0 + * @date 2019/10/31 11:55 + */ +public final class HeaderConstants { + + private HeaderConstants() { + } + + /** + * 请求时间戳 + */ + public static final String REQ_TIME = "reqTime"; + + /** + * 请求sign + */ + public static final String SIGN = "sign"; + + /** + * SECRET_ID + */ + public static final String SECRET_ID = "secretId"; + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/HttpsConstants.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/HttpsConstants.java new file mode 100644 index 0000000..ae9f67f --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/HttpsConstants.java @@ -0,0 +1,100 @@ +package com.baiye.constant; + +import com.baiye.https.CompatibleSSLFactory; +import com.baiye.https.SSLSocketFactoryInitException; +import lombok.experimental.UtilityClass; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.KeyManager; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +/** + * @author lingting + */ +@UtilityClass +@SuppressWarnings("java:S4830") +public class HttpsConstants { + + public static final String SSL = "SSL"; + + public static final String SSL_V2 = "SSLv2"; + + public static final String SSL_V3 = "SSLv3"; + + public static final String TLS = "TLS"; + + public static final String TLS_V1 = "TLSv1"; + + public static final String TLS_V11 = "TLSv1.1"; + + public static final String TLS_V12 = "TLSv1.2"; + + public static final String DALVIK = "dalvik"; + + public static final String VM_NAME = "java.vm.name"; + + /** + * Android低版本不重置的话某些SSL访问就会失败 + */ + private static final String[] ANDROID_PROTOCOLS = { SSL_V3, TLS_V1, TLS_V11, TLS_V12 }; + + /** + * 默认信任全部的域名校验器 + */ + @SuppressWarnings("java:S5527") + public static final HostnameVerifier HOSTNAME_VERIFIER = (s, sslSession) -> true; + + public static final KeyManager[] KEY_MANAGERS = null; + + public static final X509TrustManager TRUST_MANAGER; + + public static final TrustManager[] TRUST_MANAGERS; + + static { + TRUST_MANAGER = new X509TrustManager() { + + @Override + public void checkClientTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + // + } + + @Override + public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + // + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + return new X509Certificate[0]; + } + }; + TRUST_MANAGERS = new TrustManager[] { TRUST_MANAGER }; + } + + /** + * 默认的SSLSocketFactory,区分安卓 + */ + public static final SSLSocketFactory SSF; + + static { + try { + if (DALVIK.equalsIgnoreCase(System.getProperty(VM_NAME))) { + // 兼容android低版本SSL连接 + SSF = new CompatibleSSLFactory(ANDROID_PROTOCOLS); + } + else { + SSF = new CompatibleSSLFactory(); + } + } + catch (KeyManagementException | NoSuchAlgorithmException e) { + throw new SSLSocketFactoryInitException("ssf 创建失败!", e); + } + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/MDCConstants.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/MDCConstants.java new file mode 100644 index 0000000..5fb56d4 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/MDCConstants.java @@ -0,0 +1,19 @@ +package com.baiye.constant; + +/** + * MDC 相关常量 + * + * @author hccake + * @since 1.3.1 + */ +public final class MDCConstants { + + private MDCConstants() { + } + + /** + * 跟踪ID,用于一次请求或执行方法时,产生的各种日志间的数据关联 + */ + public static final String TRACE_ID_KEY = "traceId"; + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/SecretConstant.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/SecretConstant.java new file mode 100644 index 0000000..ba2ed87 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/SecretConstant.java @@ -0,0 +1,27 @@ +package com.baiye.constant; + +/** + * 有关加解密的常量类 + */ +public class SecretConstant { + + /** + * yuyou address + */ + public static final String SECRET_DECRYPT_YY_URL = "https://bd.hzdaba.cn:8085/v3/Accounts/yuyou_bd/BigData/DecryptTel"; + + /** + * yuyou sign + */ + public static final String SECRET_DECRYPT_YY_SIG = "7f49e3f9c17c0f3c8fca84168161ed37"; + + /** + * yuyou id + */ + public static final String SECRET_DECRYPT_YY_ID = "yuyou_bd"; + + /** + * 时间戳格式 + */ + public static final String SECRET_DECRYPT_TIME_FORMATE = "yyyyMMddHHmmss"; +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/WechatCallbackConstant.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/WechatCallbackConstant.java new file mode 100644 index 0000000..6948434 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/WechatCallbackConstant.java @@ -0,0 +1,46 @@ +package com.baiye.constant; + +import lombok.Getter; + +/** + * @author Enzo + * @date : 2024/4/1 + */ + +@Getter +public class WechatCallbackConstant { + private WechatCallbackConstant() { + + } + + /** + * 扫码返回 + */ + public static final int SCAN_CODE = 222; + + + /** + * 登录成功 + */ + public static final int LOGIN_SUCCESS = 201; + + + /** + * 登录失败 + */ + public static final int LOGIN_FAIL = 212; + + + /** + * 退出登录 + */ + public static final int LOGIN_OUT = 210; + + + /** + * 通过好友 + */ + public static final int THROUGH_FRIENDS = 1003; + + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/BooleanEnum.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/BooleanEnum.java new file mode 100644 index 0000000..b1619e2 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/BooleanEnum.java @@ -0,0 +1,35 @@ +package com.baiye.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Boolean 类型常量 + * + * @author Hccake 2020/4/6 21:52 + */ +@AllArgsConstructor +public enum BooleanEnum { + + /** + * 是 + */ + TRUE(true, 1), + /** + * 否 + */ + FALSE(false, 0); + + private final Boolean booleanValue; + + private final Integer intValue; + + public Boolean booleanValue() { + return booleanValue; + } + + public Integer intValue() { + return intValue; + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/ImportModeEnum.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/ImportModeEnum.java new file mode 100644 index 0000000..17b3cbb --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/ImportModeEnum.java @@ -0,0 +1,25 @@ +package com.baiye.constant.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 当数据以存在时的导入动作 + * + * @author Hccake + */ +@Getter +@AllArgsConstructor +public enum ImportModeEnum { + + /** + * 跳过已存在的数据 + */ + SKIP_EXISTING, + + /** + * 覆盖已存在的数据 + */ + OVERWRITE_EXISTING; + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/ResponseCode.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/ResponseCode.java new file mode 100644 index 0000000..93bd4cd --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/constant/enums/ResponseCode.java @@ -0,0 +1,225 @@ +package com.baiye.constant.enums; + +import lombok.Getter; + +/** + * @author q + */ +@Getter +public enum ResponseCode { + + /** + * 成功 + */ + SUCCESS("1", "success"), + + /** + * 失败 + */ + FAILURE("0", "failure "), + + /** + * 充值成功 + */ + RECHARGE_SUCCESS("1020", "充值成功"), + + /** + * 手机号码不正确 + */ + PHONE_NUMBER_IS_INCORRECT("1022", "手机号码不正确"), + + /** + * 验证码错误 + */ + VERIFICATION_CODE_PARAMETER_ERROR("1023", "验证码错误"), + + /** + * 验证码不存在或已过期 + */ + VERIFICATION_NOT_EXIST_HAS_EXPIRED("1024", "验证码不存在或已过期"), + + /** + * 读取文件失败 + */ + READ_FILE_ERROR("1021", "读取文件失败"), + /** + * 参数错误 + */ + PARAMETER_ERROR("1001", "参数错误"), + + /** + * 用户信息错误 + */ + USER_INFORMATION_ERROR("1002", "用户信息错误"), + + /** + * 账户已被禁用 + */ + ACCOUNT_DISABLED("1025", "账户已被禁用"), + + /** + * 套餐不存在或已过期 + */ + PACKAGE_ERROR("1026", "套餐不存在或已过期"), + + /** + * 支付宝支付失败 + */ + ALI_PAY_ERROR("1016", "创建订单失败"), + + /** + * 支付宝支付回调失败 + */ + CALLBACK_FAILED("1017", "支付宝支付回调失败"), + + /** + * 账号已过期 + */ + ACCOUNT_EXPIRED("1020", "账号已过期,无法激活"), + /** + * 呼叫失败 + */ + CALL_ERROR("1014", "呼叫失败"), + + /** + * axb参数配置 + */ + AXB_CONFIGURATION_ERROR("1015", "axb参数配置错误"), + + + /** + * 数据解析失败 + */ + DECRYPTION_FAILED("1012", "数据解析失败"), + + /** + * 比率不足100%,无法分配 + */ + RATIO_FAILED("1013", "比率不足100%,无法分配"), + + + /** + * axb参数配置 + */ + WRONG_USER_NAME_PASSWORD("1016", "用户名或密码不正确"), + + /** + * 账户余额不足 + */ + INSUFFICIENT_ACCOUNT_BALANCE("1019", "账户余额不足"), + + /** + * 连接成功 + */ + CONNECTION_SUCCEEDED("1027", "连接成功"), + + /** + * 获取二维码失败 + */ + FAILED_GET_QR_CODE("1028", "获取二维码失败"), + + /** + * 获取模板失败 + */ + FAILED_GET_TEMPLATE("1029", "获取模板失败,请先配置发送模板"), + + /** + * 发送消息至少配置一条 + */ + TEMPLATE_CHANGE_ERROR("1031", "发送消息至少配置一条!"), + + /** + * 添加好友失败 + */ + FAILED_ADD_FRIEND("1032", "添加好友失败!"), + + /** + * 当前账户未登录或不在线 + */ + ACCOUNT_NOT_LOGGED_OR_NOT_ONLINE("1030", "当前账户未登录或不在线"), + + /** + * 修改套餐失败 + */ + UPDATE_COMBO_FRIEND("1033", "修改套餐失败!"), + + /** + * 发送邮件失败 + */ + SEND_MAIL_FRIEND("1034", "发送邮件失败!"), + + /** + * 发送邮件失败 + */ + SEND_MAIL_NUM_FRIEND("1035", "发送数量不足100!"), + + /** + * 用户被禁11005用 + */ + USER_DISABLED("11004", "用户被禁用"), + /** + * 用户被锁定 + */ + USER_LOCKED("11005", "用户被锁定"), + /** + * 用户名或密码错误 + */ + USER_PASSWORD_ERROR("11006", "用户名或密码错误"), + /** + * 用户密码过期 + */ + USER_PASSWORD_EXPIRED("11007", "用户密码过期"), + /** + * 用户账号过期 + */ + USER_ACCOUNT_EXPIRED("11008", "用户账号已过期"), + /** + * 没有该用户 + */ + USER_NOT_EXIST("11009", "没有该用户"), + /** + * 用户登录失败 + */ + USER_LOGIN_FAIL("11010", "用户登录失败"), + /** + * 验证码错误 + */ + VERIFY_CODE_ERROR("11011", "验证码错误"), + + /** + * 修改用户信息失败 + */ + UPDATE_USER_ERROR("11012", "修改用户信息失败"), + + /** + * 兑换数据失败 + */ + DATA_CONVERSION_FAILURE("11013", "兑换数据失败,请再次重试"), + + /** + * 发送邮件失败 + */ + SEND_MAIL_MAX_NUM_FRIEND("1036", "发送数量超出最大范围!"), + + /** + * 该批次号已经存在 + */ + BATCH_NUMBER_ALREADY_EXISTS("1037", "该批次号已经存在!"), + + /** + * 非超级管理员不能修改数据 + */ + NON_SUPER_ADMINISTRATORS_CANNOT_MODIFY_DATA("1018", "非管理员不能修改数据"); + + + private final String code; + + private final String desc; + + ResponseCode(String code, String desc) { + this.code = code; + this.desc = desc; + } + + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/ChannelTypeEnum.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/ChannelTypeEnum.java new file mode 100644 index 0000000..bea881d --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/ChannelTypeEnum.java @@ -0,0 +1,50 @@ +package com.baiye.enums; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * @author Enzo + * @date 2024-4-1 + */ +@Getter +@AllArgsConstructor +public enum ChannelTypeEnum { + /** + * 手动创建 + */ + MANUAL_CREATE(1, "手动创建"), + /** + * 文件上传 + */ + FILE_UPLOAD(2, "文件上传"), + + /** + * 飞鱼回传 + */ + FEI_YU(3, "飞鱼回传"), + + /** + * 外呼接入 + */ + OUT_BOUND(4, "外呼接入"), + + /** + * api回传 + */ + API(5, "api回传"), + ; + + + private final Integer key; + private final String name; + + public static String find(Integer key) { + for (ChannelTypeEnum channelTypeEnum : ChannelTypeEnum.values()) { + if (channelTypeEnum.key.equals(key)) { + return channelTypeEnum.name; + } + } + return null; + } +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/PackageEnum.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/PackageEnum.java new file mode 100644 index 0000000..acc004a --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/PackageEnum.java @@ -0,0 +1,43 @@ +package com.baiye.enums; + +import com.baiye.constant.DefaultNumberConstants; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +/** + * @author Enzo + * @date : 2024/4/1 + */ +@Getter +@AllArgsConstructor +public enum PackageEnum { + /** + * 月度 + */ + MONTH(1, 3), + + /** + * 季度 + */ + QUARTER(2, 90), + + /** + * 年度 + */ + YEAR(3, 365); + + + private final Integer type; + private final Integer num; + + public static Integer find(Integer val) { + for (PackageEnum packageEnum : PackageEnum.values()) { + if (Objects.equals(packageEnum.getType(), val)) { + return packageEnum.getNum(); + } + } + return DefaultNumberConstants.MINUS_ONE_NUMBER; + } +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/SalesManEnum.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/SalesManEnum.java new file mode 100644 index 0000000..feb1b4b --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/SalesManEnum.java @@ -0,0 +1,76 @@ +/* + * Copyright 2019-2020 Zheng Jie + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.baiye.enums; + +import com.baiye.constant.DefaultNumberConstants; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +/** + *

+ * 验证码业务场景对应的 Redis 中的 key + *

+ * + * @author Zheng Jie + * @date 2020-05-02 + */ +@Getter +@AllArgsConstructor +public enum SalesManEnum { + + /** + * 录入员 + */ + ENTRY_CLERK(19L, 1), + + /** + * 初审员 + */ + FIRST_INSTANCE(20L, 2), + + /** + * 业务员 + */ + SALESMAN(23L, 4), + + /** + * 业务主管 + */ + EXECUTIVE(22L, 0), + + /** + * 复审员 + */ + RETRIAL(21L, 3); + + + private final Long id; + private final Integer type; + + + + public static Integer find(Long val) { + for (SalesManEnum salesManEnum : SalesManEnum.values()) { + if (Objects.equals(salesManEnum.getId(), val)) { + return salesManEnum.getType(); + } + } + return DefaultNumberConstants.MINUS_ONE_NUMBER; + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/StatisticsEnum.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/StatisticsEnum.java new file mode 100644 index 0000000..2c6fcb5 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/enums/StatisticsEnum.java @@ -0,0 +1,48 @@ +package com.baiye.enums; + +import com.baiye.constant.DefaultNumberConstants; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Objects; + +/** + * @author Enzo + * @date : 2024/4/3 + */ +@Getter +@AllArgsConstructor +public enum StatisticsEnum { + + /** + * 当天 + */ + TODAY(1, 0), + + /** + * 七天 + */ + SEVEN_DAYS(2, 7), + + /** + * 三十日 + */ + THIRTY_DAYS(3, 30); + + + + private final Integer type; + + private final Integer num; + + + public static Integer find(Integer val) { + for (StatisticsEnum salesManEnum : StatisticsEnum.values()) { + if (Objects.equals(salesManEnum.getType(), val)) { + return salesManEnum.getNum(); + } + } + return DefaultNumberConstants.MINUS_ONE_NUMBER; + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/BadRequestException.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/BadRequestException.java new file mode 100644 index 0000000..cdd4b20 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/BadRequestException.java @@ -0,0 +1,25 @@ +package com.baiye.exception; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +import static org.springframework.http.HttpStatus.BAD_REQUEST; + +/** + * 统一异常处理 + */ +@Getter +public class BadRequestException extends RuntimeException { + + private Integer status = BAD_REQUEST.value(); + + public BadRequestException(String msg) { + super(msg); + } + + public BadRequestException(HttpStatus status, String msg) { + super(msg); + this.status = status.value(); + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/BusinessException.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/BusinessException.java new file mode 100644 index 0000000..629d6b2 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/BusinessException.java @@ -0,0 +1,57 @@ +package com.baiye.exception; + +import cn.hutool.core.text.CharSequenceUtil; +import com.baiye.result.ResultCode; +import lombok.Getter; + +/** + * 通用业务异常 + * + * @author Hccake + */ +@Getter +public class BusinessException extends RuntimeException { + + private final String message; + + private final int code; + + public BusinessException(ResultCode resultCode) { + super(resultCode.getMessage()); + this.code = resultCode.getCode(); + this.message = resultCode.getMessage(); + } + + /** + * 用于需要format返回结果的异常 + */ + public BusinessException(ResultCode resultCode, Object... args) { + this(resultCode.getCode(), CharSequenceUtil.format(resultCode.getMessage(), args)); + } + + public BusinessException(ResultCode resultCode, Throwable e) { + super(resultCode.getMessage(), e); + this.code = resultCode.getCode(); + this.message = resultCode.getMessage(); + } + + /** + * 用于需要format返回结果的异常 + */ + public BusinessException(ResultCode resultCode, Throwable e, Object... args) { + this(resultCode.getCode(), CharSequenceUtil.format(resultCode.getMessage(), args), e); + } + + public BusinessException(int code, String message) { + super(message); + this.message = message; + this.code = code; + } + + public BusinessException(int code, String message, Throwable e) { + super(message, e); + this.message = message; + this.code = code; + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/SqlCheckedException.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/SqlCheckedException.java new file mode 100644 index 0000000..238ef9d --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/SqlCheckedException.java @@ -0,0 +1,30 @@ +package com.baiye.exception; + +import com.baiye.result.SystemResultCode; + +/** + * sql防注入校验异常 + * + * @author Hccake + * @version 1.0 + * @date 2019/10/19 16:52 + */ +public class SqlCheckedException extends BusinessException { + + public SqlCheckedException(SystemResultCode systemResultMsg) { + super(systemResultMsg); + } + + public SqlCheckedException(SystemResultCode systemResultMsg, Throwable e) { + super(systemResultMsg, e); + } + + public SqlCheckedException(int code, String msg) { + super(code, msg); + } + + public SqlCheckedException(int code, String msg, Throwable e) { + super(code, msg, e); + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/handler/GlobalException.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/handler/GlobalException.java new file mode 100644 index 0000000..f2e8b20 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/handler/GlobalException.java @@ -0,0 +1,58 @@ +package com.baiye.exception.handler; + +import com.baiye.exception.BadRequestException; +import com.baiye.result.R; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Objects; + +/** + * @Author YQY + * @Date 2023/8/4 + */ +@Slf4j +@RestControllerAdvice +public class GlobalException { + + /** + * 处理自定义异常 + */ + @ExceptionHandler(value = BadRequestException.class) + public R badRequestException(BadRequestException e) { + log.error(getStackTrace(e)); + return R.failed(e.getStatus(), e.getMessage()); + } + + /** + * 接口数据验证异常(@Validated验证) + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + public R handleMethodArgumentNotValidException(MethodArgumentNotValidException e) { + String[] str = Objects.requireNonNull(e.getBindingResult().getAllErrors().get(0).getCodes())[1].split("\\."); + String message = e.getBindingResult().getAllErrors().get(0).getDefaultMessage(); + String msg = "不能为空"; + if (msg.equals(message)) { + message = str[1] + ":" + message; + } + log.error(message); + return R.failed(HttpStatus.BAD_REQUEST.value(), message); + } + + /** + * 获取堆栈信息 + */ + public static String getStackTrace(Throwable throwable) { + StringWriter sw = new StringWriter(); + try (PrintWriter pw = new PrintWriter(sw)) { + throwable.printStackTrace(pw); + return sw.toString(); + } + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/handler/GlobalExceptionHandler.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/handler/GlobalExceptionHandler.java new file mode 100644 index 0000000..0b064fc --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/exception/handler/GlobalExceptionHandler.java @@ -0,0 +1,18 @@ +package com.baiye.exception.handler; + +/** + * 异常日志处理类 + * + * @author Hccake + * @version 1.0 + * @date 2019/10/18 17:05 + */ +public interface GlobalExceptionHandler { + + /** + * 在此处理错误信息 进行落库,入ES, 发送报警通知等信息 + * @param throwable 异常 + */ + void handle(Throwable throwable); + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/https/CompatibleSSLFactory.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/https/CompatibleSSLFactory.java new file mode 100644 index 0000000..2e8bf1a --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/https/CompatibleSSLFactory.java @@ -0,0 +1,95 @@ +package com.baiye.https; + +import com.baiye.constant.HttpsConstants; +import com.baiye.util.ArrayUtils; + +import javax.net.ssl.KeyManager; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSocket; +import javax.net.ssl.SSLSocketFactory; +import javax.net.ssl.TrustManager; +import java.io.IOException; +import java.io.InputStream; +import java.net.InetAddress; +import java.net.Socket; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +/** + * 用于兼容 android 使用 + * + * @author lingting + */ +public class CompatibleSSLFactory extends SSLSocketFactory { + + private final String[] protocols; + + private final SSLSocketFactory factory; + + public CompatibleSSLFactory(String... protocols) throws NoSuchAlgorithmException, KeyManagementException { + this(HttpsConstants.TLS, HttpsConstants.KEY_MANAGERS, HttpsConstants.TRUST_MANAGERS, new SecureRandom(), + protocols); + } + + public CompatibleSSLFactory(String protocol, KeyManager[] keyManagers, TrustManager[] trustManagers, + SecureRandom secureRandom, String... protocols) throws NoSuchAlgorithmException, KeyManagementException { + this.protocols = protocols; + final SSLContext context = SSLContext.getInstance(protocol); + context.init(keyManagers, trustManagers, secureRandom); + this.factory = context.getSocketFactory(); + } + + @Override + public String[] getDefaultCipherSuites() { + return factory.getDefaultCipherSuites(); + } + + @Override + public String[] getSupportedCipherSuites() { + return factory.getSupportedCipherSuites(); + } + + @Override + public Socket createSocket() throws IOException { + return enabledProtocols(factory.createSocket()); + } + + @Override + public Socket createSocket(Socket socket, InputStream inputStream, boolean b) throws IOException { + return enabledProtocols(factory.createSocket(socket, inputStream, b)); + } + + @Override + public Socket createSocket(Socket socket, String s, int i, boolean b) throws IOException { + return enabledProtocols(factory.createSocket(socket, s, i, b)); + } + + @Override + public Socket createSocket(String s, int i) throws IOException { + return enabledProtocols(factory.createSocket(s, i)); + } + + @Override + public Socket createSocket(String s, int i, InetAddress inetAddress, int i1) throws IOException { + return enabledProtocols(factory.createSocket(s, i, inetAddress, i1)); + } + + @Override + public Socket createSocket(InetAddress inetAddress, int i) throws IOException { + return enabledProtocols(factory.createSocket(inetAddress, i)); + } + + @Override + public Socket createSocket(InetAddress inetAddress, int i, InetAddress inetAddress1, int i1) throws IOException { + return enabledProtocols(factory.createSocket(inetAddress, i, inetAddress1, i1)); + } + + private Socket enabledProtocols(Socket socket) { + if (!ArrayUtils.isEmpty(protocols) && socket instanceof SSLSocket) { + ((SSLSocket) socket).setEnabledProtocols(protocols); + } + return socket; + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/https/SSLSocketFactoryInitException.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/https/SSLSocketFactoryInitException.java new file mode 100644 index 0000000..bc728d0 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/https/SSLSocketFactoryInitException.java @@ -0,0 +1,12 @@ +package com.baiye.https; + +/** + * @author lingting 2023/2/1 14:29 + */ +public class SSLSocketFactoryInitException extends RuntimeException { + + public SSLSocketFactoryInitException(String message, Throwable cause) { + super(message, cause); + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/CustomJavaTimeModule.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/CustomJavaTimeModule.java new file mode 100644 index 0000000..e94da30 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/CustomJavaTimeModule.java @@ -0,0 +1,45 @@ +package com.baiye.jackson; + +import cn.hutool.core.date.DatePattern; +import com.fasterxml.jackson.databind.module.SimpleModule; +import com.fasterxml.jackson.datatype.jsr310.PackageVersion; +import com.fasterxml.jackson.datatype.jsr310.deser.InstantDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer; +import com.fasterxml.jackson.datatype.jsr310.ser.InstantSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; +import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.LocalTime; +import java.time.format.DateTimeFormatter; + +/** + * 自定义java8新增时间类型的序列化 + * + * @see com.fasterxml.jackson.datatype.jsr310.JavaTimeModule + * @author Hccake + */ +public class CustomJavaTimeModule extends SimpleModule { + + public CustomJavaTimeModule() { + super(PackageVersion.VERSION); + + this.addSerializer(LocalDateTime.class, + new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))); + this.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ISO_LOCAL_DATE)); + this.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ISO_LOCAL_TIME)); + this.addSerializer(Instant.class, InstantSerializer.INSTANCE); + + this.addDeserializer(LocalDateTime.class, + new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN))); + this.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ISO_LOCAL_DATE)); + this.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ISO_LOCAL_TIME)); + this.addDeserializer(Instant.class, InstantDeserializer.INSTANT); + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullArrayJsonSerializer.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullArrayJsonSerializer.java new file mode 100644 index 0000000..debe7db --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullArrayJsonSerializer.java @@ -0,0 +1,32 @@ +package com.baiye.jackson; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.io.Serializable; + +/** + * 空数组序列化处理器 如果 Array 为 null,则序列化为 [] + * + * @author Hccake + * @version 1.0 + * @date 2019/10/17 23:17 + */ +public class NullArrayJsonSerializer extends JsonSerializer implements Serializable { + + private static final long serialVersionUID = 1L; + + @Override + public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException { + if (value == null) { + jsonGenerator.writeStartArray(); + jsonGenerator.writeEndArray(); + } + else { + jsonGenerator.writeObject(value); + } + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullMapJsonSerializer.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullMapJsonSerializer.java new file mode 100644 index 0000000..8f885d0 --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullMapJsonSerializer.java @@ -0,0 +1,32 @@ +package com.baiye.jackson; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.io.Serializable; + +/** + * 空 Map 序列化处理器 Map 为 null,则序列化为 {} + * + * @author Hccake + * @version 1.0 + * @date 2019/10/17 23:17 + */ +public class NullMapJsonSerializer extends JsonSerializer implements Serializable { + + private static final long serialVersionUID = 1L; + + @Override + public void serialize(Object value, JsonGenerator jsonGenerator, SerializerProvider provider) throws IOException { + if (value == null) { + jsonGenerator.writeStartObject(); + jsonGenerator.writeEndObject(); + } + else { + jsonGenerator.writeObject(value); + } + } + +} diff --git a/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullSerializerProvider.java b/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullSerializerProvider.java new file mode 100644 index 0000000..4f3361d --- /dev/null +++ b/marketing-scrm-common/common-core/src/main/java/com/baiye/jackson/NullSerializerProvider.java @@ -0,0 +1,120 @@ +package com.baiye.jackson; + +import com.fasterxml.jackson.databind.BeanProperty; +import com.fasterxml.jackson.databind.JavaType; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializationConfig; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.ser.DefaultSerializerProvider; +import com.fasterxml.jackson.databind.ser.SerializerFactory; + +import java.util.Collection; +import java.util.Map; + +/** + *

+ * 修改了 Null 值的序列化器提供者 + *

+ * + *