Repository: paascloud/paascloud-master Branch: master Commit: 781281a95033 Files: 893 Total size: 1.7 MB Directory structure: gitextract_nwog7ueh/ ├── .gitignore ├── LICENSE ├── README.md ├── paascloud-common/ │ ├── paascloud-common-base/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── paascloud/ │ │ │ │ └── base/ │ │ │ │ ├── constant/ │ │ │ │ │ ├── AliyunMqTopicConstants.java │ │ │ │ │ ├── AliyunSmsConstants.java │ │ │ │ │ └── GlobalConstant.java │ │ │ │ ├── dto/ │ │ │ │ │ ├── BaseQuery.java │ │ │ │ │ ├── BaseTree.java │ │ │ │ │ ├── BaseVo.java │ │ │ │ │ ├── CheckValidDto.java │ │ │ │ │ ├── GaodeBaseDto.java │ │ │ │ │ ├── JobParameter.java │ │ │ │ │ ├── KvDto.java │ │ │ │ │ ├── LoginAuthDto.java │ │ │ │ │ ├── MessageQueryDto.java │ │ │ │ │ ├── MqMessageDto.java │ │ │ │ │ ├── MqMessageVo.java │ │ │ │ │ ├── ShardingContextDto.java │ │ │ │ │ ├── UpdateStatusDto.java │ │ │ │ │ └── UserTokenDto.java │ │ │ │ ├── enums/ │ │ │ │ │ └── ErrorCodeEnum.java │ │ │ │ └── exception/ │ │ │ │ ├── BooleanParseException.java │ │ │ │ ├── BusinessException.java │ │ │ │ ├── ConfigException.java │ │ │ │ ├── ImportException.java │ │ │ │ └── ReferenceModelNullException.java │ │ │ └── resources/ │ │ │ └── .gitkeep │ │ └── test/ │ │ └── java/ │ │ └── .gitkeep │ ├── paascloud-common-config/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── config/ │ │ ├── PaascloudCoreConfig.java │ │ └── properties/ │ │ ├── AliyunProperties.java │ │ ├── AsyncTaskProperties.java │ │ ├── GaodeProperties.java │ │ ├── JobProperties.java │ │ ├── PaascloudProperties.java │ │ ├── QiniuProperties.java │ │ ├── ReliableMessageProperties.java │ │ ├── SwaggerProperties.java │ │ └── ZookeeperProperties.java │ ├── paascloud-common-core/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── paascloud/ │ │ │ │ └── core/ │ │ │ │ ├── annotation/ │ │ │ │ │ ├── LogAnnotation.java │ │ │ │ │ ├── NotDisplaySql.java │ │ │ │ │ ├── OperationLogDto.java │ │ │ │ │ └── ValidateAnnotation.java │ │ │ │ ├── aspect/ │ │ │ │ │ ├── BindingResultAop.java │ │ │ │ │ ├── LogAspect.java │ │ │ │ │ └── NotDisplaySqlAspect.java │ │ │ │ ├── config/ │ │ │ │ │ ├── AsyncTaskExecutorConfiguration.java │ │ │ │ │ ├── CoreConfiguration.java │ │ │ │ │ ├── ExceptionHandlingAsyncTaskExecutor.java │ │ │ │ │ ├── PcObjectMapper.java │ │ │ │ │ ├── RedisConfiguration.java │ │ │ │ │ ├── SwaggerConfiguration.java │ │ │ │ │ └── ZookeeperInitRunner.java │ │ │ │ ├── enums/ │ │ │ │ │ └── LogTypeEnum.java │ │ │ │ ├── interceptor/ │ │ │ │ │ ├── CoreHeaderInterceptor.java │ │ │ │ │ ├── CoreHttpRequestInterceptor.java │ │ │ │ │ ├── SqlLogInterceptor.java │ │ │ │ │ └── TokenInterceptor.java │ │ │ │ ├── mq/ │ │ │ │ │ └── MqMessage.java │ │ │ │ ├── mybatis/ │ │ │ │ │ ├── BaseEntity.java │ │ │ │ │ └── MyMapper.java │ │ │ │ ├── support/ │ │ │ │ │ ├── AbstractTreeService.java │ │ │ │ │ ├── BaseController.java │ │ │ │ │ ├── BaseService.java │ │ │ │ │ ├── IService.java │ │ │ │ │ ├── ITree.java │ │ │ │ │ ├── SpringContextHolder.java │ │ │ │ │ └── TreeUtils.java │ │ │ │ └── utils/ │ │ │ │ ├── CustomSystemUtil.java │ │ │ │ ├── RequestUtil.java │ │ │ │ ├── SessionRegistryCenterConfiguration.java │ │ │ │ └── TokenCache.java │ │ │ └── resources/ │ │ │ └── META-INF/ │ │ │ └── spring.factories │ │ └── test/ │ │ └── java/ │ │ ├── .gitkeep │ │ └── IdTest.java │ ├── paascloud-common-util/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ ├── BigDecimalUtil.java │ │ ├── Collections3.java │ │ ├── DateUtil.java │ │ ├── HttpAesUtil.java │ │ ├── JacksonUtil.java │ │ ├── PubUtils.java │ │ ├── PublicUtil.java │ │ ├── RandomUtil.java │ │ ├── RecursionTreeUtil.java │ │ ├── RedisKeyUtil.java │ │ ├── ThreadLocalMap.java │ │ ├── TreeNode.java │ │ ├── UrlUtil.java │ │ ├── ValidateUtil.java │ │ ├── annotation/ │ │ │ └── NoNeedAccessAuthentication.java │ │ ├── exception/ │ │ │ └── HttpAesException.java │ │ ├── helper/ │ │ │ ├── LongJsonDeserializer.java │ │ │ └── LongJsonSerializer.java │ │ ├── page/ │ │ │ ├── PageUtil.java │ │ │ └── Query.java │ │ └── wrapper/ │ │ ├── PageWrapMapper.java │ │ ├── PageWrapper.java │ │ ├── WrapMapper.java │ │ └── Wrapper.java │ ├── paascloud-common-zk/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ └── java/ │ │ │ └── com/ │ │ │ └── paascloud/ │ │ │ └── core/ │ │ │ ├── generator/ │ │ │ │ ├── IdGenerator.java │ │ │ │ ├── IncrementIdGenerator.java │ │ │ │ └── UniqueIdGenerator.java │ │ │ └── registry/ │ │ │ ├── RegistryCenterFactory.java │ │ │ ├── base/ │ │ │ │ ├── CoordinatorRegistryCenter.java │ │ │ │ ├── RegisterDto.java │ │ │ │ ├── RegistryCenter.java │ │ │ │ └── ReliableMessageRegisterDto.java │ │ │ ├── exception/ │ │ │ │ ├── RegException.java │ │ │ │ └── RegExceptionHandler.java │ │ │ └── zookeeper/ │ │ │ └── ZookeeperRegistryCenter.java │ │ └── test/ │ │ └── java/ │ │ └── .gitkeep │ ├── paascloud-security-app/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── security/ │ │ ├── app/ │ │ │ ├── AppSecretException.java │ │ │ ├── AppSecurityController.java │ │ │ ├── authentication/ │ │ │ │ └── openid/ │ │ │ │ ├── OpenIdAuthenticationFilter.java │ │ │ │ ├── OpenIdAuthenticationProvider.java │ │ │ │ ├── OpenIdAuthenticationSecurityConfig.java │ │ │ │ └── OpenIdAuthenticationToken.java │ │ │ └── social/ │ │ │ ├── AppSingUpUtils.java │ │ │ ├── AppSocialAuthenticationFilterPostProcessor.java │ │ │ └── SpringSocialConfigurerPostProcessor.java │ │ └── server/ │ │ ├── PcAccessDeniedHandler.java │ │ ├── PcResourceServerConfig.java │ │ ├── PcWebResponseExceptionTranslator.java │ │ ├── TokenJwtEnhancer.java │ │ └── TokenStoreConfig.java │ ├── paascloud-security-core/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── security/ │ │ └── core/ │ │ ├── SecurityCoreConfig.java │ │ ├── SecurityResult.java │ │ ├── SecurityUser.java │ │ ├── authentication/ │ │ │ ├── AuthenticationBeanConfig.java │ │ │ ├── DefaultSocialUserDetailsServiceImpl.java │ │ │ ├── DefaultUserDetailsServiceImpl.java │ │ │ ├── FormAuthenticationConfig.java │ │ │ └── mobile/ │ │ │ ├── SmsCodeAuthenticationFilter.java │ │ │ ├── SmsCodeAuthenticationProvider.java │ │ │ ├── SmsCodeAuthenticationSecurityConfig.java │ │ │ └── SmsCodeAuthenticationToken.java │ │ ├── authorize/ │ │ │ ├── AuthorizeConfigManager.java │ │ │ ├── AuthorizeConfigProvider.java │ │ │ ├── PcAuthorizeConfigManager.java │ │ │ └── PcAuthorizeConfigProvider.java │ │ ├── properties/ │ │ │ ├── BrowserProperties.java │ │ │ ├── EmailCodeProperties.java │ │ │ ├── ImageCodeProperties.java │ │ │ ├── LoginResponseType.java │ │ │ ├── OAuth2ClientProperties.java │ │ │ ├── OAuth2Properties.java │ │ │ ├── QQProperties.java │ │ │ ├── SecurityConstants.java │ │ │ ├── SecurityProperties.java │ │ │ ├── SessionProperties.java │ │ │ ├── SmsCodeProperties.java │ │ │ ├── SocialProperties.java │ │ │ ├── ValidateCodeProperties.java │ │ │ └── WeixinProperties.java │ │ ├── social/ │ │ │ ├── BaseSocialController.java │ │ │ ├── SocialConfig.java │ │ │ ├── qq/ │ │ │ │ ├── api/ │ │ │ │ │ ├── QQ.java │ │ │ │ │ ├── QQImpl.java │ │ │ │ │ └── QQUserInfo.java │ │ │ │ ├── config/ │ │ │ │ │ └── QQAutoConfig.java │ │ │ │ └── connet/ │ │ │ │ ├── QQAdapter.java │ │ │ │ ├── QQConnectionFactory.java │ │ │ │ ├── QQOAuth2Template.java │ │ │ │ └── QQServiceProvider.java │ │ │ ├── support/ │ │ │ │ ├── PcSpringSocialConfigurer.java │ │ │ │ ├── SocialAuthenticationFilterPostProcessor.java │ │ │ │ └── SocialUserInfo.java │ │ │ ├── view/ │ │ │ │ ├── PcConnectView.java │ │ │ │ └── PcConnectionStatusView.java │ │ │ └── weixin/ │ │ │ ├── api/ │ │ │ │ ├── Weixin.java │ │ │ │ ├── WeixinImpl.java │ │ │ │ └── WeixinUserInfo.java │ │ │ ├── config/ │ │ │ │ └── WeixinAutoConfiguration.java │ │ │ └── connect/ │ │ │ ├── WeixinAccessGrant.java │ │ │ ├── WeixinAdapter.java │ │ │ ├── WeixinConnectionFactory.java │ │ │ ├── WeixinOAuth2Template.java │ │ │ └── WeixinServiceProvider.java │ │ └── validate/ │ │ └── code/ │ │ ├── CookieUtil.java │ │ ├── ValidateCode.java │ │ ├── ValidateCodeBeanConfig.java │ │ ├── ValidateCodeController.java │ │ ├── ValidateCodeException.java │ │ ├── ValidateCodeFilter.java │ │ ├── ValidateCodeGenerator.java │ │ ├── ValidateCodeProcessor.java │ │ ├── ValidateCodeProcessorHolder.java │ │ ├── ValidateCodeRepository.java │ │ ├── ValidateCodeSecurityConfig.java │ │ ├── ValidateCodeType.java │ │ ├── email/ │ │ │ ├── DefaultEmailCodeSender.java │ │ │ ├── EmailCodeGenerator.java │ │ │ ├── EmailCodeProcessor.java │ │ │ └── EmailCodeSender.java │ │ ├── image/ │ │ │ ├── ImageCode.java │ │ │ ├── ImageCodeGenerator.java │ │ │ └── ImageCodeProcessor.java │ │ ├── impl/ │ │ │ ├── AbstractValidateCodeProcessor.java │ │ │ └── RedisValidateCodeRepository.java │ │ └── sms/ │ │ ├── DefaultSmsCodeSender.java │ │ ├── SmsCodeGenerator.java │ │ ├── SmsCodeProcessor.java │ │ └── SmsCodeSender.java │ ├── paascloud-security-feign/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── security/ │ │ └── feign/ │ │ ├── OAuth2FeignAutoConfiguration.java │ │ ├── OAuth2FeignRequestInterceptor.java │ │ ├── Oauth2ClientProperties.java │ │ └── Oauth2FeignErrorInterceptor.java │ └── pom.xml ├── paascloud-discovery/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── discovery/ │ │ └── PaasCloudDiscoveryApplication.java │ └── resources/ │ ├── application.yml │ ├── banner.txt │ ├── bootstrap.yml │ ├── logback-spring.xml │ └── server.jks ├── paascloud-eureka/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── discovery/ │ │ └── eureka/ │ │ └── PaasCloudEurekaApplication.java │ └── resources/ │ ├── application.yml │ ├── banner.txt │ ├── bootstrap.yml │ └── logback-spring.xml ├── paascloud-gateway/ │ ├── .gitignore │ ├── README.md │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── gateway/ │ │ ├── PaasCloudGatewayApplication.java │ │ ├── config/ │ │ │ └── SecurityConfig.java │ │ ├── fallback/ │ │ │ └── UacFallbackProvider.java │ │ └── filter/ │ │ ├── AuthHeaderFilter.java │ │ └── RenewFilter.java │ └── resources/ │ ├── application.yml │ ├── banner.txt │ ├── bootstrap.yml │ └── logback-spring.xml ├── paascloud-generator/ │ ├── .gitignore │ ├── README.md │ ├── paascloud-generator-mdc/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── paascloud/ │ │ │ └── provider/ │ │ │ └── main/ │ │ │ └── PaginationPlugin.java │ │ └── resources/ │ │ ├── config.properties │ │ └── generator/ │ │ ├── generatorConfig-A.xml │ │ └── generatorConfig-B.xml │ ├── paascloud-generator-omc/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── paascloud/ │ │ │ └── provider/ │ │ │ └── main/ │ │ │ └── PaginationPlugin.java │ │ └── resources/ │ │ ├── config.properties │ │ └── generator/ │ │ ├── generatorConfig-A.xml │ │ └── generatorConfig-B.xml │ ├── paascloud-generator-opc/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── paascloud/ │ │ │ └── provider/ │ │ │ └── main/ │ │ │ └── PaginationPlugin.java │ │ └── resources/ │ │ ├── config.properties │ │ └── generator/ │ │ ├── generatorConfig-A.xml │ │ └── generatorConfig-B.xml │ ├── paascloud-generator-tpc/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── paascloud/ │ │ │ └── provider/ │ │ │ └── main/ │ │ │ └── PaginationPlugin.java │ │ └── resources/ │ │ ├── config.properties │ │ └── generator/ │ │ ├── generatorConfig-A.xml │ │ └── generatorConfig-B.xml │ ├── paascloud-generator-uac/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── paascloud/ │ │ │ └── provider/ │ │ │ └── main/ │ │ │ └── PaginationPlugin.java │ │ └── resources/ │ │ ├── config.properties │ │ └── generator/ │ │ ├── generatorConfig-A.xml │ │ └── generatorConfig-B.xml │ └── pom.xml ├── paascloud-monitor/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── discovery/ │ │ ├── PaasCloudMonitorApplication.java │ │ └── SecurityConfig.java │ └── resources/ │ ├── application.yml │ ├── banner.txt │ ├── bootstrap.yml │ └── logback-spring.xml ├── paascloud-provider/ │ ├── paascloud-provider-mdc/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── paascloud/ │ │ │ │ ├── PaasCloudMdcApplication.java │ │ │ │ └── provider/ │ │ │ │ ├── config/ │ │ │ │ │ ├── MdcWebMvcConfig.java │ │ │ │ │ └── ResourceServerConfig.java │ │ │ │ ├── manager/ │ │ │ │ │ └── MdcProductManager.java │ │ │ │ ├── mapper/ │ │ │ │ │ ├── MdcAddressMapper.java │ │ │ │ │ ├── MdcDictMapper.java │ │ │ │ │ ├── MdcExceptionLogMapper.java │ │ │ │ │ ├── MdcProductCategoryMapper.java │ │ │ │ │ └── MdcProductMapper.java │ │ │ │ ├── model/ │ │ │ │ │ ├── constant/ │ │ │ │ │ │ └── MallConstant.java │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── MdcAddress.java │ │ │ │ │ │ ├── MdcDict.java │ │ │ │ │ │ ├── MdcExceptionLog.java │ │ │ │ │ │ ├── MdcProduct.java │ │ │ │ │ │ └── MdcProductCategory.java │ │ │ │ │ ├── dto/ │ │ │ │ │ │ ├── MdcCategoryCheckNameDto.java │ │ │ │ │ │ ├── MdcDictCheckCodeDto.java │ │ │ │ │ │ ├── MdcDictCheckNameDto.java │ │ │ │ │ │ ├── MdcEditCategoryDto.java │ │ │ │ │ │ ├── MdcEditDictDto.java │ │ │ │ │ │ ├── MdcEditProductDto.java │ │ │ │ │ │ └── MdcExceptionQueryDto.java │ │ │ │ │ ├── enums/ │ │ │ │ │ │ ├── AddressTypeEnum.java │ │ │ │ │ │ ├── MdcCategoryStatusEnum.java │ │ │ │ │ │ └── MdcDictStatusEnum.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── MdcCategoryVo.java │ │ │ │ │ ├── MdcDictVo.java │ │ │ │ │ └── ProductVo.java │ │ │ │ ├── service/ │ │ │ │ │ ├── MdcAddressService.java │ │ │ │ │ ├── MdcDictService.java │ │ │ │ │ ├── MdcExceptionLogService.java │ │ │ │ │ ├── MdcProductCategoryService.java │ │ │ │ │ ├── MdcProductService.java │ │ │ │ │ ├── OpcRpcService.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── MdcAddressServiceImpl.java │ │ │ │ │ ├── MdcDictServiceImpl.java │ │ │ │ │ ├── MdcExceptionLogServiceImpl.java │ │ │ │ │ ├── MdcProductCategoryServiceImpl.java │ │ │ │ │ └── MdcProductServiceImpl.java │ │ │ │ └── web/ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ ├── frontend/ │ │ │ │ │ ├── MdcAddressRest.java │ │ │ │ │ ├── MdcDictMainController.java │ │ │ │ │ ├── MdcExceptionMainController.java │ │ │ │ │ ├── MdcProductCategoryMainController.java │ │ │ │ │ ├── MdcProductMainController.java │ │ │ │ │ ├── UacDictCommonController.java │ │ │ │ │ └── UacProductCategoryCommonController.java │ │ │ │ └── rpc/ │ │ │ │ ├── MdcAddressQueryFeignClient.java │ │ │ │ ├── MdcExceptionLogFeignClient.java │ │ │ │ ├── MdcMqMessageFeignClient.java │ │ │ │ ├── MdcProductCategoryFeignClient.java │ │ │ │ ├── MdcProductCategoryQueryFeignClient.java │ │ │ │ ├── MdcProductFeignClient.java │ │ │ │ └── MdcProductQueryFeignClient.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── spring-devtools.properties │ │ │ ├── ValidationMessages.properties │ │ │ ├── application.yml │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ ├── conf/ │ │ │ │ └── liquibase.properties │ │ │ ├── liquibase/ │ │ │ │ └── index.xml │ │ │ ├── logback-spring.xml │ │ │ └── mapper/ │ │ │ ├── MdcAddressMapper.xml │ │ │ ├── MdcDictMapper.xml │ │ │ ├── MdcExceptionLogMapper.xml │ │ │ ├── MdcProductCategoryMapper.xml │ │ │ └── MdcProductMapper.xml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── provider/ │ │ └── PaasCloudMdcApplicationTests.java │ ├── paascloud-provider-omc/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── paascloud/ │ │ │ │ ├── PaasCloudOmcApplication.java │ │ │ │ └── provider/ │ │ │ │ ├── config/ │ │ │ │ │ ├── OmcWebMvcConfig.java │ │ │ │ │ └── ResourceServerConfig.java │ │ │ │ ├── mapper/ │ │ │ │ │ ├── OmcCartMapper.java │ │ │ │ │ ├── OmcOrderDetailMapper.java │ │ │ │ │ ├── OmcOrderMapper.java │ │ │ │ │ ├── OmcShippingMapper.java │ │ │ │ │ └── PtcPayInfoMapper.java │ │ │ │ ├── model/ │ │ │ │ │ └── domain/ │ │ │ │ │ ├── OmcCart.java │ │ │ │ │ ├── OmcOrder.java │ │ │ │ │ ├── OmcOrderDetail.java │ │ │ │ │ ├── OmcShipping.java │ │ │ │ │ └── PtcPayInfo.java │ │ │ │ ├── service/ │ │ │ │ │ ├── MdcProductService.java │ │ │ │ │ ├── OmcCartService.java │ │ │ │ │ ├── OmcOrderDetailService.java │ │ │ │ │ ├── OmcOrderService.java │ │ │ │ │ ├── OmcShippingService.java │ │ │ │ │ ├── OpcOssService.java │ │ │ │ │ ├── PtcAlipayService.java │ │ │ │ │ ├── PtcPayInfoService.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── MdcProductServiceImpl.java │ │ │ │ │ ├── OmcCartServiceImpl.java │ │ │ │ │ ├── OmcOrderDetailServiceImpl.java │ │ │ │ │ ├── OmcOrderServiceImpl.java │ │ │ │ │ ├── OmcShippingServiceImpl.java │ │ │ │ │ ├── OpcOssServiceImpl.java │ │ │ │ │ ├── PtcAlipayServiceImpl.java │ │ │ │ │ └── PtcPayInfoServiceImpl.java │ │ │ │ └── web/ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ ├── frontend/ │ │ │ │ │ ├── OmcOrderController.java │ │ │ │ │ ├── OmcShippingController.java │ │ │ │ │ └── PtcPayController.java │ │ │ │ └── rpc/ │ │ │ │ ├── MallCartFeignClient.java │ │ │ │ ├── MallCartQueryFeignClient.java │ │ │ │ ├── OmcOrderDetailFeignClient.java │ │ │ │ ├── OmcOrderDetailQueryFeignClient.java │ │ │ │ ├── OmcOrderFeignClient.java │ │ │ │ └── OmcOrderQueryFeignClient.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── spring-devtools.properties │ │ │ ├── ValidationMessages.properties │ │ │ ├── application.yml │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ ├── conf/ │ │ │ │ └── liquibase.properties │ │ │ ├── liquibase/ │ │ │ │ └── index.xml │ │ │ ├── logback-spring.xml │ │ │ ├── mapper/ │ │ │ │ ├── OmcCartMapper.xml │ │ │ │ ├── OmcOrderDetailMapper.xml │ │ │ │ ├── OmcOrderMapper.xml │ │ │ │ ├── OmcShippingMapper.xml │ │ │ │ └── PtcPayInfoMapper.xml │ │ │ └── zfbinfo.properties │ │ └── test/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── paascloud/ │ │ │ └── provider/ │ │ │ └── PaasCloudOmcApplicationTests.java │ │ └── resources/ │ │ └── generator/ │ │ └── generatorConfig.xml │ ├── paascloud-provider-opc/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── paascloud/ │ │ │ │ ├── PaasCloudOpcApplication.java │ │ │ │ └── provider/ │ │ │ │ ├── config/ │ │ │ │ │ ├── AliyunMqConfiguration.java │ │ │ │ │ ├── AliyunSmsConfiguration.java │ │ │ │ │ ├── OpcWebMvcConfig.java │ │ │ │ │ ├── QiniuOssConfiguration.java │ │ │ │ │ └── ResourceServerConfig.java │ │ │ │ ├── consumer/ │ │ │ │ │ ├── MdcTopicConsumer.java │ │ │ │ │ ├── OptSendEmailTopicConsumer.java │ │ │ │ │ ├── OptSendSmsTopicConsumer.java │ │ │ │ │ └── listener/ │ │ │ │ │ └── OptPushMessageListener.java │ │ │ │ ├── mapper/ │ │ │ │ │ ├── OpcSmsSettingMapper.java │ │ │ │ │ └── OptAttachmentMapper.java │ │ │ │ ├── model/ │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── OpcSmsSetting.java │ │ │ │ │ │ └── OptAttachment.java │ │ │ │ │ └── dto/ │ │ │ │ │ ├── attachment/ │ │ │ │ │ │ └── OptAttachmentReqDto.java │ │ │ │ │ └── mail/ │ │ │ │ │ └── MailEntity.java │ │ │ │ ├── service/ │ │ │ │ │ ├── OpcAttachmentService.java │ │ │ │ │ ├── OpcOssService.java │ │ │ │ │ ├── OptFreeMarkerService.java │ │ │ │ │ ├── OptSendMailService.java │ │ │ │ │ ├── OptSmsService.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── OptAttachmentServiceImpl.java │ │ │ │ │ ├── OptFreeMarkerServiceImpl.java │ │ │ │ │ ├── OptQiniuOssServiceImpl.java │ │ │ │ │ ├── OptSendMailServiceImpl.java │ │ │ │ │ └── OptSmsServiceImpl.java │ │ │ │ ├── utils/ │ │ │ │ │ ├── CheckFileUtil.java │ │ │ │ │ └── GaoDeUtil.java │ │ │ │ └── web/ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ ├── frontend/ │ │ │ │ │ └── OpcFileController.java │ │ │ │ └── rpc/ │ │ │ │ ├── DingtalkFeignClient.java │ │ │ │ ├── OpcAttachmentFeignClient.java │ │ │ │ ├── OpcGaodeFeignClient.java │ │ │ │ └── OpcMqMessageFeignClient.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── spring-devtools.properties │ │ │ ├── ValidationMessages.properties │ │ │ ├── application.yml │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ ├── conf/ │ │ │ │ └── liquibase.properties │ │ │ ├── liquibase/ │ │ │ │ └── index.xml │ │ │ ├── logback-spring.xml │ │ │ ├── mapper/ │ │ │ │ ├── OpcSmsSettingMapper.xml │ │ │ │ └── OptAttachmentMapper.xml │ │ │ └── templates/ │ │ │ └── mail/ │ │ │ ├── sendRegisterSuccessTemplate.ftl │ │ │ └── sendRegisterVerifyCodeTemplate.vm │ │ └── test/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── paascloud/ │ │ │ └── provider/ │ │ │ ├── PaasCloudOmcApplicationTests.java │ │ │ ├── aliyun/ │ │ │ │ ├── MqProducerTest.java │ │ │ │ └── OptSmsServiceTest.java │ │ │ ├── mail/ │ │ │ │ └── MailTest.java │ │ │ └── qiniu/ │ │ │ └── OpcOssServiceTest.java │ │ └── resources/ │ │ └── generator/ │ │ └── generatorConfig.xml │ ├── paascloud-provider-tpc/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── paascloud/ │ │ │ │ ├── PaasCloudTpcApplication.java │ │ │ │ └── provider/ │ │ │ │ ├── config/ │ │ │ │ │ ├── MqBeanInitRunner.java │ │ │ │ │ ├── ResourceServerConfig.java │ │ │ │ │ └── TpcWebMvcConfig.java │ │ │ │ ├── job/ │ │ │ │ │ ├── dataflow/ │ │ │ │ │ │ ├── HandleSendingMessageJob.java │ │ │ │ │ │ └── HandleWaitingConfirmMessageJob.java │ │ │ │ │ ├── listener/ │ │ │ │ │ │ └── HandleUserTokenJobListener.java │ │ │ │ │ └── simple/ │ │ │ │ │ ├── DeleteRpcConsumerMessageJob.java │ │ │ │ │ ├── DeleteRpcExpireFileJob.java │ │ │ │ │ ├── DeleteRpcProducerMessageJob.java │ │ │ │ │ └── HandleUserJwtTokenJob.java │ │ │ │ ├── listener/ │ │ │ │ │ ├── MqConsumerChangeListener.java │ │ │ │ │ └── MqProducerChangeListener.java │ │ │ │ ├── mapper/ │ │ │ │ │ ├── TpcJobTaskMapper.java │ │ │ │ │ ├── TpcMqConfirmMapper.java │ │ │ │ │ ├── TpcMqConsumerMapper.java │ │ │ │ │ ├── TpcMqMessageMapper.java │ │ │ │ │ ├── TpcMqProducerMapper.java │ │ │ │ │ ├── TpcMqSubscribeTagMapper.java │ │ │ │ │ ├── TpcMqTagMapper.java │ │ │ │ │ └── TpcMqTopicMapper.java │ │ │ │ ├── model/ │ │ │ │ │ ├── constant/ │ │ │ │ │ │ └── .gitkeep │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── TpcJobTask.java │ │ │ │ │ │ ├── TpcMqConfirm.java │ │ │ │ │ │ ├── TpcMqConsumer.java │ │ │ │ │ │ ├── TpcMqMessage.java │ │ │ │ │ │ ├── TpcMqProducer.java │ │ │ │ │ │ ├── TpcMqSubscribeTag.java │ │ │ │ │ │ ├── TpcMqTag.java │ │ │ │ │ │ └── TpcMqTopic.java │ │ │ │ │ ├── dto/ │ │ │ │ │ │ └── MessageTaskQueryDto.java │ │ │ │ │ ├── enums/ │ │ │ │ │ │ ├── JobTaskTypeEnum.java │ │ │ │ │ │ ├── MqConfirmStatusEnum.java │ │ │ │ │ │ ├── MqSendStatusEnum.java │ │ │ │ │ │ └── PIDEnum.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── TpcMessageVo.java │ │ │ │ │ ├── TpcMqConfirmVo.java │ │ │ │ │ ├── TpcMqConsumerVo.java │ │ │ │ │ ├── TpcMqProducerVo.java │ │ │ │ │ ├── TpcMqPublishVo.java │ │ │ │ │ ├── TpcMqSubscribeVo.java │ │ │ │ │ ├── TpcMqTagVo.java │ │ │ │ │ └── TpcMqTopicVo.java │ │ │ │ ├── mq/ │ │ │ │ │ └── RocketMqProducer.java │ │ │ │ ├── service/ │ │ │ │ │ ├── MdcRpcService.java │ │ │ │ │ ├── MqProducerBeanFactory.java │ │ │ │ │ ├── OmcRpcService.java │ │ │ │ │ ├── OpcRpcService.java │ │ │ │ │ ├── TpcMqConsumerService.java │ │ │ │ │ ├── TpcMqMessageService.java │ │ │ │ │ ├── TpcMqProducerService.java │ │ │ │ │ ├── TpcMqTagService.java │ │ │ │ │ ├── TpcMqTopicService.java │ │ │ │ │ ├── UacRpcService.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── TpcMqConsumerServiceImpl.java │ │ │ │ │ ├── TpcMqMessageServiceImpl.java │ │ │ │ │ ├── TpcMqProducerServiceImpl.java │ │ │ │ │ ├── TpcMqTagServiceImpl.java │ │ │ │ │ └── TpcMqTopicServiceImpl.java │ │ │ │ └── web/ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ ├── frontend/ │ │ │ │ │ ├── TpcMessageMainController.java │ │ │ │ │ ├── TpcMqConsumerController.java │ │ │ │ │ ├── TpcMqProducerController.java │ │ │ │ │ ├── TpcMqTagController.java │ │ │ │ │ └── TpcMqTopicController.java │ │ │ │ └── rpc/ │ │ │ │ └── TpcMqMessageFeignClient.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── spring-devtools.properties │ │ │ ├── ValidationMessages.properties │ │ │ ├── application.yml │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ ├── conf/ │ │ │ │ └── liquibase.properties │ │ │ ├── liquibase/ │ │ │ │ └── index.xml │ │ │ ├── logback-spring.xml │ │ │ └── mapper/ │ │ │ ├── TpcJobTaskMapper.xml │ │ │ ├── TpcMqConfirmMapper.xml │ │ │ ├── TpcMqConsumerMapper.xml │ │ │ ├── TpcMqMessageMapper.xml │ │ │ ├── TpcMqProducerMapper.xml │ │ │ ├── TpcMqSubscribeTagMapper.xml │ │ │ ├── TpcMqTagMapper.xml │ │ │ └── TpcMqTopicMapper.xml │ │ └── test/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── provider/ │ │ └── PaasCloudMdcApplicationTests.java │ ├── paascloud-provider-uac/ │ │ ├── pom.xml │ │ └── src/ │ │ ├── main/ │ │ │ ├── java/ │ │ │ │ └── com/ │ │ │ │ └── paascloud/ │ │ │ │ ├── PaasCloudUacApplication.java │ │ │ │ └── provider/ │ │ │ │ ├── config/ │ │ │ │ │ ├── AliyunMqConfiguration.java │ │ │ │ │ ├── CaptchaConfig.java │ │ │ │ │ ├── RedisInitRunner.java │ │ │ │ │ └── UacWebMvcConfig.java │ │ │ │ ├── manager/ │ │ │ │ │ └── UserManager.java │ │ │ │ ├── mapper/ │ │ │ │ │ ├── UacActionMapper.java │ │ │ │ │ ├── UacGroupMapper.java │ │ │ │ │ ├── UacGroupUserMapper.java │ │ │ │ │ ├── UacLogMapper.java │ │ │ │ │ ├── UacMenuMapper.java │ │ │ │ │ ├── UacRoleActionMapper.java │ │ │ │ │ ├── UacRoleMapper.java │ │ │ │ │ ├── UacRoleMenuMapper.java │ │ │ │ │ ├── UacRoleUserMapper.java │ │ │ │ │ ├── UacUserMapper.java │ │ │ │ │ ├── UacUserMenuMapper.java │ │ │ │ │ └── UacUserTokenMapper.java │ │ │ │ ├── model/ │ │ │ │ │ ├── constant/ │ │ │ │ │ │ └── MenuConstant.java │ │ │ │ │ ├── domain/ │ │ │ │ │ │ ├── UacAction.java │ │ │ │ │ │ ├── UacGroup.java │ │ │ │ │ │ ├── UacGroupUser.java │ │ │ │ │ │ ├── UacLog.java │ │ │ │ │ │ ├── UacMenu.java │ │ │ │ │ │ ├── UacRole.java │ │ │ │ │ │ ├── UacRoleAction.java │ │ │ │ │ │ ├── UacRoleMenu.java │ │ │ │ │ │ ├── UacRoleUser.java │ │ │ │ │ │ ├── UacUser.java │ │ │ │ │ │ ├── UacUserMenu.java │ │ │ │ │ │ └── UacUserToken.java │ │ │ │ │ ├── dto/ │ │ │ │ │ │ ├── action/ │ │ │ │ │ │ │ ├── ActionMainQueryDto.java │ │ │ │ │ │ │ ├── UacActionCheckCodeDto.java │ │ │ │ │ │ │ └── UacActionCheckUrlDto.java │ │ │ │ │ │ ├── base/ │ │ │ │ │ │ │ └── ModifyStatusDto.java │ │ │ │ │ │ ├── email/ │ │ │ │ │ │ │ └── SendEmailMessage.java │ │ │ │ │ │ ├── group/ │ │ │ │ │ │ │ ├── CheckGroupCodeDto.java │ │ │ │ │ │ │ ├── CheckGroupNameDto.java │ │ │ │ │ │ │ ├── GroupBindUserDto.java │ │ │ │ │ │ │ └── GroupBindUserReqDto.java │ │ │ │ │ │ ├── log/ │ │ │ │ │ │ │ └── UacLogMainDto.java │ │ │ │ │ │ ├── menu/ │ │ │ │ │ │ │ ├── UacEditMenuDto.java │ │ │ │ │ │ │ ├── UacMenuCheckCodeDto.java │ │ │ │ │ │ │ ├── UacMenuCheckNameDto.java │ │ │ │ │ │ │ ├── UacMenuCheckUrlDto.java │ │ │ │ │ │ │ ├── UacMenuStatusDto.java │ │ │ │ │ │ │ ├── UacMenuUrlDto.java │ │ │ │ │ │ │ ├── UserMenuChildrenDto.java │ │ │ │ │ │ │ └── UserMenuDto.java │ │ │ │ │ │ ├── omc/ │ │ │ │ │ │ │ └── CartListQuery.java │ │ │ │ │ │ ├── role/ │ │ │ │ │ │ │ ├── BindUserDto.java │ │ │ │ │ │ │ ├── CheckRoleCodeDto.java │ │ │ │ │ │ │ ├── RoleBindActionDto.java │ │ │ │ │ │ │ ├── RoleBindMenuDto.java │ │ │ │ │ │ │ ├── RoleBindUserDto.java │ │ │ │ │ │ │ └── RoleBindUserReqDto.java │ │ │ │ │ │ ├── sms/ │ │ │ │ │ │ │ └── SmsMessage.java │ │ │ │ │ │ ├── token/ │ │ │ │ │ │ │ ├── RefreshTokenDto.java │ │ │ │ │ │ │ └── TokenMainQueryDto.java │ │ │ │ │ │ └── user/ │ │ │ │ │ │ ├── BindRoleDto.java │ │ │ │ │ │ ├── BindUserMenusDto.java │ │ │ │ │ │ ├── BindUserRolesDto.java │ │ │ │ │ │ ├── CheckEmailDto.java │ │ │ │ │ │ ├── CheckLoginNameDto.java │ │ │ │ │ │ ├── CheckNewPasswordDto.java │ │ │ │ │ │ ├── CheckUserNameDto.java │ │ │ │ │ │ ├── CheckUserPhoneDto.java │ │ │ │ │ │ ├── LoginRespDto.java │ │ │ │ │ │ ├── ModifyUserStatusDto.java │ │ │ │ │ │ ├── ResetLoginPwdDto.java │ │ │ │ │ │ ├── UserModifyPwdDto.java │ │ │ │ │ │ └── UserResetPwdDto.java │ │ │ │ │ ├── enums/ │ │ │ │ │ │ ├── UacActionStatusEnum.java │ │ │ │ │ │ ├── UacEmailTemplateEnum.java │ │ │ │ │ │ ├── UacGroupStatusEnum.java │ │ │ │ │ │ ├── UacMenuStatusEnum.java │ │ │ │ │ │ ├── UacRoleStatusEnum.java │ │ │ │ │ │ ├── UacUserSourceEnum.java │ │ │ │ │ │ ├── UacUserStatusEnum.java │ │ │ │ │ │ ├── UacUserTokenStatusEnum.java │ │ │ │ │ │ ├── UacUserTypeEnum.java │ │ │ │ │ │ └── ZtreeAuthTypeEnum.java │ │ │ │ │ └── vo/ │ │ │ │ │ ├── ActionVo.java │ │ │ │ │ ├── BindAuthVo.java │ │ │ │ │ ├── ElementTreeVo.java │ │ │ │ │ ├── GroupZtreeVo.java │ │ │ │ │ ├── JqTreeResponseVo.java │ │ │ │ │ ├── KaptchaVo.java │ │ │ │ │ ├── RoleVo.java │ │ │ │ │ ├── UserBindRoleVo.java │ │ │ │ │ ├── UserTokenVo.java │ │ │ │ │ ├── UserVo.java │ │ │ │ │ ├── ViewMenuVo.java │ │ │ │ │ ├── ZtreeResponseVo.java │ │ │ │ │ ├── role/ │ │ │ │ │ │ ├── MenuCountVo.java │ │ │ │ │ │ └── RoleZtreeVo.java │ │ │ │ │ └── treeview/ │ │ │ │ │ ├── AdditionalParameters.java │ │ │ │ │ ├── Item.java │ │ │ │ │ └── ItemType.java │ │ │ │ ├── mq/ │ │ │ │ │ ├── consumer/ │ │ │ │ │ │ └── listener/ │ │ │ │ │ │ └── UacPushMessageListener.java │ │ │ │ │ └── producer/ │ │ │ │ │ ├── EmailProducer.java │ │ │ │ │ └── SmsProducer.java │ │ │ │ ├── security/ │ │ │ │ │ ├── PcAuthenticationFailureHandler.java │ │ │ │ │ ├── PcAuthenticationSuccessHandler.java │ │ │ │ │ ├── PcAuthorizationServerConfig.java │ │ │ │ │ ├── PcLogoutSuccessHandler.java │ │ │ │ │ ├── PcPermissionAuthorizeConfigProvider.java │ │ │ │ │ ├── PcSecurityExpressionHandler.java │ │ │ │ │ ├── RestClientDetailsServiceImpl.java │ │ │ │ │ ├── SecurityUtils.java │ │ │ │ │ └── UacUserDetailsServiceImpl.java │ │ │ │ ├── service/ │ │ │ │ │ ├── EmailService.java │ │ │ │ │ ├── MdcAddressService.java │ │ │ │ │ ├── OpcRpcService.java │ │ │ │ │ ├── RedisHashService.java │ │ │ │ │ ├── RedisService.java │ │ │ │ │ ├── RedisSetService.java │ │ │ │ │ ├── SmsService.java │ │ │ │ │ ├── UacActionService.java │ │ │ │ │ ├── UacFreeMarkerService.java │ │ │ │ │ ├── UacGroupService.java │ │ │ │ │ ├── UacGroupUserService.java │ │ │ │ │ ├── UacLogService.java │ │ │ │ │ ├── UacLoginService.java │ │ │ │ │ ├── UacMenuService.java │ │ │ │ │ ├── UacPermissionService.java │ │ │ │ │ ├── UacRoleActionService.java │ │ │ │ │ ├── UacRoleMenuService.java │ │ │ │ │ ├── UacRoleService.java │ │ │ │ │ ├── UacRoleUserService.java │ │ │ │ │ ├── UacUserMenuService.java │ │ │ │ │ ├── UacUserService.java │ │ │ │ │ ├── UacUserTokenService.java │ │ │ │ │ └── impl/ │ │ │ │ │ ├── EmailServiceImpl.java │ │ │ │ │ ├── MdcAddressServiceImpl.java │ │ │ │ │ ├── OpcRpcServiceImpl.java │ │ │ │ │ ├── PcSmsCodeSender.java │ │ │ │ │ ├── RedisHashServiceImpl.java │ │ │ │ │ ├── RedisServiceImpl.java │ │ │ │ │ ├── RedisSetServiceImpl.java │ │ │ │ │ ├── SmsServiceImpl.java │ │ │ │ │ ├── UacActionServiceImpl.java │ │ │ │ │ ├── UacFreeMarkerServiceImpl.java │ │ │ │ │ ├── UacGroupServiceImpl.java │ │ │ │ │ ├── UacGroupUserServiceImpl.java │ │ │ │ │ ├── UacLogServiceImpl.java │ │ │ │ │ ├── UacLoginServiceImpl.java │ │ │ │ │ ├── UacMenuServiceImpl.java │ │ │ │ │ ├── UacPermissionServiceImpl.java │ │ │ │ │ ├── UacRoleActionServiceImpl.java │ │ │ │ │ ├── UacRoleMenuServiceImpl.java │ │ │ │ │ ├── UacRoleServiceImpl.java │ │ │ │ │ ├── UacRoleUserServiceImpl.java │ │ │ │ │ ├── UacUserMenuServiceImpl.java │ │ │ │ │ ├── UacUserServiceImpl.java │ │ │ │ │ └── UacUserTokenServiceImpl.java │ │ │ │ ├── utils/ │ │ │ │ │ ├── Md5Util.java │ │ │ │ │ └── TreeUtil.java │ │ │ │ └── web/ │ │ │ │ ├── GlobalExceptionHandler.java │ │ │ │ ├── admin/ │ │ │ │ │ ├── AuthRestController.java │ │ │ │ │ ├── UacActionCommonController.java │ │ │ │ │ ├── UacActionMainController.java │ │ │ │ │ ├── UacGrantAuth4RoleController.java │ │ │ │ │ ├── UacGroupBindUserController.java │ │ │ │ │ ├── UacGroupCommonController.java │ │ │ │ │ ├── UacGroupMainController.java │ │ │ │ │ ├── UacLogMainController.java │ │ │ │ │ ├── UacMenuCommonController.java │ │ │ │ │ ├── UacMenuMainController.java │ │ │ │ │ ├── UacRoleBindUserController.java │ │ │ │ │ ├── UacRoleCommonController.java │ │ │ │ │ ├── UacRoleMainController.java │ │ │ │ │ ├── UacTokenMainController.java │ │ │ │ │ ├── UacUserCommonController.java │ │ │ │ │ ├── UacUserLoginController.java │ │ │ │ │ ├── UacUserMainController.java │ │ │ │ │ └── UacUserPasswordController.java │ │ │ │ ├── mall/ │ │ │ │ │ ├── EmailController.java │ │ │ │ │ ├── MallAuthRestController.java │ │ │ │ │ ├── MallCartController.java │ │ │ │ │ └── MallUserController.java │ │ │ │ └── rpc/ │ │ │ │ ├── UacMqMessageFeignClient.java │ │ │ │ └── UacUserTokenFeignClient.java │ │ │ └── resources/ │ │ │ ├── META-INF/ │ │ │ │ └── spring-devtools.properties │ │ │ ├── ValidationMessages.properties │ │ │ ├── application.yml │ │ │ ├── banner.txt │ │ │ ├── bootstrap.yml │ │ │ ├── conf/ │ │ │ │ └── liquibase.properties │ │ │ ├── liquibase/ │ │ │ │ ├── change_log/ │ │ │ │ │ └── 2017-06-10-init-schema.xml │ │ │ │ └── index.xml │ │ │ ├── logback-spring.xml │ │ │ ├── mapper/ │ │ │ │ ├── UacActionMapper.xml │ │ │ │ ├── UacGroupMapper.xml │ │ │ │ ├── UacGroupUserMapper.xml │ │ │ │ ├── UacLogMapper.xml │ │ │ │ ├── UacMenuMapper.xml │ │ │ │ ├── UacRoleActionMapper.xml │ │ │ │ ├── UacRoleMapper.xml │ │ │ │ ├── UacRoleMenuMapper.xml │ │ │ │ ├── UacRoleUserMapper.xml │ │ │ │ ├── UacUserMapper.xml │ │ │ │ ├── UacUserMenuMapper.xml │ │ │ │ └── UacUserTokenMapper.xml │ │ │ ├── org/ │ │ │ │ └── springframework/ │ │ │ │ └── security/ │ │ │ │ └── messages_zh_CN.properties │ │ │ ├── static/ │ │ │ │ └── index.html │ │ │ └── templates/ │ │ │ └── email/ │ │ │ ├── activeUserSuccessTemplate.ftl │ │ │ ├── activeUserTemplate.ftl │ │ │ ├── sendRestLoginPwdSuccessTemplate.ftl │ │ │ ├── sendRestLoginPwdTemplate.ftl │ │ │ ├── sendRestPwdCodeTemplate.ftl │ │ │ └── sendRestUserEmailTemplate.ftl │ │ └── test/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── paascloud/ │ │ │ └── provider/ │ │ │ ├── MD5Test.java │ │ │ ├── MybatisGenerator.java │ │ │ ├── PaasCloudUacApplicationTests.java │ │ │ ├── UacMenuServiceTest.java │ │ │ ├── UacRoleServiceTest.java │ │ │ └── UacUserServiceTest.java │ │ └── resources/ │ │ └── .gitkeep │ └── pom.xml ├── paascloud-provider-api/ │ ├── paascloud-provider-mdc-api/ │ │ ├── .gitignore │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── provider/ │ │ ├── exceptions/ │ │ │ └── MdcBizException.java │ │ ├── model/ │ │ │ ├── constant/ │ │ │ │ └── MdcApiConstant.java │ │ │ ├── dto/ │ │ │ │ ├── AddressDTO.java │ │ │ │ ├── GlobalExceptionLogDto.java │ │ │ │ ├── ProductCategoryDto.java │ │ │ │ ├── ProductDto.java │ │ │ │ └── ProductReqDto.java │ │ │ └── vo/ │ │ │ └── ProductDetailVo.java │ │ └── service/ │ │ ├── MdcAddressQueryFeignApi.java │ │ ├── MdcExceptionLogFeignApi.java │ │ ├── MdcMqMessageFeignApi.java │ │ ├── MdcProductCategoryFeignApi.java │ │ ├── MdcProductCategoryQueryFeignApi.java │ │ ├── MdcProductFeignApi.java │ │ ├── MdcProductQueryFeignApi.java │ │ └── hystrix/ │ │ ├── MdcAddressQueryFeignHystrix.java │ │ ├── MdcExceptionLogFeignHystrix.java │ │ ├── MdcMqMessageApiHystrix.java │ │ ├── MdcProductCategoryFeignHystrix.java │ │ ├── MdcProductCategoryQueryFeignHystrix.java │ │ ├── MdcProductFeignHystrix.java │ │ └── MdcProductQueryFeignHystrix.java │ ├── paascloud-provider-omc-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── provider/ │ │ ├── exceptions/ │ │ │ └── OmcBizException.java │ │ ├── model/ │ │ │ ├── constant/ │ │ │ │ ├── OmcApiConstant.java │ │ │ │ └── PtcApiConstant.java │ │ │ ├── dto/ │ │ │ │ ├── OrderDetailDto.java │ │ │ │ ├── OrderDto.java │ │ │ │ └── OrderPageQuery.java │ │ │ └── vo/ │ │ │ ├── CartProductVo.java │ │ │ ├── CartVo.java │ │ │ ├── OrderDocVo.java │ │ │ ├── OrderItemVo.java │ │ │ ├── OrderProductVo.java │ │ │ ├── OrderVo.java │ │ │ └── ShippingVo.java │ │ └── service/ │ │ ├── OmcCartFeignApi.java │ │ ├── OmcCartQueryFeignApi.java │ │ ├── OmcOrderDetailFeignApi.java │ │ ├── OmcOrderDetailQueryFeignApi.java │ │ ├── OmcOrderFeignApi.java │ │ ├── OmcOrderQueryFeignApi.java │ │ └── hystrix/ │ │ ├── OmcCartFeignHystrix.java │ │ ├── OmcCartQueryFeignHystrix.java │ │ ├── OmcOrderDetailFeignHystrix.java │ │ ├── OmcOrderDetailQueryFeignHystrix.java │ │ ├── OmcOrderFeignHystrix.java │ │ └── OmcOrderQueryFeignHystrix.java │ ├── paascloud-provider-opc-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── provider/ │ │ ├── exceptions/ │ │ │ └── OpcBizException.java │ │ ├── model/ │ │ │ ├── constant/ │ │ │ │ └── OpcApiConstant.java │ │ │ ├── dto/ │ │ │ │ ├── PcSendEmailRequest.java │ │ │ │ ├── PcSendSmsRequest.java │ │ │ │ ├── attachment/ │ │ │ │ │ ├── OptAttachmentDeleteReqDto.java │ │ │ │ │ ├── OptAttachmentQueryReqDto.java │ │ │ │ │ ├── OptAttachmentRespDto.java │ │ │ │ │ ├── OptUpdateAttachmentReqDto.java │ │ │ │ │ └── OptUploadFileByteInfoReqDto.java │ │ │ │ ├── gaode/ │ │ │ │ │ └── GaodeLocation.java │ │ │ │ ├── oss/ │ │ │ │ │ ├── ElementImgUrlDto.java │ │ │ │ │ ├── OptBatchGetUrlRequest.java │ │ │ │ │ ├── OptGetUrlRequest.java │ │ │ │ │ ├── OptUploadFileReqDto.java │ │ │ │ │ └── OptUploadFileRespDto.java │ │ │ │ └── robot/ │ │ │ │ ├── AtDto.java │ │ │ │ ├── ChatRobotMsgDto.java │ │ │ │ ├── LinkDto.java │ │ │ │ ├── MarkdownDto.java │ │ │ │ └── TextDto.java │ │ │ ├── enums/ │ │ │ │ └── RobotMsgTypeEnum.java │ │ │ └── factory/ │ │ │ └── ChatRobotMsgFactory.java │ │ └── service/ │ │ ├── DingtalkFeignApi.java │ │ ├── OpcGaodeFeignApi.java │ │ ├── OpcMqMessageFeignApi.java │ │ ├── OpcOssFeignApi.java │ │ └── hystrix/ │ │ ├── DingtalkFeignApiHystrix.java │ │ ├── OpcGaodeFeignApiHystrix.java │ │ ├── OpcMqMessageFeignApiHystrix.java │ │ └── OpcOssFeignApiHystrix.java │ ├── paascloud-provider-sdk-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ ├── java/ │ │ │ └── com/ │ │ │ └── paascloud/ │ │ │ └── provider/ │ │ │ ├── annotation/ │ │ │ │ ├── MqConsumerStore.java │ │ │ │ └── MqProducerStore.java │ │ │ ├── aspect/ │ │ │ │ ├── MqConsumerStoreAspect.java │ │ │ │ └── MqProducerStoreAspect.java │ │ │ ├── autoconfigure/ │ │ │ │ ├── MessageAutoConfiguration.java │ │ │ │ └── MessageBeanConfiguration.java │ │ │ ├── mapper/ │ │ │ │ └── MqMessageDataMapper.java │ │ │ ├── model/ │ │ │ │ ├── domain/ │ │ │ │ │ └── MqMessageData.java │ │ │ │ ├── dto/ │ │ │ │ │ └── UpdateAttachmentDto.java │ │ │ │ └── enums/ │ │ │ │ ├── DelayLevelEnum.java │ │ │ │ ├── MqMessageTypeEnum.java │ │ │ │ ├── MqOrderTypeEnum.java │ │ │ │ └── MqSendTypeEnum.java │ │ │ └── service/ │ │ │ ├── MqMessageService.java │ │ │ └── impl/ │ │ │ └── MqMessageServiceImpl.java │ │ └── resources/ │ │ ├── META-INF/ │ │ │ └── spring.factories │ │ └── sdk/ │ │ └── mapper/ │ │ └── MqMessageDataMapper.xml │ ├── paascloud-provider-tpc-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── provider/ │ │ ├── exceptions/ │ │ │ └── TpcBizException.java │ │ ├── model/ │ │ │ ├── dto/ │ │ │ │ ├── PcJobTask.java │ │ │ │ ├── PcMessageJobTask.java │ │ │ │ └── TpcMqMessageDto.java │ │ │ └── enums/ │ │ │ └── JobTaskStatusEnum.java │ │ └── service/ │ │ ├── TpcMqMessageFeignApi.java │ │ └── hystrix/ │ │ └── TpcMqMessageFeignApiHystrix.java │ ├── paascloud-provider-uac-api/ │ │ ├── pom.xml │ │ └── src/ │ │ └── main/ │ │ └── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── provider/ │ │ └── model/ │ │ ├── constant/ │ │ │ ├── UacApiConstant.java │ │ │ └── UacConstant.java │ │ ├── dto/ │ │ │ └── user/ │ │ │ ├── ForgetCheckAnswerDto.java │ │ │ ├── ForgetResetPasswordDto.java │ │ │ ├── IdStatusDto.java │ │ │ ├── LoginReqDto.java │ │ │ ├── Perm.java │ │ │ ├── ResetPasswordDto.java │ │ │ ├── UserInfoDto.java │ │ │ └── UserRegisterDto.java │ │ ├── enums/ │ │ │ └── UacGroupTypeEnum.java │ │ ├── exceptions/ │ │ │ └── UacBizException.java │ │ ├── service/ │ │ │ ├── UacMqMessageFeignApi.java │ │ │ ├── UacUserTokenFeignApi.java │ │ │ └── hystrix/ │ │ │ ├── UacMqMessageApiHystrix.java │ │ │ └── UacUserTokenFeignApiHystrix.java │ │ └── vo/ │ │ └── MenuVo.java │ └── pom.xml ├── paascloud-zipkin/ │ ├── pom.xml │ └── src/ │ └── main/ │ ├── java/ │ │ └── com/ │ │ └── paascloud/ │ │ └── discovery/ │ │ ├── CustomPollerConfiguration.java │ │ └── PaasCloudZipkinApplication.java │ └── resources/ │ ├── application.yml │ ├── banner.txt │ ├── bootstrap.yml │ ├── logback-spring.xml │ └── mysql.sql └── pom.xml ================================================ FILE CONTENTS ================================================ ================================================ FILE: .gitignore ================================================ # Compiled class file *.class # Log file *.log # BlueJ files *.ctxt # Mobile Tools for Java (J2ME) .mtj.tmp/ # Package Files # *.jar *.war *.ear *.zip *.tar.gz *.rar *.idea ### IntelliJ IDEA ### logs .idea *.iws *.iml *.ipr log.* # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* ================================================ FILE: LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: You must give any other recipients of the Work or Derivative Works a copy of this License; and You must cause any modified files to carry prominent notices stating that You changed the files; and You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "{}" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright 2017 paascloud.net 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. ================================================ FILE: README.md ================================================ ## Spring Cloud 实战项目 ### 项目介绍 ``` 功能点: 模拟商城,完整的购物流程、后端运营平台对前端业务的支撑,和对项目的运维,有各项的监控指标和运维指标。 技术点: 核心技术为springcloud+vue两个全家桶实现,采取了取自开源用于开源的目标,所以能用开源绝不用收费框架,整体技术栈只有 阿里云短信服务是收费的,都是目前java前瞻性的框架,可以为中小企业解决微服务架构难题,可以帮助企业快速建站。由于服务 器成本较高,尽量降低开发成本的原则,本项目由10个后端项目和3个前端项目共同组成。真正实现了基于RBAC、jwt和oauth2的 无状态统一权限认证的解决方案,实现了异常和日志的统一管理,实现了MQ落地保证100%到达的解决方案。 核心框架:springcloud Edgware全家桶 安全框架:Spring Security Spring Cloud Oauth2 分布式任务调度:elastic-job 持久层框架:MyBatis、通用Mapper4、Mybatis_PageHelper 数据库连接池:Alibaba Druid 日志管理:Logback 前端框架:Vue全家桶以及相关组件 三方服务: 邮件服务、阿里云短信服务、七牛云文件服务、钉钉机器人服务、高德地图API ``` ### 平台目录结构说明 ``` ├─paascloud-master----------------------------父项目,公共依赖 │ │ │ ├─paascloud-eureka--------------------------微服务注册中心 │ │ │ ├─paascloud-discovery-----------------------微服务配置中心 │ │ │ ├─paascloud-monitor-------------------------微服务监控中心 │ │ │ ├─paascloud-zipkin--------------------------微服务日志采集中心 │ │ │ ├─paascloud-gateway--------------------------微服务网关中心 │ │ │ ├─paascloud-provider │ │ │ │ │ ├─paascloud-provider-mdc------------------数据服务中心 │ │ │ │ │ ├─paascloud-provider-omc------------------订单服务中心 │ │ │ │ │ ├─paascloud-provider-opc------------------对接服务中心 │ │ │ │ │ ├─paascloud-provider-tpc------------------任务服务中心 │ │ │ │ │ └─paascloud-provider-uac------------------用户服务中心 │ │ │ ├─paascloud-provider-api │ │ │ │ │ ├─paascloud-provider-mdc-api------------------数据服务中心API │ │ │ │ │ ├─paascloud-provider-omc-api------------------订单服务中心API │ │ │ │ │ ├─paascloud-provider-opc-api------------------对接服务中心API │ │ │ │ │ ├─paascloud-provider-tpc-api------------------任务服务中心API │ │ │ │ │ ├─paascloud-provider-sdk-api------------------可靠消息服务API │ │ │ │ │ └─paascloud-provider-uac-api------------------用户服务中心API │ │ │ ├─paascloud-common │ │ │ │ │ ├─paascloud-common-base------------------公共POJO基础包 │ │ │ │ │ ├─paascloud-common-config------------------公共配置包 │ │ │ │ │ ├─paascloud-common-core------------------微服务核心依赖包 │ │ │ │ │ ├─paascloud-common-util------------------公共工具包 │ │ │ │ │ ├─paascloud-common-zk------------------zookeeper配置 │ │ │ │ │ ├─paascloud-security-app------------------公共无状态安全认证 │ │ │ │ │ ├─paascloud-security-core------------------安全服务核心包 │ │ │ │ │ └─paascloud-security-feign------------------基于auth2的feign配置 │ │ │ ├─paascloud-generator │ │ │ │ │ ├─paascloud-generator-mdc------------------数据服务中心Mybatis Generator │ │ │ │ │ ├─paascloud-generator-omc------------------数据服务中心Mybatis Generator │ │ │ │ │ ├─paascloud-generator-opc------------------数据服务中心Mybatis Generator │ │ │ │ │ ├─paascloud-generator-tpc------------------数据服务中心Mybatis Generator │ │ │ │ │ └─paascloud-generator-uac------------------数据服务中心Mybatis Generator ``` ### 特殊说明 ``` 这里做一个解释由于微服务的拆分受制于服务器,这里我做了微服务的合并,比如OAuth2的认证服务中心和用户中心合并, 统一的one service服务中心和用户认证中心合并,支付中心和订单中心合并,其实这也是不得已而为之, 只是做了业务微服务中心的合并,并没有将架构中的 注册中心 监控中心 服务发现中心进行合并。 ``` ### 作者介绍 ``` Spring Cloud 爱好者,现就任于鲜易供应链平台研发部. ``` ### QQ群交流 ①:519587831(满) ②:873283104(满) ③:882458726(满) ④:693445268 ⑤:813682656 ⑥:797334670 ⑦:797876073 ⑧:814712305 ⑨:…… ### FAQ * [相关问题](https://github.com/paascloud/paascloud-master/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98) ## 配套项目 ``` 后端项目:https://github.com/paascloud/paascloud-master https://gitee.com/paascloud/paascloud-master 登录入口:https://github.com/paascloud/paascloud-login-web https://gitee.com/paascloud/paascloud-login-web 后端入口:https://github.com/paascloud/paascloud-admin-web https://gitee.com/paascloud/paascloud-admin-web 前端入口:https://github.com/paascloud/paascloud-mall-web https://gitee.com/paascloud/paascloud-mall-web ``` ### 传送门 - 博客入口: http://blog.paascloud.net - 后端入口: http://admin.paascloud.net (支持微信登录体验) - 模拟商城: http://mall.paascloud.net (支持微信登录体验) - 文档手册: http://document.paascloud.net - github: https://github.com/paascloud - 操作手册: http://blog.paascloud.net/2018/06/10/paascloud/doc/ ### 架构图 ![项目架构图](http://img.paascloud.net/paascloud/doc/paascloud-project.png) ================================================ FILE: paascloud-common/paascloud-common-base/pom.xml ================================================ 4.0.0 com.liuzm.paascloud.common paascloud-common 1.0 paascloud-common-base UTF-8 UTF-8 1.8 io.springfox springfox-swagger2 ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/constant/AliyunMqTopicConstants.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AliyunMqTopicConstants.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.constant; import com.google.common.collect.Lists; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; /** * The class Aliyun mq topic constants. * * @author paascloud.net @gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class AliyunMqTopicConstants { /** * The enum Uac mq topic enum. * * @author paascloud.net @gmail.com */ public enum MqTopicEnum { /** * 发送短信. */ SEND_SMS_TOPIC("SEND_SMS_TOPIC", "发送短信"), /** * 发送邮件. */ SEND_EMAIL_TOPIC("SEND_EMAIL_TOPIC", "发送邮件"), /** * Tpc topic mq topic enum. */ TPC_TOPIC("TPC_TOPIC", "TPC_TOPIC"), /** * Opc topic mq topic enum. */ OPC_TOPIC("OPC_TOPIC", "OPC_TOPIC"), /** * Mdc topic mq topic enum. */ MDC_TOPIC("MDC_TOPIC", "MDC_TOPIC"),; MqTopicEnum(String topic, String topicName) { this.topic = topic; this.topicName = topicName; } /** * The Topic. */ String topic; /** * The Topic name. */ String topicName; /** * Gets topic. * * @return the topic */ public String getTopic() { return topic; } } /** * The enum Uac mq tag enum. * * @author paascloud.net @gmail.com */ public enum MqTagEnum { /** * 注册获取验证码. */ REGISTER_USER_AUTH_CODE("REGISTER_USER_AUTH_CODE", MqTopicEnum.SEND_SMS_TOPIC.getTopic(), "注册获取验证码"), /** * 修改密码获取验证码. */ MODIFY_PASSWORD_AUTH_CODE("MODIFY_PASSWORD_AUTH_CODE", MqTopicEnum.SEND_SMS_TOPIC.getTopic(), "修改密码获取验证码"), /** * 忘记密码获取验证码. */ FORGOT_PASSWORD_AUTH_CODE("FORGOT_PASSWORD_AUTH_CODE", MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), "忘记密码获取验证码"), /** * 激活用户. */ ACTIVE_USER("ACTIVE_USER", MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), "激活用户"), /** * 激活用户成功. */ ACTIVE_USER_SUCCESS("ACTIVE_USER_SUCCESS", MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), "激活用户成功"), /** * 重置密码 */ RESET_LOGIN_PWD("RESET_LOGIN_PWD", MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), "重置密码"), /** * 重置密码 */ RESET_USER_EMAIL("RESET_LOGIN_PWD", MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), "重置密码"), /** * 删除生产者历史消息 */ DELETE_PRODUCER_MESSAGE("DELETE_PRODUCER_MESSAGE", MqTopicEnum.TPC_TOPIC.getTopic(), "删除生产者历史消息"), /** * 删除消费者历史消息 */ DELETE_CONSUMER_MESSAGE("DELETE_CONSUMER_MESSAGE", MqTopicEnum.TPC_TOPIC.getTopic(), "删除消费者历史消息"), /** * 发送异常日志. */ SEND_DINGTALK_MESSAGE("SEND_EXCEPTION_LOG", MqTopicEnum.OPC_TOPIC.getTopic(), "发送异常日志"), /** * 更新附件信息. */ UPDATE_ATTACHMENT("UPDATE_ATTACHMENT", MqTopicEnum.MDC_TOPIC.getTopic(), "更新附件信息"), /** * 删除附件信息 */ DELETE_ATTACHMENT("DELETE_ATTACHMENT", MqTopicEnum.MDC_TOPIC.getTopic(), "删除附件信息"),; /** * The Tag. */ String tag; /** * The Topic. */ String topic; /** * The Tag name. */ String tagName; MqTagEnum(String tag, String topic, String tagName) { this.tag = tag; this.topic = topic; this.tagName = tagName; } /** * Gets tag. * * @return the tag */ public String getTag() { return tag; } /** * Gets topic. * * @return the topic */ public String getTopic() { return topic; } } /** * The class Consumer topics. * * @author paascloud.net @gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public static final class ConsumerTopics { /** * The constant OPT. */ public static final String OPT = buildOpcConsumerTopics(); /** * The constant UAC. */ public static final String UAC = buildUacConsumerTopics(); } private static String buildOpcConsumerTopics() { List topicObjList = new ArrayList<>(); Set sendSmsTagList = new HashSet<>(); sendSmsTagList.add(MqTagEnum.REGISTER_USER_AUTH_CODE.getTag()); Set sendEmailTagList = new HashSet<>(); sendEmailTagList.add(MqTagEnum.FORGOT_PASSWORD_AUTH_CODE.getTag()); sendEmailTagList.add(MqTagEnum.ACTIVE_USER.getTag()); sendEmailTagList.add(MqTagEnum.ACTIVE_USER_SUCCESS.getTag()); sendEmailTagList.add(MqTagEnum.RESET_LOGIN_PWD.getTag()); sendEmailTagList.add(MqTagEnum.RESET_USER_EMAIL.getTag()); topicObjList.add(new TopicObj(MqTopicEnum.SEND_SMS_TOPIC.getTopic(), sendSmsTagList)); topicObjList.add(new TopicObj(MqTopicEnum.SEND_EMAIL_TOPIC.getTopic(), sendEmailTagList)); Set deleteMessageTag = new HashSet<>(); deleteMessageTag.add(MqTagEnum.DELETE_CONSUMER_MESSAGE.getTag()); deleteMessageTag.add(MqTagEnum.DELETE_PRODUCER_MESSAGE.getTag()); topicObjList.add(new TopicObj(MqTopicEnum.TPC_TOPIC.getTopic(), deleteMessageTag)); Set mdcMqTag = new HashSet<>(); mdcMqTag.add(MqTagEnum.UPDATE_ATTACHMENT.getTag()); mdcMqTag.add(MqTagEnum.DELETE_ATTACHMENT.getTag()); topicObjList.add(new TopicObj(MqTopicEnum.MDC_TOPIC.getTopic(), mdcMqTag)); return buildOpcConsumerTopics(topicObjList); } private static String buildUacConsumerTopics() { List topicObjList = Lists.newArrayList(); Set deleteMessageTag = new HashSet<>(); deleteMessageTag.add(MqTagEnum.DELETE_CONSUMER_MESSAGE.getTag()); deleteMessageTag.add(MqTagEnum.DELETE_PRODUCER_MESSAGE.getTag()); topicObjList.add(new TopicObj(MqTopicEnum.TPC_TOPIC.getTopic(), deleteMessageTag)); return buildOpcConsumerTopics(topicObjList); } private static String buildOpcConsumerTopics(List topicList) { StringBuilder result = new StringBuilder(); if (!CollectionUtils.isEmpty(topicList)) { for (TopicObj topicObj : topicList) { String topic = topicObj.getTopic(); Set tagList = topicObj.getTagList(); if (StringUtils.isEmpty(topic) || CollectionUtils.isEmpty(topicList)) { continue; } StringBuilder tagInfo = new StringBuilder(); for (String tag : tagList) { tagInfo.append(tag).append(GlobalConstant.Symbol.PIPE); } trimEnd(tagInfo, GlobalConstant.Symbol.PIPE); result.append(topic).append(GlobalConstant.Symbol.AT).append(tagInfo).append(GlobalConstant.Symbol.COMMA); } } trimEnd(result, GlobalConstant.Symbol.COMMA); return result.toString(); } /** * The class Topic obj. * * @author paascloud.net @gmail.com */ static class TopicObj { private String topic; private Set tagList; /** * Instantiates a new Topic obj. * * @param topic the topic * @param tagList the tag list */ TopicObj(String topic, Set tagList) { this.topic = topic; this.tagList = tagList; } /** * Gets topic. * * @return the topic */ String getTopic() { return topic; } /** * Gets tag list. * * @return the tag list */ Set getTagList() { return tagList; } } private static void trimEnd(StringBuilder stringBuilder, String suffix) { if (null == stringBuilder) { return; } String str = stringBuilder.toString(); if (!StringUtils.isEmpty(suffix) && !str.endsWith(suffix)) { return; } stringBuilder.delete(str.length() - suffix.length(), str.length()); } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/constant/AliyunSmsConstants.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AliyunSmsConstants.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.constant; import com.google.common.collect.Lists; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import org.springframework.util.StringUtils; import java.util.Arrays; import java.util.List; /** * The class Aliyun sms constants. * * @author paascloud.net@gmail.com */ public class AliyunSmsConstants { /** * 短信模板枚举 */ public enum SmsTempletEnum { /** * 通用模板(短信内容:验证码${code}, 您正在注册成为paasCloud用户, 感谢您的支持!) */ UAC_PC_GLOBAL_TEMPLATE("UAC_PC_GLOBAL_TEMPLATE", "SMS_105115057", "code"),; private String busType; private String templetCode; private String smsParamName; public static SmsTempletEnum getEnum(String templateCode) { SmsTempletEnum smsTempletEnum = null; for (SmsTempletEnum ele : SmsTempletEnum.values()) { if (templateCode.equals(ele.getTempletCode())) { smsTempletEnum = ele; break; } } return smsTempletEnum; } public static boolean isSmsTemplate(String smsTemplateCode) { if (StringUtils.isEmpty(smsTemplateCode)) { throw new BusinessException(ErrorCodeEnum.UAC10011020); } List templetCodeList = getTemplateCodeList(); return templetCodeList.contains(smsTemplateCode); } public static List getList() { return Arrays.asList(SmsTempletEnum.values()); } public static List getTemplateCodeList() { List templetCodeList = Lists.newArrayList(); List list = getList(); for (SmsTempletEnum templetEnum : list) { if (StringUtils.isEmpty(templetEnum.getTempletCode())) { continue; } templetCodeList.add(templetEnum.getTempletCode()); } return templetCodeList; } SmsTempletEnum(String busType, String templetCode, String smsParamName) { this.busType = busType; this.templetCode = templetCode; this.smsParamName = smsParamName; } /** * Gets bus type. * * @return the bus type */ public String getBusType() { return busType; } /** * Gets templet code. * * @return the templet code */ public String getTempletCode() { return templetCode; } /** * Gets sms param name. * * @return the sms param name */ public String getSmsParamName() { return smsParamName; } } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/constant/GlobalConstant.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GlobalConstant.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.constant; /** * The class Global constant. * * @author paascloud.net@gmail.com */ public class GlobalConstant { /** * The constant FILE_MAX_SIZE. */ public static final long FILE_MAX_SIZE = 5 * 1024 * 1024; public static final String UNKNOWN = "unknown"; public static final String X_FORWARDED_FOR = "X-Forwarded-For"; public static final String X_REAL_IP = "X-Real-IP"; public static final String PROXY_CLIENT_IP = "Proxy-Client-IP"; public static final String WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP"; public static final String HTTP_CLIENT_IP = "HTTP_CLIENT_IP"; public static final String HTTP_X_FORWARDED_FOR = "HTTP_X_FORWARDED_FOR"; public static final String LOCALHOST_IP = "127.0.0.1"; public static final String LOCALHOST_IP_16 = "0:0:0:0:0:0:0:1"; public static final int MAX_IP_LENGTH = 15; public static final String DEV_PROFILE = "dev"; public static final String TEST_PROFILE = "test"; public static final String PRO_PROFILE = "pro"; public static final int TWO_INT = 2; public static final int M_SIZE = 1024; public static final String ROOT_PREFIX = "paascloud"; public static final int EXCEPTION_CAUSE_MAX_LENGTH = 2048; public static final int EXCEPTION_MESSAGE_MAX_LENGTH = 2048; public static final String ZK_REGISTRY_SERVICE_ROOT_PATH = "/paascloud/registry/service"; public static final String ZK_REGISTRY_ID_ROOT_PATH = "/paascloud/registry/id"; public static final String ZK_REGISTRY_PRODUCER_ROOT_PATH = "/paascloud/registry/producer"; public static final String ZK_REGISTRY_CONSUMER_ROOT_PATH = "/paascloud/registry/consumer"; public static final String ZK_REGISTRY_SEQ = "/paascloud/seq"; public interface Number { int THOUSAND_INT = 1000; int HUNDRED_INT = 100; int ONE_INT = 1; int TWO_INT = 2; int THREE_INT = 3; int FOUR_INT = 4; int FIVE_INT = 5; int SIX_INT = 6; int SEVEN_INT = 7; int EIGHT_INT = 8; int NINE_INT = 9; int TEN_INT = 10; int EIGHTEEN_INT = 18; } /** * 系统常量 */ public static final class Sys { private Sys() { } /** * 全局用户名 */ public static final String TOKEN_AUTH_DTO = "CURRENT_USER_DTO"; /** * 超级管理员的用户ID */ public static final Long SUPER_MANAGER_USER_ID = 1L; /** * 超级管理员的用户编号 */ public static final String SUPER_MANAGER_LOGIN_NAME = "admin"; /** * 超级管理员角色ID */ public static final Long SUPER_MANAGER_ROLE_ID = 1L; /** * 超级管理员组织ID */ public static final Long SUPER_MANAGER_GROUP_ID = 1L; /** * 运营工作台ID */ public static final Long OPER_APPLICATION_ID = 1L; /** * The constant MENU_ROOT. */ public static final String MENU_ROOT = "root"; /** * The constant DEFAULT_FILE_PATH. */ public static final String DEFAULT_FILE_PATH = "paascloud/file/"; /** * redis key default expire = 1MINUTES */ public static final long REDIS_DEFAULT_EXPIRE = 1L; } /** * The class Symbol. * * @author paascloud.net@gmail.com */ public static final class Symbol { private Symbol() { } /** * The constant COMMA. */ public static final String COMMA = ","; public static final String SPOT = "."; /** * The constant UNDER_LINE. */ public final static String UNDER_LINE = "_"; /** * The constant PER_CENT. */ public final static String PER_CENT = "%"; /** * The constant AT. */ public final static String AT = "@"; /** * The constant PIPE. */ public final static String PIPE = "||"; public final static String SHORT_LINE = "-"; public final static String SPACE = " "; public static final String SLASH = "/"; public static final String MH = ":"; } /** * The class Oss. * * @author paascloud.net@gmail.com */ public static final class Oss { private Oss() { } /** * The constant DEFAULT_FILE_PATH. */ public static final String DEFAULT_FILE_PATH = "/default/"; } /** * 图片压缩高度和宽度 */ public static final int IMAGE_WIDTH = 1920; /** * The constant IMAGE_HEIGHT. */ public static final int IMAGE_HEIGHT = 1280; /** * The constant Y. */ public static final Integer Y = 1; /** * The constant N. */ public static final Integer N = 0; /** * The enum Payment type enum. * * @author paascloud.net@gmail.com */ public enum PaymentTypeEnum { /** * Online pay payment type enum. */ ONLINE_PAY(1, "在线支付"); PaymentTypeEnum(int code, String value) { this.code = code; this.value = value; } private String value; private int code; /** * Gets value. * * @return the value */ public String getValue() { return value; } /** * Gets code. * * @return the code */ public int getCode() { return code; } /** * Code of payment type enum. * * @param code the code * * @return the payment type enum */ public static PaymentTypeEnum codeOf(int code) { for (PaymentTypeEnum paymentTypeEnum : values()) { if (paymentTypeEnum.getCode() == code) { return paymentTypeEnum; } } return null; } } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/BaseQuery.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BaseQuery.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import lombok.Data; import java.io.Serializable; /** * The class Base query. * * @author paascloud.net@gmail.com */ @Data public class BaseQuery implements Serializable { private static final long serialVersionUID = 3319698607712846427L; /** * 当前页 */ private Integer pageNum = 1; /** * 每页条数 */ private Integer pageSize = 10; /** * 排序 */ private String orderBy; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/BaseTree.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BaseTree.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class Base tree. * * @param the type parameter * @param the type parameter * * @author paascloud.net @gmail.com */ @Data public class BaseTree implements Serializable { private static final long serialVersionUID = -5703964834600572016L; /** * ID */ private ID id; /** * 父ID */ private ID pid; /** * 是否含有子节点 */ private boolean hasChild = false; /** * 子节点集合 */ private List children; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/BaseVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BaseVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; /** * The class Base vo. * * @author paascloud.net@gmail.com */ @ApiModel @Data public class BaseVo implements Serializable { private static final long serialVersionUID = -1695850022460957581L; private Long id; /** * 创建人 */ private String creator; /** * 创建人ID */ private Long creatorId; /** * 创建时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createdTime; /** * 最近操作人 */ private String lastOperator; /** * 最后操作人ID */ private Long lastOperatorId; /** * 更新时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/CheckValidDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CheckValidDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Check valid dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class CheckValidDto implements Serializable { private static final long serialVersionUID = 5178470476151416779L; /** * 校验的参数值 */ @ApiModelProperty(value = "校验参数值") private String validValue; /** * 参数类型(列) */ @ApiModelProperty(value = "参数类型") private String type; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/GaodeBaseDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GaodeBaseDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Gaode base dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel public class GaodeBaseDto implements Serializable{ private static final long serialVersionUID = 5894304327211503218L; /** * 状态 */ @ApiModelProperty(value = "状态") private String status; /** * 响应信息 */ @ApiModelProperty(value = "响应信息") private String info; /** * 响应编码 */ @ApiModelProperty(value = "响应编码") private String infocode; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/JobParameter.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:JobParameter.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import com.google.common.base.Preconditions; import java.io.Serializable; /** * The class Job task model. * * @author paascloud.net @gmail.com */ public class JobParameter implements Serializable { private static final long serialVersionUID = -610797345091216847L; /** * 每次查询数据量 */ private int fetchNum; /** * 取模条件 */ private String condition; /** * 取模条件 */ private String taskType; public int getFetchNum() { Preconditions.checkArgument(fetchNum != 0); return fetchNum; } public void setFetchNum(int fetchNum) { this.fetchNum = fetchNum; } public String getCondition() { return condition; } public void setCondition(String condition) { this.condition = condition; } public String getTaskType() { return taskType; } public void setTaskType(String taskType) { this.taskType = taskType; } @Override public String toString() { final StringBuilder sb = new StringBuilder("JobTaskParameter{"); sb.append("fetchNum=").append(fetchNum); sb.append(", condition='").append(condition).append('\''); sb.append(", taskType='").append(taskType).append('\''); sb.append('}'); return sb.toString(); } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/KvDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:KvDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import lombok.Data; import java.io.Serializable; /** * The class Kv dto. * * @author paascloud.net@gmail.com */ @Data public class KvDto implements Serializable { private static final long serialVersionUID = -7712636075929650779L; /** * Instantiates a new Kv dto. */ public KvDto() { } /** * Instantiates a new Kv dto. * * @param key the key * @param value the value */ public KvDto(K key, V value) { this.key = key; this.value = value; } /** * key */ private K key; /** * value */ private V value; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/LoginAuthDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:LoginAuthDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Login auth dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "登录人信息") public class LoginAuthDto implements Serializable { private static final long serialVersionUID = -1137852221455042256L; @ApiModelProperty(value = "用户ID") private Long userId; @ApiModelProperty(value = "登录名") private String loginName; @ApiModelProperty(value = "用户名") private String userName; @ApiModelProperty(value = "组织ID") private Long groupId; @ApiModelProperty(value = "组织名称") private String groupName; public LoginAuthDto() { } public LoginAuthDto(Long userId, String loginName, String userName) { this.userId = userId; this.loginName = loginName; this.userName = userName; } public LoginAuthDto(Long userId, String loginName, String userName, Long groupId, String groupName) { this.userId = userId; this.loginName = loginName; this.userName = userName; this.groupId = groupId; this.groupName = groupName; } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/MessageQueryDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MessageQueryDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; /** * The class Tpc message query dto. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @ApiModel public class MessageQueryDto extends BaseQuery { private static final long serialVersionUID = 3967075132487249652L; /** * messageKey */ @ApiModelProperty(value = "messageKey") private String messageKey; /** * messageTopic */ @ApiModelProperty(value = "messageTopic") private String messageTopic; /** * messageTag */ @ApiModelProperty(value = "messageTag") private String messageTag; /** * 发送状态 */ @ApiModelProperty(value = "发送状态") private String messageStatus; /** * PID */ @ApiModelProperty(value = "PID") private String producerGroup; /** * 消息类型 */ @ApiModelProperty(value = "消息类型") private String messageType; /** * 开始时间 */ @ApiModelProperty(value = "开始时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startQueryTime; /** * 结束时间 */ @ApiModelProperty(value = "结束时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endQueryTime; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/MqMessageDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqMessageDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import lombok.AllArgsConstructor; import lombok.Data; import java.io.Serializable; /** * The class Tpc message dto. * * @author paascloud.net @gmail.com */ @Data @AllArgsConstructor public class MqMessageDto implements Serializable { private static final long serialVersionUID = -995670498005087805L; /** * 消息key */ private String messageKey; /** * topic */ private String messageTopic; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/MqMessageVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqMessageVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Mq message vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class MqMessageVo extends BaseVo { private static final long serialVersionUID = 5440371083922622116L; /** * 消息key */ private String messageKey; /** * topic */ private String messageTopic; /** * tag */ private String messageTag; /** * 消息内容 */ private String messageBody; /** * 消息类型: 10 - 生产者 ; 20 - 消费者 */ private Integer messageType; /** * 顺序类型, 0有序 1无序 */ private int orderType; /** * 消息状态 */ private Integer status; /** * 延时级别 */ private int delayLevel; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/ShardingContextDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ShardingContextDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import lombok.Data; import lombok.NoArgsConstructor; /** * The class Sharding context dto. * * @author paascloud.net @gmail.com */ @Data @NoArgsConstructor public class ShardingContextDto { /** * The Sharding total count. */ int shardingTotalCount; /** * The Sharding item. */ int shardingItem; public ShardingContextDto(final int shardingTotalCount, final int shardingItem) { this.shardingTotalCount = shardingTotalCount; this.shardingItem = shardingItem; } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/UpdateStatusDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UpdateStatusDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Modify status dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "更改状态") public class UpdateStatusDto implements Serializable { private static final long serialVersionUID = 1494899235149813850L; /** * 角色ID */ @ApiModelProperty(value = "角色ID") private Long id; /** * 状态 */ @ApiModelProperty(value = "状态") private Integer status; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/dto/UserTokenDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UserTokenDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.dto; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; /** * The class Uac user token dto. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class UserTokenDto extends LoginAuthDto { private static final long serialVersionUID = 3136723742371575367L; private Long id; /** * 版本号 */ private Integer version; /** * 创建人 */ private String creator; /** * 创建人ID */ private Long creatorId; /** * 创建时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createdTime; /** * 最近操作人 */ private String lastOperator; /** * 最后操作人ID */ private Long lastOperatorId; /** * 更新时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; /** * 父ID */ private Long pid; /** * 登陆人Ip地址 */ private String loginIp; /** * 登录地址 */ private String loginLocation; /** * 操作系统 */ private String os; /** * 浏览器类型 */ private String browser; /** * 访问token */ private String accessToken; /** * 刷新token */ private String refreshToken; /** * 访问token的生效时间(秒) */ private Integer accessTokenValidity; /** * 刷新token的生效时间(秒) */ private Integer refreshTokenValidity; /** * 0 在线 10已刷新 20 离线 */ private Integer status; } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/enums/ErrorCodeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ErrorCodeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.enums; /** * The class Error code enum. * * @author paascloud.net @gmail.com */ public enum ErrorCodeEnum { /** * Gl 99990100 error code enum. */ GL99990100(9999100, "参数异常"), /** * Gl 99990401 error code enum. */ GL99990401(99990401, "无访问权限"), /** * Gl 000500 error code enum. */ GL99990500(500, "未知异常"), /** * Gl 000403 error code enum. */ GL99990403(9999403, "无权访问"), /** * Gl 000404 error code enum. */ GL9999404(9999404, "找不到指定资源"), /** * Gl 99990001 error code enum. */ GL99990001(99990001, "注解使用错误"), /** * Gl 99990002 error code enum. */ GL99990002(99990002, "微服务不在线,或者网络超时"), /** * Uac 10010001 error code enum. */ // 1001 用户中心 UAC10010001(10010001, "会话超时,请刷新页面重试"), /** * Uac 10010002 error code enum. */ UAC10010002(10010002, "TOKEN解析失败"), /** * Uac 10010003 error code enum. */ UAC10010003(10010003, "操作频率过快, 您的帐号已被冻结"), /** * Uac 10011001 error code enum. */ UAC10011001(10011001, "用户Id不能为空"), /** * Uac 10011002 error code enum. */ UAC10011002(10011002, "找不到用户,loginName=%s"), /** * Uac 10011003 error code enum. */ UAC10011003(10011003, "找不到用户,userId=%s"), /** * Uac 10011004 error code enum. */ UAC10011004(10011004, "找不到用户,email=%s"), /** * Uac 10011006 error code enum. */ UAC10011006(10012006, "手机号不能为空"), /** * Uac 10011007 error code enum. */ UAC10011007(10011007, "登录名不能为空"), /** * Uac 10011008 error code enum. */ UAC10011008(10011008, "新密码不能为空"), /** * Uac 10011009 error code enum. */ UAC10011009(10011009, "确认密码不能为空"), /** * Uac 10011010 error code enum. */ UAC10011010(10011010, "两次密码不一致"), /** * Uac 10011011 error code enum. */ UAC10011011(10011011, "用户不存在, userId=%s"), /** * Uac 10011012 error code enum. */ UAC10011012(10011012, "登录名已存在"), /** * Uac 10011013 error code enum. */ UAC10011013(10011013, "手机号已存在"), /** * Uac 10011014 error code enum. */ UAC10011014(10011014, "密码不能为空"), /** * Uac 10011016 error code enum. */ UAC10011016(10011016, "用户名或密码错误"), /** * Uac 10011017 error code enum. */ UAC10011017(10011017, "验证类型错误"), /** * Uac 10011018 error code enum. */ UAC10011018(10011018, "邮箱不能为空"), /** * Uac 10011019 error code enum. */ UAC10011019(10011019, "邮箱已存在"), /** * Uac 10011020 error code enum. */ UAC10011020(10011020, "短信模板不能为空"), /** * Uac 10011021 error code enum. */ UAC10011021(10011021, "发送短信验证码对象转换为json字符串失败"), /** * Uac 10011022 error code enum. */ UAC10011022(10011022, "发送短信验证码失败"), /** * Uac 10011023 error code enum. */ UAC10011023(10011023, "越权操作"), /** * Uac 10011024 error code enum. */ UAC10011024(10011024, "找不到绑定的用户, userId=%"), /** * Uac 10011025 error code enum. */ UAC10011025(10011025, "用户已存在, loginName=%"), /** * Uac 10011026 error code enum. */ UAC10011026(10011026, "更新用户失败, userId=%"), /** * Uac 10011027 error code enum. */ UAC10011027(10011027, "找不到用户,mobile=%s"), /** * Uac 10011028 error code enum. */ UAC10011028(10011028, "链接已失效"), /** * Uac 10011029 error code enum. */ UAC10011029(10011029, "重置密码失败"), /** * Uac 10011030 error code enum. */ UAC10011030(10011030, "激活失败, 链接已过期"), /** * Uac 10011031 error code enum. */ UAC10011031(10011031, "验证码超时, 请重新发送验证码"), /** * Uac 10011032 error code enum. */ UAC10011032(10011032, "邮箱不存在, loginName=%s,email=%s"), /** * Uac 10011033 error code enum. */ UAC10011033(10011033, "清空该用户常用菜单失败"), /** * Uac 10011034 error code enum. */ UAC10011034(10011034, "不允许操作admin用户"), /** * Uac 10011035 error code enum. */ UAC10011035(10011035, "原始密码输入错误"), /** * Uac 10011036 error code enum. */ UAC10011036(10011036, "新密码和原始密码不能相同"), /** * Uac 10011037 error code enum. */ UAC10011037(10011037, "修改用户失败,userId=%s"), /** * Uac 10011038 error code enum. */ UAC10011038(10011038, "激活用户失败,userId=%s"), /** * Uac 10011039 error code enum. */ UAC10011039(10011039, "验证token失败"), /** * Uac 10011040 error code enum. */ UAC10011040(10011040, "解析header失败"), /** * Uac 10011041 error code enum. */ UAC10011041(10011041, "页面已过期,请重新登录"), /** * Uac 10011042 error code enum. */ UAC10011042(10011042, "Cookie转码异常"), /** * Uac 10012001 error code enum. */ UAC10012001(10012001, "角色ID不能为空"), /** * Uac 10012002 error code enum. */ UAC10012002(10012002, "拥有的角色不允许禁用"), /** * Uac 10012003 error code enum. */ UAC10012003(10012003, "系统角色不能删除"), /** * Uac 10012004 error code enum. */ UAC10012004(10012004, "超级角色Id不能为空"), /** * Uac 10012005 error code enum. */ UAC10012005(10012005, "找不到角色信息,roleId=%s"), /** * Uac 10012006 error code enum. */ UAC10012006(10012006, "删除角色失败, roleId=%s"), /** * Uac 10012007 error code enum. */ UAC10012007(10012007, "批量删除角色失败, roleId=%s"), /** * Uac 10012008 error code enum. */ UAC10012008(10012008, "找不到绑定的角色, roleId=%s"), /** * Uac 10013001 error code enum. */ UAC10013001(10013001, "父菜单不存在,menuId=%s"), /** * Uac 10013002 error code enum. */ UAC10013002(10013002, "更新上级菜单失败,menuId=%s"), /** * Uac 10013003 error code enum. */ UAC10013003(10013003, "菜单不存在,menuId=%s"), /** * Uac 10013004 error code enum. */ UAC10013004(10013004, "启用菜单失败,menuId=%s"), /** * Uac 10013005 error code enum. */ UAC10013005(10013005, "禁用菜单失败,menuId=%s"), /** * Uac 10013006 error code enum. */ UAC10013006(10013006, "更新菜单状态失败,menuId=%s"), /** * Uac 10013007 error code enum. */ UAC10013007(10013007, "根菜单不能禁用"), /** * Uac 10013008 error code enum. */ UAC10013008(10013008, "删除菜单失败, menuId=%s"), /** * Uac 10013009 error code enum. */ UAC10013009(10013009, "请先分配菜单"), /** * Uac 10013010 error code enum. */ UAC10013010(10013010, "选择菜单不是根目录,menuId=%s"), /** * Uac 10014001 error code enum. */ UAC10014001(10014001, "找不到权限信息, actionId=%s"), /** * Uac 10014002 error code enum. */ UAC10014002(10014002, "删除失败, actionId=%s"), /** * Uac 10014003 error code enum. */ UAC10014003(10014003, "保存权限信息失败"), /** * Uac 10015001 error code enum. */ UAC10015001(10015001, "找不到组织信息,groupId=%s"), /** * Uac 10015002 error code enum. */ UAC10015002(10015002, "组织状态不存在"), /** * Uac 10015003 error code enum. */ UAC10015003(10015003, "操作越权, 启用子节点, 必须先启用父节点"), /** * Uac 10015004 error code enum. */ UAC10015004(10015004, "找不到组织信息,groupId=%s"), /** * Uac 10015006 error code enum. */ UAC10015006(10015006, "更新组织信息失败,groupId=%s"), /** * Uac 10015007 error code enum. */ UAC10015007(10015007, "该组织下还存在子节点,不能将其删除, Pid=%s"), /** * Uac 10015008 error code enum. */ UAC10015008(10015008, "该组织下绑定的用户,不能将其删除, groupId=%s"), /** * Uac 10015009 error code enum. */ UAC10015009(10015009, "找不到上级组织, groupId=%s"), /** * Mdc 10021001 error code enum. */ // 1002 数据中心 MDC10021001(10021001, "获取地址信息失败"), /** * Mdc 10021002 error code enum. */ MDC10021002(10021002, "找不到该地址信息"), /** * Mdc 10021003 error code enum. */ MDC10021003(10021003, "获取商品信息失败"), /** * Mdc 10021004 error code enum. */ MDC10021004(10021004, "找不到该商品信息,productId=%s"), /** * Mdc 10021015 error code enum. */ MDC10021015(10021015, "商品不是在线售卖状态, productId=%s"), /** * Mdc 10021016 error code enum. */ MDC10021016(10021016, "商品库存不足, productId=%s"), /** * Mdc 10021017 error code enum. */ MDC10021017(10021017, "产品已下架或者删除, productId=%s"), /** * Mdc 10021018 error code enum. */ MDC10021018(10021018, "找不到数据字典信息, dictId=%s"), /** * Mdc 10021019 error code enum. */ MDC10021019(10021019, "更新字典状态失败, dictId=%s"), /** * Mdc 10021020 error code enum. */ MDC10021020(10021020, "上级数据字典不存在, dictId=%s"), /** * Mdc 10021021 error code enum. */ MDC10021021(10021021, "商品ID不能为空"), /** * Mdc 10021024 error code enum. */ MDC10021024(10021024, "商品编码不能为空"), /** * Mdc 10023001 error code enum. */ MDC10023001(10023001, "找不到商品分类信息, categoryId=%s"), /** * Mdc 10023002 error code enum. */ MDC10023002(10023002, "上级商品分类不存在, categoryId=%s"), /** * Mdc 10023003 error code enum. */ MDC10023003(10023003, "更新商品分类状态失败, categoryId=%s"), /** * Mdc 10021022 error code enum. */ MDC10021022(10021022, "更新商品信息失败, productId=%s"), /** * Mdc 10021023 error code enum. */ MDC10021023(10021023, "删除商品信息失败, productId=%s"), /** * Omc 10031001 error code enum. */ // 1003 订单中心 OMC10031001(10031001, "购物车为空, userId=%s"), /** * Omc 10031002 error code enum. */ OMC10031002(10031002, "生成订单失败"), /** * Omc 10031003 error code enum. */ OMC10031003(10031003, "该用户此订单不存在"), /** * Omc 10031004 error code enum. */ OMC10031004(10031004, "已付款, 无法取消订单"), /** * Omc 10031005 error code enum. */ OMC10031005(10031005, "找不到订单信息, orderNo=%s"), /** * Omc 10031006 error code enum. */ OMC10031006(10031006, "清空购物车失败"), /** * Omc 10031007 error code enum. */ OMC10031007(10031007, "不存在默认地址"), /** * Omc 10031008 error code enum. */ OMC10031008(10031008, "更新默认地址失败, addressId=%s"), /** * Omc 10031009 error code enum. */ OMC10031009(10031009, "批量插入订单明细失败"), /** * Omc 10031010 error code enum. */ OMC10031010(10031010, "非快乐学习网的订单, 回调忽略"), /** * Omc 10031011 error code enum. */ OMC10031011(10031011, "支付宝重复调用"), /** * Omc 10031012 error code enum. */ OMC10031012(10031012, "上传失败"), /** * Omc 10031013 error code enum. */ OMC10031013(10031013, "获取附件地址失败"), /** * Omc 10031014 error code enum. */ OMC10031014(10031014, "更新购物车数据失败, cartId=%s"), /** * Omc 10031016 error code enum. */ OMC10031016(10031016, "更新购物车数据失败, cartId=%s"), /** * Opc 10040001 error code enum. */ // 1004 对接中心 OPC10040001(10040001, "根据IP定位失败"), /** * Opc 10040002 error code enum. */ OPC10040002(10040002, "上传文件失败"), /** * Opc 10040003 error code enum. */ OPC10040003(10040003, "文件类型不符"), /** * Opc 10040004 error code enum. */ OPC10040004(10040004, "发送短信失败"), /** * Opc 10040005 error code enum. */ OPC10040005(10040005, "生成邮件消息体失败"), /** * Opc 10040006 error code enum. */ OPC10040006(10040006, "获取模板信息失败"), /** * Opc 10040007 error code enum. */ OPC10040007(10040007, "更新附件失败, id=%s"), /** * Opc 10040008 error code enum. */ OPC10040008(10040008, "找不到该附件信息, id=%s"), /** * Opc 10040009 error code enum. */ OPC10040009(10040009, "上传图片失败"), /** * Tpc 10050001 error code enum. */ OPC10040010(10040010, "文件名不能为空"), /** * Opc 10040011 error code enum. */ OPC10040011(10040011, "今日流量已用尽, 请明天再试"), /** * Tpc 10050001 error code enum. */ // 1005 任务中心 TPC10050001(10050001, "消息的消费Topic不能为空"), /** * Tpc 10050002 error code enum. */ TPC10050002(10050002, "根据消息key查找的消息为空"), /** * Tpc 10050003 error code enum. */ TPC10050003(10050003, "删除消息失败,messageKey=%s"), /** * Tpc 10050004 error code enum. */ TPC10050004(10050004, "消息中心接口异常,message=%s, messageKey=%s"), /** * Tpc 10050005 error code enum. */ TPC10050005(10050005, "目标接口参数不能为空"), /** * Tpc 10050006 error code enum. */ TPC10050006(10050006, "根据任务Id查找的消息为空"), /** * Tpc 10050007 error code enum. */ TPC10050007(10050007, "消息数据不能为空"), /** * Tpc 10050008 error code enum. */ TPC10050008(10050008, "消息体不能为空,messageKey=%s"), /** * Tpc 10050009 error code enum. */ TPC10050009(10050009, "消息KEY不能为空"), /** * Tpc 100500010 error code enum. */ TPC100500010(10050010, "Topic=%s, 无消费者订阅"), /** * Tpc 100500011 error code enum. */ TPC100500011(10050011, "Mq编码转换异常, MessageKey=%s"), /** * Tpc 100500012 error code enum. */ TPC100500012(10050012, "发送MQ失败, MessageKey=%s"), /** * Tpc 100500013 error code enum. */ TPC100500013(10050013, "延迟级别错误, Topic=%s, MessageKey=%s"), /** * Tpc 100500014 error code enum. */ TPC100500014(10050014, "MQ重试三次,仍然发送失败, Topic=%s, MessageKey=%s"), /** * Tpc 100500015 error code enum. */ TPC100500015(10050015, "消息PID不能为空, messageKey=%s"),; private int code; private String msg; /** * Msg string. * * @return the string */ public String msg() { return msg; } /** * Code int. * * @return the int */ public int code() { return code; } ErrorCodeEnum(int code, String msg) { this.code = code; this.msg = msg; } /** * Gets enum. * * @param code the code * * @return the enum */ public static ErrorCodeEnum getEnum(int code) { for (ErrorCodeEnum ele : ErrorCodeEnum.values()) { if (ele.code() == code) { return ele; } } return null; } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/exception/BooleanParseException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BooleanParseException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.exception; /** * The class Boolean parse exception. * * @author paascloud.net@gmail.com */ public class BooleanParseException extends RuntimeException { /** * Instantiates a new Boolean parse exception. */ public BooleanParseException() { super(); } /** * Instantiates a new Boolean parse exception. * * @param message the message */ public BooleanParseException(String message) { super(message); } /** * Instantiates a new Boolean parse exception. * * @param message the message * @param cause the cause */ public BooleanParseException(String message, Throwable cause) { super(message, cause); } /** * Instantiates a new Boolean parse exception. * * @param cause the cause */ public BooleanParseException(Throwable cause) { super(cause); } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/exception/BusinessException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BusinessException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.exception; import com.paascloud.base.enums.ErrorCodeEnum; import lombok.extern.slf4j.Slf4j; /** * 业务异常. * * @author paascloud.net @gmail.com */ @Slf4j public class BusinessException extends RuntimeException { /** * 异常码 */ protected int code; private static final long serialVersionUID = 3160241586346324994L; public BusinessException() { } public BusinessException(Throwable cause) { super(cause); } public BusinessException(String message) { super(message); } public BusinessException(String message, Throwable cause) { super(message, cause); } public BusinessException(int code, String message) { super(message); this.code = code; } public BusinessException(int code, String msgFormat, Object... args) { super(String.format(msgFormat, args)); this.code = code; } public BusinessException(ErrorCodeEnum codeEnum, Object... args) { super(String.format(codeEnum.msg(), args)); this.code = codeEnum.code(); } public int getCode() { return code; } public void setCode(int code) { this.code = code; } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/exception/ConfigException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ConfigException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.exception; /** * The class Config exception. * * @author paascloud.net@gmail.com */ public class ConfigException extends RuntimeException { private static final long serialVersionUID = 6480772904575978373L; /** * Instantiates a new Config exception. * * @param message the message */ public ConfigException(String message) { super(message); } /** * Instantiates a new Config exception. */ public ConfigException() { } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/exception/ImportException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ImportException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.exception; /** * The class Import exception. * * @author paascloud.net@gmail.com */ public class ImportException extends RuntimeException { private static final long serialVersionUID = -4740091660440744697L; /** * Instantiates a new Import exception. * * @param message the message */ public ImportException(String message) { super(message); } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/java/com/paascloud/base/exception/ReferenceModelNullException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ReferenceModelNullException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.base.exception; /** * The class Reference model null exception. * * @author paascloud.net@gmail.com */ public class ReferenceModelNullException extends RuntimeException { private static final long serialVersionUID = -318154770875589045L; /** * Instantiates a new Reference model null exception. * * @param message the message */ public ReferenceModelNullException(String message) { super(message); } } ================================================ FILE: paascloud-common/paascloud-common-base/src/main/resources/.gitkeep ================================================ ================================================ FILE: paascloud-common/paascloud-common-base/src/test/java/.gitkeep ================================================ ================================================ FILE: paascloud-common/paascloud-common-config/pom.xml ================================================ com.liuzm.paascloud.common paascloud-common 1.0 4.0.0 paascloud-common-config 1.0 org.springframework.boot spring-boot-configuration-processor true org.springframework.boot spring-boot com.liuzm.paascloud.common paascloud-common-base ================================================ FILE: paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/PaascloudCoreConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaascloudCoreConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.config; import com.paascloud.config.properties.PaascloudProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; /** * The class Aliyun core config. * * @author paascloud.net @gmail.com */ @Configuration @EnableConfigurationProperties(PaascloudProperties.class) public class PaascloudCoreConfig { } ================================================ FILE: paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/AliyunProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AliyunProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.config.properties; import lombok.Data; /** * The class Aliyun properties. * * @author paascloud.net @gmail.com */ @Data public class AliyunProperties { private AliyunKeyProperties key = new AliyunKeyProperties(); private RocketMqProperties rocketMq = new RocketMqProperties(); private AliyunSmsProperties sms = new AliyunSmsProperties(); @Data public class AliyunKeyProperties { /** * 秘钥id */ private String accessKeyId; /** * 秘钥 */ private String accessKeySecret; } @Data public class RocketMqProperties { private String consumerGroup; private String producerGroup; private String namesrvAddr; /** * 生产者是否使用可靠消息, 默认不使用 @MqConsumerStore */ private boolean reliableMessageProducer; /** * 消费者是否使用可靠消息, 默认不使用 @MqProducerStore */ private boolean reliableMessageConsumer; } @Data public class AliyunSmsProperties { /** * 阿里云管理控制台中配置的短信签名(状态必须是验证通过) */ private String signName; /** * 机房信息 */ private String regionId; /** * 端点 */ private String endpoint; /** * 端点名称 */ private String endpointName; private String product; private String domain; } } ================================================ FILE: paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/AsyncTaskProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AsyncTaskProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.config.properties; import lombok.Data; /** * The class Async task properties. * * @author paascloud.net @gmail.com */ @Data public class AsyncTaskProperties { private int corePoolSize = 50; private int maxPoolSize = 100; private int queueCapacity = 10000; private int keepAliveSeconds = 3000; private String threadNamePrefix = "paascloud-task-executor-"; } ================================================ FILE: paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/GaodeProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GaodeProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.config.properties; import lombok.Data; /** * The class Gaode properties. * * @author paascloud.net @gmail.com */ @Data public class GaodeProperties { private String key = "f8bdce6f882a98635bb0b7b897331327"; } ================================================ FILE: paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/JobProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:JobProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.config.properties; import lombok.Data; /** * The class Job core properties. * * @author paascloud.net @gmail.com */ @Data public class JobProperties { private JobTask task = new JobTask(); @Data public class JobTask { private JobCoreProperties dingTalk = new JobCoreProperties(); private JobCoreProperties sendingMessage = new JobCoreProperties(); private JobCoreProperties waitingMessage = new JobCoreProperties(); @Data public class JobCoreProperties { /** * 作业名称 */ private String jobName; /** * cron表达式,用于控制作业触发时间 */ private String cron; /** * 作业分片总数 */ private int shardingTotalCount; /** * 分片序列号和参数用等号分隔,多个键值对用逗号分隔,分片序列号从0开始,不可大于或等于作业分片总数如:0=a,1=b,2=c */ private String shardingItemParameters; /** * 作业自定义参数,可通过传递该参数为作业调度的业务方法传参,用于实现带参数的作业例:每次获取的数据量、作业实例从数据库读取的主键等 */ private String jobParameter; /** * 是否开启任务执行失效转移,开启表示如果作业在一次任务执行中途宕机,允许将该次未完成的任务在另一作业节点上补偿执行 */ private boolean failover; /** * 是否开启错过任务重新执行 */ private boolean misfire = true; /** * 作业描述信息 */ private String description; /** * 配置jobProperties定义的枚举控制Elastic-Job的实现细节JOB_EXCEPTION_HANDLER用于扩展异常处理类EXECUTOR_SERVICE_HANDLER用于扩展作业处理线程池类 */ private Enum jobProperties; } } } ================================================ FILE: paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/PaascloudProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaascloudProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.config.properties; import com.paascloud.base.constant.GlobalConstant; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; /** * The class Paascloud properties. * * @author paascloud.net @gmail.com */ @Data @ConfigurationProperties(prefix = GlobalConstant.ROOT_PREFIX) public class PaascloudProperties { private ReliableMessageProperties message = new ReliableMessageProperties(); private AliyunProperties aliyun = new AliyunProperties(); private AsyncTaskProperties task = new AsyncTaskProperties(); private SwaggerProperties swagger = new SwaggerProperties(); private QiniuProperties qiniu = new QiniuProperties(); private GaodeProperties gaode = new GaodeProperties(); private JobProperties job = new JobProperties(); private ZookeeperProperties zk = new ZookeeperProperties(); } ================================================ FILE: paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/QiniuProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:QiniuProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.config.properties; import lombok.Data; /** * The class Qiniu oss properties. * * @author paascloud.net@gmail.com */ @Data public class QiniuProperties { private QiniuKeyProperties key = new QiniuKeyProperties(); private QiniuOssProperties oss = new QiniuOssProperties(); @Data public class QiniuKeyProperties { private String accessKey; private String secretKey; } @Data public class QiniuOssProperties { private String privateHost; private String publicHost; private Long fileMaxSize; } } ================================================ FILE: paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/ReliableMessageProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ReliableMessageProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.config.properties; /** * The class Reliable message properties. * * @author paascloud.net @gmail.com */ public class ReliableMessageProperties { } ================================================ FILE: paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/SwaggerProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SwaggerProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.config.properties; import lombok.Data; /** * The class Async task properties. * * @author paascloud.net @gmail.com */ @Data public class SwaggerProperties { private String title; private String description; private String version = "1.0"; private String license = "Apache License 2.0"; private String licenseUrl = "http://www.apache.org/licenses/LICENSE-2.0"; private String contactName = "无痕"; private String contactUrl = "http://paascloud.net"; private String contactEmail = "paascloud.net@gmail.com"; } ================================================ FILE: paascloud-common/paascloud-common-config/src/main/java/com/paascloud/config/properties/ZookeeperProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ZookeeperProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.config.properties; import lombok.Data; /** * The class Job zookeeper properties. * * @author paascloud.net @gmail.com */ @Data public class ZookeeperProperties { /** * 连接Zookeeper服务器的列表 * 包括IP地址和端口号 * 多个地址用逗号分隔 * 如: host1:2181,host2:2181 */ private String zkAddressList; /** * Zookeeper的命名空间 */ private String namespace; /** * 等待重试的间隔时间的初始值 * 单位:毫秒 */ private int baseSleepTimeMilliseconds = 1000; /** * 等待重试的间隔时间的最大值 * 单位:毫秒 */ private int maxSleepTimeMilliseconds = 3000; /** * 最大重试次数 */ private int maxRetries = 3; /** * 连接超时时间 * 单位:毫秒 */ private int connectionTimeoutMilliseconds = 15000; /** * 会话超时时间 * 单位:毫秒 */ private int sessionTimeoutMilliseconds = 60000; /** * 连接Zookeeper的权限令牌 * 缺省为不需要权限验 */ private String digest; } ================================================ FILE: paascloud-common/paascloud-common-core/pom.xml ================================================ com.liuzm.paascloud.common paascloud-common 1.0 4.0.0 paascloud-common-core 1.0 org.springframework.cloud spring-cloud-starter-oauth2 com.liuzm.paascloud.common paascloud-common-base com.liuzm.paascloud.common paascloud-common-util tk.mybatis mapper com.google.guava guava org.aspectj aspectjweaver eu.bitwalker UserAgentUtils 1.20 org.mybatis mybatis 3.4.2 org.apache.rocketmq rocketmq-client org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-configuration-processor true com.fasterxml.jackson.module jackson-module-parameter-names com.fasterxml.jackson.datatype jackson-datatype-jdk8 com.fasterxml.jackson.datatype jackson-datatype-jsr310 com.liuzm.paascloud.common paascloud-common-config 1.0 io.jsonwebtoken jjwt com.arronlong.httpclientutil httpclientutil com.liuzm.paascloud.common paascloud-common-zk com.netflix.hystrix hystrix-core 1.5.10 ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/annotation/LogAnnotation.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:LogAnnotation.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.annotation; import com.paascloud.core.enums.LogTypeEnum; import java.lang.annotation.*; /** * 操作日志. * * @author paascloud.net@gmail.com */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface LogAnnotation { /** * 日志类型 * * @return the log type enum */ LogTypeEnum logType() default LogTypeEnum.OPERATION_LOG; /** * 是否保存请求的参数 * * @return the boolean */ boolean isSaveRequestData() default false; /** * 是否保存响应的结果 * * @return the boolean */ boolean isSaveResponseData() default false; } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/annotation/NotDisplaySql.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:NotDisplaySql.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.annotation; import java.lang.annotation.*; /** * 配合 SqlLogInterceptor 对指定方法 禁止打印SQL到控制台 * * @author paascloud.net @gmail.com */ @Target({ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface NotDisplaySql { } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/annotation/OperationLogDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OperationLogDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.annotation; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * The class Operation log dto. * * @author paascloud.net@gmail.com */ @Data public class OperationLogDto implements Serializable { private static final long serialVersionUID = -5606865665592482762L; private Long id; /** * 组织流水号 */ private Long groupId; /** * 组织名称 */ private String groupName; /** * 日志类型 */ private String logType; /** * 日志类型名称 */ private String logName; /** * 权限ID */ private Long actionId; /** * 权限编码 */ private String actionCode; /** * 权限名称 */ private String actionName; /** * 操作系统 */ private String os; /** * 浏览器类型 */ private String browser; /** * IP地址 */ private String ip; /** * 操作位置 */ private String location; /** * 物理地址 */ private String mac; /** * 详细描述 */ private String description; /** * 请求参数 */ private String requestData; /** * 请求地址 */ private String requestUrl; /** * 响应结果 */ private String responseData; /** * 类名 */ private String className; /** * 方法名 */ private String methodName; /** * 开始时间 */ private Date startTime; /** * 结束时间 */ private Date endTime; /** * 耗时,秒 */ private Long excuteTime; /** * 创建人 */ private String creator; /** * 创建人ID */ private Long creatorId; /** * 创建时间 */ private Date createdTime; /** * 最近操作人 */ private String lastOperator; /** * 最后操作人ID */ private Long lastOperatorId; /** * 更新时间 */ private Date updateTime; } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/annotation/ValidateAnnotation.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ValidateAnnotation.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.annotation; import java.lang.annotation.*; /** * The interface Validate annotation. * * @author paascloud.net@gmail.com */ @Target({ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ValidateAnnotation { /** * Is validate boolean. * * @return the boolean */ boolean isValidate() default true; } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/aspect/BindingResultAop.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BindingResultAop.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.aspect; import com.paascloud.core.annotation.ValidateAnnotation; 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 org.springframework.validation.BindingResult; import java.lang.annotation.Annotation; import java.lang.reflect.Method; /** * The class Binding result aop. * * @author paascloud.net@gmail.com */ @Component @Aspect @Slf4j public class BindingResultAop { /** * Validate annotation. */ @Pointcut("@annotation(com.paascloud.core.annotation.ValidateAnnotation)") public void validateAnnotation() { } /** * Do before. */ @Before("validateAnnotation()") public void doBefore() { } /** * Do after. * * @param joinPoint the join point */ @AfterReturning(pointcut = "validateAnnotation()") public void doAfter(final JoinPoint joinPoint) { String methodName = joinPoint.getSignature().getName(); Object target = joinPoint.getTarget(); //得到拦截的方法 Method method = getMethodByClassAndName(target.getClass(), methodName); Object[] objects = joinPoint.getArgs(); //方法的参数 assert method != null; ValidateAnnotation annotation = (ValidateAnnotation) getAnnotationByMethod(method, ValidateAnnotation.class); if (annotation != null) { BindingResult bindingResult = null; for (Object arg : objects) { if (arg instanceof BindingResult) { bindingResult = (BindingResult) arg; } } if (bindingResult != null && bindingResult.hasErrors()) { String errorInfo = bindingResult.getFieldError().getDefaultMessage(); throw new IllegalArgumentException(errorInfo); } } } /** * 根据目标方法和注解类型 得到该目标方法的指定注解 */ private Annotation getAnnotationByMethod(Method method, Class annoClass) { Annotation[] all = method.getAnnotations(); for (Annotation annotation : all) { if (annotation.annotationType() == annoClass) { return annotation; } } return null; } /** * 根据类和方法名得到方法 */ private Method getMethodByClassAndName(Class c, String methodName) { Method[] methods = c.getDeclaredMethods(); for (Method method : methods) { if (method.getName().equals(methodName)) { return method; } } return null; } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/aspect/LogAspect.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:LogAspect.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.aspect; import com.paascloud.JacksonUtil; import com.paascloud.PubUtils; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.annotation.OperationLogDto; import com.paascloud.core.utils.RequestUtil; import com.paascloud.wrapper.Wrapper; import eu.bitwalker.useragentutils.UserAgent; 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.core.task.TaskExecutor; import org.springframework.stereotype.Component; import org.springframework.web.client.RestTemplate; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.lang.reflect.Method; import java.util.Date; /** * The class Log aspect. * * @author paascloud.net@gmail.com */ @Slf4j @Aspect @Component public class LogAspect { private ThreadLocal threadLocal = new ThreadLocal<>(); @Resource private RestTemplate restTemplate; @Resource private TaskExecutor taskExecutor; private static final int MAX_SIZE = 2000; /** * Log annotation. */ @Pointcut("@annotation(com.paascloud.core.annotation.LogAnnotation)") public void logAnnotation() { } /** * Do before. */ @Before("logAnnotation()") public void doBefore() { this.threadLocal.set(new Date(System.currentTimeMillis())); } /** * Do after. * * @param joinPoint the join point * @param returnValue the return value */ @AfterReturning(pointcut = "logAnnotation()", returning = "returnValue") public void doAfter(final JoinPoint joinPoint, final Object returnValue) { if (returnValue instanceof Wrapper) { Wrapper result = (Wrapper) returnValue; if (!PubUtils.isNull(result) && result.getCode() == Wrapper.SUCCESS_CODE) { this.handleLog(joinPoint, result); } } } private void handleLog(final JoinPoint joinPoint, final Object result) { final Date startTime = this.threadLocal.get(); final Date endTime = new Date(System.currentTimeMillis()); HttpServletRequest request = RequestUtil.getRequest(); final UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); String requestURI = request.getRequestURI(); try { LogAnnotation relog = giveController(joinPoint); LoginAuthDto loginUser = RequestUtil.getLoginUser(); if (relog == null) { return; } //获取客户端操作系统 final String os = userAgent.getOperatingSystem().getName(); //获取客户端浏览器 final String browser = userAgent.getBrowser().getName(); final String ipAddress = RequestUtil.getRemoteAddr(request); OperationLogDto operationLogDto = new OperationLogDto(); operationLogDto.setClassName(joinPoint.getTarget().getClass().getName()); operationLogDto.setMethodName(joinPoint.getSignature().getName()); operationLogDto.setExcuteTime(endTime.getTime() - startTime.getTime()); operationLogDto.setStartTime(startTime); operationLogDto.setEndTime(endTime); operationLogDto.setIp(ipAddress); operationLogDto.setOs(os); operationLogDto.setBrowser(browser); operationLogDto.setRequestUrl(requestURI); operationLogDto.setGroupId(loginUser.getGroupId()); operationLogDto.setGroupName(loginUser.getGroupName()); operationLogDto.setCreatedTime(new Date()); operationLogDto.setCreator(loginUser.getUserName()); operationLogDto.setCreatorId(loginUser.getUserId()); operationLogDto.setLastOperator(loginUser.getUserName()); operationLogDto.setLastOperatorId(loginUser.getUserId()); operationLogDto.setLogType(relog.logType().getType()); operationLogDto.setLogName(relog.logType().getName()); getControllerMethodDescription(relog, operationLogDto, result, joinPoint); threadLocal.remove(); taskExecutor.execute(() -> this.restTemplate.postForObject("http://paascloud-provider-uac/auth/saveLog", operationLogDto, Integer.class)); } catch (Exception ex) { log.error("获取注解类出现异常={}", ex.getMessage(), ex); } } private void getControllerMethodDescription(LogAnnotation relog, OperationLogDto operationLog, Object result, JoinPoint joinPoint) { if (relog.isSaveRequestData()) { setRequestData(operationLog, joinPoint); } if (relog.isSaveResponseData()) { setResponseData(operationLog, result); } } private void setResponseData(OperationLogDto requestLog, Object result) { try { requestLog.setResponseData(String.valueOf(result)); } catch (Exception e) { log.error("获取响应数据,出现错误={}", e.getMessage(), e); } } private void setRequestData(OperationLogDto uacLog, JoinPoint joinPoint) { try { Object[] args = joinPoint.getArgs(); if (args.length == 0) { return; } Object[] parameter = new Object[args.length]; int index = 0; for (Object object : parameter) { if (object instanceof HttpServletRequest) { continue; } parameter[index] = object; index++; } String requestData = JacksonUtil.toJsonWithFormat(parameter); if (requestData.length() > MAX_SIZE) { requestData = requestData.substring(MAX_SIZE); } uacLog.setRequestData(requestData); } catch (Exception e) { log.error("获取响应数据,出现错误={}", e.getMessage(), e); } } /** * 是否存在注解, 如果存在就记录日志 */ private static LogAnnotation giveController(JoinPoint joinPoint) { Method[] methods = joinPoint.getTarget().getClass().getDeclaredMethods(); String methodName = joinPoint.getSignature().getName(); if (null != methods && 0 < methods.length) { for (Method met : methods) { LogAnnotation relog = met.getAnnotation(LogAnnotation.class); if (null != relog && methodName.equals(met.getName())) { return relog; } } } return null; } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/aspect/NotDisplaySqlAspect.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:NotDisplaySqlAspect.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.aspect; import com.paascloud.ThreadLocalMap; import org.aspectj.lang.annotation.After; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.annotation.Pointcut; import org.springframework.stereotype.Component; /** * The class Not display sql aspect. * * @author paascloud.net @gmail.com */ @Aspect @Component public class NotDisplaySqlAspect { /** * The constant DISPLAY_SQL. */ public static final String DISPLAY_SQL = "DISPLAY_SQL"; @Pointcut("@annotation(com.paascloud.core.annotation.NotDisplaySql)") private void myPointCut() { } /** * Before. */ @Before(value = "myPointCut()") public void before() { ThreadLocalMap.put(DISPLAY_SQL, Boolean.FALSE); } /** * After. */ @After(value = "myPointCut()") public void after() { ThreadLocalMap.remove(DISPLAY_SQL); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/AsyncTaskExecutorConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AsyncTaskExecutorConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.config; import com.paascloud.config.properties.PaascloudProperties; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.aop.interceptor.SimpleAsyncUncaughtExceptionHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.scheduling.annotation.AsyncConfigurer; import org.springframework.scheduling.annotation.EnableAsync; import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import javax.annotation.Resource; import java.util.concurrent.Executor; /** * The class Async config. * * @author paascloud.net @gmail.com */ @Configuration @EnableAsync @EnableScheduling public class AsyncTaskExecutorConfiguration implements AsyncConfigurer { private final Logger log = LoggerFactory.getLogger(getClass()); @Resource private PaascloudProperties paascloudProperties; @Override @Bean(name = "taskExecutor") public Executor getAsyncExecutor() { log.debug("Creating Async Task Executor"); ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(paascloudProperties.getTask().getCorePoolSize()); executor.setMaxPoolSize(paascloudProperties.getTask().getMaxPoolSize()); executor.setQueueCapacity(paascloudProperties.getTask().getQueueCapacity()); executor.setKeepAliveSeconds(paascloudProperties.getTask().getKeepAliveSeconds()); executor.setThreadNamePrefix(paascloudProperties.getTask().getThreadNamePrefix()); return new ExceptionHandlingAsyncTaskExecutor(executor); } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return new SimpleAsyncUncaughtExceptionHandler(); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/CoreConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CoreConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.config; import com.paascloud.core.interceptor.SqlLogInterceptor; import com.paascloud.core.interceptor.TokenInterceptor; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; import org.springframework.web.servlet.HandlerInterceptor; /** * 加载LWR规则. * * @author paascloud.net@gmail.com */ @Configuration public class CoreConfiguration { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } @Bean public SqlLogInterceptor sqlLogInterceptor() { return new SqlLogInterceptor(); } @Bean @ConditionalOnMissingBean(HandlerInterceptor.class) @ConditionalOnProperty(prefix = "paascloud.token.interceptor", name = "enable", havingValue = "true") public TokenInterceptor tokenInterceptor() { return new TokenInterceptor(); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/ExceptionHandlingAsyncTaskExecutor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ExceptionHandlingAsyncTaskExecutor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.config; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.core.task.AsyncTaskExecutor; import java.util.concurrent.Callable; import java.util.concurrent.Future; /** * The class Exception handling async task executor. * * @author paascloud.net @gmail.com */ @Slf4j public class ExceptionHandlingAsyncTaskExecutor implements AsyncTaskExecutor, InitializingBean, DisposableBean { private final AsyncTaskExecutor executor; /** * Instantiates a new Exception handling async task executor. * * @param executor the executor */ ExceptionHandlingAsyncTaskExecutor(AsyncTaskExecutor executor) { this.executor = executor; } /** * Execute. * * @param task the task */ @Override public void execute(Runnable task) { executor.execute(createWrappedRunnable(task)); } /** * Execute. * * @param task the task * @param startTimeout the start timeout */ @Override public void execute(Runnable task, long startTimeout) { executor.execute(createWrappedRunnable(task), startTimeout); } private Callable createCallable(final Callable task) { return () -> { try { return task.call(); } catch (Exception e) { handle(e); throw e; } }; } private Runnable createWrappedRunnable(final Runnable task) { return () -> { try { task.run(); } catch (Exception e) { handle(e); } }; } /** * Handle. * * @param e the e */ private void handle(Exception e) { log.error("Caught async exception", e); } /** * Submit future. * * @param task the task * * @return the future */ @Override public Future submit(Runnable task) { return executor.submit(createWrappedRunnable(task)); } /** * Submit future. * * @param the type parameter * @param task the task * * @return the future */ @Override public Future submit(Callable task) { return executor.submit(createCallable(task)); } /** * Destroy. * * @throws Exception the exception */ @Override public void destroy() throws Exception { if (executor instanceof DisposableBean) { DisposableBean bean = (DisposableBean) executor; bean.destroy(); } } /** * After properties set. * * @throws Exception the exception */ @Override public void afterPropertiesSet() throws Exception { if (executor instanceof InitializingBean) { InitializingBean bean = (InitializingBean) executor; bean.afterPropertiesSet(); } } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/PcObjectMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcObjectMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.config; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.module.SimpleModule; import com.fasterxml.jackson.databind.ser.std.ToStringSerializer; import com.fasterxml.jackson.datatype.jdk8.Jdk8Module; import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import com.fasterxml.jackson.module.paramnames.ParameterNamesModule; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; import java.util.List; /** * The class Pc object mapper. * * @author paascloud.net @gmail.com */ public class PcObjectMapper { private PcObjectMapper() { } public static void buidMvcMessageConverter(List> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter(); SimpleModule simpleModule = new SimpleModule(); simpleModule.addSerializer(Long.class, ToStringSerializer.instance); simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance); ObjectMapper objectMapper = new ObjectMapper() .registerModule(new ParameterNamesModule()) .registerModule(new Jdk8Module()) .registerModule(new JavaTimeModule()) .registerModule(simpleModule); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); jackson2HttpMessageConverter.setObjectMapper(objectMapper); converters.add(jackson2HttpMessageConverter); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/RedisConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RedisConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.config; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cache.interceptor.KeyGenerator; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheManager; 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; /** * The class Redis configuration. * * @author paascloud.net@gmail.com */ @Configuration @EnableCaching public class RedisConfiguration { /** * generator key generator. * * @return the key generator */ @Bean public KeyGenerator keyGenerator() { return (target, method, params) -> { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); }; } /** * Cache manager cache manager. * * @param redisTemplate the redis template * * @return the cache manager */ @Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { return new RedisCacheManager(redisTemplate); } @Bean public StringRedisSerializer stringRedisSerializer() { return new StringRedisSerializer(); } @Bean("redisTemplate") public RedisTemplate redisTemplate(RedisConnectionFactory factory) { RedisTemplate template = new RedisTemplate<>(); template.setConnectionFactory(factory); 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); template.setValueSerializer(jackson2JsonRedisSerializer); template.setKeySerializer(stringRedisSerializer()); template.afterPropertiesSet(); return template; } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/SwaggerConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SwaggerConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.config; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.config.properties.SwaggerProperties; import io.swagger.annotations.ApiOperation; import org.springframework.context.annotation.Bean; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.service.ApiKey; import springfox.documentation.service.AuthorizationScope; import springfox.documentation.service.Contact; import springfox.documentation.service.SecurityReference; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.service.contexts.SecurityContext; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; import javax.annotation.Resource; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * The class Swagger configuration. * * @author paascloud.net@gmail.com */ @EnableSwagger2 public class SwaggerConfiguration { @Resource private PaascloudProperties paascloudProperties; /** * Reservation api docket. * * @return the docket */ @Bean public Docket createRestApi() { //每次都需手动输入header信息 /* ParameterBuilder pb = new ParameterBuilder(); List pars = new ArrayList(); pb.name("Authorization").description("user access_token") .modelRef(new ModelRef("string")).parameterType("header") .required(true).build(); //header中的ticket参数非必填,传空也可以 pars.add(pb.build()); //根据每个方法名也知道当前方法在设置什么参数*/ return new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) .select() .apis(RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class)) .paths(PathSelectors.any()) .build() //配置鉴权信息 .securitySchemes(securitySchemes()) .securityContexts(securityContexts()) // .globalOperationParameters(pars) .enable(true); } private ApiInfo apiInfo() { SwaggerProperties swagger = paascloudProperties.getSwagger(); return new ApiInfoBuilder() .title(swagger.getTitle()) .description(swagger.getDescription()) .version(swagger.getVersion()) .license(swagger.getLicense()) .licenseUrl(swagger.getLicenseUrl()) .contact(new Contact(swagger.getContactName(), swagger.getContactUrl(), swagger.getContactEmail())) .build(); } private List securitySchemes() { return new ArrayList(Collections.singleton(new ApiKey("Authorization", "Authorization", "header"))); } private List securityContexts() { return new ArrayList( Collections.singleton(SecurityContext.builder() .securityReferences(defaultAuth()) .forPaths(PathSelectors.regex("^(?!auth).*$")) .build()) ); } private List defaultAuth() { AuthorizationScope authorizationScope = new AuthorizationScope("global", "accessEverything"); AuthorizationScope[] authorizationScopes = new AuthorizationScope[1]; authorizationScopes[0] = authorizationScope; return new ArrayList(Collections.singleton(new SecurityReference("Authorization", authorizationScopes))); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/config/ZookeeperInitRunner.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ZookeeperInitRunner.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.config; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.core.registry.RegistryCenterFactory; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.net.InetAddress; /** * The class Redis init runner. * * @author paascloud.net @gmail.com */ @Component @Order @Slf4j public class ZookeeperInitRunner implements CommandLineRunner { @Resource private PaascloudProperties paascloudProperties; @Value("${spring.application.name}") private String applicationName; /** * Run. * * @param args the args * * @throws Exception the exception */ @Override public void run(String... args) throws Exception { String hostAddress = InetAddress.getLocalHost().getHostAddress(); log.info("###ZookeeperInitRunner,init. HostAddress={}, applicationName={}", hostAddress, applicationName); RegistryCenterFactory.startup(paascloudProperties, hostAddress, applicationName); log.info("###ZookeeperInitRunner,finish<<<<<<<<<<<<<"); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/enums/LogTypeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:LogTypeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.enums; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.List; import java.util.Map; /** * The enum Log type enum. * * @author paascloud.net@gmail.com */ public enum LogTypeEnum { /** * 操作日志 */ OPERATION_LOG("10", "操作日志"), /** * 登录日志 */ LOGIN_LOG("20", "登录日志"), /** * 异常日志 */ EXCEPTION_LOG("30", "异常日志"); /** * The Type. */ String type; /** * The Name. */ String name; LogTypeEnum(String type, String name) { this.type = type; this.name = name; } /** * Gets type. * * @return the type */ public String getType() { return type; } /** * Gets name. * * @return the name */ public String getName() { return name; } /** * Gets name. * * @param type the type * * @return the name */ public static String getName(String type) { for (LogTypeEnum ele : LogTypeEnum.values()) { if (type.equals(ele.getType())) { return ele.getName(); } } return null; } /** * Gets enum. * * @param type the type * * @return the enum */ public static LogTypeEnum getEnum(String type) { for (LogTypeEnum ele : LogTypeEnum.values()) { if (type.equals(ele.getType())) { return ele; } } return LogTypeEnum.OPERATION_LOG; } /** * Gets list. * * @return the list */ public static List> getList() { List> list = Lists.newArrayList(); for (LogTypeEnum ele : LogTypeEnum.values()) { Map map = Maps.newHashMap(); map.put("key", ele.getType()); map.put("value", ele.getName()); list.add(map); } return list; } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/interceptor/CoreHeaderInterceptor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CoreHeaderInterceptor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.interceptor; import com.netflix.hystrix.strategy.concurrency.HystrixRequestContext; import com.netflix.hystrix.strategy.concurrency.HystrixRequestVariableDefault; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Arrays; import java.util.Collections; import java.util.List; /** * The class Core header interceptor. * * @author paascloud.net@gmail.com */ @Slf4j public class CoreHeaderInterceptor extends HandlerInterceptorAdapter { /** * The constant HEADER_LABEL. */ public static final String HEADER_LABEL = "x-label"; /** * The constant HEADER_LABEL_SPLIT. */ public static final String HEADER_LABEL_SPLIT = ","; /** * The constant LABEL. */ public static final HystrixRequestVariableDefault> LABEL = new HystrixRequestVariableDefault<>(); private static void initHystrixRequestContext(String labels) { log.info("LABEL={}", labels); if (!HystrixRequestContext.isCurrentThreadInitialized()) { HystrixRequestContext.initializeContext(); } if (!StringUtils.isEmpty(labels)) { CoreHeaderInterceptor.LABEL.set(Arrays.asList(labels.split(CoreHeaderInterceptor.HEADER_LABEL_SPLIT))); } else { CoreHeaderInterceptor.LABEL.set(Collections.emptyList()); } } private static void shutdownHystrixRequestContext() { if (HystrixRequestContext.isCurrentThreadInitialized()) { HystrixRequestContext.getContextForCurrentThread().shutdown(); } } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { CoreHeaderInterceptor.initHystrixRequestContext(request.getHeader(CoreHeaderInterceptor.HEADER_LABEL)); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) { CoreHeaderInterceptor.shutdownHystrixRequestContext(); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/interceptor/CoreHttpRequestInterceptor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CoreHttpRequestInterceptor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.interceptor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpRequest; import org.springframework.http.client.ClientHttpRequestExecution; import org.springframework.http.client.ClientHttpRequestInterceptor; import org.springframework.http.client.ClientHttpResponse; import org.springframework.http.client.support.HttpRequestWrapper; import org.springframework.util.StringUtils; import java.io.IOException; /** * The class Core http request interceptor. * * @author paascloud.net@gmail.com */ @Slf4j public class CoreHttpRequestInterceptor implements ClientHttpRequestInterceptor { /** * Intercept client http response. * * @param request the request * @param body the body * @param execution the execution * * @return the client http response * * @throws IOException the io exception */ @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { HttpRequestWrapper requestWrapper = new HttpRequestWrapper(request); String header = StringUtils.collectionToDelimitedString( CoreHeaderInterceptor.LABEL.get(), CoreHeaderInterceptor.HEADER_LABEL_SPLIT); log.info("header={} ", header); requestWrapper.getHeaders().add(CoreHeaderInterceptor.HEADER_LABEL, header); return execution.execute(requestWrapper, body); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/interceptor/SqlLogInterceptor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SqlLogInterceptor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.interceptor; import com.paascloud.ThreadLocalMap; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.core.aspect.NotDisplaySqlAspect; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.executor.Executor; import org.apache.ibatis.mapping.BoundSql; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.ParameterMapping; import org.apache.ibatis.plugin.*; import org.apache.ibatis.reflection.MetaObject; import org.apache.ibatis.session.Configuration; import org.apache.ibatis.session.ResultHandler; import org.apache.ibatis.session.RowBounds; import org.apache.ibatis.type.TypeHandlerRegistry; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.annotation.Order; import java.text.DateFormat; import java.util.*; /** * mybatis sql 拦截器 * 1.配合注解NotDisplaySql ,可以禁止指定的方法的SQL 不打印控制台。 * 2.SQL 执行时间超过 关注时间 noticeTime ,以error级别打印到控制台 * 使用时需要把mybatis logger级别设置为 INFO级别 * * @author paascloud.net @gmail.com */ @Intercepts({ @Signature(type = Executor.class, method = "update", args = {MappedStatement.class, Object.class}), @Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})}) @Slf4j @Order(1) public class SqlLogInterceptor implements Interceptor { @Value("${paascloud.enableSqlLogInterceptor}") private boolean enableSqlLogInterceptor; /** * 关注时间 单位秒,默认值 5 * 如果 执行SQL 超过时间 就会打印error 日志 */ private Double noticeTime = 5.0; /** * Intercept object. * * @param invocation the invocation * * @return the object * * @throws Throwable the throwable */ @Override public Object intercept(Invocation invocation) throws Throwable { long start = System.currentTimeMillis(); MappedStatement mappedStatement = (MappedStatement) invocation.getArgs()[0]; Object parameter = null; if (invocation.getArgs().length > 1) { parameter = invocation.getArgs()[1]; } BoundSql boundSql = mappedStatement.getBoundSql(parameter); Configuration configuration = mappedStatement.getConfiguration(); String sql = boundSql.getSql().replaceAll("[\\s]+", " "); List paramList = getParamList(configuration, boundSql); Object proceed = invocation.proceed(); int result = 0; if (proceed instanceof ArrayList) { ArrayList resultList = (ArrayList) proceed; result = resultList.size(); } if (proceed instanceof Integer) { result = (Integer) proceed; } if (enableSqlLogInterceptor) { long end = System.currentTimeMillis(); long time = end - start; Boolean flag = (Boolean) ThreadLocalMap.get(NotDisplaySqlAspect.DISPLAY_SQL); if (time >= noticeTime * GlobalConstant.Number.THOUSAND_INT) { log.error("执行超过{}秒,sql={}", noticeTime, sql); log.error("result={}, time={}ms, params={}", result, time, paramList); return proceed; } if (flag == null || Objects.equals(flag, true)) { log.info("sql={}", sql); log.info("result={},time={}ms, params={}", result, time, paramList); } } return proceed; } /** * Instantiates a new Sql log interceptor. */ public SqlLogInterceptor() { log.info("[打印SQL拦截器创建]noticeTime={}秒", noticeTime); } /** * 设置执行sql * * @param noticeTime 关注时间 ,如果执行sql超过关注时间,打印error日志. */ public SqlLogInterceptor(Double noticeTime) { this.noticeTime = noticeTime; log.info("[打印SQL拦截器创建]noticeTime={}秒", noticeTime); } /** * Plugin object. * * @param target the target * * @return the object */ @Override public Object plugin(Object target) { return Plugin.wrap(target, this); } /** * Sets properties. * * @param properties the properties */ @Override public void setProperties(Properties properties) { } /** * 获取sql参数集合。 * * @param configuration the configuration * @param boundSql the bound sql * * @return the param list */ private List getParamList(Configuration configuration, BoundSql boundSql) { Object parameterObject = boundSql.getParameterObject(); List parameterMappings = boundSql.getParameterMappings(); List params = new ArrayList<>(); if (parameterMappings.size() > 0 && parameterObject != null) { TypeHandlerRegistry typeHandlerRegistry = configuration.getTypeHandlerRegistry(); if (typeHandlerRegistry.hasTypeHandler(parameterObject.getClass())) { params.add(getParameterValue(parameterObject)); } else { MetaObject metaObject = configuration.newMetaObject(parameterObject); for (ParameterMapping parameterMapping : parameterMappings) { String propertyName = parameterMapping.getProperty(); if (metaObject.hasGetter(propertyName)) { Object obj = metaObject.getValue(propertyName); params.add(getParameterValue(obj)); } else if (boundSql.hasAdditionalParameter(propertyName)) { Object obj = boundSql.getAdditionalParameter(propertyName); params.add(getParameterValue(obj)); } } } } return params; } private String getParameterValue(Object obj) { String value; if (obj instanceof String) { value = "'" + obj.toString() + "'"; } else if (obj instanceof Date) { DateFormat formatter = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, DateFormat.DEFAULT, Locale.CHINA); value = "'" + formatter.format(obj) + "'"; } else { if (obj != null) { value = obj.toString(); } else { value = ""; } } return value; } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/interceptor/TokenInterceptor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TokenInterceptor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.interceptor; import com.paascloud.RedisKeyUtil; import com.paascloud.ThreadLocalMap; import com.paascloud.annotation.NoNeedAccessAuthentication; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UserTokenDto; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.annotation.AnnotationUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpHeaders; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.lang.reflect.Method; /** * The class Token interceptor. * * @author paascloud.net @gmail.com */ @Slf4j public class TokenInterceptor implements HandlerInterceptor { @Value("${paascloud.oauth2.jwtSigningKey}") private String jwtSigningKey; @Resource private RedisTemplate redisTemplate; private static final String OPTIONS = "OPTIONS"; private static final String AUTH_PATH1 = "/auth"; private static final String AUTH_PATH2 = "/oauth"; private static final String AUTH_PATH3 = "/error"; private static final String AUTH_PATH4 = "/api"; /** * After completion. * * @param request the request * @param response the response * @param arg2 the arg 2 * @param ex the ex * * @throws Exception the exception */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception ex) throws Exception { if (ex != null) { log.error("<== afterCompletion - 解析token失败. ex={}", ex.getMessage(), ex); this.handleException(response); } } /** * Post handle. * * @param request the request * @param response the response * @param arg2 the arg 2 * @param mv the mv */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView mv) { } /** * Pre handle boolean. * * @param request the request * @param response the response * @param handler the handler * * @return the boolean */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { String uri = request.getRequestURI(); log.info("<== preHandle - 权限拦截器. url={}", uri); if (uri.contains(AUTH_PATH1) || uri.contains(AUTH_PATH2) || uri.contains(AUTH_PATH3) || uri.contains(AUTH_PATH4)) { log.info("<== preHandle - 配置URL不走认证. url={}", uri); return true; } log.info("<== preHandle - 调试模式不走认证. OPTIONS={}", request.getMethod().toUpperCase()); if (OPTIONS.equalsIgnoreCase(request.getMethod())) { log.info("<== preHandle - 调试模式不走认证. url={}", uri); return true; } if (isHaveAccess(handler)) { log.info("<== preHandle - 不需要认证注解不走认证. token={}"); return true; } String token = StringUtils.substringAfter(request.getHeader(HttpHeaders.AUTHORIZATION), "Bearer "); log.info("<== preHandle - 权限拦截器. token={}", token); LoginAuthDto loginUser = (UserTokenDto) redisTemplate.opsForValue().get(RedisKeyUtil.getAccessTokenKey(token)); if (loginUser == null) { log.error("获取用户信息失败, 不允许操作"); return false; } log.info("<== preHandle - 权限拦截器. loginUser={}", loginUser); ThreadLocalMap.put(GlobalConstant.Sys.TOKEN_AUTH_DTO, loginUser); log.info("<== preHandle - 权限拦截器. url={}, loginUser={}", uri, loginUser); return true; } private void handleException(HttpServletResponse res) throws IOException { res.resetBuffer(); res.setHeader("Access-Control-Allow-Origin", "*"); res.setHeader("Access-Control-Allow-Credentials", "true"); res.setContentType("application/json"); res.setCharacterEncoding("UTF-8"); res.getWriter().write("{\"code\":100009 ,\"message\" :\"解析token失败\"}"); res.flushBuffer(); } private boolean isHaveAccess(Object handler) { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); NoNeedAccessAuthentication responseBody = AnnotationUtils.findAnnotation(method, NoNeedAccessAuthentication.class); return responseBody != null; } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/mq/MqMessage.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqMessage.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.mq; import com.google.common.base.Preconditions; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.Message; import org.apache.rocketmq.remoting.common.RemotingHelper; import org.slf4j.Logger; import org.springframework.util.StringUtils; import java.io.Serializable; import java.io.UnsupportedEncodingException; /** * The class Mq message. * * @author paascloud.net@gmail.com */ @Slf4j @Data @ApiModel("消息队列") public class MqMessage implements Serializable { private static final long serialVersionUID = 9215900048842983997L; @ApiModelProperty("主题") private String topic; @ApiModelProperty("标签") private String tag; @ApiModelProperty("唯一键") private String key; @ApiModelProperty("消息体") private String body; /** * Check message message. * * @param mqMessage the mq message * * @return the message */ public static Message checkMessage(MqMessage mqMessage) { String topic = mqMessage.getTopic(); String key = mqMessage.getKey(); String body = mqMessage.getBody(); String tag = mqMessage.getTag(); printCheckMessageLog(topic, key, body, tag); checkMessage(topic, key, body); return buildMessage(body, topic, tag, key); } private static void printCheckMessageLog(final String topic, final String key, final String body, final String tag) { log.info("checkMessage - 校验MQ body={}, topic={}, tag={}, key={}", body, topic, tag, key); } /** * Check message message. * * @param body the body * @param topic the topic * @param tag the tag * @param key the key * * @return the message */ public static Message checkMessage(String body, String topic, String tag, String key) { printCheckMessageLog(topic, key, body, tag); checkMessage(topic, key, body); return buildMessage(body, topic, tag, key); } /** * Check message message. * * @param message the message * * @return the message */ public static Message checkMessage(Message message) { String body = new String(message.getBody()); String topic = message.getTopic(); String key = message.getKeys(); String tag = message.getTags(); printCheckMessageLog(topic, key, body, tag); checkMessage(topic, key, body); return buildMessage(body, topic, tag, key); } /** * Instantiates a new Mq message. * * @param message the message */ public MqMessage(Message message) { this.body = new String(message.getBody()); this.topic = message.getTopic(); this.key = message.getKeys(); this.tag = message.getTags(); } private static Message buildMessage(String body, String topic, String tag, String key) { Message message = new Message(); try { message.setBody(body.getBytes(RemotingHelper.DEFAULT_CHARSET)); } catch (UnsupportedEncodingException e) { log.error("编码转换,出现异常={}", e.getMessage(), e); throw new BusinessException(ErrorCodeEnum.TPC100500011); } message.setKeys(key); message.setTopic(topic); message.setTags(tag); return message; } /** * Instantiates a new Mq message. * * @param topic the topic * @param tag the tag * @param key the key * @param body the body */ public MqMessage(String topic, String tag, String key, String body) { this.topic = topic; this.tag = tag; this.key = key; this.body = body; } /** * Check message. * * @param topic the topic * @param key the key * @param body the body */ public static void checkMessage(String topic, String key, String body) { Preconditions.checkArgument(!StringUtils.isEmpty(topic), "发送消息失败, 消息主题不能为空"); Preconditions.checkArgument(!StringUtils.isEmpty(key), "发送消息失败, 消息关键字不能为空"); Preconditions.checkArgument(!StringUtils.isEmpty(body), "发送消息失败, 消息体不能为空"); } /** * Print producer result. * * @param sendResult the send result * @param logger the logger */ public static void printProducerResult(SendResult sendResult, Logger logger) { if (sendResult != null) { logger.info("sendSimpleMessage - 发送MQ [OK]sendResult={}", sendResult); } else { logger.info("sendSimpleMessage - 发送MQ [FAIL]"); } } /** * Print producer exception. * * @param topic the topic * @param tag the tag * @param key the key * @param logger the logger * @param e the e */ public static void printProducerException(String topic, String tag, String key, Logger logger, Exception e) { logger.error("sendSimpleMessage - 发送MQ [FAIL] topic={}, tag={}, key={}", topic, tag, key, e); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/mybatis/BaseEntity.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BaseEntity.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.mybatis; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonIgnore; import com.paascloud.base.dto.LoginAuthDto; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.io.Serializable; import java.util.Date; /** * The class Base entity. * * @author paascloud.net@gmail.com */ @Data public class BaseEntity implements Serializable { private static final long serialVersionUID = 2393269568666085258L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 版本号 */ private Integer version; /** * 创建人 */ private String creator; /** * 创建人ID */ @Column(name = "creator_id") private Long creatorId; /** * 创建时间 */ @Column(name = "created_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createdTime; /** * 最近操作人 */ @Column(name = "last_operator") private String lastOperator; /** * 最后操作人ID */ @Column(name = "last_operator_id") private Long lastOperatorId; /** * 更新时间 */ @Column(name = "update_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date updateTime; @Transient private Integer pageNum; @Transient private Integer pageSize; @Transient private String orderBy; /** * Is new boolean. * * @return the boolean */ @Transient @JsonIgnore public boolean isNew() { return this.id == null; } /** * Sets update info. * * @param user the user */ @Transient @JsonIgnore public void setUpdateInfo(LoginAuthDto user) { if (isNew()) { this.creatorId = (this.lastOperatorId = user.getUserId()); this.creator = user.getUserName(); this.createdTime = (this.updateTime = new Date()); } this.lastOperatorId = user.getUserId(); this.lastOperator = user.getUserName() == null ? user.getLoginName() : user.getUserName(); this.updateTime = new Date(); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/mybatis/MyMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MyMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.mybatis; import tk.mybatis.mapper.common.Mapper; import tk.mybatis.mapper.common.MySqlMapper; /** * The interface My mapper. * * @param the type parameter @author paascloud.net@gmail.com */ public interface MyMapper extends Mapper, MySqlMapper { } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/AbstractTreeService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AbstractTreeService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.support; import com.google.common.collect.Lists; import com.paascloud.PublicUtil; import com.paascloud.base.dto.BaseTree; import java.io.Serializable; import java.util.List; import java.util.Objects; /** * The class Tree service. * * @param the type parameter * @param the type parameter * * @author paascloud.net @gmail.com */ public abstract class AbstractTreeService, ID extends Serializable> implements ITree { /** * Gets child tree objects. * * @param list the list * @param parentId the parent id * * @return the child tree objects */ @Override public List getChildTreeObjects(List list, ID parentId) { List returnList = Lists.newArrayList(); for (T res : list) { if (res.getPid() == null) { continue; } if (Objects.equals(res.getPid(), parentId)) { recursionFn(list, res); returnList.add(res); } } return returnList; } /** * 递归列表 * * @param list the list * @param t the t */ @Override public void recursionFn(List list, T t) { List children = getChildList(list, t); if (PublicUtil.isNotEmpty(children)) { t.setChildren(children); t.setHasChild(true); } for (T nextChild : children) { // 下一个对象,与所有的资源集进行判断 if (hasChild(list, nextChild)) { // 有下一个子节点,递归 for (T node : children) { // 所有的对象--跟当前这个childList 的对象子节点 recursionFn(list, node); } nextChild.setHasChild(true); } } } /** * 获得指定节点下的所有子节点 * * @param list the list * @param t the t * * @return the child list */ @Override public List getChildList(List list, T t) { List childList = Lists.newArrayList(); for (T child : list) { if (PublicUtil.isEmpty(child.getPid())) { continue; } // 判断集合的父ID是否等于上一级的id if (Objects.equals(child.getPid(), t.getId())) { childList.add(child); } } return childList; } /** * 判断是否还有下一个子节点 * * @param list the list * @param t the t * * @return the boolean */ @Override public boolean hasChild(List list, T t) { return !getChildList(list, t).isEmpty(); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/BaseController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BaseController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.support; import com.paascloud.PublicUtil; import com.paascloud.ThreadLocalMap; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import com.paascloud.core.generator.IncrementIdGenerator; import com.paascloud.core.generator.UniqueIdGenerator; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * The class Base controller. * * @author paascloud.net@gmail.com */ public class BaseController { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * Gets login auth dto. * * @return the login auth dto */ protected LoginAuthDto getLoginAuthDto() { LoginAuthDto loginAuthDto = (LoginAuthDto) ThreadLocalMap.get(GlobalConstant.Sys.TOKEN_AUTH_DTO); if (PublicUtil.isEmpty(loginAuthDto)) { throw new BusinessException(ErrorCodeEnum.UAC10011041); } return loginAuthDto; } /** * Handle result wrapper. * * @param the type parameter * @param result the result * * @return the wrapper */ protected Wrapper handleResult(T result) { boolean flag = isFlag(result); if (flag) { return WrapMapper.wrap(Wrapper.SUCCESS_CODE, "操作成功", result); } else { return WrapMapper.wrap(Wrapper.ERROR_CODE, "操作失败", result); } } /** * Handle result wrapper. * * @param the type parameter * @param result the result * @param errorMsg the error msg * * @return the wrapper */ protected Wrapper handleResult(E result, String errorMsg) { boolean flag = isFlag(result); if (flag) { return WrapMapper.wrap(Wrapper.SUCCESS_CODE, "操作成功", result); } else { return WrapMapper.wrap(Wrapper.ERROR_CODE, errorMsg, result); } } private boolean isFlag(Object result) { boolean flag; if (result instanceof Integer) { flag = (Integer) result > 0; } else if (result instanceof Boolean) { flag = (Boolean) result; } else { flag = PublicUtil.isNotEmpty(result); } return flag; } protected long generateId() { return UniqueIdGenerator.getInstance(IncrementIdGenerator.getServiceId()).nextId(); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/BaseService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BaseService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.support; import com.paascloud.base.exception.BusinessException; import com.paascloud.core.generator.IncrementIdGenerator; import com.paascloud.core.generator.UniqueIdGenerator; import org.apache.ibatis.session.RowBounds; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import tk.mybatis.mapper.common.Mapper; import java.util.List; /** * The class Base service. * * @param the type parameter * * @author paascloud.net@gmail.com */ public abstract class BaseService implements IService { /** * The Logger. */ protected final Logger logger = LoggerFactory.getLogger(this.getClass()); /** * The Mapper. */ @Autowired protected Mapper mapper; /** * Gets mapper. * * @return the mapper */ public Mapper getMapper() { return mapper; } /** * Select list. * * @param record the record * * @return the list */ @Override public List select(T record) { return mapper.select(record); } /** * Select by key t. * * @param key the key * * @return the t */ @Override public T selectByKey(Object key) { return mapper.selectByPrimaryKey(key); } /** * Select all list. * * @return the list */ @Override public List selectAll() { return mapper.selectAll(); } /** * Select one t. * * @param record the record * * @return the t */ @Override public T selectOne(T record) { return mapper.selectOne(record); } /** * Select count int. * * @param record the record * * @return the int */ @Override public int selectCount(T record) { return mapper.selectCount(record); } /** * Select by example list. * * @param example the example * * @return the list */ @Override public List selectByExample(Object example) { return mapper.selectByExample(example); } /** * Save int. * * @param record the record * * @return the int */ @Override public int save(T record) { return mapper.insertSelective(record); } /** * Batch save int. * * @param list the list * * @return the int */ @Override public int batchSave(List list) { int result = 0; for (T record : list) { int count = mapper.insertSelective(record); result += count; } return result; } /** * Update int. * * @param entity the entity * * @return the int */ @Override public int update(T entity) { return mapper.updateByPrimaryKeySelective(entity); } /** * Delete int. * * @param record the record * * @return the int */ @Override public int delete(T record) { return mapper.delete(record); } /** * Delete by key int. * * @param key the key * * @return the int */ @Override public int deleteByKey(Object key) { return mapper.deleteByPrimaryKey(key); } /** * Batch delete int. * * @param list the list * * @return the int */ @Override public int batchDelete(List list) { int result = 0; for (T record : list) { int count = mapper.delete(record); if (count < 1) { logger.error("删除数据失败"); throw new BusinessException("删除数据失败!"); } result += count; } return result; } /** * Select count by example int. * * @param example the example * * @return the int */ @Override public int selectCountByExample(Object example) { return mapper.selectCountByExample(example); } /** * Update by example int. * * @param record the record * @param example the example * * @return the int */ @Override public int updateByExample(T record, Object example) { return mapper.updateByExampleSelective(record, example); } /** * Delete by example int. * * @param example the example * * @return the int */ @Override public int deleteByExample(Object example) { return mapper.deleteByPrimaryKey(example); } /** * Select by row bounds list. * * @param record the record * @param rowBounds the row bounds * * @return the list */ @Override public List selectByRowBounds(T record, RowBounds rowBounds) { return mapper.selectByRowBounds(record, rowBounds); } /** * Select by example and row bounds list. * * @param example the example * @param rowBounds the row bounds * * @return the list */ @Override public List selectByExampleAndRowBounds(Object example, RowBounds rowBounds) { return mapper.selectByExampleAndRowBounds(example, rowBounds); } protected long generateId() { return UniqueIdGenerator.getInstance(IncrementIdGenerator.getServiceId()).nextId(); } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/IService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:IService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.support; import org.apache.ibatis.annotations.Param; import org.apache.ibatis.session.RowBounds; import org.springframework.transaction.annotation.Transactional; import java.util.List; /** * 通用接口 * * @param the type parameter @author paascloud.net@gmail.com * * @author paascloud.net@gmail.com */ public interface IService { /** * 根据实体中的属性值进行查询, 查询条件使用等号 @param record the record * * @param record the record * * @return the list */ List select(T record); /** * 根据主键字段进行查询, 方法参数必须包含完整的主键属性, 查询条件使用等号 @param key the key * * @param key the key * * @return the t */ T selectByKey(Object key); /** * 查询全部结果, select(null)方法能达到同样的效果 @return the list * * @return the list */ List selectAll(); /** * 根据实体中的属性进行查询, 只能有一个返回值, 有多个结果是抛出异常, 查询条件使用等号 @param record the record * * @param record the record * * @return the t */ T selectOne(T record); /** * 根据实体中的属性查询总数, 查询条件使用等号 @param record the record * * @param record the record * * @return the int */ int selectCount(T record); /** * 保存一个实体, null的属性不会保存, 会使用数据库默认值 @param record the record * * @param record the record * * @return the int */ int save(T record); /** * 批量保存 @param list the list * * @param list the list * * @return the int */ @Transactional(rollbackFor = Exception.class) int batchSave(List list); /** * 根据主键更新属性不为null的值 @param entity the entity * * @param entity the entity * * @return the int */ int update(T entity); /** * 根据实体属性作为条件进行删除, 查询条件使用等号 @param record the record * * @param record the record * * @return the int */ int delete(T record); /** * 批量删除 @param list the list * * @param list the list * * @return the int */ @Transactional(rollbackFor = Exception.class) int batchDelete(List list); /** * 根据主键字段进行删除, 方法参数必须包含完整的主键属性 @param key the key * * @param key the key * * @return the int */ int deleteByKey(Object key); /** * 这个查询支持通过Example类指定查询列, 通过selectProperties方法指定查询列 @param example the example * * @param example the example * * @return the list */ List selectByExample(Object example); /** * 根据Example条件进行查询总数 @param example the example * * @param example the example * * @return the int */ int selectCountByExample(Object example); /** * 根据Example条件更新实体record包含的不是null的属性值 @param record the record * * @param record the record * @param example the example * * @return the int */ int updateByExample(@Param("record") T record, @Param("example") Object example); /** * 根据Example条件删除数据 @param example the example * * @param example the example * * @return the int */ int deleteByExample(Object example); /** * 根据实体属性和RowBounds进行分页查询 @param record the record * * @param record the record * @param rowBounds the row bounds * * @return the list */ List selectByRowBounds(T record, RowBounds rowBounds); /** * 根据example条件和RowBounds进行分页查询 @param example the example * * @param example the example * @param rowBounds the row bounds * * @return the list */ List selectByExampleAndRowBounds(Object example, RowBounds rowBounds); } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/ITree.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ITree.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.support; import com.paascloud.base.dto.BaseTree; import java.io.Serializable; import java.util.List; /** * The interface Tree interface. * * @param the type parameter * @param the type parameter * * @author paascloud.net @gmail.com */ public interface ITree, ID extends Serializable> { /** * 获得指定节点下所有归档 * * @param list the list * @param parentId the parent id * * @return the child tree objects */ List getChildTreeObjects(List list, ID parentId); /** * 递归列表 * * @param list the list * @param t the t */ void recursionFn(List list, T t); /** * 获得指定节点下的所有子节点 * * @param list the list * @param t the t * * @return the child list */ List getChildList(List list, T t); /** * 判断是否还有下一个子节点 * * @param list the list * @param t the t * * @return the boolean */ boolean hasChild(List list, T t); } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/SpringContextHolder.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SpringContextHolder.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.support; import org.springframework.beans.BeansException; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.stereotype.Component; /** * The class Spring context holder. * * @author paascloud.net @gmail.com */ @Component public class SpringContextHolder implements ApplicationContextAware { private static ApplicationContext applicationContext; /** * Sets application context. * * @param applicationContext the application context * * @throws BeansException the beans exception */ @Override public void setApplicationContext(ApplicationContext applicationContext) { SpringContextHolder.applicationContext = applicationContext; } /** * Gets application context. * * @return the application context */ public static ApplicationContext getApplicationContext() { assertApplicationContext(); return applicationContext; } /** * Gets bean. * * @param the type parameter * @param beanName the bean name * * @return the bean */ public static T getBean(String beanName) { assertApplicationContext(); return (T) applicationContext.getBean(beanName); } /** * Gets bean. * * @param the type parameter * @param requiredType the required type * * @return the bean */ public static T getBean(Class requiredType) { assertApplicationContext(); return applicationContext.getBean(requiredType); } public static DefaultListableBeanFactory getDefaultListableBeanFactory() { assertApplicationContext(); return (DefaultListableBeanFactory) ((ConfigurableApplicationContext) applicationContext).getBeanFactory(); } private static void assertApplicationContext() { if (SpringContextHolder.applicationContext == null) { throw new IllegalArgumentException("applicationContext属性为null,请检查是否注入了SpringContextHolder!"); } } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/support/TreeUtils.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TreeUtils.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.support; import com.paascloud.base.dto.BaseTree; import java.io.Serializable; /** * The class Tree utils. * * @author paascloud.net @gmail.com */ public class TreeUtils, ID extends Serializable> extends AbstractTreeService { } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/utils/CustomSystemUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CustomSystemUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.utils; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.net.Inet4Address; import java.net.InetAddress; import java.net.NetworkInterface; import java.util.Enumeration; /** * 系统工具类,用于获取系统相关信息 * * @author paascloud.net @gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class CustomSystemUtil { /** * 内网IP */ private static String INTRANET_IP = getIntranetIp(); /** * 外网IP */ private static String INTERNET_IP = getInternetIp(); /** * 获得内网IP * * @return 内网IP */ private static String getIntranetIp() { try { return InetAddress.getLocalHost().getHostAddress(); } catch (Exception e) { throw new RuntimeException(e); } } /** * 获得外网IP * * @return 外网IP */ private static String getInternetIp() { try { Enumeration networks = NetworkInterface.getNetworkInterfaces(); InetAddress ip; Enumeration addrs; while (networks.hasMoreElements()) { addrs = networks.nextElement().getInetAddresses(); while (addrs.hasMoreElements()) { ip = addrs.nextElement(); if (ip != null && ip instanceof Inet4Address && ip.isSiteLocalAddress() && !ip.getHostAddress().equals(INTRANET_IP)) { return ip.getHostAddress(); } } } // 如果没有外网IP,就返回内网IP return INTRANET_IP; } catch (Exception e) { throw new RuntimeException(e); } } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/utils/RequestUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RequestUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.utils; import com.paascloud.PublicUtil; import com.paascloud.ThreadLocalMap; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.crypto.codec.Base64; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.net.InetAddress; import java.net.UnknownHostException; /** * The class Request util. * * @author paascloud.net@gmail.com */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) public class RequestUtil { /** * Gets request. * * @return the request */ public static HttpServletRequest getRequest() { return ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); } /** * 获得用户远程地址 * * @param request the request * * @return the string */ public static String getRemoteAddr(HttpServletRequest request) { String ipAddress = request.getHeader(GlobalConstant.X_REAL_IP); if (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader(GlobalConstant.X_FORWARDED_FOR); } if (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader(GlobalConstant.PROXY_CLIENT_IP); } if (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader(GlobalConstant.WL_PROXY_CLIENT_IP); } if (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader(GlobalConstant.HTTP_CLIENT_IP); } if (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader(GlobalConstant.HTTP_X_FORWARDED_FOR); } if (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); } if (StringUtils.isEmpty(ipAddress) || GlobalConstant.UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); if (GlobalConstant.LOCALHOST_IP.equals(ipAddress) || GlobalConstant.LOCALHOST_IP_16.equals(ipAddress)) { //根据网卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { log.error("获取IP地址, 出现异常={}", e.getMessage(), e); } assert inet != null; ipAddress = inet.getHostAddress(); } log.info("获取IP地址 ipAddress={}", ipAddress); } // 对于通过多个代理的情况, 第一个IP为客户端真实IP,多个IP按照','分割 //"***.***.***.***".length() = 15 if (ipAddress != null && ipAddress.length() > GlobalConstant.MAX_IP_LENGTH) { if (ipAddress.indexOf(GlobalConstant.Symbol.COMMA) > 0) { ipAddress = ipAddress.substring(0, ipAddress.indexOf(GlobalConstant.Symbol.COMMA)); } } return ipAddress; } /** * Gets login user. * * @return the login user */ public static LoginAuthDto getLoginUser() { LoginAuthDto loginAuthDto = (LoginAuthDto) ThreadLocalMap.get(GlobalConstant.Sys.TOKEN_AUTH_DTO); if (PublicUtil.isEmpty(loginAuthDto)) { throw new BusinessException(ErrorCodeEnum.UAC10011039); } return loginAuthDto; } /** * Gets auth header. * * @param request the request * * @return the auth header */ public static String getAuthHeader(HttpServletRequest request) { String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION); if (org.apache.commons.lang.StringUtils.isEmpty(authHeader)) { throw new BusinessException(ErrorCodeEnum.UAC10011040); } return authHeader; } public static String[] extractAndDecodeHeader(String header) throws IOException { byte[] base64Token = header.substring(6).getBytes("UTF-8"); byte[] decoded; try { decoded = Base64.decode(base64Token); } catch (IllegalArgumentException e) { throw new BadCredentialsException("Failed to decode basic authentication token"); } String token = new String(decoded, "UTF-8"); int delim = token.indexOf(GlobalConstant.Symbol.MH); if (delim == -1) { throw new BadCredentialsException("Invalid basic authentication token"); } return new String[]{token.substring(0, delim), token.substring(delim + 1)}; } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/utils/SessionRegistryCenterConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SessionRegistryCenterConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.utils; import com.paascloud.config.properties.ZookeeperProperties; import lombok.AccessLevel; import lombok.NoArgsConstructor; /** * 注册中心配置的会话声明周期. * * @author zhangliang */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class SessionRegistryCenterConfiguration { private static ZookeeperProperties regCenterConfig; /** * 从当前会话范围获取注册中心配置. * * @return 事件追踪数据源配置 */ public static ZookeeperProperties getRegistryCenterConfiguration() { return regCenterConfig; } /** * 设置注册中心配置至当前会话范围. * * @param regCenterConfig 注册中心配置 */ public static void setRegistryCenterConfiguration(final ZookeeperProperties regCenterConfig) { SessionRegistryCenterConfiguration.regCenterConfig = regCenterConfig; } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/java/com/paascloud/core/utils/TokenCache.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TokenCache.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.utils; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import java.util.concurrent.TimeUnit; /** * The class Token cache. * * @author paascloud.net@gmail.com */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) public class TokenCache { public static final String NULL = "null"; /** * LRU算法 */ private static LoadingCache localCache = CacheBuilder.newBuilder().initialCapacity(1000).maximumSize(10000).expireAfterAccess(12, TimeUnit.HOURS) .build(new CacheLoader() { //默认的数据加载实现,当调用get取值的时候,如果key没有对应的值,就调用这个方法进行加载. @Override public String load(String s) { return "null"; } }); /** * Set key. * * @param key the key * @param value the value */ public static void setKey(String key, String value) { localCache.put(key, value); } /** * Get key string. * * @param key the key * * @return the string */ public static String getKey(String key) { String value; try { value = localCache.get(key); if (NULL.equals(value)) { return null; } return value; } catch (Exception e) { log.error("localCache get error", e); } return null; } } ================================================ FILE: paascloud-common/paascloud-common-core/src/main/resources/META-INF/spring.factories ================================================ # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.paascloud.core.config.CoreConfiguration ================================================ FILE: paascloud-common/paascloud-common-core/src/test/java/.gitkeep ================================================ ================================================ FILE: paascloud-common/paascloud-common-core/src/test/java/IdTest.java ================================================ import com.paascloud.core.generator.IncrementIdGenerator; import com.paascloud.core.generator.UniqueIdGenerator; import lombok.extern.slf4j.Slf4j; import java.util.Collections; import java.util.HashSet; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; /** * The class Id test. * @author paascloud.net@gmail.com */ @Slf4j public class IdTest { /** * The entry point of application. * * @param args the input arguments * * @throws InterruptedException the interrupted exception */ public static void main(String[] args) throws InterruptedException { UniqueIdGenerator instance = UniqueIdGenerator.getInstance(IncrementIdGenerator.getServiceId()); ExecutorService es = Executors.newFixedThreadPool(10); final HashSet idSet = new HashSet(); Collections.synchronizedCollection(idSet); long start = System.currentTimeMillis(); log.info(" start generate id *"); for (int i = 0; i < 10; i++) es.execute(() -> { for (long j = 0; j < 5000000; j++) { long id = instance.nextId(); synchronized (idSet) { idSet.add(id); } } }); es.shutdown(); es.awaitTermination(10, TimeUnit.SECONDS); long end = System.currentTimeMillis(); log.info(" end generate id "); log.info("* cost " + (end - start) + " ms!"); } } ================================================ FILE: paascloud-common/paascloud-common-util/pom.xml ================================================ com.liuzm.paascloud.common paascloud-common 1.0 4.0.0 paascloud-common-util com.fasterxml.jackson.core jackson-annotations 2.8.5 com.fasterxml.jackson.core jackson-databind 2.8.7 org.apache.commons commons-lang3 ch.qos.logback logback-classic commons-codec commons-codec org.codehaus.jackson jackson-smile org.codehaus.jackson jackson-core-asl org.codehaus.jackson jackson-mapper-asl com.xiaoleilu hutool-all commons-beanutils commons-beanutils 1.9.3 com.google.guava guava ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/BigDecimalUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BigDecimalUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.math.BigDecimal; /** * The class Big decimal util. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class BigDecimalUtil { /** * Add big decimal. * * @param v1 the v 1 * @param v2 the v 2 * * @return the big decimal */ public static BigDecimal add(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.add(b2); } /** * Sub big decimal. * * @param v1 the v 1 * @param v2 the v 2 * * @return the big decimal */ public static BigDecimal sub(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.subtract(b2); } /** * Mul big decimal. * * @param v1 the v 1 * @param v2 the v 2 * * @return the big decimal */ public static BigDecimal mul(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.multiply(b2); } /** * Div big decimal. * * @param v1 the v 1 * @param v2 the v 2 * * @return the big decimal */ public static BigDecimal div(double v1, double v2) { BigDecimal b1 = new BigDecimal(Double.toString(v1)); BigDecimal b2 = new BigDecimal(Double.toString(v2)); return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP); } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/Collections3.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:Collections3.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** * The class Collections 3. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class Collections3 { /** * 返回a+b的新List. * * @param the type parameter * @param a the a * @param b the b * * @return the list */ public static List union(final Collection a, final Collection b) { List result = new ArrayList<>(a); result.addAll(b); return result; } /** * 返回a-b的新List. * * @param the type parameter * @param a the a * @param b the b * * @return the list */ public static List subtract(final Collection a, final Collection b) { List list = new ArrayList<>(a); for (T element : b) { list.remove(element); } return list; } /** * 返回a与b的交集的新List. * * @param the type parameter * @param a the a * @param b the b * * @return the list */ public static List intersection(Collection a, Collection b) { List list = new ArrayList<>(); for (T element : a) { if (b.contains(element)) { list.add(element); } } return list; } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/DateUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:DateUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import com.xiaoleilu.hutool.date.DateField; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.Date; /** * The class Date util. * * @author paascloud.net @gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class DateUtil { /** * 获取系统前时间. * * @param minute the minute * * @return the before time[yyyy-MM-dd HH:mm:ss] */ public static String getBeforeTime(int minute) { Date newDate = com.xiaoleilu.hutool.date.DateUtil.offset(new Date(), DateField.MINUTE, -minute); return com.xiaoleilu.hutool.date.DateUtil.formatDateTime(newDate); } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/HttpAesUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:HttpAesUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import com.paascloud.exception.HttpAesException; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import sun.misc.BASE64Decoder; import sun.misc.BASE64Encoder; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.security.MessageDigest; /** * The class Http aes util. * * @author paascloud.net@gmail.com */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) public class HttpAesUtil { private static final String CHAR_SET = "UTF-8"; /** * 加密 * * @param contentParam 需要加密的内容 * @param keyParam 加密密码 * @param md5Key 是否对key进行md5加密 * @param ivParam 加密向量 * * @return 加密后的字节数据 string */ public static String encrypt(String contentParam, String keyParam, boolean md5Key, String ivParam) { try { byte[] content = contentParam.getBytes(CHAR_SET); byte[] key = keyParam.getBytes(CHAR_SET); byte[] iv = ivParam.getBytes(CHAR_SET); if (md5Key) { MessageDigest md = MessageDigest.getInstance("MD5"); key = md.digest(key); } SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); //"算法/模式/补码方式" Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding"); //使用CBC模式, 需要一个向量iv, 可增加加密算法的强度 IvParameterSpec ivps = new IvParameterSpec(iv); cipher.init(Cipher.ENCRYPT_MODE, skeySpec, ivps); byte[] bytes = cipher.doFinal(content); return new BASE64Encoder().encode(bytes); } catch (Exception ex) { log.error("加密密码失败", ex); throw new HttpAesException("加密失败"); } } /** * 解密 * * @param contentParam 需要加密的内容 * @param keyParam 加密密码 * @param md5Key 是否对key进行md5加密 * @param ivParam 加密向量 * * @return string */ public static String decrypt(String contentParam, String keyParam, boolean md5Key, String ivParam) { try { if (PubUtils.isNull(contentParam, keyParam, md5Key, ivParam)) { return ""; } byte[] content = new BASE64Decoder().decodeBuffer(contentParam); byte[] key = keyParam.getBytes(CHAR_SET); byte[] iv = ivParam.getBytes(CHAR_SET); if (md5Key) { MessageDigest md = MessageDigest.getInstance("MD5"); key = md.digest(key); } SecretKeySpec skeySpec = new SecretKeySpec(key, "AES"); //"算法/模式/补码方式" Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding"); //使用CBC模式, 需要一个向量iv, 可增加加密算法的强度 IvParameterSpec ivps = new IvParameterSpec(iv); cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivps); byte[] bytes = cipher.doFinal(content); return new String(bytes, CHAR_SET); } catch (Exception ex) { log.error("解密密码失败", ex); throw new HttpAesException("解密失败"); } } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/JacksonUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:JacksonUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import com.google.common.base.Preconditions; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.codehaus.jackson.map.DeserializationConfig.Feature; import org.codehaus.jackson.map.ObjectMapper; import org.codehaus.jackson.map.SerializationConfig; import org.codehaus.jackson.type.JavaType; import org.codehaus.jackson.type.TypeReference; import java.io.IOException; import java.text.SimpleDateFormat; /** * Jackson Json 工具类 * * @author ligang @gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class JacksonUtil { private static ObjectMapper defaultMapper; private static ObjectMapper formatedMapper; static { // 默认的ObjectMapper defaultMapper = new ObjectMapper(); // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性 defaultMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); formatedMapper = new ObjectMapper(); // 设置输入时忽略在JSON字符串中存在但Java对象实际没有的属性 formatedMapper.configure(Feature.FAIL_ON_UNKNOWN_PROPERTIES, false); // 所有日期格式都统一为固定格式 formatedMapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")); formatedMapper.configure(SerializationConfig.Feature.WRITE_DATES_AS_TIMESTAMPS, false); } /** * 将对象转化为json数据 * * @param obj the obj * * @return string string * * @throws IOException the io exception */ public static String toJson(Object obj) throws IOException { Preconditions.checkArgument(obj != null, "this argument is required; it must not be null"); return defaultMapper.writeValueAsString(obj); } /** * json数据转化为对象(Class) * User u = JacksonUtil.parseJson(jsonValue, User.class); * User[] arr = JacksonUtil.parseJson(jsonValue, User[].class); * * @param the type parameter * @param jsonValue the json value * @param valueType the value type * * @return t t * * @throws IOException the io exception */ public static T parseJson(String jsonValue, Class valueType) throws IOException { Preconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), "this argument is required; it must not be null"); return defaultMapper.readValue(jsonValue, valueType); } /** * json数据转化为对象(JavaType) * * @param the type parameter * @param jsonValue the json value * @param valueType the value type * * @return t t * * @throws IOException the io exception */ @SuppressWarnings("unchecked") public static T parseJson(String jsonValue, JavaType valueType) throws IOException { Preconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), "this argument is required; it must not be null"); return (T) defaultMapper.readValue(jsonValue, valueType); } /** * json数据转化为对象(TypeReference) * * @param the type parameter * @param jsonValue the json value * @param valueTypeRef the value type ref * * @return t t * * @throws IOException the io exception */ public static T parseJson(String jsonValue, TypeReference valueTypeRef) throws IOException { Preconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), "this argument is required; it must not be null"); return (T) defaultMapper.readValue(jsonValue, valueTypeRef); } /** * 将对象转化为json数据(时间转换格式: "yyyy-MM-dd HH:mm:ss") * * @param obj the obj * * @return string string * * @throws IOException the io exception */ public static String toJsonWithFormat(Object obj) throws IOException { Preconditions.checkArgument(obj != null, "this argument is required; it must not be null"); return formatedMapper.writeValueAsString(obj); } /** * json数据转化为对象(时间转换格式: "yyyy-MM-dd HH:mm:ss") * User u = JacksonUtil.parseJsonWithFormat(jsonValue, User.class); * User[] arr = JacksonUtil.parseJsonWithFormat(jsonValue, User[].class); * * @param the type parameter * @param jsonValue the json value * @param valueType the value type * * @return t t * * @throws IOException the io exception */ public static T parseJsonWithFormat(String jsonValue, Class valueType) throws IOException { Preconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), "this argument is required; it must not be null"); return formatedMapper.readValue(jsonValue, valueType); } /** * json数据转化为对象(JavaType) * * @param the type parameter * @param jsonValue the json value * @param valueType the value type * * @return t t * * @throws IOException the io exception */ public static T parseJsonWithFormat(String jsonValue, JavaType valueType) throws IOException { Preconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), "this argument is required; it must not be null"); return (T) formatedMapper.readValue(jsonValue, valueType); } /** * json数据转化为对象(TypeReference) * * @param the type parameter * @param jsonValue the json value * @param valueTypeRef the value type ref * * @return t t * * @throws IOException the io exception */ public static T parseJsonWithFormat(String jsonValue, TypeReference valueTypeRef) throws IOException { Preconditions.checkArgument(StringUtils.isNotEmpty(jsonValue), "jsonValue is not null"); return (T) formatedMapper.readValue(jsonValue, valueTypeRef); } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/PubUtils.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PubUtils.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.Collection; import java.util.UUID; /** * The class Pub utils. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class PubUtils { /** * The constant STRING_NULL. */ private final static String STRING_NULL = "-"; /** * 匹配手机号码, 支持+86和86开头 */ private static final String REGX_MOBILENUM = "^((\\+86)|(86))?(13|15|17|18)\\d{9}$"; /** * 匹配邮箱帐号 */ private static final String REGX_EMAIL = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*"; /** * 匹配手机号码(先支持13, 15, 17, 18开头的手机号码). * * @param inputStr the input str * * @return the boolean */ public static Boolean isMobileNumber(String inputStr) { return !PubUtils.isNull(inputStr) && inputStr.matches(REGX_MOBILENUM); } /** * 判断一个或多个对象是否为空 * * @param values 可变参数, 要判断的一个或多个对象 * * @return 只有要判断的一个对象都为空则返回true, 否则返回false boolean */ public static boolean isNull(Object... values) { if (!PubUtils.isNotNullAndNotEmpty(values)) { return true; } for (Object value : values) { boolean flag; if (value instanceof Object[]) { flag = !isNotNullAndNotEmpty((Object[]) value); } else if (value instanceof Collection) { flag = !isNotNullAndNotEmpty((Collection) value); } else if (value instanceof String) { flag = isOEmptyOrNull(value); } else { flag = (null == value); } if (flag) { return true; } } return false; } /** * Is o empty or null boolean. * * @param o the o * * @return boolean boolean */ private static boolean isOEmptyOrNull(Object o) { return o == null || isSEmptyOrNull(o.toString()); } /** * Is s empty or null boolean. * * @param s the s * * @return boolean boolean */ private static boolean isSEmptyOrNull(String s) { return trimAndNullAsEmpty(s).length() <= 0; } /** * Trim and null as empty string. * * @param s the s * * @return java.lang.String string */ private static String trimAndNullAsEmpty(String s) { if (s != null && !s.trim().equals(STRING_NULL)) { return s.trim(); } else { return ""; } // return s == null ? "" : s.trim(); } /** * 判断对象数组是否为空并且数量大于0 * * @param value the value * * @return boolean */ private static Boolean isNotNullAndNotEmpty(Object[] value) { boolean bl = false; if (null != value && 0 < value.length) { bl = true; } return bl; } /** * 判断对象集合(List,Set)是否为空并且数量大于0 * * @param value the value * * @return boolean */ private static Boolean isNotNullAndNotEmpty(Collection value) { boolean bl = false; if (null != value && !value.isEmpty()) { bl = true; } return bl; } /** * Is email boolean. * * @param str the str * * @return the boolean */ public static boolean isEmail(String str) { boolean bl = true; if (isSEmptyOrNull(str) || !str.matches(REGX_EMAIL)) { bl = false; } return bl; } /** * Uuid string. * * @return the string */ public synchronized static String uuid() { return UUID.randomUUID().toString().replace("-", ""); } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/PublicUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PublicUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.Collection; import java.util.Map; /** * The class Public util. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class PublicUtil { /** * 判断对象是否Empty(null或元素为0) * 实用于对如下对象做判断:String Collection及其子类 Map及其子类 * * @param pObj 待检查对象 * * @return boolean 返回的布尔值 */ public static boolean isEmpty(Object pObj) { if (pObj == null) { return true; } if (pObj == "") { return true; } if (pObj instanceof String) { return ((String) pObj).length() == 0; } else if (pObj instanceof Collection) { return ((Collection) pObj).isEmpty(); } else if (pObj instanceof Map) { return ((Map) pObj).size() == 0; } return false; } /** * 判断对象是否为NotEmpty(!null或元素大于0) * 实用于对如下对象做判断:String Collection及其子类 Map及其子类 * * @param pObj 待检查对象 * * @return boolean 返回的布尔值 */ public static boolean isNotEmpty(Object pObj) { if (pObj == null) { return false; } if (pObj == "") { return false; } if (pObj instanceof String) { return ((String) pObj).length() != 0; } else if (pObj instanceof Collection) { return !((Collection) pObj).isEmpty(); } else if (pObj instanceof Map) { return ((Map) pObj).size() != 0; } return true; } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/RandomUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RandomUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.Random; /** * The class Random util. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class RandomUtil { private static final int MAX_LENGTH = 50; /** * 生成一个随机验证码 大小写字母+数字 * * @param length the length * * @return 随机验证码 string */ public static String createComplexCode(int length) { if (length > MAX_LENGTH) { length = MAX_LENGTH; } Random r = new Random(); StringBuilder code = new StringBuilder(); while (true) { if (code.length() == length) { break; } int tmp = r.nextInt(127); if (tmp < 33 || tmp == 92 || tmp == 47 || tmp == 34) { continue; } char x = (char) (tmp); if (code.toString().indexOf(x) > 0) { continue; } code.append(x); } return code.toString(); } /** * Create number code string. * * @param length the length * * @return the string */ public static String createNumberCode(int length) { return randomString("0123456789", length); } private static String randomString(String baseString, int length) { Random random = new Random(); StringBuilder sb = new StringBuilder(); if (length < 1) { length = 1; } int baseLength = baseString.length(); for (int i = 0; i < length; ++i) { int number = random.nextInt(baseLength); sb.append(baseString.charAt(number)); } return sb.toString(); } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/RecursionTreeUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RecursionTreeUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * The class Recursion tree util. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class RecursionTreeUtil { /** * Gets child tree nodes. * * @param list the list * @param parentId the parent id * * @return the child tree nodes */ public static List getChildTreeNodes(List list, Long parentId) { List returnList = new ArrayList<>(); for (TreeNode treeNode : list) { if (treeNode.getPid() == null) { continue; } if (Objects.equals(treeNode.getPid(), parentId)) { recursionFn(list, treeNode); returnList.add(treeNode); } } return returnList; } /** * 递归列表 */ private static void recursionFn(List list, TreeNode node) { List childList = getChildList(list, node); if (PublicUtil.isEmpty(childList)) { return; } node.setChildren(childList); for (TreeNode tChild : childList) { recursionFn(list, tChild); } } /** * 得到子节点列表 */ private static List getChildList(List list, TreeNode t) { List tList = new ArrayList<>(); for (TreeNode treeNode : list) { if (PublicUtil.isEmpty(treeNode.getPid())) { continue; } if (Objects.equals(treeNode.getPid(), t.getId())) { tList.add(treeNode); } } return tList; } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/RedisKeyUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RedisKeyUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import com.google.common.base.Preconditions; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.commons.lang3.StringUtils; /** * The class Redis key util. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class RedisKeyUtil { /** * The constant RESET_PWD_TOKEN_KEY. */ private static final String RESET_PWD_TOKEN_KEY = "paascloud:restPwd"; private static final String ACTIVE_USER = "paascloud:activeUser"; private static final String SEND_SMS_COUNT = "paascloud:sms:count"; private static final String SEND_EMAIL_CODE = "paascloud:email:code"; private static final String ACCESS_TOKEN = "paascloud:token:accessToken"; private static final String UPLOAD_FILE_SIZE = "paascloud:file:upload_file_size"; private static final int REF_NO_MAX_LENGTH = 100; /** * Gets reset pwd token key. * * @param resetPwdKey the rest pwd key * * @return the reset pwd token key */ public static String getResetPwdTokenKey(String resetPwdKey) { Preconditions.checkArgument(StringUtils.isNotEmpty(resetPwdKey), "参数不能为空"); return RESET_PWD_TOKEN_KEY + ":" + resetPwdKey; } public static String getSendEmailCodeKey(String loginName, String email) { Preconditions.checkArgument(StringUtils.isNotEmpty(loginName), "Email不能为空"); Preconditions.checkArgument(StringUtils.isNotEmpty(email), "用户名不能为空"); return SEND_EMAIL_CODE + ":" + loginName + email; } /** * Gets active user key. * * @param activeToken the active token * * @return the active user key */ public static String getActiveUserKey(String activeToken) { Preconditions.checkArgument(StringUtils.isNotEmpty(activeToken), "参数不能为空"); return ACTIVE_USER + ":" + activeToken; } /** * Gets send sms count key. * * @param ipAddr the ip addr * @param type mobile;ip;total * * @return the send sms count key */ public static String getSendSmsCountKey(String ipAddr, String type) { Preconditions.checkArgument(StringUtils.isNotEmpty(ipAddr), "请不要篡改IP地址"); return SEND_SMS_COUNT + ":" + type + ":" + ipAddr; } /** * Gets send sms rate key. * * @param ipAddr the ip addr * * @return the send sms rate key */ public static String getSendSmsRateKey(String ipAddr) { Preconditions.checkArgument(StringUtils.isNotEmpty(ipAddr), "请不要篡改IP地址"); return SEND_SMS_COUNT + ":" + ipAddr; } public static String getAccessTokenKey(String token) { Preconditions.checkArgument(StringUtils.isNotEmpty(token), "非法请求token参数不存在"); return ACCESS_TOKEN + ":" + token; } public static String createMqKey(String topic, String tag, String refNo, String body) { String temp = refNo; Preconditions.checkArgument(StringUtils.isNotEmpty(topic), "topic is null"); Preconditions.checkArgument(StringUtils.isNotEmpty(tag), "tag is null"); Preconditions.checkArgument(StringUtils.isNotEmpty(refNo), "refNo is null"); Preconditions.checkArgument(StringUtils.isNotEmpty(body), "body is null"); if (refNo.length() > REF_NO_MAX_LENGTH) { temp = StringUtils.substring(refNo, 0, REF_NO_MAX_LENGTH) + "..."; } return topic + "_" + tag + "_" + temp + "-" + body.hashCode(); } public static String getFileSizeKey() { return UPLOAD_FILE_SIZE; } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/ThreadLocalMap.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ThreadLocalMap.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.HashMap; import java.util.Map; /** * The class Thread local map. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ThreadLocalMap { /** * The constant threadContext. */ private final static ThreadLocal> THREAD_CONTEXT = new MapThreadLocal(); /** * Put. * * @param key the key * @param value the value */ public static void put(String key, Object value) { getContextMap().put(key, value); } /** * Remove object. * * @param key the key * * @return the object */ public static Object remove(String key) { return getContextMap().remove(key); } /** * Get object. * * @param key the key * * @return the object */ public static Object get(String key) { return getContextMap().get(key); } private static class MapThreadLocal extends ThreadLocal> { /** * Initial value map. * * @return the map */ @Override protected Map initialValue() { return new HashMap(8) { private static final long serialVersionUID = 3637958959138295593L; @Override public Object put(String key, Object value) { return super.put(key, value); } }; } } /** * 取得thread context Map的实例。 * * @return thread context Map的实例 */ private static Map getContextMap() { return THREAD_CONTEXT.get(); } /** * 清理线程所有被hold住的对象。以便重用! */ public static void remove() { getContextMap().clear(); } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/TreeNode.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TreeNode.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import lombok.Data; import java.util.List; /** * The class Tree node. * * @author paascloud.net@gmail.com */ @Data public class TreeNode { /** * 节点编码 */ private String nodeCode; /** * 节点名称 */ private String nodeName; /** * ID */ private Long id; /** * 父ID */ private Long pid; /** * 孩子节点信息 */ private List children; } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/UrlUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UrlUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import lombok.extern.slf4j.Slf4j; import java.io.UnsupportedEncodingException; /** * url转码、解码 * * @author paascloud.net @gmail.com */ @Slf4j public class UrlUtil { private final static String ENCODE = "GBK"; /** * URL 解码 */ public static String getURLDecoderString(String str) { String result = ""; if (null == str) { return ""; } try { result = java.net.URLDecoder.decode(str, ENCODE); } catch (UnsupportedEncodingException e) { log.error("URL解码失败 ex={}", e.getMessage(), e); } return result; } /** * URL 转码 */ public static String getURLEncoderString(String str) { String result = ""; if (null == str) { return ""; } try { result = java.net.URLEncoder.encode(str, ENCODE); } catch (UnsupportedEncodingException e) { log.error("URL转码失败 ex={}", e.getMessage(), e); } return result; } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/ValidateUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ValidateUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.commons.lang3.StringUtils; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * The class Validate util. * * @author paascloud.net @gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ValidateUtil { /** * 校验手机号码是否合法. * * @param mobile the mobile * * @return the boolean */ public static boolean isMobileNumber(final String mobile) { if (StringUtils.isEmpty(mobile)) { return false; } final String reg = "^((\\+?86)|(\\(\\+86\\)))?(13[0-9][0-9]{8}|14[0-9]{9}|15[0-9][0-9]{8}|17[0-9][0-9]{8}|18[0-9][0-9]{8})$"; Pattern pattern = Pattern.compile(reg); Matcher matcher = pattern.matcher(mobile); return matcher.matches(); } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/annotation/NoNeedAccessAuthentication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:NoNeedAccessAuthentication.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; /** * The interface No need access authentication. * * @author paascloud.net @gmail.com */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NoNeedAccessAuthentication { } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/exception/HttpAesException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:HttpAesException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.exception; /** * The class Http aes exception. * * @author paascloud.net @gmail.com */ public class HttpAesException extends IllegalArgumentException { private static final long serialVersionUID = -2489600753056921095L; /** * Instantiates a new Http aes exception. * * @param message the message */ public HttpAesException(String message) { super(message); } /** * Instantiates a new Http aes exception. */ public HttpAesException() { } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/helper/LongJsonDeserializer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:LongJsonDeserializer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.helper; import com.fasterxml.jackson.core.JsonParser; import com.fasterxml.jackson.databind.DeserializationContext; import com.fasterxml.jackson.databind.JsonDeserializer; import lombok.extern.slf4j.Slf4j; import java.io.IOException; /** * 将字符串转为Long * * @author paascloud.net@gmail.com */ @Slf4j public class LongJsonDeserializer extends JsonDeserializer { /** * Deserialize long. * * @param jsonParser the json parser * @param deserializationContext the deserialization context * * @return the long */ @Override public Long deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) { String value = null; try { value = jsonParser.getText(); } catch (IOException e) { log.error("deserialize={}", e.getMessage(), e); } try { return value == null ? null : Long.parseLong(value); } catch (NumberFormatException e) { log.error("解析长整形错误", e); return null; } } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/helper/LongJsonSerializer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:LongJsonSerializer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.helper; import com.fasterxml.jackson.core.JsonGenerator; import com.fasterxml.jackson.databind.JsonSerializer; import com.fasterxml.jackson.databind.SerializerProvider; import java.io.IOException; /** * Long 类型字段序列化时转为字符串,避免js丢失精度 * * @author paascloud.net@gmail.com */ public class LongJsonSerializer extends JsonSerializer { /** * Serialize. * * @param value the value * @param jsonGenerator the json generator * @param serializerProvider the serializer provider * * @throws IOException the io exception */ @Override public void serialize(Long value, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException { String text = (value == null ? null : String.valueOf(value)); if (text != null) { jsonGenerator.writeString(text); } } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/page/PageUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PageUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.page; import lombok.Data; /** * The class Page util. * * @author paascloud.net@gmail.com */ @Data public class PageUtil { /** * The cur page.当前页 */ private int currentPage = 1; /** * The next page.下一页 */ private int nextPage; /** * The pre page. 上一页 */ private int prePage; /** * The total row. 总条数 */ private int totalRow; /** * The page size.每页条数 */ private int pageSize = 10; /** * The total page.总页数 */ private int totalPage; /** * The start. 开始条数 */ private int start; /** * The buttons. */ private int[] buttons; /** * 当前页条数 */ private int curPageSize; /** * Instantiates a new page util. */ public PageUtil() { } /** * Instantiates a new page util. * * @param currentPage the current page */ public PageUtil(int currentPage) { this.currentPage = currentPage; } /** * Instantiates a new page util. * * @param currentPage the current page * @param pageSize the page size */ public PageUtil(int currentPage, int pageSize) { this.currentPage = currentPage; this.pageSize = pageSize; } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/page/Query.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:Query.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.page; import lombok.Data; import java.io.Serializable; /** * The class Query. * * @author paascloud.net@gmail.com */ @Data public class Query implements Serializable { private static final long serialVersionUID = 8933019121780323520L; /** * 当前页 */ private int pageNum = 1; /** * 每页的数量 */ private int pageSize = 20; } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/wrapper/PageWrapMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PageWrapMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.wrapper; import com.paascloud.page.PageUtil; /** * The class Page wrap mapper. * * @author paascloud.net@gmail.com */ public class PageWrapMapper { /** * Instantiates a new page wrap mapper. */ private PageWrapMapper() { } private static PageWrapper wrap(int code, String message, E o, PageUtil pageUtil) { return new PageWrapper(code, message, o, pageUtil); } /** * Wrap data with default code=200. * * @param the type parameter * @param o the o * @param pageUtil the page util * * @return the page wrapper */ public static PageWrapper wrap(E o, PageUtil pageUtil) { return wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, o, pageUtil); } /** * Wrap. * * @param the type parameter * @param code the code * @param message the message * * @return the page wrapper */ public static PageWrapper wrap(int code, String message) { return wrap(code, message, null, null); } /** * Wrap. * * @param the type parameter * @param code the code * * @return the page wrapper */ public static PageWrapper wrap(int code) { return wrap(code, null, null, null); } /** * Wrap. * * @param the type parameter * @param e the e * * @return the page wrapper */ public static PageWrapper wrap(Exception e) { return new PageWrapper(Wrapper.ERROR_CODE, e.getMessage(), null, null); } /** * Un wrapper. * * @param the type parameter * @param wrapper the wrapper * * @return the e */ public static E unWrap(PageWrapper wrapper) { return wrapper.getResult(); } /** * Wrap ERROR. code=100 * * @param the type parameter * * @return the page wrapper */ public static PageWrapper illegalArgument() { return wrap(Wrapper.ILLEGAL_ARGUMENT_CODE_, Wrapper.ILLEGAL_ARGUMENT_MESSAGE, null, null); } /** * Wrap ERROR. code=500 * * @param the type parameter * * @return the page wrapper */ public static PageWrapper error() { return wrap(Wrapper.ERROR_CODE, Wrapper.ERROR_MESSAGE, null, null); } /** * Wrap SUCCESS. code=200 * * @param the type parameter * * @return the page wrapper */ public static PageWrapper ok() { return new PageWrapper(); } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/wrapper/PageWrapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PageWrapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.wrapper; import com.paascloud.page.PageUtil; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Page wrapper. * * @param the type parameter @author paascloud.net@gmail.com */ @Data @EqualsAndHashCode(callSuper = true) public class PageWrapper extends Wrapper { private static final long serialVersionUID = 666985064788933395L; private PageUtil pageUtil; /** * Instantiates a new Page wrapper. */ PageWrapper() { super(); } /** * Instantiates a new Page wrapper. * * @param code the code * @param message the message */ public PageWrapper(int code, String message) { super(code, message); } /** * Instantiates a new pageWrapper default code=200 * * @param result the result * @param pageUtil the page util */ public PageWrapper(T result, PageUtil pageUtil) { super(); this.setResult(result); this.setPageUtil(pageUtil); } /** * Instantiates a new Page wrapper. * * @param code the code * @param message the message * @param result the result * @param pageUtil the page util */ PageWrapper(int code, String message, T result, PageUtil pageUtil) { super(code, message, result); this.pageUtil = pageUtil; } /** * Sets the 分页数据 , 返回自身的引用. * * @param pageUtil the page util * * @return the page wrapper */ public PageWrapper pageUtil(PageUtil pageUtil) { this.setPageUtil(pageUtil); return this; } /** * Sets the 结果数据 , 返回自身的引用. * * @param result the result * * @return the page wrapper */ @Override public PageWrapper result(T result) { super.setResult(result); return this; } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/wrapper/WrapMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:WrapMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.wrapper; import org.apache.commons.lang3.StringUtils; /** * The class Wrap mapper. * * @author paascloud.net@gmail.com */ public class WrapMapper { /** * Instantiates a new wrap mapper. */ private WrapMapper() { } /** * Wrap. * * @param the element type * @param code the code * @param message the message * @param o the o * * @return the wrapper */ public static Wrapper wrap(int code, String message, E o) { return new Wrapper<>(code, message, o); } /** * Wrap. * * @param the element type * @param code the code * @param message the message * * @return the wrapper */ public static Wrapper wrap(int code, String message) { return wrap(code, message, null); } /** * Wrap. * * @param the element type * @param code the code * * @return the wrapper */ public static Wrapper wrap(int code) { return wrap(code, null); } /** * Wrap. * * @param the element type * @param e the e * * @return the wrapper */ public static Wrapper wrap(Exception e) { return new Wrapper<>(Wrapper.ERROR_CODE, e.getMessage()); } /** * Un wrapper. * * @param the element type * @param wrapper the wrapper * * @return the e */ public static E unWrap(Wrapper wrapper) { return wrapper.getResult(); } /** * Wrap ERROR. code=100 * * @param the element type * * @return the wrapper */ public static Wrapper illegalArgument() { return wrap(Wrapper.ILLEGAL_ARGUMENT_CODE_, Wrapper.ILLEGAL_ARGUMENT_MESSAGE); } /** * Wrap ERROR. code=500 * * @param the element type * * @return the wrapper */ public static Wrapper error() { return wrap(Wrapper.ERROR_CODE, Wrapper.ERROR_MESSAGE); } /** * Error wrapper. * * @param the type parameter * @param message the message * * @return the wrapper */ public static Wrapper error(String message) { return wrap(Wrapper.ERROR_CODE, StringUtils.isBlank(message) ? Wrapper.ERROR_MESSAGE : message); } /** * Wrap SUCCESS. code=200 * * @param the element type * * @return the wrapper */ public static Wrapper ok() { return new Wrapper<>(); } /** * Ok wrapper. * * @param the type parameter * @param o the o * * @return the wrapper */ public static Wrapper ok(E o) { return new Wrapper<>(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, o); } } ================================================ FILE: paascloud-common/paascloud-common-util/src/main/java/com/paascloud/wrapper/Wrapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:Wrapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.wrapper; import com.fasterxml.jackson.annotation.JsonIgnore; import lombok.Data; import org.codehaus.jackson.map.annotate.JsonSerialize; import java.io.Serializable; /** * The class Wrapper. * * @param the type parameter @author paascloud.net@gmail.com */ @Data @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class Wrapper implements Serializable { /** * 序列化标识 */ private static final long serialVersionUID = 4893280118017319089L; /** * 成功码. */ public static final int SUCCESS_CODE = 200; /** * 成功信息. */ public static final String SUCCESS_MESSAGE = "操作成功"; /** * 错误码. */ public static final int ERROR_CODE = 500; /** * 错误信息. */ public static final String ERROR_MESSAGE = "内部异常"; /** * 错误码:参数非法 */ public static final int ILLEGAL_ARGUMENT_CODE_ = 100; /** * 错误信息:参数非法 */ public static final String ILLEGAL_ARGUMENT_MESSAGE = "参数非法"; /** * 编号. */ private int code; /** * 信息. */ private String message; /** * 结果数据 */ private T result; /** * Instantiates a new wrapper. default code=200 */ Wrapper() { this(SUCCESS_CODE, SUCCESS_MESSAGE); } /** * Instantiates a new wrapper. * * @param code the code * @param message the message */ Wrapper(int code, String message) { this(code, message, null); } /** * Instantiates a new wrapper. * * @param code the code * @param message the message * @param result the result */ Wrapper(int code, String message, T result) { super(); this.code(code).message(message).result(result); } /** * Sets the 编号 , 返回自身的引用. * * @param code the new 编号 * * @return the wrapper */ private Wrapper code(int code) { this.setCode(code); return this; } /** * Sets the 信息 , 返回自身的引用. * * @param message the new 信息 * * @return the wrapper */ private Wrapper message(String message) { this.setMessage(message); return this; } /** * Sets the 结果数据 , 返回自身的引用. * * @param result the new 结果数据 * * @return the wrapper */ public Wrapper result(T result) { this.setResult(result); return this; } /** * 判断是否成功: 依据 Wrapper.SUCCESS_CODE == this.code * * @return code =200,true;否则 false. */ @JsonIgnore public boolean success() { return Wrapper.SUCCESS_CODE == this.code; } /** * 判断是否成功: 依据 Wrapper.SUCCESS_CODE != this.code * * @return code !=200,true;否则 false. */ @JsonIgnore public boolean error() { return !success(); } } ================================================ FILE: paascloud-common/paascloud-common-zk/pom.xml ================================================ com.liuzm.paascloud.common paascloud-common 1.0 4.0.0 paascloud-common-zk 1.0 com.liuzm.paascloud.common paascloud-common-base com.liuzm.paascloud.common paascloud-common-util org.aspectj aspectjweaver org.mybatis mybatis 3.4.2 com.liuzm.paascloud.common paascloud-common-config 1.0 org.apache.curator curator-framework org.apache.curator curator-client org.apache.curator curator-recipes com.alibaba fastjson ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/generator/IdGenerator.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:IdGenerator.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.generator; /** * The interface Id generator. * * @author paascloud.net @gmail.com */ public interface IdGenerator { /** * 生成下一个ID * * @return the string */ Long nextId(); } ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/generator/IncrementIdGenerator.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:IncrementIdGenerator.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.generator; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.core.registry.base.CoordinatorRegistryCenter; import com.paascloud.core.registry.base.RegisterDto; import org.apache.curator.retry.RetryNTimes; /** * FrameworkID 的保存器. * * @author gaohongtao */ public class IncrementIdGenerator implements IdGenerator { private static Long serviceId = null; private final RegisterDto registerDto; /** * Instantiates a new Increment id generator. * * @param registerDto the register dto */ public IncrementIdGenerator(RegisterDto registerDto) { this.registerDto = registerDto; } /** * Next id long. * * @return the long */ @Override public Long nextId() { String app = this.registerDto.getApp(); String host = this.registerDto.getHost(); CoordinatorRegistryCenter regCenter = this.registerDto.getCoordinatorRegistryCenter(); String path = GlobalConstant.ZK_REGISTRY_ID_ROOT_PATH + GlobalConstant.Symbol.SLASH + app + GlobalConstant.Symbol.SLASH + host; if (regCenter.isExisted(path)) { // 如果已经有该节点,表示已经为当前的host上部署的该app分配的编号(应对某个服务重启之后编号不变的问题),直接获取该id,而无需生成 return Long.valueOf(regCenter.getDirectly(GlobalConstant.ZK_REGISTRY_ID_ROOT_PATH + GlobalConstant.Symbol.SLASH + app + GlobalConstant.Symbol.SLASH + host)); } else { // 节点不存在,那么需要生成id,利用zk节点的版本号每写一次就自增的机制来实现 regCenter.increment(GlobalConstant.ZK_REGISTRY_SEQ, new RetryNTimes(2000, 3)); // 生成id Integer id = regCenter.getAtomicValue(GlobalConstant.ZK_REGISTRY_SEQ, new RetryNTimes(2000, 3)).postValue(); // 将数据写入节点 regCenter.persist(path); regCenter.persist(path, String.valueOf(id)); return Long.valueOf(id); } } /** * Gets service id. * * @return the service id */ public static Long getServiceId() { return serviceId; } /** * Sets service id. * * @param serviceId the service id */ public static void setServiceId(Long serviceId) { IncrementIdGenerator.serviceId = serviceId; } } ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/generator/UniqueIdGenerator.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UniqueIdGenerator.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.generator; /** * 分布式唯一ID生成器 * * @author paascloud.net@gmail.com */ public class UniqueIdGenerator implements IdGenerator { /** * 开始使用该算法的时间为: 2017-01-01 00:00:00 */ private static final long START_TIME = 1483200000000L; /** * worker id的bit数,最多支持8192个app和host的组合(即在N个服务器上每个服务器部署M个项目,总共部署N*M=8192) */ private static final int APP_HOST_ID_BITS = 13; /** * 序列号,支持单节点最高1000*1024的并发 */ private final static int SEQUENCE_BITS = 10; /** * 最大的app host id,8091 */ private final static long MAX_APP_HOST_ID = ~(-1L << APP_HOST_ID_BITS); /** * 最大的序列号,1023 */ private final static long MAX_SEQUENCE = ~(-1L << SEQUENCE_BITS); /** * app host编号的移位 */ private final static long APP_HOST_ID_SHIFT = SEQUENCE_BITS; /** * 时间戳的移位 */ private final static long TIMESTAMP_LEFT_SHIFT = APP_HOST_ID_BITS + APP_HOST_ID_SHIFT; /** * 该项目的app host id,对应着为某台机器上的某个项目分配的serviceId(注意区分Span中的serviceId) */ private long appHostId; /** * 上次生成ID的时间戳 */ private long lastTimestamp = -1L; /** * 当前毫秒生成的序列 */ private long sequence = 0L; /** * 单例 */ private static volatile UniqueIdGenerator idGen = null; /** * 实例化 * * @param appHostId the app host id * * @return the instance */ public static UniqueIdGenerator getInstance(long appHostId) { if (idGen == null) { synchronized (UniqueIdGenerator.class) { if (idGen == null) { idGen = new UniqueIdGenerator(appHostId); } } } return idGen; } private UniqueIdGenerator(long appHostId) { if (appHostId > MAX_APP_HOST_ID) { // zk分配的serviceId过大(基本小规模的公司不会出现这样的问题) throw new IllegalArgumentException(String.format("app host Id wrong: %d ", appHostId)); } this.appHostId = appHostId; } /** * 利用twitter的snowflake(做了些微修改)算法来实现 * * @return the long */ @Override public Long nextId() { return this.genUniqueId(); } /** * 生成唯一id的具体实现 */ private synchronized long genUniqueId() { long current = System.currentTimeMillis(); if (current < lastTimestamp) { // 如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过,出现问题返回-1 return -1; } if (current == lastTimestamp) { // 如果当前生成id的时间还是上次的时间,那么对sequence序列号进行+1 sequence = (sequence + 1) & MAX_SEQUENCE; if (sequence == MAX_SEQUENCE) { // 当前毫秒生成的序列数已经大于最大值,那么阻塞到下一个毫秒再获取新的时间戳 current = this.nextMs(lastTimestamp); } } else { // 当前的时间戳已经是下一个毫秒 sequence = 0L; } // 更新上次生成id的时间戳 lastTimestamp = current; // 进行移位操作生成int64的唯一ID return ((current - START_TIME) << TIMESTAMP_LEFT_SHIFT) | (this.appHostId << APP_HOST_ID_SHIFT) | sequence; } /** * 阻塞到下一个毫秒 */ private long nextMs(long timeStamp) { long current = System.currentTimeMillis(); while (current <= timeStamp) { current = System.currentTimeMillis(); } return current; } /** * Generate id long. * * @return the long */ public static long generateId() { return UniqueIdGenerator.getInstance(IncrementIdGenerator.getServiceId()).nextId(); } } ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/RegistryCenterFactory.java ================================================ package com.paascloud.core.registry; import com.google.common.base.Charsets; import com.google.common.hash.HashCode; import com.google.common.hash.Hasher; import com.google.common.hash.Hashing; import com.paascloud.config.properties.AliyunProperties; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.config.properties.ZookeeperProperties; import com.paascloud.core.generator.IncrementIdGenerator; import com.paascloud.core.registry.base.CoordinatorRegistryCenter; import com.paascloud.core.registry.base.RegisterDto; import com.paascloud.core.registry.zookeeper.ZookeeperRegistryCenter; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.concurrent.ConcurrentHashMap; /** * 注册中心工厂. * * @author zhangliang */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class RegistryCenterFactory { private static final ConcurrentHashMap REG_CENTER_REGISTRY = new ConcurrentHashMap<>(); /** * 创建注册中心. * * @param zookeeperProperties the zookeeper properties * * @return 注册中心对象 coordinator registry center */ public static CoordinatorRegistryCenter createCoordinatorRegistryCenter(ZookeeperProperties zookeeperProperties) { Hasher hasher = Hashing.md5().newHasher().putString(zookeeperProperties.getZkAddressList(), Charsets.UTF_8); HashCode hashCode = hasher.hash(); CoordinatorRegistryCenter result = REG_CENTER_REGISTRY.get(hashCode); if (null != result) { return result; } result = new ZookeeperRegistryCenter(zookeeperProperties); result.init(); REG_CENTER_REGISTRY.put(hashCode, result); return result; } /** * Startup. * * @param paascloudProperties the paascloud properties * @param host the host * @param app the app */ public static void startup(PaascloudProperties paascloudProperties, String host, String app) { CoordinatorRegistryCenter coordinatorRegistryCenter = createCoordinatorRegistryCenter(paascloudProperties.getZk()); RegisterDto dto = new RegisterDto(app, host, coordinatorRegistryCenter); Long serviceId = new IncrementIdGenerator(dto).nextId(); IncrementIdGenerator.setServiceId(serviceId); registerMq(paascloudProperties, host, app); } private static void registerMq(PaascloudProperties paascloudProperties, String host, String app) { CoordinatorRegistryCenter coordinatorRegistryCenter = createCoordinatorRegistryCenter(paascloudProperties.getZk()); AliyunProperties.RocketMqProperties rocketMq = paascloudProperties.getAliyun().getRocketMq(); String consumerGroup = rocketMq.isReliableMessageConsumer() ? rocketMq.getConsumerGroup() : null; String namesrvAddr = rocketMq.getNamesrvAddr(); String producerGroup = rocketMq.isReliableMessageProducer() ? rocketMq.getProducerGroup() : null; coordinatorRegistryCenter.registerMq(app, host, producerGroup, consumerGroup, namesrvAddr); } } ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/base/CoordinatorRegistryCenter.java ================================================ package com.paascloud.core.registry.base; import java.util.List; /** * 用于协调分布式服务的注册中心. * * @author zhangliang */ public interface CoordinatorRegistryCenter extends RegistryCenter { /** * 直接从注册中心而非本地缓存获取数据. * * @param key 键 * * @return 值 directly */ String getDirectly(String key); /** * 获取子节点名称集合. * * @param key 键 * * @return 子节点名称集合 children keys */ List getChildrenKeys(String key); /** * 获取子节点数量. * * @param key 键 * * @return 子节点数量 num children */ int getNumChildren(String key); /** * 持久化临时注册数据. * * @param key 键 * @param value 值 */ void persistEphemeral(String key, String value); /** * 持久化顺序注册数据. * * @param key 键 * @param value 值 * * @return 包含10位顺序数字的znode名称 string */ String persistSequential(String key, String value); /** * 持久化临时顺序注册数据. * * @param key 键 */ void persistEphemeralSequential(String key); /** * 添加本地缓存. * * @param cachePath 需加入缓存的路径 */ void addCacheData(String cachePath); /** * 释放本地缓存. * * @param cachePath 需释放缓存的路径 */ void evictCacheData(String cachePath); /** * 获取注册中心数据缓存对象. * * @param cachePath 缓存的节点路径 * * @return 注册中心数据缓存对象 raw cache */ Object getRawCache(String cachePath); /** * 向注册中心进行注册,生成该服务的编号并返回 * * @param app the app * @param host the host * @param producerGroup the producer group * @param consumerGroup the consumer group * @param namesrvAddr the namesrv addr */ void registerMq(String app, String host, String producerGroup, String consumerGroup, String namesrvAddr); } ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/base/RegisterDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RegisterDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.registry.base; import lombok.AllArgsConstructor; import lombok.Data; /** * The class Register dto. * * @author paascloud.net @gmail.com */ @Data @AllArgsConstructor public class RegisterDto { private String app; private String host; private CoordinatorRegistryCenter coordinatorRegistryCenter; } ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/base/RegistryCenter.java ================================================ package com.paascloud.core.registry.base; import org.apache.curator.framework.recipes.atomic.AtomicValue; import org.apache.curator.retry.RetryNTimes; /** * 注册中心. * * @author zhangliang */ public interface RegistryCenter { /** * 初始化注册中心. */ void init(); /** * 关闭注册中心. */ void close(); /** * 获取注册数据. * * @param key 键 * * @return 值 string */ String get(String key); /** * 获取数据是否存在. * * @param key 键 * * @return 数据是否存在 boolean */ boolean isExisted(String key); /** * 持久化注册数据. * * @param key 键 * @param value 值 */ void persist(String key, String value); /** * 创建一个持久化节点,初始内容为空. * * @param key the key */ void persist(String key); /** * 更新注册数据. * * @param key 键 * @param value 值 */ void update(String key, String value); /** * 删除注册数据. * * @param key 键 */ void remove(String key); /** * 获取注册中心当前时间. * * @param key 用于获取时间的键 * * @return 注册中心当前时间 registry center time */ long getRegistryCenterTime(String key); /** * 直接获取操作注册中心的原生客户端. * 如:Zookeeper或Redis等原生客户端. * * @return 注册中心的原生客户端 raw client */ Object getRawClient(); /** * Instantiates a new Increment. * * @param path the path * @param retryNTimes the retry n times */ void increment(String path, RetryNTimes retryNTimes); /** * Instantiates a new Get atomic value. * * @param path the path * @param retryNTimes the retry n times * * @return the atomic value */ AtomicValue getAtomicValue(String path, RetryNTimes retryNTimes); } ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/base/ReliableMessageRegisterDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ReliableMessageRegisterDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.core.registry.base; import com.google.common.base.Preconditions; import lombok.Data; import org.apache.commons.lang3.StringUtils; /** * The class Reliable message register dto. * * @author paascloud.net @gmail.com */ @Data public class ReliableMessageRegisterDto { private String consumerGroup; private String producerGroup; private String namesrvAddr; /** * Sets consumer group. * * @param consumerGroup the consumer group * * @return the consumer group */ public ReliableMessageRegisterDto setConsumerGroup(final String consumerGroup) { Preconditions.checkArgument(StringUtils.isNotEmpty(consumerGroup), "init zk cid is null"); this.consumerGroup = consumerGroup; return this; } /** * Sets producer group. * * @param producerGroup the producer group * * @return the producer group */ public ReliableMessageRegisterDto setProducerGroup(final String producerGroup) { Preconditions.checkArgument(StringUtils.isNotEmpty(producerGroup), "init zk pid is null"); this.producerGroup = producerGroup; return this; } /** * Sets namesrv addr. * * @param namesrvAddr the namesrv addr * * @return the namesrv addr */ public ReliableMessageRegisterDto setNamesrvAddr(final String namesrvAddr) { Preconditions.checkArgument(StringUtils.isNotEmpty(namesrvAddr), "init ZK namesrvAddr is null"); this.namesrvAddr = namesrvAddr; return this; } } ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/exception/RegException.java ================================================ package com.paascloud.core.registry.exception; /** * 注册中心异常. * * @author zhangliang */ public final class RegException extends RuntimeException { private static final long serialVersionUID = -6417179023552012152L; /** * Instantiates a new Reg exception. * * @param errorMessage the error message * @param args the args */ public RegException(final String errorMessage, final Object... args) { super(String.format(errorMessage, args)); } /** * Instantiates a new Reg exception. * * @param cause the cause */ public RegException(final Exception cause) { super(cause); } } ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/exception/RegExceptionHandler.java ================================================ package com.paascloud.core.registry.exception; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.zookeeper.KeeperException.NoNodeException; import org.apache.zookeeper.KeeperException.NodeExistsException; /** * 注册中心异常处理类. * * @author zhangliang */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class RegExceptionHandler { /** * 处理异常. *

*

处理掉中断和连接失效异常并继续抛注册中心.

* * @param cause 待处理异常. */ public static void handleException(final Exception cause) { if (null == cause) { return; } boolean flag = isIgnoredException(cause) || null != cause.getCause() && isIgnoredException(cause.getCause()); if (flag) { log.debug("Elastic job: ignored exception for: {}", cause.getMessage()); } else if (cause instanceof InterruptedException) { Thread.currentThread().interrupt(); } else { throw new RegException(cause); } } private static boolean isIgnoredException(final Throwable cause) { return cause instanceof NoNodeException || cause instanceof NodeExistsException; } } ================================================ FILE: paascloud-common/paascloud-common-zk/src/main/java/com/paascloud/core/registry/zookeeper/ZookeeperRegistryCenter.java ================================================ package com.paascloud.core.registry.zookeeper; import com.alibaba.fastjson.JSON; import com.google.common.base.Charsets; import com.google.common.base.Preconditions; import com.google.common.base.Strings; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.config.properties.ZookeeperProperties; import com.paascloud.core.registry.base.CoordinatorRegistryCenter; import com.paascloud.core.registry.base.ReliableMessageRegisterDto; import com.paascloud.core.registry.exception.RegExceptionHandler; import com.xiaoleilu.hutool.date.DateUtil; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.framework.api.ACLProvider; import org.apache.curator.framework.recipes.atomic.AtomicValue; import org.apache.curator.framework.recipes.atomic.DistributedAtomicInteger; import org.apache.curator.framework.recipes.cache.ChildData; import org.apache.curator.framework.recipes.cache.TreeCache; import org.apache.curator.retry.ExponentialBackoffRetry; import org.apache.curator.retry.RetryNTimes; import org.apache.curator.utils.CloseableUtils; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.KeeperException; import org.apache.zookeeper.ZooDefs; import org.apache.zookeeper.data.ACL; import org.apache.zookeeper.data.Stat; import java.util.*; import java.util.Map.Entry; import java.util.concurrent.TimeUnit; /** * 基于Zookeeper的注册中心. * * @author zhangliang */ @Slf4j public final class ZookeeperRegistryCenter implements CoordinatorRegistryCenter { @Getter(AccessLevel.PROTECTED) private ZookeeperProperties zkConfig; private final Map caches = new HashMap<>(); @Getter private CuratorFramework client; @Getter private DistributedAtomicInteger distributedAtomicInteger; /** * Instantiates a new Zookeeper registry center. * * @param zkConfig the zk config */ public ZookeeperRegistryCenter(final ZookeeperProperties zkConfig) { this.zkConfig = zkConfig; } /** * Init. */ @Override public void init() { log.debug("Elastic job: zookeeper registry center init, server lists is: {}.", zkConfig.getZkAddressList()); CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder() .connectString(zkConfig.getZkAddressList()) .retryPolicy(new ExponentialBackoffRetry(zkConfig.getBaseSleepTimeMilliseconds(), zkConfig.getMaxRetries(), zkConfig.getMaxSleepTimeMilliseconds())); if (0 != zkConfig.getSessionTimeoutMilliseconds()) { builder.sessionTimeoutMs(zkConfig.getSessionTimeoutMilliseconds()); } if (0 != zkConfig.getConnectionTimeoutMilliseconds()) { builder.connectionTimeoutMs(zkConfig.getConnectionTimeoutMilliseconds()); } if (!Strings.isNullOrEmpty(zkConfig.getDigest())) { builder.authorization("digest", zkConfig.getDigest().getBytes(Charsets.UTF_8)) .aclProvider(new ACLProvider() { @Override public List getDefaultAcl() { return ZooDefs.Ids.CREATOR_ALL_ACL; } @Override public List getAclForPath(final String path) { return ZooDefs.Ids.CREATOR_ALL_ACL; } }); } client = builder.build(); client.start(); try { if (!client.blockUntilConnected(zkConfig.getMaxSleepTimeMilliseconds() * zkConfig.getMaxRetries(), TimeUnit.MILLISECONDS)) { client.close(); throw new KeeperException.OperationTimeoutException(); } //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); } } /** * Close. */ @Override public void close() { for (Entry each : caches.entrySet()) { each.getValue().close(); } waitForCacheClose(); CloseableUtils.closeQuietly(client); } /** * 等待500ms, cache先关闭再关闭client, 否则会抛异常 * 因为异步处理, 可能会导致client先关闭而cache还未关闭结束. * 等待Curator新版本解决这个bug. * BUG地址:https://issues.apache.org/jira/browse/CURATOR-157 */ private void waitForCacheClose() { try { Thread.sleep(500L); } catch (final InterruptedException ex) { Thread.currentThread().interrupt(); } } /** * Get string. * * @param key the key * * @return the string */ @Override public String get(final String key) { TreeCache cache = findTreeCache(key); if (null == cache) { return getDirectly(key); } ChildData resultInCache = cache.getCurrentData(key); if (null != resultInCache) { return null == resultInCache.getData() ? null : new String(resultInCache.getData(), Charsets.UTF_8); } return getDirectly(key); } private TreeCache findTreeCache(final String key) { for (Entry entry : caches.entrySet()) { if (key.startsWith(entry.getKey())) { return entry.getValue(); } } return null; } /** * Gets directly. * * @param key the key * * @return the directly */ @Override public String getDirectly(final String key) { try { return new String(client.getData().forPath(key), Charsets.UTF_8); //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); return null; } } /** * Gets children keys. * * @param key the key * * @return the children keys */ @Override public List getChildrenKeys(final String key) { try { List result = client.getChildren().forPath(key); result.sort(Comparator.reverseOrder()); return result; //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); return Collections.emptyList(); } } /** * Gets num children. * * @param key the key * * @return the num children */ @Override public int getNumChildren(final String key) { Stat stat = null; try { stat = client.checkExists().forPath(key); } catch (final Exception ex) { RegExceptionHandler.handleException(ex); } return stat == null ? 0 : stat.getNumChildren(); } /** * Is existed boolean. * * @param key the key * * @return the boolean */ @Override public boolean isExisted(final String key) { try { return null != client.checkExists().forPath(key); //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); return false; } } /** * Persist. * * @param key the key * @param value the value */ @Override public void persist(final String key, final String value) { try { if (!isExisted(key)) { if (null == value) { client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(key); } else { client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath(key, value.getBytes(Charsets.UTF_8)); } } else { if (null != value) { update(key, value); } } //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); } } /** * Persist. * * @param key the key */ @Override public void persist(String key) { this.persist(key, null); } /** * Update. * * @param key the key * @param value the value */ @Override public void update(final String key, final String value) { try { client.inTransaction().check().forPath(key).and().setData().forPath(key, value.getBytes(Charsets.UTF_8)).and().commit(); //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); } } /** * Persist ephemeral. * * @param key the key * @param value the value */ @Override public void persistEphemeral(final String key, final String value) { try { if (isExisted(key)) { client.delete().deletingChildrenIfNeeded().forPath(key); } client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(key, value.getBytes(Charsets.UTF_8)); //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); } } /** * Persist sequential string. * * @param key the key * @param value the value * * @return the string */ @Override public String persistSequential(final String key, final String value) { try { return client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath(key, value.getBytes(Charsets.UTF_8)); //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); } return null; } /** * Persist ephemeral sequential. * * @param key the key */ @Override public void persistEphemeralSequential(final String key) { try { client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL_SEQUENTIAL).forPath(key); //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); } } /** * Remove. * * @param key the key */ @Override public void remove(final String key) { try { client.delete().deletingChildrenIfNeeded().forPath(key); //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); } } /** * Gets registry center time. * * @param key the key * * @return the registry center time */ @Override public long getRegistryCenterTime(final String key) { long result = 0L; try { persist(key, ""); result = client.checkExists().forPath(key).getMtime(); //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); } Preconditions.checkState(0L != result, "Cannot get registry center time."); return result; } /** * Gets raw client. * * @return the raw client */ @Override public Object getRawClient() { return client; } /** * Increment. * * @param path the path * @param retryNTimes the retry n times */ @Override public void increment(String path, RetryNTimes retryNTimes) { try { distributedAtomicInteger = new DistributedAtomicInteger(client, path, retryNTimes); distributedAtomicInteger.increment(); } catch (Exception e) { log.error("increment={}", e.getMessage(), e); } } /** * Gets atomic value. * * @param path the path * @param retryNTimes the retry n times * * @return the atomic value */ @Override public AtomicValue getAtomicValue(String path, RetryNTimes retryNTimes) { try { distributedAtomicInteger = new DistributedAtomicInteger(client, path, retryNTimes); return distributedAtomicInteger.get(); } catch (Exception e) { log.error("getAtomicValue={}", e.getMessage(), e); } return null; } /** * Add cache data. * * @param cachePath the cache path */ @Override public void addCacheData(final String cachePath) { TreeCache cache = new TreeCache(client, cachePath); try { cache.start(); //CHECKSTYLE:OFF } catch (final Exception ex) { //CHECKSTYLE:ON RegExceptionHandler.handleException(ex); } caches.put(cachePath + "/", cache); } /** * Evict cache data. * * @param cachePath the cache path */ @Override public void evictCacheData(final String cachePath) { TreeCache cache = caches.remove(cachePath + "/"); if (null != cache) { cache.close(); } } /** * Gets raw cache. * * @param cachePath the cache path * * @return the raw cache */ @Override public Object getRawCache(final String cachePath) { return caches.get(cachePath + "/"); } /** * Register mq. * * @param app the app * @param host the host * @param producerGroup the producer group * @param consumerGroup the consumer group * @param namesrvAddr the namesrv addr */ @Override public void registerMq(final String app, final String host, final String producerGroup, final String consumerGroup, String namesrvAddr) { // 注册生产者 final String producerRootPath = GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH + GlobalConstant.Symbol.SLASH + app; final String consumerRootPath = GlobalConstant.ZK_REGISTRY_CONSUMER_ROOT_PATH + GlobalConstant.Symbol.SLASH + app; ReliableMessageRegisterDto dto; if (StringUtils.isNotEmpty(producerGroup)) { dto = new ReliableMessageRegisterDto().setProducerGroup(producerGroup).setNamesrvAddr(namesrvAddr); String producerJson = JSON.toJSONString(dto); this.persist(producerRootPath, producerJson); this.persistEphemeral(producerRootPath + GlobalConstant.Symbol.SLASH + host, DateUtil.now()); } // 注册消费者 if (StringUtils.isNotEmpty(consumerGroup)) { dto = new ReliableMessageRegisterDto().setConsumerGroup(consumerGroup).setNamesrvAddr(namesrvAddr); String producerJson = JSON.toJSONString(dto); this.persist(consumerRootPath, producerJson); this.persistEphemeral(consumerRootPath + GlobalConstant.Symbol.SLASH + host, DateUtil.now()); } } } ================================================ FILE: paascloud-common/paascloud-common-zk/src/test/java/.gitkeep ================================================ ================================================ FILE: paascloud-common/paascloud-security-app/pom.xml ================================================ 4.0.0 paascloud-security-app com.liuzm.paascloud.common paascloud-common 1.0 com.liuzm.paascloud.common paascloud-security-core ${paascloud.security.version} ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/AppSecretException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AppSecretException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.app; /** * The class App secret exception. * * @author paascloud.net @gmail.com */ public class AppSecretException extends RuntimeException { private static final long serialVersionUID = -1629364510827838114L; /** * Instantiates a new App secret exception. * * @param msg the msg */ public AppSecretException(String msg) { super(msg); } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/AppSecurityController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AppSecurityController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.app; import com.paascloud.security.app.social.AppSingUpUtils; import com.paascloud.security.core.properties.SecurityConstants; import com.paascloud.security.core.social.BaseSocialController; import com.paascloud.security.core.social.support.SocialUserInfo; import org.springframework.http.HttpStatus; import org.springframework.social.connect.Connection; import org.springframework.social.connect.web.ProviderSignInUtils; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.ServletWebRequest; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; /** * The class App security controller. * * @author paascloud.net@gmail.comg */ @RestController public class AppSecurityController extends BaseSocialController { @Resource private ProviderSignInUtils providerSignInUtils; @Resource private AppSingUpUtils appSingUpUtils; /** * 需要注册时跳到这里,返回401和用户信息给前端 * * @param request the request * * @return social user info */ @GetMapping(SecurityConstants.DEFAULT_SOCIAL_USER_INFO_URL) @ResponseStatus(HttpStatus.UNAUTHORIZED) public SocialUserInfo getSocialUserInfo(HttpServletRequest request) { Connection connection = providerSignInUtils.getConnectionFromSession(new ServletWebRequest(request)); appSingUpUtils.saveConnectionData(new ServletWebRequest(request), connection.createData()); return buildSocialUserInfo(connection); } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/authentication/openid/OpenIdAuthenticationFilter.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpenIdAuthenticationFilter.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.app.authentication.openid; import com.paascloud.security.core.properties.SecurityConstants; import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.util.Assert; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * The class Open id authentication filter. * * @author paascloud.net@gmail.com */ public class OpenIdAuthenticationFilter extends AbstractAuthenticationProcessingFilter { // ~ Static fields/initializers // ===================================================================================== private String openIdParameter = SecurityConstants.DEFAULT_PARAMETER_NAME_OPENID; private String providerIdParameter = SecurityConstants.DEFAULT_PARAMETER_NAME_PROVIDERID; private boolean postOnly = true; private static final String POST = "POST"; // ~ Constructors // =================================================================================================== /** * Instantiates a new Open id authentication filter. */ OpenIdAuthenticationFilter() { super(new AntPathRequestMatcher(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_OPENID, "POST")); } // ~ Methods // ======================================================================================================== /** * Attempt authentication authentication. * * @param request the request * @param response the response * * @return the authentication * * @throws AuthenticationException the authentication exception */ @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { if (postOnly && !POST.equals(request.getMethod())) { throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); } String openid = obtainOpenId(request); String providerId = obtainProviderId(request); if (openid == null) { openid = ""; } if (providerId == null) { providerId = ""; } openid = openid.trim(); providerId = providerId.trim(); OpenIdAuthenticationToken authRequest = new OpenIdAuthenticationToken(openid, providerId); // Allow subclasses to set the "details" property setDetails(request, authRequest); return this.getAuthenticationManager().authenticate(authRequest); } /** * 获取openId * * @param request the request * * @return the string */ protected String obtainOpenId(HttpServletRequest request) { return request.getParameter(openIdParameter); } /** * 获取提供商id * * @param request the request * * @return the string */ protected String obtainProviderId(HttpServletRequest request) { return request.getParameter(providerIdParameter); } /** * Provided so that subclasses may configure what is put into the * authentication request's details property. * * @param request that an authentication request is being created for * @param authRequest the authentication request object that should have its details set */ protected void setDetails(HttpServletRequest request, OpenIdAuthenticationToken authRequest) { authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); } /** * Sets the parameter name which will be used to obtain the username from * the login request. * * @param openIdParameter the open id parameter */ public void setOpenIdParameter(String openIdParameter) { Assert.hasText(openIdParameter, "Username parameter must not be empty or null"); this.openIdParameter = openIdParameter; } /** * Defines whether only HTTP POST requests will be allowed by this filter. * If set to true, and an authentication request is received which is not a * POST request, an exception will be raised immediately and authentication * will not be attempted. The unsuccessfulAuthentication() method * will be called as if handling a failed authentication. *

* Defaults to true but may be overridden by subclasses. * * @param postOnly the post only */ public void setPostOnly(boolean postOnly) { this.postOnly = postOnly; } /** * Gets open id parameter. * * @return the open id parameter */ public final String getOpenIdParameter() { return openIdParameter; } /** * Gets provider id parameter. * * @return the provider id parameter */ public String getProviderIdParameter() { return providerIdParameter; } /** * Sets provider id parameter. * * @param providerIdParameter the provider id parameter */ public void setProviderIdParameter(String providerIdParameter) { this.providerIdParameter = providerIdParameter; } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/authentication/openid/OpenIdAuthenticationProvider.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpenIdAuthenticationProvider.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.app.authentication.openid; import org.apache.commons.collections.CollectionUtils; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.InternalAuthenticationServiceException; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.social.connect.UsersConnectionRepository; import org.springframework.social.security.SocialUserDetailsService; import java.util.HashSet; import java.util.Set; /** * The class Open id authentication provider. * * @author paascloud.net@gmail.com */ public class OpenIdAuthenticationProvider implements AuthenticationProvider { private SocialUserDetailsService userDetailsService; private UsersConnectionRepository usersConnectionRepository; /** * Authenticate authentication. * * @param authentication the authentication * * @return the authentication * * @throws AuthenticationException the authentication exception */ @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { OpenIdAuthenticationToken authenticationToken = (OpenIdAuthenticationToken) authentication; Set providerUserIds = new HashSet<>(); providerUserIds.add((String) authenticationToken.getPrincipal()); Set userIds = usersConnectionRepository.findUserIdsConnectedTo(authenticationToken.getProviderId(), providerUserIds); if (CollectionUtils.isEmpty(userIds) || userIds.size() != 1) { throw new InternalAuthenticationServiceException("无法获取用户信息"); } String userId = userIds.iterator().next(); UserDetails user = userDetailsService.loadUserByUserId(userId); if (user == null) { throw new InternalAuthenticationServiceException("无法获取用户信息"); } OpenIdAuthenticationToken authenticationResult = new OpenIdAuthenticationToken(user, user.getAuthorities()); authenticationResult.setDetails(authenticationToken.getDetails()); return authenticationResult; } /** * Supports boolean. * * @param authentication the authentication * * @return the boolean */ @Override public boolean supports(Class authentication) { return OpenIdAuthenticationToken.class.isAssignableFrom(authentication); } /** * Gets user details service. * * @return the user details service */ public SocialUserDetailsService getUserDetailsService() { return userDetailsService; } /** * Sets user details service. * * @param userDetailsService the user details service */ public void setUserDetailsService(SocialUserDetailsService userDetailsService) { this.userDetailsService = userDetailsService; } /** * Gets users connection repository. * * @return the users connection repository */ public UsersConnectionRepository getUsersConnectionRepository() { return usersConnectionRepository; } /** * Sets users connection repository. * * @param usersConnectionRepository the users connection repository */ public void setUsersConnectionRepository(UsersConnectionRepository usersConnectionRepository) { this.usersConnectionRepository = usersConnectionRepository; } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/authentication/openid/OpenIdAuthenticationSecurityConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpenIdAuthenticationSecurityConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.app.authentication.openid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.SecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.social.connect.UsersConnectionRepository; import org.springframework.social.security.SocialUserDetailsService; import org.springframework.stereotype.Component; /** * The class Open id authentication security config. * * @author paascloud.net@gmail.com */ @Component public class OpenIdAuthenticationSecurityConfig extends SecurityConfigurerAdapter { private final AuthenticationSuccessHandler pcAuthenticationSuccessHandler; private final AuthenticationFailureHandler pcAuthenticationFailureHandler; private final SocialUserDetailsService userDetailsService; private final UsersConnectionRepository usersConnectionRepository; @Autowired public OpenIdAuthenticationSecurityConfig(AuthenticationSuccessHandler pcAuthenticationSuccessHandler, AuthenticationFailureHandler pcAuthenticationFailureHandler, SocialUserDetailsService userDetailsService, UsersConnectionRepository usersConnectionRepository) { this.pcAuthenticationSuccessHandler = pcAuthenticationSuccessHandler; this.pcAuthenticationFailureHandler = pcAuthenticationFailureHandler; this.userDetailsService = userDetailsService; this.usersConnectionRepository = usersConnectionRepository; } /** * Configure. * * @param http the http */ @Override public void configure(HttpSecurity http) { OpenIdAuthenticationFilter openIdAuthenticationFilter = new OpenIdAuthenticationFilter(); openIdAuthenticationFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class)); openIdAuthenticationFilter.setAuthenticationSuccessHandler(pcAuthenticationSuccessHandler); openIdAuthenticationFilter.setAuthenticationFailureHandler(pcAuthenticationFailureHandler); OpenIdAuthenticationProvider openIdAuthenticationProvider = new OpenIdAuthenticationProvider(); openIdAuthenticationProvider.setUserDetailsService(userDetailsService); openIdAuthenticationProvider.setUsersConnectionRepository(usersConnectionRepository); http.authenticationProvider(openIdAuthenticationProvider) .addFilterAfter(openIdAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/authentication/openid/OpenIdAuthenticationToken.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpenIdAuthenticationToken.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.app.authentication.openid; import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.SpringSecurityCoreVersion; import java.util.Collection; /** * The class Open id authentication token. * * @author paascloud.net@gmail.com */ public class OpenIdAuthenticationToken extends AbstractAuthenticationToken { private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID; // ~ Instance fields // ================================================================================================ private final Object principal; private String providerId; // ~ Constructors // =================================================================================================== /** * This constructor can be safely used by any code that wishes to create a * UsernamePasswordAuthenticationToken, as the {@link #isAuthenticated()} * will return false. * * @param openId the open id * @param providerId the provider id */ public OpenIdAuthenticationToken(String openId, String providerId) { super(null); this.principal = openId; this.providerId = providerId; setAuthenticated(false); } /** * This constructor should only be used by AuthenticationManager or * AuthenticationProvider implementations that are satisfied with * producing a trusted (i.e. {@link #isAuthenticated()} = true) * authentication token. * * @param principal the principal * @param authorities the authorities */ public OpenIdAuthenticationToken(Object principal, Collection authorities) { super(authorities); this.principal = principal; // must use super, as we override super.setAuthenticated(true); } // ~ Methods // ======================================================================================================== /** * Gets credentials. * * @return the credentials */ @Override public Object getCredentials() { return null; } /** * Gets principal. * * @return the principal */ @Override public Object getPrincipal() { return this.principal; } /** * Gets provider id. * * @return the provider id */ public String getProviderId() { return providerId; } /** * Sets authenticated. * * @param isAuthenticated the is authenticated * * @throws IllegalArgumentException the illegal argument exception */ @Override public void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException { if (isAuthenticated) { throw new IllegalArgumentException( "Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead"); } super.setAuthenticated(false); } /** * Erase credentials. */ @Override public void eraseCredentials() { super.eraseCredentials(); } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/social/AppSingUpUtils.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AppSingUpUtils.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.app.social; import com.paascloud.security.app.AppSecretException; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.social.connect.Connection; import org.springframework.social.connect.ConnectionData; import org.springframework.social.connect.ConnectionFactoryLocator; import org.springframework.social.connect.UsersConnectionRepository; import org.springframework.stereotype.Component; import org.springframework.web.context.request.WebRequest; import java.util.concurrent.TimeUnit; /** * app环境下替换providerSignInUtils,避免由于没有session导致读不到社交用户信息的问题 * * @author paascloud.net @gmail.com */ @Component public class AppSingUpUtils { private final RedisTemplate redisTemplate; private final UsersConnectionRepository usersConnectionRepository; private final ConnectionFactoryLocator connectionFactoryLocator; /** * Instantiates a new App sing up utils. * * @param redisTemplate the redis template * @param usersConnectionRepository the users connection repository * @param connectionFactoryLocator the connection factory locator */ @Autowired public AppSingUpUtils(RedisTemplate redisTemplate, UsersConnectionRepository usersConnectionRepository, ConnectionFactoryLocator connectionFactoryLocator) { this.redisTemplate = redisTemplate; this.usersConnectionRepository = usersConnectionRepository; this.connectionFactoryLocator = connectionFactoryLocator; } /** * 缓存社交网站用户信息到redis * * @param request the request * @param connectionData the connection data */ public void saveConnectionData(WebRequest request, ConnectionData connectionData) { redisTemplate.opsForValue().set(getKey(request), connectionData, 10, TimeUnit.MINUTES); } /** * 将缓存的社交网站用户信息与系统注册用户信息绑定 * * @param request the request * @param userId the user id */ public void doPostSignUp(WebRequest request, String userId) { String key = getKey(request); if (!redisTemplate.hasKey(key)) { throw new AppSecretException("无法找到缓存的用户社交账号信息"); } ConnectionData connectionData = (ConnectionData) redisTemplate.opsForValue().get(key); Connection connection = connectionFactoryLocator.getConnectionFactory(connectionData.getProviderId()) .createConnection(connectionData); usersConnectionRepository.createConnectionRepository(userId).addConnection(connection); redisTemplate.delete(key); } /** * 获取redis key */ private String getKey(WebRequest request) { String deviceId = request.getHeader("deviceId"); if (StringUtils.isBlank(deviceId)) { throw new AppSecretException("设备id参数不能为空"); } return "pc:security:social.connect." + deviceId; } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/social/AppSocialAuthenticationFilterPostProcessor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AppSocialAuthenticationFilterPostProcessor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.app.social; import com.paascloud.security.core.social.support.SocialAuthenticationFilterPostProcessor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.social.security.SocialAuthenticationFilter; import org.springframework.stereotype.Component; /** * The type App social authentication filter post processor. * @author paascloud */ @Component public class AppSocialAuthenticationFilterPostProcessor implements SocialAuthenticationFilterPostProcessor{ private final AuthenticationSuccessHandler pcAuthenticationSuccessHandler; @Autowired public AppSocialAuthenticationFilterPostProcessor(AuthenticationSuccessHandler pcAuthenticationSuccessHandler) { this.pcAuthenticationSuccessHandler = pcAuthenticationSuccessHandler; } @Override public void process(final SocialAuthenticationFilter socialAuthenticationFilter) { socialAuthenticationFilter.setAuthenticationSuccessHandler(pcAuthenticationSuccessHandler); } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/app/social/SpringSocialConfigurerPostProcessor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SpringSocialConfigurerPostProcessor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.app.social; import org.apache.commons.lang.StringUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.stereotype.Component; import com.paascloud.security.core.properties.SecurityConstants; import com.paascloud.security.core.social.support.PcSpringSocialConfigurer; /** * The class Spring social configurer post processor. * * @author paascloud.net@gmail.com */ @Component public class SpringSocialConfigurerPostProcessor implements BeanPostProcessor { /** * Post process before initialization object. * * @param bean the bean * @param beanName the bean name * * @return the object * * @throws BeansException the beans exception */ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } /** * Post process after initialization object. * * @param bean the bean * @param beanName the bean name * * @return the object * * @throws BeansException the beans exception */ @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { String pcSocialSecurityConfig = "pcSocialSecurityConfig"; if (StringUtils.equals(beanName, pcSocialSecurityConfig)) { PcSpringSocialConfigurer config = (PcSpringSocialConfigurer) bean; config.signupUrl(SecurityConstants.DEFAULT_SOCIAL_USER_INFO_URL); return config; } return bean; } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/server/PcAccessDeniedHandler.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcAccessDeniedHandler.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.server; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Configuration; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Map; /** * The class Pc access denied handler. * * @author paascloud.net @gmail.com */ @Slf4j @Configuration public class PcAccessDeniedHandler implements AccessDeniedHandler { @Resource private ObjectMapper objectMapper; /** * Handle. * * @param request the request * @param response the response * @param e the e * * @throws JsonProcessingException the json processing exception */ @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException e) throws IOException { log.info("处理权限异常. e={}", e); Map result = new HashMap<>(3); result.put("code", 99990401); result.put("message", "无访问权限"); String json = objectMapper.writeValueAsString(result); response.setStatus(HttpStatus.UNAUTHORIZED.value()); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(json); } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/server/PcResourceServerConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcResourceServerConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.server; import com.paascloud.security.app.authentication.openid.OpenIdAuthenticationSecurityConfig; import com.paascloud.security.core.authentication.FormAuthenticationConfig; import com.paascloud.security.core.authentication.mobile.SmsCodeAuthenticationSecurityConfig; import com.paascloud.security.core.authorize.AuthorizeConfigManager; import com.paascloud.security.core.validate.code.ValidateCodeSecurityConfig; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer; import org.springframework.security.oauth2.provider.expression.OAuth2WebSecurityExpressionHandler; import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl; import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; import org.springframework.social.security.SpringSocialConfigurer; import javax.annotation.Resource; import javax.sql.DataSource; /** * 资源服务器配置 * * @author paascloud.net @gmail.com */ @Configuration @EnableResourceServer public class PcResourceServerConfig extends ResourceServerConfigurerAdapter { @Autowired private OAuth2WebSecurityExpressionHandler pcSecurityExpressionHandler; @Autowired private AccessDeniedHandler pcAccessDeniedHandler; @Autowired protected AuthenticationSuccessHandler pcAuthenticationSuccessHandler; @Autowired protected AuthenticationFailureHandler pcAuthenticationFailureHandler; @Autowired private SmsCodeAuthenticationSecurityConfig smsCodeAuthenticationSecurityConfig; @Autowired private ValidateCodeSecurityConfig validateCodeSecurityConfig; @Autowired private SpringSocialConfigurer pcSocialSecurityConfig; @Autowired private AuthorizeConfigManager authorizeConfigManager; @Autowired private FormAuthenticationConfig formAuthenticationConfig; @Autowired private OpenIdAuthenticationSecurityConfig openIdAuthenticationSecurityConfig; @Resource private DataSource dataSource; /** * 记住我功能的token存取器配置 * * @return the persistent token repository */ @Bean public PersistentTokenRepository persistentTokenRepository() { JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); tokenRepository.setDataSource(dataSource); // tokenRepository.setCreateTableOnStartup(true); // 第一次启动创建 return tokenRepository; } /** * Configure. * * @param http the http * * @throws Exception the exception */ @Override public void configure(HttpSecurity http) throws Exception { formAuthenticationConfig.configure(http); http.headers().frameOptions().disable(); http.apply(validateCodeSecurityConfig) .and() .apply(smsCodeAuthenticationSecurityConfig) .and() .apply(pcSocialSecurityConfig) .and() .apply(openIdAuthenticationSecurityConfig) .and() .headers().frameOptions().disable() .and() .exceptionHandling().accessDeniedHandler(pcAccessDeniedHandler) .and() .csrf().disable(); authorizeConfigManager.config(http.authorizeRequests()); } @Override public void configure(ResourceServerSecurityConfigurer resources) { resources.expressionHandler(pcSecurityExpressionHandler); } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/server/PcWebResponseExceptionTranslator.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcWebResponseExceptionTranslator.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.server; import org.springframework.http.ResponseEntity; import org.springframework.security.oauth2.common.exceptions.OAuth2Exception; import org.springframework.security.oauth2.provider.error.WebResponseExceptionTranslator; /** * The class Pc web response exception translator. * * @author paascloud.net @gmail.com */ public class PcWebResponseExceptionTranslator implements WebResponseExceptionTranslator { /** * Translate response entity. * * @param e the e * * @return the response entity * * @throws Exception the exception */ @Override public ResponseEntity translate(Exception e) throws Exception { return null; } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/server/TokenJwtEnhancer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TokenJwtEnhancer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.server; import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.security.oauth2.provider.token.TokenEnhancer; import java.util.HashMap; import java.util.Map; /** * The class Token jwt enhancer. * * @author paascloud.net @gmail.com */ public class TokenJwtEnhancer implements TokenEnhancer { /** * Enhance o auth 2 access token. * * @param accessToken the access token * @param oAuth2Authentication the o auth 2 authentication * * @return the o auth 2 access token */ @Override public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication oAuth2Authentication) { Map info = new HashMap<>(8); info.put("timestamp", System.currentTimeMillis()); Authentication authentication = oAuth2Authentication.getUserAuthentication(); if (authentication != null && authentication.getPrincipal() instanceof UserDetails) { Object principal = authentication.getPrincipal(); info.put("loginName", ((UserDetails) principal).getUsername()); } ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(info); return accessToken; } } ================================================ FILE: paascloud-common/paascloud-security-app/src/main/java/com/paascloud/security/server/TokenStoreConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TokenStoreConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.server; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.security.oauth2.provider.token.TokenEnhancer; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; import com.paascloud.security.core.properties.SecurityProperties; /** * The class Token store config. * * @author paascloud.net @gmail.com */ @Configuration public class TokenStoreConfig { /** * 使用redis存储token的配置,只有在paascloud.security.oauth2.tokenStore配置为redis时生效 */ @Configuration @ConditionalOnProperty(prefix = "paascloud.security.oauth2", name = "tokenStore", havingValue = "redis") public static class RedisConfig { @Autowired private RedisConnectionFactory redisConnectionFactory; /** * Redis token store token store. * * @return token store */ @Bean public TokenStore redisTokenStore() { return new RedisTokenStore(redisConnectionFactory); } } /** * 使用jwt时的配置,默认生效 * * @author paascloud.net @gmail.com */ @Configuration @ConditionalOnProperty(prefix = "paascloud.security.oauth2", name = "tokenStore", havingValue = "jwt", matchIfMissing = true) public static class JwtConfig { @Autowired private SecurityProperties securityProperties; /** * Jwt token store token store. * * @return the token store */ @Bean public TokenStore jwtTokenStore() { return new JwtTokenStore(jwtAccessTokenConverter()); } /** * Jwt access token converter jwt access token converter. * * @return the jwt access token converter */ @Bean public JwtAccessTokenConverter jwtAccessTokenConverter() { JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); converter.setSigningKey(securityProperties.getOauth2().getJwtSigningKey()); return converter; } /** * Jwt token enhancer token enhancer. * * @return the token enhancer */ @Bean @ConditionalOnBean(TokenEnhancer.class) public TokenEnhancer jwtTokenEnhancer() { return new TokenJwtEnhancer(); } } } ================================================ FILE: paascloud-common/paascloud-security-core/pom.xml ================================================ 4.0.0 paascloud-security-core com.liuzm.paascloud.common paascloud-common 1.0 org.springframework.cloud spring-cloud-starter-oauth2 org.springframework.boot spring-boot-starter-data-redis org.springframework.boot spring-boot-starter-jdbc mysql mysql-connector-java org.springframework.social spring-social-config org.springframework.social spring-social-core org.springframework.social spring-social-security org.springframework.social spring-social-web commons-lang commons-lang commons-collections commons-collections commons-beanutils commons-beanutils org.springframework.boot spring-boot-configuration-processor com.github.penggle kaptcha com.fasterxml.jackson.core jackson-annotations com.fasterxml.jackson.core jackson-databind com.fasterxml.jackson.core jackson-core com.fasterxml.jackson.datatype jackson-datatype-jsr310 com.liuzm.paascloud.common paascloud-common-util ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/SecurityCoreConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SecurityCoreConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core; import com.paascloud.security.core.properties.SecurityProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; /** * The class Security core config. * * @author paascloud.net@gmail.com */ @Configuration @EnableConfigurationProperties(SecurityProperties.class) public class SecurityCoreConfig { } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/SecurityResult.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SecurityResult.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.commons.lang3.StringUtils; /** * The class Security result. * * @author paascloud.net @gmail.com */ @Data @NoArgsConstructor public class SecurityResult { /** * 成功码. */ public static final int SUCCESS_CODE = 200; /** * 成功信息. */ public static final String SUCCESS_MESSAGE = "操作成功"; /** * 错误码. */ public static final int ERROR_CODE = 500; /** * 错误信息. */ public static final String ERROR_MESSAGE = "内部异常"; /** * 状态码 */ private Integer code; /** * 提示信息 */ private String message; /** * 结果 */ private Object result; public static SecurityResult ok(Object data) { return new SecurityResult(data); } public static SecurityResult ok() { return new SecurityResult(null); } public static SecurityResult error(String message) { return error(message, null); } public static SecurityResult error(String message, Object data) { return new SecurityResult(ERROR_CODE, StringUtils.isEmpty(message) ? ERROR_MESSAGE : message, data); } public SecurityResult(Integer code, String message, Object result) { this.code = code; this.message = message; this.result = result; } private SecurityResult(Object result) { this.code = SUCCESS_CODE; this.message = SUCCESS_MESSAGE; this.result = result; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/SecurityUser.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SecurityUser.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core; import org.apache.commons.lang3.StringUtils; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import java.util.Collection; /** * The class Security user. * * @author paascloud.net @gmail.com */ public class SecurityUser implements UserDetails { private static final long serialVersionUID = 4872628781561412463L; private static final String ENABLE = "ENABLE"; private Collection authorities; private Long userId; private String nickName; private String loginName; private String loginPwd; private String status; private Long groupId; private String groupName; public SecurityUser(Long userId, String loginName, String loginPwd, String nickName, Long groupId, String groupName) { this.setUserId(userId); this.setLoginName(loginName); this.setLoginPwd(loginPwd); this.setNickName(nickName); this.setGroupId(groupId); this.setGroupName(groupName); } public SecurityUser(Long userId, String loginName, String loginPwd, String nickName, Long groupId, String groupName, String status, Collection grantedAuthorities) { this.setUserId(userId); this.setLoginName(loginName); this.setLoginPwd(loginPwd); this.setNickName(nickName); this.setGroupId(groupId); this.setGroupName(groupName); this.setStatus(status); this.authorities = grantedAuthorities; } @Override public Collection getAuthorities() { return this.authorities; } @Override public String getPassword() { return this.getLoginPwd(); } @Override public String getUsername() { return this.getLoginName(); } @Override public boolean isAccountNonExpired() { return true; } @Override public boolean isAccountNonLocked() { return true; } @Override public boolean isCredentialsNonExpired() { return true; } @Override public boolean isEnabled() { return StringUtils.equals(this.status, ENABLE); } public Long getUserId() { return userId; } public void setUserId(Long userId) { this.userId = userId; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } public String getLoginPwd() { return loginPwd; } public void setLoginPwd(String loginPwd) { this.loginPwd = loginPwd; } public Long getGroupId() { return groupId; } public void setGroupId(Long groupId) { this.groupId = groupId; } public String getGroupName() { return groupName; } public void setGroupName(String groupName) { this.groupName = groupName; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/AuthenticationBeanConfig.java ================================================ package com.paascloud.security.core.authentication; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.social.security.SocialUserDetailsService; /** * 认证相关的扩展点配置。配置在这里的bean,业务系统都可以通过声明同类型或同名的bean来覆盖安全 * 模块默认的配置。 * * @author paascloud.net @gmail.com */ @Configuration public class AuthenticationBeanConfig { /** * 默认密码处理器 * * @return 密码加密器 */ @Bean @ConditionalOnMissingBean(PasswordEncoder.class) public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } /** * 默认认证器 * * @return user details service */ @Bean @ConditionalOnMissingBean(UserDetailsService.class) public UserDetailsService userDetailsService() { return new DefaultUserDetailsServiceImpl(); } /** * 默认认证器 * * @return social user details service */ @Bean @ConditionalOnMissingBean(SocialUserDetailsService.class) public SocialUserDetailsService socialUserDetailsService() { return new DefaultSocialUserDetailsServiceImpl(); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/DefaultSocialUserDetailsServiceImpl.java ================================================ package com.paascloud.security.core.authentication; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.social.security.SocialUserDetails; import org.springframework.social.security.SocialUserDetailsService; /** * 默认的SocialUserDetailsService实现 * 不做任何处理,只在控制台打印一句日志,然后抛出异常,提醒业务系统自己配置SocialUserDetailsService。 * * @author paascloud.net @gmail.com */ @Slf4j public class DefaultSocialUserDetailsServiceImpl implements SocialUserDetailsService { /** * Load user by user id social user details. * * @param userId the user id * * @return the social user details * * @throws UsernameNotFoundException the username not found exception */ @Override public SocialUserDetails loadUserByUserId(String userId) throws UsernameNotFoundException { log.warn("请配置 SocialUserDetailsService 接口的实现."); throw new UsernameNotFoundException(userId); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/DefaultUserDetailsServiceImpl.java ================================================ package com.paascloud.security.core.authentication; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; /** * 默认的 UserDetailsService 实现 * 不做任何处理,只在控制台打印一句日志,然后抛出异常,提醒业务系统自己配置 UserDetailsService。 * * @author paascloud.net @gmail.com */ @Slf4j public class DefaultUserDetailsServiceImpl implements UserDetailsService { /** * Load user by username user details. * * @param username the username * * @return the user details * * @throws UsernameNotFoundException the username not found exception */ @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { log.warn("请配置 UserDetailsService 接口的实现."); throw new UsernameNotFoundException(username); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/FormAuthenticationConfig.java ================================================ package com.paascloud.security.core.authentication; import com.paascloud.security.core.properties.SecurityConstants; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.stereotype.Component; /** * 表单登录配置 * * @author paascloud.net @gmail.com */ @Component public class FormAuthenticationConfig { /** * The Pc authentication success handler. */ protected final AuthenticationSuccessHandler pcAuthenticationSuccessHandler; /** * The Pc authentication failure handler. */ protected final AuthenticationFailureHandler pcAuthenticationFailureHandler; /** * Instantiates a new Form authentication config. * * @param pcAuthenticationSuccessHandler the pc authentication success handler * @param pcAuthenticationFailureHandler the pc authentication failure handler */ @Autowired public FormAuthenticationConfig(AuthenticationSuccessHandler pcAuthenticationSuccessHandler, AuthenticationFailureHandler pcAuthenticationFailureHandler) { this.pcAuthenticationSuccessHandler = pcAuthenticationSuccessHandler; this.pcAuthenticationFailureHandler = pcAuthenticationFailureHandler; } /** * Configure. * * @param http the http * * @throws Exception the exception */ public void configure(HttpSecurity http) throws Exception { http.formLogin() .loginPage(SecurityConstants.DEFAULT_UNAUTHENTICATION_URL) .loginProcessingUrl(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_FORM) .successHandler(pcAuthenticationSuccessHandler) .failureHandler(pcAuthenticationFailureHandler); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/mobile/SmsCodeAuthenticationFilter.java ================================================ package com.paascloud.security.core.authentication.mobile; import com.paascloud.security.core.properties.SecurityConstants; import org.springframework.security.authentication.AuthenticationServiceException; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter; import org.springframework.security.web.util.matcher.AntPathRequestMatcher; import org.springframework.util.Assert; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 短信登录过滤器 * * @author paascloud.net @gmail.com */ public class SmsCodeAuthenticationFilter extends AbstractAuthenticationProcessingFilter { private static final String POST = "POST"; // ~ Static fields/initializers // ===================================================================================== private String mobileParameter = SecurityConstants.DEFAULT_PARAMETER_NAME_MOBILE; private boolean postOnly = true; // ~ Constructors // =================================================================================================== /** * Instantiates a new Sms code authentication filter. */ public SmsCodeAuthenticationFilter() { super(new AntPathRequestMatcher(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_MOBILE, "POST")); } // ~ Methods // ======================================================================================================== /** * Attempt authentication authentication. * * @param request the request * @param response the response * * @return the authentication * * @throws AuthenticationException the authentication exception */ @Override public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { if (postOnly && !POST.equals(request.getMethod())) { throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); } String mobile = obtainMobile(request); if (mobile == null) { mobile = ""; } mobile = mobile.trim(); SmsCodeAuthenticationToken authRequest = new SmsCodeAuthenticationToken(mobile); // Allow subclasses to set the "details" property setDetails(request, authRequest); return this.getAuthenticationManager().authenticate(authRequest); } /** * 获取手机号 * * @param request the request * * @return the string */ protected String obtainMobile(HttpServletRequest request) { return request.getParameter(mobileParameter); } /** * Provided so that subclasses may configure what is put into the * authentication request's details property. * * @param request that an authentication request is being created for * @param authRequest the authentication request object that should have its details set */ protected void setDetails(HttpServletRequest request, SmsCodeAuthenticationToken authRequest) { authRequest.setDetails(authenticationDetailsSource.buildDetails(request)); } /** * Sets the parameter name which will be used to obtain the username from * the login request. * * @param usernameParameter the parameter name. Defaults to "username". */ public void setMobileParameter(String usernameParameter) { Assert.hasText(usernameParameter, "Username parameter must not be empty or null"); this.mobileParameter = usernameParameter; } /** * Defines whether only HTTP POST requests will be allowed by this filter. * If set to true, and an authentication request is received which is not a * POST request, an exception will be raised immediately and authentication * will not be attempted. The unsuccessfulAuthentication() method * will be called as if handling a failed authentication. *

* Defaults to true but may be overridden by subclasses. * * @param postOnly the post only */ public void setPostOnly(boolean postOnly) { this.postOnly = postOnly; } /** * Gets mobile parameter. * * @return the mobile parameter */ public final String getMobileParameter() { return mobileParameter; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/mobile/SmsCodeAuthenticationProvider.java ================================================ package com.paascloud.security.core.authentication.mobile; import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.InternalAuthenticationServiceException; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; /** * 短信登录验证逻辑 *

* 由于短信验证码的验证在过滤器里已完成,这里直接读取用户信息即可。 * * @author paascloud.net @gmail.com */ public class SmsCodeAuthenticationProvider implements AuthenticationProvider { private UserDetailsService userDetailsService; /** * Authenticate authentication. * * @param authentication the authentication * * @return the authentication * * @throws AuthenticationException the authentication exception */ @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { SmsCodeAuthenticationToken authenticationToken = (SmsCodeAuthenticationToken) authentication; UserDetails user = userDetailsService.loadUserByUsername((String) authenticationToken.getPrincipal()); if (user == null) { throw new InternalAuthenticationServiceException("无法获取用户信息"); } SmsCodeAuthenticationToken authenticationResult = new SmsCodeAuthenticationToken(user, user.getAuthorities()); authenticationResult.setDetails(authenticationToken.getDetails()); return authenticationResult; } /** * Supports boolean. * * @param authentication the authentication * * @return the boolean */ @Override public boolean supports(Class authentication) { return SmsCodeAuthenticationToken.class.isAssignableFrom(authentication); } /** * Gets user details service. * * @return the user details service */ public UserDetailsService getUserDetailsService() { return userDetailsService; } /** * Sets user details service. * * @param userDetailsService the user details service */ public void setUserDetailsService(UserDetailsService userDetailsService) { this.userDetailsService = userDetailsService; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/mobile/SmsCodeAuthenticationSecurityConfig.java ================================================ package com.paascloud.security.core.authentication.mobile; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.config.annotation.SecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; import org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices; import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; import org.springframework.stereotype.Component; import java.util.UUID; /** * 短信登录配置 * * @author paascloud.net @gmail.com */ @Component public class SmsCodeAuthenticationSecurityConfig extends SecurityConfigurerAdapter { @Autowired private AuthenticationSuccessHandler pcAuthenticationSuccessHandler; @Autowired private AuthenticationFailureHandler pcAuthenticationFailureHandler; @Autowired private UserDetailsService userDetailsService; @Autowired private PersistentTokenRepository persistentTokenRepository; /** * Configure. * * @param http the http */ @Override public void configure(HttpSecurity http) { SmsCodeAuthenticationFilter smsCodeAuthenticationFilter = new SmsCodeAuthenticationFilter(); smsCodeAuthenticationFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class)); smsCodeAuthenticationFilter.setAuthenticationSuccessHandler(pcAuthenticationSuccessHandler); smsCodeAuthenticationFilter.setAuthenticationFailureHandler(pcAuthenticationFailureHandler); String key = UUID.randomUUID().toString(); smsCodeAuthenticationFilter.setRememberMeServices(new PersistentTokenBasedRememberMeServices(key, userDetailsService, persistentTokenRepository)); SmsCodeAuthenticationProvider smsCodeAuthenticationProvider = new SmsCodeAuthenticationProvider(); smsCodeAuthenticationProvider.setUserDetailsService(userDetailsService); http.authenticationProvider(smsCodeAuthenticationProvider) .addFilterAfter(smsCodeAuthenticationFilter, UsernamePasswordAuthenticationFilter.class); // } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authentication/mobile/SmsCodeAuthenticationToken.java ================================================ package com.paascloud.security.core.authentication.mobile; import org.springframework.security.authentication.AbstractAuthenticationToken; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.SpringSecurityCoreVersion; import java.util.Collection; /** * 短信登录验证信息封装类 * * @author paascloud.net @gmail.com */ public class SmsCodeAuthenticationToken extends AbstractAuthenticationToken { private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID; private final Object principal; SmsCodeAuthenticationToken(String mobile) { super(null); this.principal = mobile; setAuthenticated(false); } SmsCodeAuthenticationToken(Object principal, Collection authorities) { super(authorities); this.principal = principal; super.setAuthenticated(true); } @Override public Object getCredentials() { return null; } @Override public Object getPrincipal() { return this.principal; } @Override public void setAuthenticated(boolean isAuthenticated) { if (isAuthenticated) { throw new IllegalArgumentException("Cannot set this token to trusted - use constructor which takes a GrantedAuthority list instead"); } super.setAuthenticated(false); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authorize/AuthorizeConfigManager.java ================================================ package com.paascloud.security.core.authorize; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; /** * 授权信息管理器 * 用于收集系统中所有 AuthorizeConfigProvider 并加载其配置 * * @author paascloud.net @gmail.com */ public interface AuthorizeConfigManager { /** * Config. * * @param config the config */ void config(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry config); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authorize/AuthorizeConfigProvider.java ================================================ package com.paascloud.security.core.authorize; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; /** * 授权配置提供器,各个模块和业务系统可以通过实现此接口向系统添加授权配置。 * * @author paascloud.net @gmail.com */ public interface AuthorizeConfigProvider { /** * Config boolean. * * @param config the config * * @return 返回的boolean表示配置中是否有针对anyRequest的配置 。在整个授权配置中, 应该有且仅有一个针对anyRequest的配置,如果所有的实现都没有针对anyRequest的配置, 系统会自动增加一个anyRequest().authenticated()的配置。如果有多个针对anyRequest 的配置,则会抛出异常。 */ boolean config(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry config); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authorize/PcAuthorizeConfigManager.java ================================================ package com.paascloud.security.core.authorize; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; import org.springframework.stereotype.Component; import java.util.List; /** * 默认的授权配置管理器 * * @author paascloud.net @gmail.com */ @Component public class PcAuthorizeConfigManager implements AuthorizeConfigManager { private final List authorizeConfigProviders; /** * Instantiates a new Pc authorize config manager. * * @param authorizeConfigProviders the authorize config providers */ @Autowired public PcAuthorizeConfigManager(List authorizeConfigProviders) { this.authorizeConfigProviders = authorizeConfigProviders; } /** * Config. * * @param config the config */ @Override public void config(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry config) { boolean existAnyRequestConfig = false; String existAnyRequestConfigName = null; for (AuthorizeConfigProvider authorizeConfigProvider : authorizeConfigProviders) { boolean currentIsAnyRequestConfig = authorizeConfigProvider.config(config); if (existAnyRequestConfig && currentIsAnyRequestConfig) { throw new RuntimeException("重复的anyRequest配置:" + existAnyRequestConfigName + "," + authorizeConfigProvider.getClass().getSimpleName()); } else if (currentIsAnyRequestConfig) { existAnyRequestConfig = true; existAnyRequestConfigName = authorizeConfigProvider.getClass().getSimpleName(); } } if (!existAnyRequestConfig) { config.anyRequest().authenticated(); } } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/authorize/PcAuthorizeConfigProvider.java ================================================ package com.paascloud.security.core.authorize; import com.paascloud.security.core.properties.SecurityConstants; import org.springframework.core.annotation.Order; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; import org.springframework.stereotype.Component; /** * 核心模块的授权配置提供器,安全模块涉及的url的授权配置在这里。 * * @author paascloud.net @gmail.com */ @Component @Order(Integer.MIN_VALUE) public class PcAuthorizeConfigProvider implements AuthorizeConfigProvider { /** * Config boolean. * * @param config the config * * @return the boolean */ @Override public boolean config(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry config) { config.antMatchers(SecurityConstants.DEFAULT_UNAUTHENTICATION_URL, SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_MOBILE, SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_OPENID, SecurityConstants.DEFAULT_SOCIAL_USER_INFO_URL, SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + "/*", "/pay/alipayCallback", "/druid/**", "/auth/**", "/swagger-ui.html", "/swagger-resources/**", "/v2/api-docs").permitAll(); return false; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/BrowserProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BrowserProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.properties; import lombok.Data; /** * 浏览器环境配置项 * * @author paascloud.net @gmail.com */ @Data public class BrowserProperties { /** * session管理配置项 */ private SessionProperties session = new SessionProperties(); /** * '记住我'功能的有效时间,默认1小时 */ private int rememberMeSeconds = 3600; /** * 社交登录,如果需要用户注册,跳转的页面 */ private String signUpUrl = "/pc-signUp.html"; /** * 登录响应的方式,默认是json */ private LoginResponseType signInResponseType = LoginResponseType.JSON; /** * 登录成功后跳转的地址,如果设置了此属性,则登录成功后总是会跳到这个地址上。 * 只在signInResponseType为REDIRECT时生效 */ private String singInSuccessUrl; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/EmailCodeProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:EmailCodeProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.properties; import lombok.Data; /** * The class Email code properties. * * @author paascloud.net @gmail.com */ @Data public class EmailCodeProperties { /** * 过期时间 */ private int expireIn = 60 * 60 * 24; /** * 要拦截的url,多个url用逗号隔开,ant pattern */ private String url; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/ImageCodeProperties.java ================================================ package com.paascloud.security.core.properties; import lombok.Data; import lombok.EqualsAndHashCode; /** * 图片验证码配置项 * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class ImageCodeProperties extends SmsCodeProperties { /** * Instantiates a new Image code properties. */ ImageCodeProperties() { super.setLength(4); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/LoginResponseType.java ================================================ package com.paascloud.security.core.properties; /** * 认证成功后的响应方式 * * @author paascloud.net @gmail.com */ public enum LoginResponseType { /** * 跳转 */ REDIRECT, /** * 返回json */ JSON } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/OAuth2ClientProperties.java ================================================ package com.paascloud.security.core.properties; import lombok.Data; /** * 认证服务器注册的第三方应用配置项 * * @author paascloud.net @gmail.com */ @Data public class OAuth2ClientProperties { /** * 第三方应用appId */ private String clientId; /** * 第三方应用appSecret */ private String clientSecret; /** * 针对此应用发出的token的有效时间 */ private int accessTokenValidateSeconds = 7200; private int refreshTokenValiditySeconds = 2592000; private String scope; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/OAuth2Properties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OAuth2Properties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.properties; import lombok.Data; /** * The class O auth 2 properties. * * @author paascloud.net @gmail.com */ @Data public class OAuth2Properties { /** * 使用jwt时为token签名的秘钥 */ private String jwtSigningKey = "paascloud"; /** * 客户端配置 */ private OAuth2ClientProperties[] clients = {}; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/QQProperties.java ================================================ package com.paascloud.security.core.properties; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.boot.autoconfigure.social.SocialProperties; /** * QQ登录配置项 * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class QQProperties extends SocialProperties { /** * 第三方id,用来决定发起第三方登录的url,默认是 qq。 */ private String providerId = "qq"; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/SecurityConstants.java ================================================ package com.paascloud.security.core.properties; /** * The interface Security constants. * * @author paascloud.net@gmail.com */ public interface SecurityConstants { /** * 默认的处理验证码的url前缀 */ String DEFAULT_VALIDATE_CODE_URL_PREFIX = "/auth/code"; /** * 当请求需要身份认证时,默认跳转的url */ String DEFAULT_UNAUTHENTICATION_URL = "/auth/require"; /** * 默认的用户名密码登录请求处理url */ String DEFAULT_SIGN_IN_PROCESSING_URL_FORM = "/auth/form"; /** * 默认的手机验证码登录请求处理url */ String DEFAULT_SIGN_IN_PROCESSING_URL_MOBILE = "/auth/mobile"; /** * 默认的OPENID登录请求处理url */ String DEFAULT_SIGN_IN_PROCESSING_URL_OPENID = "/auth/openid"; /** * 验证图片验证码时,http请求中默认的携带图片验证码信息的参数的名称 */ String DEFAULT_PARAMETER_NAME_CODE_IMAGE = "imageCode"; /** * 验证短信验证码时,http请求中默认的携带短信验证码信息的参数的名称 */ String DEFAULT_PARAMETER_NAME_CODE_SMS = "smsCode"; /** * 验证邮箱验证码时,http请求中默认的携带短信验证码信息的参数的名称 */ String DEFAULT_PARAMETER_NAME_CODE_EMAIL = "emailCode"; /** * 发送短信验证码 或 验证短信验证码时,传递手机号的参数的名称 */ String DEFAULT_PARAMETER_NAME_MOBILE = "mobile"; /** * 发送邮箱验证码 或 验证邮箱验证码时,传递邮箱的参数的名称 */ String DEFAULT_PARAMETER_NAME_EMAIL = "email"; /** * openid参数名 */ String DEFAULT_PARAMETER_NAME_OPENID = "openId"; /** * providerId参数名 */ String DEFAULT_PARAMETER_NAME_PROVIDERID = "providerId"; /** * 获取第三方用户信息的url */ String DEFAULT_SOCIAL_USER_INFO_URL = "/social/user"; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/SecurityProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SecurityProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.properties; import org.springframework.boot.context.properties.ConfigurationProperties; /** * The class Security properties. * * @author paascloud.net@gmail.com */ @ConfigurationProperties(prefix = "paascloud.security") public class SecurityProperties { /** * 浏览器环境配置 */ private BrowserProperties browser = new BrowserProperties(); /** * 验证码配置 */ private ValidateCodeProperties code = new ValidateCodeProperties(); /** * 社交登录配置 */ private SocialProperties social = new SocialProperties(); /** * OAuth2认证服务器配置 */ private OAuth2Properties oauth2 = new OAuth2Properties(); /** * Gets browser. * * @return the browser */ public BrowserProperties getBrowser() { return browser; } /** * Sets browser. * * @param browser the browser */ public void setBrowser(BrowserProperties browser) { this.browser = browser; } /** * Gets code. * * @return the code */ public ValidateCodeProperties getCode() { return code; } /** * Sets code. * * @param code the code */ public void setCode(ValidateCodeProperties code) { this.code = code; } /** * Gets social. * * @return the social */ public SocialProperties getSocial() { return social; } /** * Sets social. * * @param social the social */ public void setSocial(SocialProperties social) { this.social = social; } /** * Gets oauth 2. * * @return the oauth 2 */ public OAuth2Properties getOauth2() { return oauth2; } /** * Sets oauth 2. * * @param oauth2 the oauth 2 */ public void setOauth2(OAuth2Properties oauth2) { this.oauth2 = oauth2; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/SessionProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SessionProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.properties; import lombok.Data; /** * session管理相关配置项 * * @author paascloud.net @gmail.com */ @Data public class SessionProperties { /** * 同一个用户在系统中的最大session数,默认1 */ private int maximumSessions = 1; /** * 达到最大session时是否阻止新的登录请求,默认为false,不阻止,新的登录会将老的登录失效掉 */ private boolean maxSessionsPreventsLogin; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/SmsCodeProperties.java ================================================ package com.paascloud.security.core.properties; import lombok.Data; /** * The class Sms code properties. * * @author paascloud.net @gmail.com */ @Data public class SmsCodeProperties { /** * 验证码长度 */ private int length = 6; /** * 过期时间 */ private int expireIn = 60; /** * 要拦截的url,多个url用逗号隔开,ant pattern */ private String url; /** * 每天每个手机号最大送送短信数量 */ private int mobileMaxSendCount; /** * 每天每个IP最大送送短信数量 */ private int ipMaxSendCount; /** * 每天最大送送短信数量 */ private int totalMaxSendCount; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/SocialProperties.java ================================================ package com.paascloud.security.core.properties; import lombok.Data; /** * 社交登录配置项 * * @author paascloud.net @gmail.com */ @Data public class SocialProperties { /** * 社交登录功能拦截的url */ private String filterProcessesUrl = "/auth"; private QQProperties qq = new QQProperties(); private WeixinProperties weixin = new WeixinProperties(); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/ValidateCodeProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ValidateCodeProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.properties; import lombok.Data; /** * 验证码配置 * * @author paascloud.net @gmail.com */ @Data public class ValidateCodeProperties { /** * 图片验证码配置 */ private ImageCodeProperties image = new ImageCodeProperties(); /** * 短信验证码配置 */ private SmsCodeProperties sms = new SmsCodeProperties(); /** * 邮箱验证码配置 */ private EmailCodeProperties email = new EmailCodeProperties(); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/properties/WeixinProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:WeixinProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.properties; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.boot.autoconfigure.social.SocialProperties; /** * 微信登录配置项 * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class WeixinProperties extends SocialProperties { /** * 第三方id,用来决定发起第三方登录的url,默认是 weixin。 */ private String providerId = "weixin"; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/BaseSocialController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BaseSocialController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social; import org.springframework.social.connect.Connection; import com.paascloud.security.core.social.support.SocialUserInfo; /** * The class Social controller. * * @author paascloud.net@gmail.com */ public abstract class BaseSocialController { /** * 根据Connection信息构建SocialUserInfo * * @param connection the connection * * @return social user info */ protected SocialUserInfo buildSocialUserInfo(Connection connection) { SocialUserInfo userInfo = new SocialUserInfo(); userInfo.setProviderId(connection.getKey().getProviderId()); userInfo.setProviderUserId(connection.getKey().getProviderUserId()); userInfo.setNickname(connection.getDisplayName()); userInfo.setHeadimg(connection.getImageUrl()); return userInfo; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/SocialConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SocialConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social; import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.crypto.encrypt.Encryptors; import org.springframework.social.config.annotation.EnableSocial; import org.springframework.social.config.annotation.SocialConfigurerAdapter; import org.springframework.social.connect.ConnectionFactoryLocator; import org.springframework.social.connect.ConnectionSignUp; import org.springframework.social.connect.UsersConnectionRepository; import org.springframework.social.connect.jdbc.JdbcUsersConnectionRepository; import org.springframework.social.connect.web.ProviderSignInUtils; import org.springframework.social.security.SpringSocialConfigurer; import com.paascloud.security.core.properties.SecurityProperties; import com.paascloud.security.core.social.support.PcSpringSocialConfigurer; import com.paascloud.security.core.social.support.SocialAuthenticationFilterPostProcessor; /** * 社交登录配置主类 * * @author paascloud.net @gmail.com */ @Configuration @EnableSocial public class SocialConfig extends SocialConfigurerAdapter { @Autowired private DataSource dataSource; @Autowired private SecurityProperties securityProperties; @Autowired(required = false) private ConnectionSignUp connectionSignUp; @Autowired(required = false) private SocialAuthenticationFilterPostProcessor socialAuthenticationFilterPostProcessor; /** * Gets users connection repository. * * @param connectionFactoryLocator the connection factory locator * * @return the users connection repository */ @Override public UsersConnectionRepository getUsersConnectionRepository(ConnectionFactoryLocator connectionFactoryLocator) { JdbcUsersConnectionRepository repository = new JdbcUsersConnectionRepository(dataSource, connectionFactoryLocator, Encryptors.noOpText()); repository.setTablePrefix("pc_uac_"); if (connectionSignUp != null) { repository.setConnectionSignUp(connectionSignUp); } return repository; } /** * 社交登录配置类,供浏览器或app模块引入设计登录配置用。 * * @return spring social configurer */ @Bean public SpringSocialConfigurer pcSocialSecurityConfig() { String filterProcessesUrl = securityProperties.getSocial().getFilterProcessesUrl(); PcSpringSocialConfigurer configurer = new PcSpringSocialConfigurer(filterProcessesUrl); configurer.signupUrl(securityProperties.getBrowser().getSignUpUrl()); configurer.setSocialAuthenticationFilterPostProcessor(socialAuthenticationFilterPostProcessor); return configurer; } /** * 用来处理注册流程的工具类 * * @param connectionFactoryLocator the connection factory locator * * @return provider sign in utils */ @Bean public ProviderSignInUtils providerSignInUtils(ConnectionFactoryLocator connectionFactoryLocator) { return new ProviderSignInUtils(connectionFactoryLocator, getUsersConnectionRepository(connectionFactoryLocator)) { }; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/api/QQ.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:QQ.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.qq.api; /** * The interface Qq. * * @author paascloud.net@gmail.com */ public interface QQ { /** * Gets user info. * * @return the user info */ QQUserInfo getUserInfo(); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/api/QQImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:QQImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.qq.api; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.social.oauth2.AbstractOAuth2ApiBinding; import org.springframework.social.oauth2.TokenStrategy; import com.fasterxml.jackson.databind.ObjectMapper; /** * The class Qq. * * @author paascloud.net @gmail.com */ @Slf4j public class QQImpl extends AbstractOAuth2ApiBinding implements QQ { private static final String URL_GET_OPENID = "https://graph.qq.com/oauth2.0/me?access_token=%s"; private static final String URL_GET_USERINFO = "https://graph.qq.com/user/get_user_info?oauth_consumer_key=%s&openid=%s"; private String appId; private String openId; private ObjectMapper objectMapper = new ObjectMapper(); /** * Instantiates a new Qq. * * @param accessToken the access token * @param appId the app id */ public QQImpl(String accessToken, String appId) { super(accessToken, TokenStrategy.ACCESS_TOKEN_PARAMETER); this.appId = appId; String url = String.format(URL_GET_OPENID, accessToken); String result = getRestTemplate().getForObject(url, String.class); log.info("result={}", result); this.openId = StringUtils.substringBetween(result, "\"openid\":\"", "\"}"); } /** * Gets user info. * * @return the user info */ @Override public QQUserInfo getUserInfo() { String url = String.format(URL_GET_USERINFO, appId, openId); String result = getRestTemplate().getForObject(url, String.class); log.info("result={}", result); QQUserInfo userInfo; try { userInfo = objectMapper.readValue(result, QQUserInfo.class); userInfo.setOpenId(openId); return userInfo; } catch (Exception e) { throw new RuntimeException("获取用户信息失败", e); } } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/api/QQUserInfo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:QQUserInfo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.qq.api; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; import java.io.Serializable; /** * The class Qq user info. * * @author paascloud.net@gmail.com */ @Data public class QQUserInfo implements Serializable { private static final long serialVersionUID = -7584208099330390359L; /** * 返回码 */ private String ret; /** * 如果ret<0,会有相应的错误信息提示,返回数据全部用UTF-8编码。 */ private String msg; private String openId; /** * 不知道什么东西,文档上没写,但是实际api返回里有。 */ @JsonProperty("is_lost") private String isLost; /** * 省(直辖市) */ private String province; /** * 市(直辖市区) */ private String city; /** * 出生年月 */ private String year; /** * 用户在QQ空间的昵称。 */ private String nickname; /** * 大小为30×30像素的QQ空间头像URL。 */ @JsonProperty("figureurl") private String figureUrl; /** * 大小为50×50像素的QQ空间头像URL。 */ @JsonProperty("figureurl_1") private String figureUrl1; /** * 大小为100×100像素的QQ空间头像URL。 */ @JsonProperty("figureurl_2") private String figureUrl2; /** * 大小为40×40像素的QQ头像URL。 */ @JsonProperty("figureurl_qq_1") private String figureUrlQq1; /** * 大小为100×100像素的QQ头像URL。需要注意,不是所有的用户都拥有QQ的100×100的头像,但40×40像素则是一定会有。 */ @JsonProperty("figureurl_qq_2") private String figureUrlQq2; /** * 性别。 如果获取不到则默认返回”男” */ private String gender; /** * 标识用户是否为黄钻用户(0:不是;1:是)。 */ @JsonProperty("is_yellow_vip") private String isYellowVip; /** * 标识用户是否为黄钻用户(0:不是;1:是) */ private String vip; /** * 黄钻等级 */ @JsonProperty("yellow_vip_level") private String yellowVipLevel; /** * 黄钻等级 */ private String level; /** * 标识是否为年费黄钻用户(0:不是; 1:是) */ @JsonProperty("is_yellow_year_vip") private String isYellowYearVip; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/config/QQAutoConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:QQAutoConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.qq.config; import com.paascloud.security.core.properties.QQProperties; import com.paascloud.security.core.social.qq.connet.QQConnectionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.social.SocialAutoConfigurerAdapter; import org.springframework.context.annotation.Configuration; import org.springframework.social.connect.ConnectionFactory; import com.paascloud.security.core.properties.SecurityProperties; /** * The class Qq auto config. * * @author paascloud.net@gmail.com */ @Configuration @ConditionalOnProperty(prefix = "paascloud.security.social.qq", name = "app-id") public class QQAutoConfig extends SocialAutoConfigurerAdapter { private final SecurityProperties securityProperties; @Autowired public QQAutoConfig(SecurityProperties securityProperties) { this.securityProperties = securityProperties; } /** * Create connection factory connection factory. * * @return the connection factory */ @Override protected ConnectionFactory createConnectionFactory() { QQProperties qqConfig = securityProperties.getSocial().getQq(); return new QQConnectionFactory(qqConfig.getProviderId(), qqConfig.getAppId(), qqConfig.getAppSecret()); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/connet/QQAdapter.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:QQAdapter.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.qq.connet; import com.paascloud.security.core.social.qq.api.QQ; import com.paascloud.security.core.social.qq.api.QQUserInfo; import org.springframework.social.connect.ApiAdapter; import org.springframework.social.connect.ConnectionValues; import org.springframework.social.connect.UserProfile; /** * The class Qq adapter. * * @author paascloud.net@gmail.com */ public class QQAdapter implements ApiAdapter { /** * Test boolean. * * @param api the api * * @return the boolean */ @Override public boolean test(QQ api) { return true; } /** * Sets connection values. * * @param api the api * @param values the values */ @Override public void setConnectionValues(QQ api, ConnectionValues values) { QQUserInfo userInfo = api.getUserInfo(); values.setDisplayName(userInfo.getNickname()); values.setImageUrl(userInfo.getFigureUrlQq1()); values.setProfileUrl(null); values.setProviderUserId(userInfo.getOpenId()); } /** * Fetch user profile user profile. * * @param api the api * * @return the user profile */ @Override public UserProfile fetchUserProfile(QQ api) { return null; } /** * Update status. * * @param api the api * @param message the message */ @Override public void updateStatus(QQ api, String message) { //do noting } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/connet/QQConnectionFactory.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:QQConnectionFactory.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.qq.connet; import org.springframework.social.connect.support.OAuth2ConnectionFactory; import com.paascloud.security.core.social.qq.api.QQ; /** * The class Qq connection factory. * * @author paascloud.net@gmail.com */ public class QQConnectionFactory extends OAuth2ConnectionFactory { /** * Instantiates a new Qq connection factory. * * @param providerId the provider id * @param appId the app id * @param appSecret the app secret */ public QQConnectionFactory(String providerId, String appId, String appSecret) { super(providerId, new QQServiceProvider(appId, appSecret), new QQAdapter()); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/connet/QQOAuth2Template.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:QQOAuth2Template.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.qq.connet; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.social.oauth2.AccessGrant; import org.springframework.social.oauth2.OAuth2Template; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.nio.charset.Charset; /** * The class Qqo auth 2 template. * * @author paascloud.net@gmail.com */ @Slf4j public class QQOAuth2Template extends OAuth2Template { /** * Instantiates a new Qqo auth 2 template. * * @param clientId the client id * @param clientSecret the client secret * @param authorizeUrl the authorize url * @param accessTokenUrl the access token url */ QQOAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) { super(clientId, clientSecret, authorizeUrl, accessTokenUrl); setUseParametersForClientAuthentication(true); } /** * Post for access grant access grant. * * @param accessTokenUrl the access token url * @param parameters the parameters * * @return the access grant */ @Override protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap parameters) { String responseStr = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class); log.info("获取accessToke的响应={}", responseStr); String[] items = StringUtils.splitByWholeSeparatorPreserveAllTokens(responseStr, "&"); String accessToken = StringUtils.substringAfterLast(items[0], "="); Long expiresIn = new Long(StringUtils.substringAfterLast(items[1], "=")); String refreshToken = StringUtils.substringAfterLast(items[2], "="); return new AccessGrant(accessToken, null, refreshToken, expiresIn); } /** * Create rest template rest template. * * @return the rest template */ @Override protected RestTemplate createRestTemplate() { RestTemplate restTemplate = super.createRestTemplate(); restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8"))); return restTemplate; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/qq/connet/QQServiceProvider.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:QQServiceProvider.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.qq.connet; import org.springframework.social.oauth2.AbstractOAuth2ServiceProvider; import com.paascloud.security.core.social.qq.api.QQ; import com.paascloud.security.core.social.qq.api.QQImpl; /** * The class Qq service provider. * * @author paascloud.net@gmail.com */ public class QQServiceProvider extends AbstractOAuth2ServiceProvider { private String appId; private static final String URL_AUTHORIZE = "https://graph.qq.com/oauth2.0/authorize"; private static final String URL_ACCESS_TOKEN = "https://graph.qq.com/oauth2.0/token"; /** * Instantiates a new Qq service provider. * * @param appId the app id * @param appSecret the app secret */ QQServiceProvider(String appId, String appSecret) { super(new QQOAuth2Template(appId, appSecret, URL_AUTHORIZE, URL_ACCESS_TOKEN)); this.appId = appId; } /** * Gets api. * * @param accessToken the access token * * @return the api */ @Override public QQ getApi(String accessToken) { return new QQImpl(accessToken, appId); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/support/PcSpringSocialConfigurer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcSpringSocialConfigurer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.support; import org.springframework.social.security.SocialAuthenticationFilter; import org.springframework.social.security.SpringSocialConfigurer; /** * 继承默认的社交登录配置,加入自定义的后处理逻辑 * * @author paascloud.net @gmail.com */ public class PcSpringSocialConfigurer extends SpringSocialConfigurer { private String filterProcessesUrl; private SocialAuthenticationFilterPostProcessor socialAuthenticationFilterPostProcessor; /** * Instantiates a new Pc spring social configurer. * * @param filterProcessesUrl the filter processes url */ public PcSpringSocialConfigurer(String filterProcessesUrl) { this.filterProcessesUrl = filterProcessesUrl; } /** * Post process t. * * @param the type parameter * @param object the object * * @return the t */ @SuppressWarnings("unchecked") @Override protected T postProcess(T object) { SocialAuthenticationFilter filter = (SocialAuthenticationFilter) super.postProcess(object); filter.setFilterProcessesUrl(filterProcessesUrl); if (socialAuthenticationFilterPostProcessor != null) { socialAuthenticationFilterPostProcessor.process(filter); } return (T) filter; } /** * Gets filter processes url. * * @return the filter processes url */ public String getFilterProcessesUrl() { return filterProcessesUrl; } /** * Sets filter processes url. * * @param filterProcessesUrl the filter processes url */ public void setFilterProcessesUrl(String filterProcessesUrl) { this.filterProcessesUrl = filterProcessesUrl; } /** * Gets social authentication filter post processor. * * @return the social authentication filter post processor */ public SocialAuthenticationFilterPostProcessor getSocialAuthenticationFilterPostProcessor() { return socialAuthenticationFilterPostProcessor; } /** * Sets social authentication filter post processor. * * @param socialAuthenticationFilterPostProcessor the social authentication filter post processor */ public void setSocialAuthenticationFilterPostProcessor(SocialAuthenticationFilterPostProcessor socialAuthenticationFilterPostProcessor) { this.socialAuthenticationFilterPostProcessor = socialAuthenticationFilterPostProcessor; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/support/SocialAuthenticationFilterPostProcessor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SocialAuthenticationFilterPostProcessor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.support; import org.springframework.social.security.SocialAuthenticationFilter; /** * SocialAuthenticationFilter后处理器,用于在不同环境下个性化社交登录的配置 * * @author paascloud.net @gmail.com */ public interface SocialAuthenticationFilterPostProcessor { /** * Process. * * @param socialAuthenticationFilter the social authentication filter */ void process(SocialAuthenticationFilter socialAuthenticationFilter); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/support/SocialUserInfo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SocialUserInfo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.support; import lombok.Data; /** * The class Social user info. * * @author paascloud.net@gmail.com */ @Data public class SocialUserInfo { private String providerId; private String providerUserId; private String nickname; private String headimg; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/view/PcConnectView.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcConnectView.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.view; import org.springframework.web.servlet.view.AbstractView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Map; /** * 绑定结果视图 * * @author paascloud.net @gmail.com */ public class PcConnectView extends AbstractView { private static final String CONNECTIONS = "connections"; /** * Render merged output model. * * @param model the model * @param request the request * @param response the response * * @throws Exception the exception */ @Override protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { response.setContentType("text/html;charset=UTF-8"); if (model.get(CONNECTIONS) == null) { response.getWriter().write("

解绑成功

"); } else { response.getWriter().write("

绑定成功

"); } } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/view/PcConnectionStatusView.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcConnectionStatusView.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.view; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.collections.CollectionUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.social.connect.Connection; import org.springframework.stereotype.Component; import org.springframework.web.servlet.view.AbstractView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 社交账号绑定状态视图 * * @author paascloud.net @gmail.com */ @Component("connect/status") public class PcConnectionStatusView extends AbstractView { @Autowired private ObjectMapper objectMapper; /** * Render merged output model. * * @param model the model * @param request the request * @param response the response * * @throws Exception the exception */ @SuppressWarnings("unchecked") @Override protected void renderMergedOutputModel(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception { Map>> connections = (Map>>) model.get("connectionMap"); Map result = new HashMap<>(8); for (String key : connections.keySet()) { result.put(key, CollectionUtils.isNotEmpty(connections.get(key))); } response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(objectMapper.writeValueAsString(result)); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/api/Weixin.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:Weixin.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.weixin.api; /** * 微信API调用接口 * * @author paascloud.net @gmail.com */ public interface Weixin { /** * Gets user info. * * @param openId the open id * * @return the user info */ WeixinUserInfo getUserInfo(String openId); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/api/WeixinImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:WeixinImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.weixin.api; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.social.oauth2.AbstractOAuth2ApiBinding; import org.springframework.social.oauth2.TokenStrategy; import java.nio.charset.Charset; import java.util.List; /** * Weixin API调用模板, scope为Request的Spring bean, 根据当前用户的accessToken创建。 * * @author paascloud.net @gmail.com */ @Slf4j public class WeixinImpl extends AbstractOAuth2ApiBinding implements Weixin { private ObjectMapper objectMapper = new ObjectMapper(); private static final String ERR_CODE = "errcode"; /** * 获取用户信息的url */ private static final String URL_GET_USER_INFO = "https://api.weixin.qq.com/sns/userinfo?openid="; /** * Instantiates a new Weixin. * * @param accessToken the access token */ public WeixinImpl(String accessToken) { super(accessToken, TokenStrategy.ACCESS_TOKEN_PARAMETER); } /** * 默认注册的StringHttpMessageConverter字符集为ISO-8859-1,而微信返回的是UTF-8的,所以覆盖了原来的方法。 * * @return the message converters */ @Override protected List> getMessageConverters() { List> messageConverters = super.getMessageConverters(); messageConverters.remove(0); messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8"))); return messageConverters; } /** * 获取微信用户信息。 * * @param openId the open id * * @return the user info */ @Override public WeixinUserInfo getUserInfo(String openId) { String url = URL_GET_USER_INFO + openId; String response = getRestTemplate().getForObject(url, String.class); if (StringUtils.contains(response, ERR_CODE)) { return null; } WeixinUserInfo profile = null; try { profile = objectMapper.readValue(response, WeixinUserInfo.class); } catch (Exception e) { log.error("getUserInfo={}", e.getMessage(), e); } return profile; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/api/WeixinUserInfo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:WeixinUserInfo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.weixin.api; import lombok.Data; /** * 微信用户信息 * * @author paascloud.net @gmail.com */ @Data public class WeixinUserInfo { /** * 普通用户的标识,对当前开发者帐号唯一 */ private String openid; /** * 普通用户昵称 */ private String nickname; /** * 语言 */ private String language; /** * 普通用户性别,1为男性,2为女性 */ private String sex; /** * 普通用户个人资料填写的省份 */ private String province; /** * 普通用户个人资料填写的城市 */ private String city; /** * 国家,如中国为CN */ private String country; /** * 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空 */ private String headimgurl; /** * 用户特权信息,json数组,如微信沃卡用户为(chinaunicom) */ private String[] privilege; /** * 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。 */ private String unionid; } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/config/WeixinAutoConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:WeixinAutoConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.weixin.config; import com.paascloud.security.core.social.weixin.connect.WeixinConnectionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.social.SocialAutoConfigurerAdapter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.social.connect.ConnectionFactory; import org.springframework.web.servlet.View; import com.paascloud.security.core.properties.SecurityProperties; import com.paascloud.security.core.properties.WeixinProperties; import com.paascloud.security.core.social.view.PcConnectView; /** * 微信登录配置 * * @author paascloud.net @gmail.com */ @Configuration @ConditionalOnProperty(prefix = "paascloud.security.social.weixin", name = "app-id") public class WeixinAutoConfiguration extends SocialAutoConfigurerAdapter { @Autowired private SecurityProperties securityProperties; /** * Create connection factory connection factory. * * @return the connection factory */ @Override protected ConnectionFactory createConnectionFactory() { WeixinProperties weixinConfig = securityProperties.getSocial().getWeixin(); return new WeixinConnectionFactory(weixinConfig.getProviderId(), weixinConfig.getAppId(), weixinConfig.getAppSecret()); } /** * Weixin connected view view. * * @return the view */ @Bean({"connect/weixinConnect", "connect/weixinConnected"}) @ConditionalOnMissingBean(name = "weixinConnectedView") public View weixinConnectedView() { return new PcConnectView(); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/connect/WeixinAccessGrant.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:WeixinAccessGrant.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.weixin.connect; import org.springframework.social.oauth2.AccessGrant; /** * 微信的access_token信息。与标准OAuth2协议不同,微信在获取access_token时会同时返回openId,并没有单独的通过accessToke换取openId的服务 *

* 所以在这里继承了标准AccessGrant,添加了openId字段,作为对微信access_token信息的封装。 * * @author paascloud.net @gmail.com */ public class WeixinAccessGrant extends AccessGrant { private static final long serialVersionUID = -7243374526633186782L; private String openId; /** * Instantiates a new Weixin access grant. */ public WeixinAccessGrant() { super(""); } /** * Instantiates a new Weixin access grant. * * @param accessToken the access token * @param scope the scope * @param refreshToken the refresh token * @param expiresIn the expires in */ public WeixinAccessGrant(String accessToken, String scope, String refreshToken, Long expiresIn) { super(accessToken, scope, refreshToken, expiresIn); } /** * Gets open id. * * @return the openId */ public String getOpenId() { return openId; } /** * Sets open id. * * @param openId the openId to set */ public void setOpenId(String openId) { this.openId = openId; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/connect/WeixinAdapter.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:WeixinAdapter.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.weixin.connect; import com.paascloud.security.core.social.weixin.api.WeixinUserInfo; import org.springframework.social.connect.ApiAdapter; import org.springframework.social.connect.ConnectionValues; import org.springframework.social.connect.UserProfile; import com.paascloud.security.core.social.weixin.api.Weixin; /** * 微信 api适配器,将微信 api的数据模型转为spring social的标准模型。 * * @author paascloud.net @gmail.com */ public class WeixinAdapter implements ApiAdapter { private String openId; /** * Instantiates a new Weixin adapter. */ WeixinAdapter() { } /** * Instantiates a new Weixin adapter. * * @param openId the open id */ WeixinAdapter(String openId) { this.openId = openId; } /** * Test boolean. * * @param api the api * * @return boolean boolean */ @Override public boolean test(Weixin api) { return true; } /** * Sets connection values. * * @param api the api * @param values the values */ @Override public void setConnectionValues(Weixin api, ConnectionValues values) { WeixinUserInfo profile = api.getUserInfo(openId); values.setProviderUserId(profile.getOpenid()); values.setDisplayName(profile.getNickname()); values.setImageUrl(profile.getHeadimgurl()); } /** * Fetch user profile user profile. * * @param api the api * * @return user profile */ @Override public UserProfile fetchUserProfile(Weixin api) { return null; } /** * Update status. * * @param api the api * @param message the message */ @Override public void updateStatus(Weixin api, String message) { //do nothing } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/connect/WeixinConnectionFactory.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:WeixinConnectionFactory.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.weixin.connect; import org.springframework.social.connect.ApiAdapter; import org.springframework.social.connect.Connection; import org.springframework.social.connect.ConnectionData; import org.springframework.social.connect.support.OAuth2Connection; import org.springframework.social.connect.support.OAuth2ConnectionFactory; import org.springframework.social.oauth2.AccessGrant; import org.springframework.social.oauth2.OAuth2ServiceProvider; import com.paascloud.security.core.social.weixin.api.Weixin; /** * 微信连接工厂 * * @author paascloud.net @gmail.com */ public class WeixinConnectionFactory extends OAuth2ConnectionFactory { /** * Instantiates a new Weixin connection factory. * * @param providerId the provider id * @param appId the app id * @param appSecret the app secret */ public WeixinConnectionFactory(String providerId, String appId, String appSecret) { super(providerId, new WeixinServiceProvider(appId, appSecret), new WeixinAdapter()); } /** * 由于微信的openId是和accessToken一起返回的,所以在这里直接根据accessToken设置providerUserId即可,不用像QQ那样通过QQAdapter来获取 * * @param accessGrant the access grant * * @return the string */ @Override protected String extractProviderUserId(AccessGrant accessGrant) { if (accessGrant instanceof WeixinAccessGrant) { return ((WeixinAccessGrant) accessGrant).getOpenId(); } return null; } /** * Create connection connection. * * @param accessGrant the access grant * * @return the connection */ @Override public Connection createConnection(AccessGrant accessGrant) { return new OAuth2Connection<>(getProviderId(), extractProviderUserId(accessGrant), accessGrant.getAccessToken(), accessGrant.getRefreshToken(), accessGrant.getExpireTime(), getOAuth2ServiceProvider(), getApiAdapter(extractProviderUserId(accessGrant))); } /** * Create connection connection. * * @param data the data * * @return the connection */ @Override public Connection createConnection(ConnectionData data) { return new OAuth2Connection<>(data, getOAuth2ServiceProvider(), getApiAdapter(data.getProviderUserId())); } private ApiAdapter getApiAdapter(String providerUserId) { return new WeixinAdapter(providerUserId); } private OAuth2ServiceProvider getOAuth2ServiceProvider() { return (OAuth2ServiceProvider) getServiceProvider(); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/connect/WeixinOAuth2Template.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:WeixinOAuth2Template.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.weixin.connect; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang.StringUtils; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.social.oauth2.AccessGrant; import org.springframework.social.oauth2.OAuth2Parameters; import org.springframework.social.oauth2.OAuth2Template; import org.springframework.util.MultiValueMap; import org.springframework.web.client.RestTemplate; import java.nio.charset.Charset; import java.util.Map; /** * 完成微信的OAuth2认证流程的模板类。国内厂商实现的OAuth2每个都不同, spring默认提供的OAuth2Template适应不了,只能针对每个厂商自己微调。 * * @author paascloud.net @gmail.com */ @Slf4j public class WeixinOAuth2Template extends OAuth2Template { private String clientId; private String clientSecret; private String accessTokenUrl; private static final String REFRESH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/refresh_token"; private static final String ERR_CODE = "errcode"; private static final String ERR_MSG = "errmsg"; /** * Instantiates a new Weixin o auth 2 template. * * @param clientId the client id * @param clientSecret the client secret * @param authorizeUrl the authorize url * @param accessTokenUrl the access token url */ WeixinOAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) { super(clientId, clientSecret, authorizeUrl, accessTokenUrl); setUseParametersForClientAuthentication(true); this.clientId = clientId; this.clientSecret = clientSecret; this.accessTokenUrl = accessTokenUrl; } /** * Exchange for access access grant. * * @param authorizationCode the authorization code * @param redirectUri the redirect uri * @param parameters the parameters * * @return the access grant */ @Override public AccessGrant exchangeForAccess(String authorizationCode, String redirectUri, MultiValueMap parameters) { StringBuilder accessTokenRequestUrl = new StringBuilder(accessTokenUrl); accessTokenRequestUrl.append("?appid=").append(clientId); accessTokenRequestUrl.append("&secret=").append(clientSecret); accessTokenRequestUrl.append("&code=").append(authorizationCode); accessTokenRequestUrl.append("&grant_type=authorization_code"); accessTokenRequestUrl.append("&redirect_uri=").append(redirectUri); return getAccessToken(accessTokenRequestUrl); } /** * Refresh access access grant. * * @param refreshToken the refresh token * @param additionalParameters the additional parameters * * @return the access grant */ @Override public AccessGrant refreshAccess(String refreshToken, MultiValueMap additionalParameters) { StringBuilder refreshTokenUrl = new StringBuilder(REFRESH_TOKEN_URL); refreshTokenUrl.append("?appid=").append(clientId); refreshTokenUrl.append("&grant_type=refresh_token"); refreshTokenUrl.append("&refresh_token=").append(refreshToken); return getAccessToken(refreshTokenUrl); } @SuppressWarnings("unchecked") private AccessGrant getAccessToken(StringBuilder accessTokenRequestUrl) { log.info("获取access_token, 请求URL: " + accessTokenRequestUrl.toString()); String response = getRestTemplate().getForObject(accessTokenRequestUrl.toString(), String.class); log.info("获取access_token, 响应内容: " + response); Map result = null; try { result = new ObjectMapper().readValue(response, Map.class); } catch (Exception e) { log.error("getAccessToken={}", e.getMessage(), e); } //返回错误码时直接返回空 if (StringUtils.isNotBlank(MapUtils.getString(result, ERR_CODE))) { String errCode = MapUtils.getString(result, ERR_CODE); String errMsg = MapUtils.getString(result, ERR_MSG); throw new RuntimeException("获取access token失败, errCode:" + errCode + ", errMsg:" + errMsg); } WeixinAccessGrant accessToken = new WeixinAccessGrant( MapUtils.getString(result, "access_token"), MapUtils.getString(result, "scope"), MapUtils.getString(result, "refresh_token"), MapUtils.getLong(result, "expires_in")); accessToken.setOpenId(MapUtils.getString(result, "openid")); return accessToken; } /** * 构建获取授权码的请求。也就是引导用户跳转到微信的地址。 * * @param parameters the parameters * * @return the string */ @Override public String buildAuthenticateUrl(OAuth2Parameters parameters) { String url = super.buildAuthenticateUrl(parameters); url = url + "&appid=" + clientId + "&scope=snsapi_login"; return url; } /** * Build authorize url string. * * @param parameters the parameters * * @return the string */ @Override public String buildAuthorizeUrl(OAuth2Parameters parameters) { return buildAuthenticateUrl(parameters); } /** * 微信返回的contentType是html/text,添加相应的HttpMessageConverter来处理。 * * @return the rest template */ @Override protected RestTemplate createRestTemplate() { RestTemplate restTemplate = super.createRestTemplate(); restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8"))); return restTemplate; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/social/weixin/connect/WeixinServiceProvider.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:WeixinServiceProvider.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.social.weixin.connect; import org.springframework.social.oauth2.AbstractOAuth2ServiceProvider; import com.paascloud.security.core.social.weixin.api.Weixin; import com.paascloud.security.core.social.weixin.api.WeixinImpl; /** * 微信的OAuth2流程处理器的提供器,供spring social的connect体系调用 * * @author paascloud.net @gmail.com */ public class WeixinServiceProvider extends AbstractOAuth2ServiceProvider { /** * 微信获取授权码的url */ private static final String URL_AUTHORIZE = "https://open.weixin.qq.com/connect/qrconnect"; /** * 微信获取accessToken的url */ private static final String URL_ACCESS_TOKEN = "https://api.weixin.qq.com/sns/oauth2/access_token"; /** * Instantiates a new Weixin service provider. * * @param appId the app id * @param appSecret the app secret */ WeixinServiceProvider(String appId, String appSecret) { super(new WeixinOAuth2Template(appId, appSecret, URL_AUTHORIZE, URL_ACCESS_TOKEN)); } /** * Gets api. * * @param accessToken the access token * * @return the api */ @Override public Weixin getApi(String accessToken) { return new WeixinImpl(accessToken); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/CookieUtil.java ================================================ package com.paascloud.security.core.validate.code; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; /** * The class Cookie util. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class CookieUtil { private static Logger logger = LoggerFactory.getLogger(CookieUtil.class); /** * 设置cookie域,默认为:paascloud.net] */ private final static String COOKIE_DOMAIN = "paascloud.net"; /** * 设置默认路径:/,这个路径即该工程下都可以访问该cookie 如果不设置路径,那么只有设置该cookie路径及其子路径可以访问 */ private final static String COOKIE_PATH = "/"; /** * 设置cookie有效期,根据需要自定义[本系统设置为7天] */ private final static int COOKIE_MAX_AGE = 60 * 60 * 24 * 7; /** * Sets cookie. * * @param name the name * @param value the value * @param maxAge the max age * @param response the response */ public static void setCookie(String name, String value, Integer maxAge, HttpServletResponse response) { logger.info("setCookie - 设置cookie. name={}, value={}. maxAge={}", name, value, maxAge); Cookie cookie; try { cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8")); } catch (UnsupportedEncodingException e) { throw new IllegalArgumentException("Cookie转码异常"); } cookie.setDomain(COOKIE_DOMAIN); cookie.setPath(COOKIE_PATH); cookie.setMaxAge(maxAge == null ? COOKIE_MAX_AGE : maxAge); response.addCookie(cookie); logger.info("setCookie - 设置cookie. [OK]"); } /** * 根据Cookie的key得到Cookie的值. * * @param request the request * @param name the name * * @return the cookie value */ public static String getCookieValue(HttpServletRequest request, String name) { Cookie cookie = getCookie(request, name); if (cookie != null) { return cookie.getValue(); } else { return null; } } /** * 根据Cookie的名称得到Cookie对象. * * @param request the request * @param name the name * * @return the cookie */ public static Cookie getCookie(HttpServletRequest request, String name) { logger.info("获取指定名称的cookie. name={}", name); Cookie[] cookies = request.getCookies(); if (cookies == null || StringUtils.isBlank(name)) { return null; } Cookie cookie = null; for (Cookie cooky : cookies) { if (!cooky.getName().equals(name) || StringUtils.isBlank(cooky.getDomain())) { continue; } cookie = cooky; if (request.getServerName().contains(cookie.getDomain())) { break; } } return cookie; } /** * 删除指定名称的Cookie. * * @param name the name * @param response the response */ public static void removeCookie(String name, HttpServletResponse response) { logger.info("removeCookie - 删除指定名称的Cookie. key={}", name); Cookie cookie = new Cookie(name, null); cookie.setDomain(COOKIE_DOMAIN); cookie.setPath(COOKIE_PATH); cookie.setMaxAge(0); response.addCookie(cookie); logger.info("removeCookie - 删除指定名称的Cookie. [OK]"); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCode.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ValidateCode.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer; import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer; import java.io.Serializable; import java.time.LocalDateTime; /** * 验证码信息封装类 * * @author paascloud.net @gmail.com */ public class ValidateCode implements Serializable { private static final long serialVersionUID = 1588203828504660915L; private String code; private String type; @JsonDeserialize(using = LocalDateTimeDeserializer.class) @JsonSerialize(using = LocalDateTimeSerializer.class) private LocalDateTime expireTime; /** * Instantiates a new Validate code. */ public ValidateCode() { } /** * Instantiates a new Validate code. * * @param code the code * @param expireIn the expire in */ public ValidateCode(String code, int expireIn) { this.code = code; this.expireTime = LocalDateTime.now().plusSeconds(expireIn); } /** * Instantiates a new Validate code. * * @param code the code * @param expireTime the expire time */ public ValidateCode(String code, LocalDateTime expireTime) { this.code = code; this.expireTime = expireTime; } /** * Is expired boolean. * * @return the boolean */ @JsonIgnore public boolean isExpired() { return LocalDateTime.now().isAfter(expireTime); } /** * Gets code. * * @return the code */ public String getCode() { return code; } /** * Sets code. * * @param code the code */ public void setCode(String code) { this.code = code; } /** * Gets expire time. * * @return the expire time */ public LocalDateTime getExpireTime() { return expireTime; } /** * Sets expire time. * * @param expireTime the expire time */ public void setExpireTime(LocalDateTime expireTime) { this.expireTime = expireTime; } /** * Gets type. * * @return the type */ public String getType() { return type; } /** * Sets type. * * @param type the type */ public void setType(String type) { this.type = type; } /** * To string string. * * @return the string */ @Override public String toString() { final StringBuilder sb = new StringBuilder("ValidateCode{"); sb.append("code='").append(code).append('\''); sb.append(", type='").append(type).append('\''); sb.append(", expireTime=").append(expireTime); sb.append('}'); return sb.toString(); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeBeanConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ValidateCodeBeanConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code; import com.google.code.kaptcha.Producer; import com.paascloud.security.core.properties.SecurityProperties; import com.paascloud.security.core.validate.code.email.DefaultEmailCodeSender; import com.paascloud.security.core.validate.code.email.EmailCodeSender; import com.paascloud.security.core.validate.code.sms.DefaultSmsCodeSender; import com.paascloud.security.core.validate.code.sms.SmsCodeSender; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.paascloud.security.core.validate.code.image.ImageCodeGenerator; /** * 验证码相关的扩展点配置。配置在这里的bean,业务系统都可以通过声明同类型或同名的bean来覆盖安全 * 模块默认的配置。 * * @author paascloud.net @gmail.com */ @Configuration public class ValidateCodeBeanConfig { @Autowired private SecurityProperties securityProperties; @Autowired private Producer captchaProducer; /** * 图片验证码图片生成器 * * @return validate code generator */ @Bean @ConditionalOnMissingBean(name = "imageValidateCodeGenerator") public ValidateCodeGenerator imageValidateCodeGenerator() { ImageCodeGenerator codeGenerator = new ImageCodeGenerator(); codeGenerator.setSecurityProperties(securityProperties); codeGenerator.setCaptchaProducer(captchaProducer); return codeGenerator; } /** * 短信验证码发送器 * * @return sms code sender */ @Bean @ConditionalOnMissingBean(SmsCodeSender.class) public SmsCodeSender smsCodeSender() { return new DefaultSmsCodeSender(); } /** * 邮箱验证码发送器 * * @return sms code sender */ @Bean @ConditionalOnMissingBean(EmailCodeSender.class) public EmailCodeSender emailCodeSender() { return new DefaultEmailCodeSender(); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeController.java ================================================ package com.paascloud.security.core.validate.code; import com.paascloud.security.core.SecurityResult; import com.paascloud.security.core.properties.SecurityConstants; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.context.request.ServletWebRequest; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 生成校验码的请求处理器 * * @author paascloud.net @gmail.com */ @Slf4j @RestController public class ValidateCodeController { @Resource private ValidateCodeProcessorHolder validateCodeProcessorHolder; /** * 创建验证码,根据验证码类型不同,调用不同的 {@link ValidateCodeProcessor}接口实现 * * @param request the request * @param response the response * @param type the type * * @throws Exception the exception */ @PostMapping(SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + "/{type}") public void createCode(HttpServletRequest request, HttpServletResponse response, @PathVariable String type) throws Exception { validateCodeProcessorHolder.findValidateCodeProcessor(type).create(new ServletWebRequest(request, response)); } /** * Check code object. * * @param request the request * @param response the response * @param type the type * * @return the object */ @GetMapping(SecurityConstants.DEFAULT_VALIDATE_CODE_URL_PREFIX + "/{type}") public Object checkCode(HttpServletRequest request, HttpServletResponse response, @PathVariable String type) { SecurityResult result = new SecurityResult(SecurityResult.SUCCESS_CODE, "校验成功", true); try { validateCodeProcessorHolder.findValidateCodeProcessor(type).check(new ServletWebRequest(request, response)); } catch (ValidateCodeException e) { result = SecurityResult.error(e.getMessage(), false); } catch (Exception e) { log.error("getAccessToken={}", e.getMessage(), e); result = SecurityResult.error("验证码错误", false); } return result; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeException.java ================================================ package com.paascloud.security.core.validate.code; import org.springframework.security.core.AuthenticationException; /** * The class Validate code exception. * * @author paascloud.net@gmail.com */ public class ValidateCodeException extends AuthenticationException { private static final long serialVersionUID = -7285211528095468156L; /** * Instantiates a new Validate code exception. * * @param msg the msg */ public ValidateCodeException(String msg) { super(msg); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeFilter.java ================================================ package com.paascloud.security.core.validate.code; import com.paascloud.security.core.properties.SecurityConstants; import com.paascloud.security.core.properties.SecurityProperties; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; import org.springframework.web.context.request.ServletWebRequest; import org.springframework.web.filter.OncePerRequestFilter; import javax.annotation.Resource; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Map; import java.util.Set; /** * 校验验证码的过滤器 * * @author paascloud.net @gmail.com */ @Component("validateCodeFilter") public class ValidateCodeFilter extends OncePerRequestFilter implements InitializingBean { /** * 验证码校验失败处理器 */ @Resource private AuthenticationFailureHandler authenticationFailureHandler; /** * 系统配置信息 */ @Autowired private SecurityProperties securityProperties; /** * 系统中的校验码处理器 */ @Resource private ValidateCodeProcessorHolder validateCodeProcessorHolder; /** * 存放所有需要校验验证码的url */ private Map urlMap = new HashMap<>(); /** * 验证请求url与配置的url是否匹配的工具类 */ private AntPathMatcher pathMatcher = new AntPathMatcher(); private static final String GET = "get"; /** * 初始化要拦截的url配置信息 * * @throws ServletException the servlet exception */ @Override public void afterPropertiesSet() throws ServletException { super.afterPropertiesSet(); urlMap.put(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_FORM, ValidateCodeType.IMAGE); addUrlToMap(securityProperties.getCode().getImage().getUrl(), ValidateCodeType.IMAGE); urlMap.put(SecurityConstants.DEFAULT_SIGN_IN_PROCESSING_URL_MOBILE, ValidateCodeType.SMS); addUrlToMap(securityProperties.getCode().getSms().getUrl(), ValidateCodeType.SMS); addUrlToMap(securityProperties.getCode().getEmail().getUrl(), ValidateCodeType.EMAIL); } /** * 讲系统中配置的需要校验验证码的URL根据校验的类型放入map * * @param urlString the url string * @param type the type */ private void addUrlToMap(String urlString, ValidateCodeType type) { if (StringUtils.isNotBlank(urlString)) { String[] urls = StringUtils.splitByWholeSeparatorPreserveAllTokens(urlString, ","); for (String url : urls) { urlMap.put(url, type); } } } /** * Do filter internal. * * @param request the request * @param response the response * @param chain the chain * * @throws ServletException the servlet exception * @throws IOException the io exception */ @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws ServletException, IOException { ValidateCodeType type = getValidateCodeType(request); if (type != null) { logger.info("校验请求(" + request.getRequestURI() + ")中的验证码,验证码类型" + type); try { validateCodeProcessorHolder.findValidateCodeProcessor(type).validate(new ServletWebRequest(request, response)); logger.info("验证码校验通过"); } catch (ValidateCodeException exception) { authenticationFailureHandler.onAuthenticationFailure(request, response, exception); return; } } chain.doFilter(request, response); } /** * 获取校验码的类型,如果当前请求不需要校验,则返回null */ private ValidateCodeType getValidateCodeType(HttpServletRequest request) { ValidateCodeType result = null; if (!StringUtils.equalsIgnoreCase(request.getMethod(), GET)) { Set urls = urlMap.keySet(); for (String url : urls) { if (pathMatcher.match(url, request.getRequestURI())) { result = urlMap.get(url); } } } return result; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeGenerator.java ================================================ package com.paascloud.security.core.validate.code; import org.springframework.web.context.request.ServletWebRequest; /** * 校验码生成器 * * @author paascloud.net @gmail.com */ public interface ValidateCodeGenerator { /** * 生成校验码 * * @param request the request * * @return validate code */ ValidateCode generate(ServletWebRequest request); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeProcessor.java ================================================ package com.paascloud.security.core.validate.code; import org.springframework.web.context.request.ServletWebRequest; /** * 校验码处理器,封装不同校验码的处理逻辑 * * @author paascloud.net @gmail.com */ public interface ValidateCodeProcessor { /** * 创建校验码 * * @param request the request * * @throws Exception the exception */ void create(ServletWebRequest request) throws Exception; /** * 校验验证码(验证后删除) * * @param servletWebRequest the servlet web request */ void validate(ServletWebRequest servletWebRequest); /** * 校验验证码(验证后不删除) * * @param servletWebRequest the servlet web request */ void check(ServletWebRequest servletWebRequest); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeProcessorHolder.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ValidateCodeProcessorHolder.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.util.Map; /** * 校验码处理器管理器 * * @author paascloud.net @gmail.com */ @Component public class ValidateCodeProcessorHolder { private final Map validateCodeProcessors; /** * Instantiates a new Validate code processor holder. * * @param validateCodeProcessors the validate code processors */ @Autowired public ValidateCodeProcessorHolder(Map validateCodeProcessors) { this.validateCodeProcessors = validateCodeProcessors; } /** * Find validate code processor validate code processor. * * @param type the type * * @return validate code processor */ ValidateCodeProcessor findValidateCodeProcessor(ValidateCodeType type) { return findValidateCodeProcessor(type.toString().toLowerCase()); } /** * Find validate code processor validate code processor. * * @param type the type * * @return validate code processor */ ValidateCodeProcessor findValidateCodeProcessor(String type) { String name = type.toLowerCase() + ValidateCodeProcessor.class.getSimpleName(); ValidateCodeProcessor processor = validateCodeProcessors.get(name); if (processor == null) { throw new ValidateCodeException("验证码处理器" + name + "不存在"); } return processor; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeRepository.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ValidateCodeRepository.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code; import org.springframework.web.context.request.ServletWebRequest; /** * 校验码存取器 * * @author paascloud.net @gmail.com */ public interface ValidateCodeRepository { /** * 保存验证码 * * @param request the request * @param code the code * @param validateCodeType the validate code type */ void save(ServletWebRequest request, ValidateCode code, ValidateCodeType validateCodeType); /** * 获取验证码 * * @param request the request * @param validateCodeType the validate code type * * @return validate code */ ValidateCode get(ServletWebRequest request, ValidateCodeType validateCodeType); /** * 移除验证码 * * @param request the request * @param codeType the code type */ void remove(ServletWebRequest request, ValidateCodeType codeType); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeSecurityConfig.java ================================================ package com.paascloud.security.core.validate.code; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.config.annotation.SecurityConfigurerAdapter; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.web.DefaultSecurityFilterChain; import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter; import org.springframework.stereotype.Component; import javax.servlet.Filter; /** * 校验码相关安全配置 * * @author paascloud.net@gmail.com */ @Component("validateCodeSecurityConfig") public class ValidateCodeSecurityConfig extends SecurityConfigurerAdapter { @Autowired private Filter validateCodeFilter; /** * Configure. * * @param http the http */ @Override public void configure(HttpSecurity http) { http.addFilterBefore(validateCodeFilter, AbstractPreAuthenticatedProcessingFilter.class); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/ValidateCodeType.java ================================================ package com.paascloud.security.core.validate.code; import com.paascloud.security.core.properties.SecurityConstants; /** * 校验码类型 * * @author paascloud.net @gmail.com */ public enum ValidateCodeType { /** * 短信验证码 */ SMS { @Override public String getParamNameOnValidate() { return SecurityConstants.DEFAULT_PARAMETER_NAME_CODE_SMS; } }, /** * 图片验证码 */ IMAGE { @Override public String getParamNameOnValidate() { return SecurityConstants.DEFAULT_PARAMETER_NAME_CODE_IMAGE; } }, /** * 邮箱验证码 */ EMAIL { @Override public String getParamNameOnValidate() { return SecurityConstants.DEFAULT_PARAMETER_NAME_CODE_EMAIL; } }; /** * 校验时从请求中获取的参数的名字 * * @return param name on validate */ public abstract String getParamNameOnValidate(); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/email/DefaultEmailCodeSender.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:DefaultEmailCodeSender.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code.email; import lombok.extern.slf4j.Slf4j; /** * 默认的短信验证码发送器 * * @author paascloud.net @gmail.com */ @Slf4j public class DefaultEmailCodeSender implements EmailCodeSender { /** * Send. * * @param email the mobile * @param code the code */ @Override public void send(String email, String code) { log.warn("请配置真实的邮件验证码发送器(SmsCodeSender)"); log.info("向邮件" + email + "发送短信验证码" + code); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/email/EmailCodeGenerator.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:EmailCodeGenerator.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code.email; import com.paascloud.security.core.properties.SecurityProperties; import com.paascloud.security.core.validate.code.ValidateCode; import com.paascloud.security.core.validate.code.ValidateCodeGenerator; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.context.request.ServletWebRequest; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; import java.util.Map; /** * 短信验证码生成器 * * @author paascloud.net @gmail.com */ @Slf4j @Component("emailValidateCodeGenerator") public class EmailCodeGenerator implements ValidateCodeGenerator { @Autowired private SecurityProperties securityProperties; /** * Generate validate code. * * @param request the request * * @return the validate code */ @Override public ValidateCode generate(ServletWebRequest request) { HttpServletRequest httpServletRequest = (HttpServletRequest) request; Map parameterMap = httpServletRequest.getParameterMap(); String[] emails = parameterMap.get("email"); log.info(Arrays.toString(emails)); String code = Arrays.toString(emails); return new ValidateCode(code, securityProperties.getCode().getEmail().getExpireIn()); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/email/EmailCodeProcessor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:EmailCodeProcessor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code.email; import com.paascloud.security.core.properties.SecurityConstants; import com.paascloud.security.core.validate.code.ValidateCode; import com.paascloud.security.core.validate.code.ValidateCodeGenerator; import com.paascloud.security.core.validate.code.ValidateCodeRepository; import com.paascloud.security.core.validate.code.impl.AbstractValidateCodeProcessor; import org.springframework.stereotype.Component; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.context.request.ServletWebRequest; import javax.annotation.Resource; import java.util.Map; /** * 短信验证码处理器 * * @author paascloud.net @gmail.com */ @Component("emailValidateCodeProcessor") public class EmailCodeProcessor extends AbstractValidateCodeProcessor { /** * 短信验证码发送器 */ @Resource private EmailCodeSender emailCodeSender; /** * Instantiates a new Abstract validate code processor. * * @param validateCodeGenerators the validate code generators * @param validateCodeRepository the validate code repository */ public EmailCodeProcessor(Map validateCodeGenerators, ValidateCodeRepository validateCodeRepository) { super(validateCodeGenerators, validateCodeRepository); } /** * Send. * * @param request the request * @param validateCode the validate code * * @throws Exception the exception */ @Override protected void send(ServletWebRequest request, ValidateCode validateCode) throws Exception { String paramName = SecurityConstants.DEFAULT_PARAMETER_NAME_EMAIL; String email = ServletRequestUtils.getRequiredStringParameter(request.getRequest(), paramName); emailCodeSender.send(email, validateCode.getCode()); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/email/EmailCodeSender.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:EmailCodeSender.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code.email; /** * The interface Sms code sender. * * @author paascloud.net@gmail.com */ public interface EmailCodeSender { /** * Send. * * @param email the email * @param code the code */ void send(String email, String code); } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/image/ImageCode.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ImageCode.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code.image; import com.paascloud.security.core.validate.code.ValidateCode; import java.awt.image.BufferedImage; import java.time.LocalDateTime; /** * 图片验证码 * * @author paascloud.net @gmail.com */ public class ImageCode extends ValidateCode { private static final long serialVersionUID = -6020470039852318468L; private BufferedImage image; /** * Instantiates a new Image code. * * @param image the image * @param code the code * @param expireIn the expire in */ ImageCode(BufferedImage image, String code, int expireIn) { super(code, expireIn); this.image = image; } /** * Instantiates a new Image code. * * @param image the image * @param code the code * @param expireTime the expire time */ public ImageCode(BufferedImage image, String code, LocalDateTime expireTime) { super(code, expireTime); this.image = image; } /** * Gets image. * * @return the image */ public BufferedImage getImage() { return image; } /** * Sets image. * * @param image the image */ public void setImage(BufferedImage image) { this.image = image; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/image/ImageCodeGenerator.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ImageCodeGenerator.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code.image; import com.google.code.kaptcha.Producer; import com.paascloud.security.core.properties.SecurityProperties; import com.paascloud.security.core.validate.code.ValidateCodeGenerator; import org.springframework.web.context.request.ServletWebRequest; import java.awt.image.BufferedImage; /** * 默认的图片验证码生成器 * * @author paascloud.net @gmail.com */ public class ImageCodeGenerator implements ValidateCodeGenerator { private SecurityProperties securityProperties; private Producer captchaProducer; /** * 生成图片验证码. * * @param request the request * * @return the image code */ @Override public ImageCode generate(ServletWebRequest request) { String kaptchaCode = captchaProducer.createText(); BufferedImage image = captchaProducer.createImage(kaptchaCode); return new ImageCode(image, kaptchaCode, securityProperties.getCode().getImage().getExpireIn()); } /** * Sets security properties. * * @param securityProperties the security properties */ public void setSecurityProperties(SecurityProperties securityProperties) { this.securityProperties = securityProperties; } /** * Sets captcha producer. * * @param captchaProducer the captcha producer */ public void setCaptchaProducer(Producer captchaProducer) { this.captchaProducer = captchaProducer; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/image/ImageCodeProcessor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ImageCodeProcessor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code.image; import com.fasterxml.jackson.databind.ObjectMapper; import com.paascloud.security.core.SecurityResult; import com.paascloud.security.core.validate.code.ValidateCodeGenerator; import com.paascloud.security.core.validate.code.ValidateCodeRepository; import com.paascloud.security.core.validate.code.impl.AbstractValidateCodeProcessor; import org.springframework.stereotype.Component; import org.springframework.web.context.request.ServletWebRequest; import javax.annotation.Resource; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.util.Map; /** * 图片验证码处理器 * * @author paascloud.net @gmail.com */ @Component("imageValidateCodeProcessor") public class ImageCodeProcessor extends AbstractValidateCodeProcessor { @Resource private ObjectMapper objectMapper; /** * Instantiates a new Abstract validate code processor. * * @param validateCodeGenerators the validate code generators * @param validateCodeRepository the validate code repository */ public ImageCodeProcessor(Map validateCodeGenerators, ValidateCodeRepository validateCodeRepository) { super(validateCodeGenerators, validateCodeRepository); } /** * 发送图形验证码,将其写到响应中 * * @param request the request * @param imageCode the image code * * @throws Exception the exception */ @Override protected void send(ServletWebRequest request, ImageCode imageCode) throws Exception { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ImageIO.write(imageCode.getImage(), "JPEG", bos); SecurityResult result = SecurityResult.ok(bos.toByteArray()); String json = objectMapper.writeValueAsString(result); HttpServletResponse response = request.getResponse(); response.setCharacterEncoding("UTF-8"); response.getWriter().write(json); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/impl/AbstractValidateCodeProcessor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AbstractValidateCodeProcessor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code.impl; import com.paascloud.security.core.validate.code.*; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.ServletRequestBindingException; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.context.request.ServletWebRequest; import java.util.Map; /** * 抽象的图片验证码处理器 * * @param the type parameter @author paascloud.net@gmail.com * * @author paascloud.net @gmail.com */ public abstract class AbstractValidateCodeProcessor implements ValidateCodeProcessor { /** * 收集系统中所有的 {@link ValidateCodeGenerator} 接口的实现。 */ private final Map validateCodeGenerators; private final ValidateCodeRepository validateCodeRepository; /** * Instantiates a new Abstract validate code processor. * * @param validateCodeGenerators the validate code generators * @param validateCodeRepository the validate code repository */ @Autowired public AbstractValidateCodeProcessor(Map validateCodeGenerators, ValidateCodeRepository validateCodeRepository) { this.validateCodeGenerators = validateCodeGenerators; this.validateCodeRepository = validateCodeRepository; } /** * Create. * * @param request the request * * @throws Exception the exception */ @Override public void create(ServletWebRequest request) throws Exception { C validateCode = generate(request); save(request, validateCode); send(request, validateCode); } /** * 生成校验码 */ @SuppressWarnings("unchecked") private C generate(ServletWebRequest request) { String type = getValidateCodeType().toString().toLowerCase(); String generatorName = type + ValidateCodeGenerator.class.getSimpleName(); ValidateCodeGenerator validateCodeGenerator = validateCodeGenerators.get(generatorName); if (validateCodeGenerator == null) { throw new ValidateCodeException("验证码生成器" + generatorName + "不存在"); } return (C) validateCodeGenerator.generate(request); } /** * 保存校验码 */ private void save(ServletWebRequest request, C validateCode) { ValidateCode code = new ValidateCode(validateCode.getCode(), validateCode.getExpireTime()); validateCodeRepository.save(request, code, getValidateCodeType()); } /** * 发送校验码,由子类实现 * * @param request the request * @param validateCode the validate code * * @throws Exception the exception */ protected abstract void send(ServletWebRequest request, C validateCode) throws Exception; /** * 根据请求的url获取校验码的类型 */ private ValidateCodeType getValidateCodeType() { String type = StringUtils.substringBefore(getClass().getSimpleName(), "CodeProcessor"); return ValidateCodeType.valueOf(type.toUpperCase()); } /** * Validate. * * @param request the request */ @SuppressWarnings("unchecked") @Override public void validate(ServletWebRequest request) { ValidateCodeType codeType = getValidateCodeType(); this.check(request); validateCodeRepository.remove(request, codeType); } /** * Check. * * @param request the request */ @SuppressWarnings("unchecked") @Override public void check(ServletWebRequest request) { ValidateCodeType codeType = getValidateCodeType(); C codeInSession = (C) validateCodeRepository.get(request, codeType); String codeInRequest; try { codeInRequest = ServletRequestUtils.getStringParameter(request.getRequest(), codeType.getParamNameOnValidate()); } catch (ServletRequestBindingException e) { throw new ValidateCodeException("获取验证码的值失败"); } if (StringUtils.isBlank(codeInRequest)) { throw new ValidateCodeException(codeType + "验证码的值不能为空"); } if (codeInSession == null || codeInSession.isExpired()) { validateCodeRepository.remove(request, codeType); throw new ValidateCodeException(codeType + "验证码已过期"); } if (!StringUtils.equals(codeInSession.getCode(), codeInRequest)) { throw new ValidateCodeException(codeType + "验证码不匹配"); } } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/impl/RedisValidateCodeRepository.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RedisValidateCodeRepository.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.core.validate.code.impl; import com.paascloud.security.core.validate.code.ValidateCode; import com.paascloud.security.core.validate.code.ValidateCodeException; import com.paascloud.security.core.validate.code.ValidateCodeRepository; import com.paascloud.security.core.validate.code.ValidateCodeType; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.web.context.request.ServletWebRequest; import java.util.concurrent.TimeUnit; /** * 基于redis的验证码存取器,避免由于没有session导致无法存取验证码的问题 * * @author paascloud.net @gmail.com */ @Component public class RedisValidateCodeRepository implements ValidateCodeRepository { private final RedisTemplate redisTemplate; /** * Instantiates a new Redis validate code repository. * * @param redisTemplate the redis template */ @Autowired public RedisValidateCodeRepository(RedisTemplate redisTemplate) { this.redisTemplate = redisTemplate; } /** * Save. * * @param request the request * @param code the code * @param type the type */ @Override public void save(ServletWebRequest request, ValidateCode code, ValidateCodeType type) { String key = buildKey(request, type); redisTemplate.opsForValue().set(key, code, 3, TimeUnit.MINUTES); } /** * Get validate code. * * @param request the request * @param type the type * * @return the validate code */ @Override public ValidateCode get(ServletWebRequest request, ValidateCodeType type) { Object value = redisTemplate.opsForValue().get(buildKey(request, type)); if (value == null) { return null; } return (ValidateCode) value; } /** * Remove. * * @param request the request * @param type the type */ @Override public void remove(ServletWebRequest request, ValidateCodeType type) { redisTemplate.delete(buildKey(request, type)); } private String buildKey(ServletWebRequest request, ValidateCodeType type) { String deviceId = request.getHeader("deviceId"); if (StringUtils.isBlank(deviceId)) { throw new ValidateCodeException("请在请求头中携带deviceId参数"); } return "code:" + type.toString().toLowerCase() + ":" + deviceId; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/sms/DefaultSmsCodeSender.java ================================================ package com.paascloud.security.core.validate.code.sms; import lombok.extern.slf4j.Slf4j; /** * 默认的短信验证码发送器 * * @author paascloud.net @gmail.com */ @Slf4j public class DefaultSmsCodeSender implements SmsCodeSender { /** * Send. * * @param mobile the mobile * @param code the code * @param ip the ip */ @Override public void send(String mobile, String code, String ip) { log.warn("请配置真实的短信验证码发送器(SmsCodeSender)"); log.info("向手机" + mobile + "发送短信验证码" + code + "ip:" + ip); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/sms/SmsCodeGenerator.java ================================================ package com.paascloud.security.core.validate.code.sms; import com.paascloud.security.core.properties.SecurityProperties; import com.paascloud.security.core.validate.code.ValidateCode; import com.paascloud.security.core.validate.code.ValidateCodeGenerator; import org.apache.commons.lang.RandomStringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.context.request.ServletWebRequest; /** * 短信验证码生成器 * * @author paascloud.net @gmail.com */ @Component("smsValidateCodeGenerator") public class SmsCodeGenerator implements ValidateCodeGenerator { @Autowired private SecurityProperties securityProperties; /** * Generate validate code. * * @param request the request * * @return the validate code */ @Override public ValidateCode generate(ServletWebRequest request) { String code = RandomStringUtils.randomNumeric(securityProperties.getCode().getSms().getLength()); return new ValidateCode(code, securityProperties.getCode().getSms().getExpireIn()); } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/sms/SmsCodeProcessor.java ================================================ package com.paascloud.security.core.validate.code.sms; import com.fasterxml.jackson.databind.ObjectMapper; import com.paascloud.RedisKeyUtil; import com.paascloud.security.core.SecurityResult; import com.paascloud.security.core.properties.SecurityConstants; import com.paascloud.security.core.properties.SecurityProperties; import com.paascloud.security.core.properties.SmsCodeProperties; import com.paascloud.security.core.validate.code.ValidateCode; import com.paascloud.security.core.validate.code.ValidateCodeException; import com.paascloud.security.core.validate.code.ValidateCodeGenerator; import com.paascloud.security.core.validate.code.ValidateCodeRepository; import com.paascloud.security.core.validate.code.impl.AbstractValidateCodeProcessor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.context.request.ServletWebRequest; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Map; import java.util.concurrent.TimeUnit; /** * 短信验证码处理器 * * @author paascloud.net @gmail.com */ @Component("smsValidateCodeProcessor") @Slf4j public class SmsCodeProcessor extends AbstractValidateCodeProcessor { private static final String X_FORWARDED_FOR = "x-forwarded-for"; private static final String PROXY_CLIENT_IP = "Proxy-Client-IP"; private static final String WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP"; private static final String LOCALHOST_IP = "127.0.0.1"; private static final String LOCALHOST_IP_16 = "0:0:0:0:0:0:0:1"; private static final String UNKNOWN = "unknown"; private static final String COMMA = ","; private static final int MAX_IP_LENGTH = 15; @Resource private SmsCodeSender smsCodeSender; @Resource private RedisTemplate redisTemplate; @Autowired private SecurityProperties securityProperties; @Resource private ObjectMapper objectMapper; /** * Instantiates a new Abstract validate code processor. * * @param validateCodeGenerators the validate code generators * @param validateCodeRepository the validate code repository */ public SmsCodeProcessor(Map validateCodeGenerators, ValidateCodeRepository validateCodeRepository) { super(validateCodeGenerators, validateCodeRepository); } /** * Send. * * @param request the request * @param validateCode the validate code * * @throws Exception the exception */ @Override protected void send(ServletWebRequest request, ValidateCode validateCode) throws Exception { String paramName = SecurityConstants.DEFAULT_PARAMETER_NAME_MOBILE; String mobile = ServletRequestUtils.getRequiredStringParameter(request.getRequest(), paramName); String ipAddr = this.getRemoteAddr(request.getRequest()); SecurityResult result = new SecurityResult(SecurityResult.SUCCESS_CODE, "校验成功", true); // 统一处理短信流量 try { this.checkSendSmsCount(mobile, ipAddr); smsCodeSender.send(mobile, validateCode.getCode(), ipAddr); } catch (ValidateCodeException e) { log.error("校验短信数量, e={}", e.getMessage(), e); result = SecurityResult.error(e.getMessage(), false); } catch (Exception e) { log.error("校验短信数量, e={}", e.getMessage(), e); result = SecurityResult.error("内部异常", false); } String json = objectMapper.writeValueAsString(result); HttpServletResponse response = request.getResponse(); response.setCharacterEncoding("UTF-8"); response.getWriter().write(json); } private void checkSendSmsCount(String mobile, String ipAddr) { String mobileSmsCountKey = RedisKeyUtil.getSendSmsCountKey(mobile, "mobile"); String ipSmsCountKey = RedisKeyUtil.getSendSmsCountKey(ipAddr, "ip"); String totalSmsCountKey = RedisKeyUtil.getSendSmsCountKey("total", "total"); String sendSmsRateKey = RedisKeyUtil.getSendSmsRateKey(ipAddr); SmsCodeProperties sms = securityProperties.getCode().getSms(); Integer sendSmsRateCount = (Integer) redisTemplate.opsForValue().get(sendSmsRateKey); if (sendSmsRateCount != null) { log.error("操作频率过快 ipAddr={}, mobile={}", ipAddr, mobile); throw new ValidateCodeException("操作频率过快"); } else { redisTemplate.opsForValue().set(sendSmsRateKey, 1, 1, TimeUnit.MINUTES); } Integer mobileSmsCount = (Integer) redisTemplate.opsForValue().get(mobileSmsCountKey); if (mobileSmsCount != null && mobileSmsCount > sms.getMobileMaxSendCount()) { log.error("Mobile当天短信发送数上限 ipAddr={}, mobile={}", ipAddr, mobile); throw new ValidateCodeException("Mobile当天短信发送数上限"); } else { redisTemplate.opsForValue().set(mobileSmsCountKey, mobileSmsCount == null ? 1 : mobileSmsCount + 1, 1, TimeUnit.DAYS); } Integer ipSmsCount = (Integer) redisTemplate.opsForValue().get(ipSmsCountKey); if (ipSmsCount != null && ipSmsCount > sms.getIpMaxSendCount()) { log.error("IP当天短信发送数上限 ipAddr={}, mobile={}", ipAddr, mobile); throw new ValidateCodeException("IP当天短信发送数上限"); } else { redisTemplate.opsForValue().set(ipSmsCountKey, ipSmsCount == null ? 1 : ipSmsCount + 1, 1, TimeUnit.DAYS); } Integer totalSmsCount = (Integer) redisTemplate.opsForValue().get(totalSmsCountKey); if (totalSmsCount != null && totalSmsCount > sms.getTotalMaxSendCount()) { log.error("当天短信发送数上限 ipAddr={}, mobile={}", ipAddr, mobile); throw new ValidateCodeException("当天短信发送数上限"); } else { redisTemplate.opsForValue().set(totalSmsCountKey, totalSmsCount == null ? 1 : totalSmsCount + 1, 1, TimeUnit.DAYS); } } private String getRemoteAddr(HttpServletRequest request) { String ipAddress = request.getHeader(X_FORWARDED_FOR); if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader(PROXY_CLIENT_IP); } if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = request.getHeader(WL_PROXY_CLIENT_IP); } if (ipAddress == null || ipAddress.length() == 0 || UNKNOWN.equalsIgnoreCase(ipAddress)) { ipAddress = request.getRemoteAddr(); if (LOCALHOST_IP.equals(ipAddress) || LOCALHOST_IP_16.equals(ipAddress)) { //根据网卡取本机配置的IP InetAddress inet = null; try { inet = InetAddress.getLocalHost(); } catch (UnknownHostException e) { log.error("获取IP地址, 出现异常={}", e.getMessage(), e); } assert inet != null; ipAddress = inet.getHostAddress(); } } // 对于通过多个代理的情况, 第一个IP为客户端真实IP,多个IP按照','分割 //"***.***.***.***".length() = 15 if (ipAddress != null && ipAddress.length() > MAX_IP_LENGTH && ipAddress.indexOf(COMMA) > 0) { ipAddress = ipAddress.substring(0, ipAddress.indexOf(COMMA)); } return ipAddress; } } ================================================ FILE: paascloud-common/paascloud-security-core/src/main/java/com/paascloud/security/core/validate/code/sms/SmsCodeSender.java ================================================ package com.paascloud.security.core.validate.code.sms; /** * The interface Sms code sender. * * @author paascloud.net@gmail.com */ public interface SmsCodeSender { /** * Send. * * @param mobile the mobile * @param code the code * @param ip the ip */ void send(String mobile, String code, String ip); } ================================================ FILE: paascloud-common/paascloud-security-feign/pom.xml ================================================ paascloud-common com.liuzm.paascloud.common 1.0 4.0.0 paascloud-security-feign org.springframework.cloud spring-cloud-starter-feign org.springframework.cloud spring-cloud-starter-oauth2 com.liuzm.paascloud.common paascloud-common-base ================================================ FILE: paascloud-common/paascloud-security-feign/src/main/java/com/paascloud/security/feign/OAuth2FeignAutoConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OAuth2FeignAutoConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.feign; import feign.Logger; import feign.RequestInterceptor; import feign.codec.ErrorDecoder; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.http.client.Netty4ClientHttpRequestFactory; import org.springframework.security.oauth2.client.DefaultOAuth2ClientContext; import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.security.oauth2.client.token.grant.client.ClientCredentialsResourceDetails; import org.springframework.security.oauth2.common.AuthenticationScheme; /** * The class O auth 2 feign auto configuration. * * @author paascloud.net @gmail.com */ @Configuration @EnableConfigurationProperties(Oauth2ClientProperties.class) public class OAuth2FeignAutoConfiguration { private final Oauth2ClientProperties oauth2ClientProperties; /** * Instantiates a new O auth 2 feign auto configuration. * * @param oauth2ClientProperties the oauth 2 client properties */ @Autowired public OAuth2FeignAutoConfiguration(Oauth2ClientProperties oauth2ClientProperties) { this.oauth2ClientProperties = oauth2ClientProperties; } /** * Resource details client credentials resource details. * * @return the client credentials resource details */ @Bean("paascloudClientCredentialsResourceDetails") public ClientCredentialsResourceDetails resourceDetails() { ClientCredentialsResourceDetails details = new ClientCredentialsResourceDetails(); details.setId(oauth2ClientProperties.getId()); details.setAccessTokenUri(oauth2ClientProperties.getAccessTokenUrl()); details.setClientId(oauth2ClientProperties.getClientId()); details.setClientSecret(oauth2ClientProperties.getClientSecret()); details.setAuthenticationScheme(AuthenticationScheme.valueOf(oauth2ClientProperties.getClientAuthenticationScheme())); return details; } /** * O auth 2 rest template o auth 2 rest template. * * @return the o auth 2 rest template */ @Bean("paascloudOAuth2RestTemplate") public OAuth2RestTemplate oAuth2RestTemplate() { final OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(resourceDetails(), new DefaultOAuth2ClientContext()); oAuth2RestTemplate.setRequestFactory(new Netty4ClientHttpRequestFactory()); return oAuth2RestTemplate; } /** * Oauth 2 feign request interceptor request interceptor. * * @param oAuth2RestTemplate the o auth 2 rest template * * @return the request interceptor */ @Bean public RequestInterceptor oauth2FeignRequestInterceptor(@Qualifier("paascloudOAuth2RestTemplate") OAuth2RestTemplate oAuth2RestTemplate) { return new OAuth2FeignRequestInterceptor(oAuth2RestTemplate); } /** * Feign logger level logger . level. * * @return the logger . level */ @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } /* * To disable Hystrix support on a per-client basis create a vanilla Feign.Builder with the "prototype" scope, e.g.: */ // @Bean // @Scope("prototype") // public Feign.Builder feignBuilder() { // return Feign.builder(); // } @Bean public ErrorDecoder errorDecoder() { return new Oauth2FeignErrorInterceptor(); } } ================================================ FILE: paascloud-common/paascloud-security-feign/src/main/java/com/paascloud/security/feign/OAuth2FeignRequestInterceptor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OAuth2FeignRequestInterceptor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.feign; import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.security.oauth2.client.OAuth2RestTemplate; import org.springframework.util.Assert; /** * The class O auth 2 feign request interceptor. * * @author paascloud.net @gmail.com */ @Slf4j public class OAuth2FeignRequestInterceptor implements RequestInterceptor { private static final String BEARER_TOKEN_TYPE = "bearer"; private final OAuth2RestTemplate oAuth2RestTemplate; /** * Instantiates a new O auth 2 feign request interceptor. * * @param oAuth2RestTemplate the o auth 2 rest template */ OAuth2FeignRequestInterceptor(OAuth2RestTemplate oAuth2RestTemplate) { Assert.notNull(oAuth2RestTemplate, "Context can not be null"); this.oAuth2RestTemplate = oAuth2RestTemplate; } /** * Apply. * * @param template the template */ @Override public void apply(RequestTemplate template) { log.debug("Constructing Header {} for Token {}", HttpHeaders.AUTHORIZATION, BEARER_TOKEN_TYPE); template.header(HttpHeaders.AUTHORIZATION, String.format("%s %s", BEARER_TOKEN_TYPE, oAuth2RestTemplate.getAccessToken().toString())); } } ================================================ FILE: paascloud-common/paascloud-security-feign/src/main/java/com/paascloud/security/feign/Oauth2ClientProperties.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:Oauth2ClientProperties.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.feign; import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; /** * The class Oauth 2 client properties. * * @author paascloud.net @gmail.com */ @Data @ConfigurationProperties(prefix = "paascloud.oauth2.client") public class Oauth2ClientProperties { private String id; private String accessTokenUrl; private String clientId; private String clientSecret; private String clientAuthenticationScheme; } ================================================ FILE: paascloud-common/paascloud-security-feign/src/main/java/com/paascloud/security/feign/Oauth2FeignErrorInterceptor.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:Oauth2FeignErrorInterceptor.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.security.feign; import com.fasterxml.jackson.databind.ObjectMapper; import com.netflix.hystrix.exception.HystrixBadRequestException; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import feign.Response; import feign.codec.ErrorDecoder; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import java.io.IOException; import java.util.HashMap; /** * The class Feign error interceptor. * * @author paascloud.net @gmail.com */ @Slf4j public class Oauth2FeignErrorInterceptor implements ErrorDecoder { private final ErrorDecoder defaultErrorDecoder = new Default(); /** * Decode exception. * * @param methodKey the method key * @param response the response * * @return the exception */ @Override public Exception decode(final String methodKey, final Response response) { if (response.status() >= HttpStatus.BAD_REQUEST.value() && response.status() < HttpStatus.INTERNAL_SERVER_ERROR.value()) { return new HystrixBadRequestException("request exception wrapper"); } ObjectMapper mapper = new ObjectMapper(); try { HashMap map = mapper.readValue(response.body().asInputStream(), HashMap.class); Integer code = (Integer) map.get("code"); String message = (String) map.get("message"); if (code != null) { ErrorCodeEnum anEnum = ErrorCodeEnum.getEnum(code); if (anEnum != null) { if (anEnum == ErrorCodeEnum.GL99990100) { throw new IllegalArgumentException(message); } else { throw new BusinessException(anEnum); } } else { throw new BusinessException(ErrorCodeEnum.GL99990500, message); } } } catch (IOException e) { log.info("Failed to process response body"); } return defaultErrorDecoder.decode(methodKey, response); } } ================================================ FILE: paascloud-common/pom.xml ================================================ com.liuzm.paascloud paascloud-master 1.0 4.0.0 com.liuzm.paascloud.common paascloud-common pom paascloud-common-base paascloud-common-util paascloud-common-config paascloud-common-core paascloud-security-app paascloud-security-core paascloud-security-feign paascloud-common-zk UTF-8 org.projectlombok lombok ================================================ FILE: paascloud-discovery/pom.xml ================================================ 4.0.0 com.liuzm.paascloud.discovery paascloud-discovery jar paascloud-discovery 配置中心 org.springframework.boot spring-boot-starter-parent 1.5.13.RELEASE UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-dependencies Edgware.SR3 pom import org.springframework.cloud spring-cloud-starter-config org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-config-server org.springframework.cloud spring-cloud-security de.codecentric spring-boot-admin-starter-client 1.5.7 org.springframework.cloud spring-cloud-starter-bus-amqp ${artifactId} org.springframework.boot spring-boot-maven-plugin build-info com.spotify docker-maven-plugin 0.4.13 ${project.artifactId}:${project.version} java ["java", "-jar", "/${project.build.finalName}.jar"] / ${project.build.directory} ${project.build.finalName}.jar dev dev true pro pro ================================================ FILE: paascloud-discovery/src/main/java/com/paascloud/discovery/PaasCloudDiscoveryApplication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudDiscoveryApplication.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.discovery; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.config.server.EnableConfigServer; /** * The class Paas cloud discovery application. * * @author paascloud.net@gmail.com */ @SpringBootApplication @EnableConfigServer @EnableDiscoveryClient public class PaasCloudDiscoveryApplication { /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { SpringApplication.run(PaasCloudDiscoveryApplication.class, args); } } ================================================ FILE: paascloud-discovery/src/main/resources/application.yml ================================================ server: port: 8080 spring: profiles: active: dev application: name: @pom.artifactId@ rabbitmq: host: paascloud-mq-rabbit port: 5672 username: guest password: guest boot: admin: username: admin password: admin security: user: name: admin password: admin info: 软件著作权: paascloud快速搭建企业级分布式微服务平台 著作登记号: 2018SR320076 关于我们: http://paascloud.net ================================================ FILE: paascloud-discovery/src/main/resources/banner.txt ================================================ ${AnsiColor.BRIGHT_CYAN} .__ .___ __ ___________ _____ ______ ____ | | ____ __ __ __| _/ ____ _____/ |_ \____ \__ \ \__ \ / ___// ___\| | / _ \| | \/ __ | / \_/ __ \ __\ | |_> > __ \_/ __ \_\___ \\ \___| |_( <_> ) | / /_/ | | | \ ___/| | | __(____ (____ /____ >\___ >____/\____/|____/\____ | /\ |___| /\___ >__| |__| \/ \/ \/ \/ Powered by liuzhaoming\/ \/ \/ \/ ================================================ FILE: paascloud-discovery/src/main/resources/bootstrap.yml ================================================ spring: cloud: config: server: git: uri: https://github.com/paascloud/paascloud-config-repo.git username: password: search-paths: /* default-label: ${spring.profiles.active} basedir: /data/config/paascloud-config-repo inetutils: ignoredInterfaces: - docker0 - veth.* preferredNetworks: - 192.168 encrypt: key-store: location: classpath:/server.jks password: paascloud-storepass alias: paascloud-key-store secret: paascloud-keypass eureka: client: serviceUrl: defaultZone: http://root:root@paascloud-eureka:8761/eureka/ instance: instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port} ================================================ FILE: paascloud-discovery/src/main/resources/logback-spring.xml ================================================ ${LOG_PATH}/${LOG_FILE} %date [%level] [%thread] %logger{60} [%file : %line] %msg%n ${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz 30 ================================================ FILE: paascloud-eureka/pom.xml ================================================ 4.0.0 com.liuzm.paascloud.eureka paascloud-eureka jar paascloud-eureka Demo project for Spring Boot com.liuzm.paascloud paascloud-master 1.0 UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-starter-eureka-server org.springframework.boot spring-boot-starter-security net.logstash.logback logstash-logback-encoder ${artifactId} org.springframework.boot spring-boot-maven-plugin com.spotify docker-maven-plugin 0.4.13 ${project.artifactId}:${project.version} java ["java", "-jar", "/${project.build.finalName}.jar"] / ${project.build.directory} ${project.build.finalName}.jar ================================================ FILE: paascloud-eureka/src/main/java/com/paascloud/discovery/eureka/PaasCloudEurekaApplication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudEurekaApplication.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.discovery.eureka; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; /** * The class Paas cloud eureka application. * * @author paascloud.net@gmail.com */ @EnableEurekaServer @SpringBootApplication public class PaasCloudEurekaApplication { /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { SpringApplication.run(PaasCloudEurekaApplication.class, args); } } ================================================ FILE: paascloud-eureka/src/main/resources/application.yml ================================================ server: port: 8761 spring: profiles: active: dev application: name: @pom.artifactId@ security: basic: enabled: true user: name: root password: root ================================================ FILE: paascloud-eureka/src/main/resources/banner.txt ================================================ ${AnsiColor.BRIGHT_CYAN} .__ .___ __ ___________ _____ ______ ____ | | ____ __ __ __| _/ ____ _____/ |_ \____ \__ \ \__ \ / ___// ___\| | / _ \| | \/ __ | / \_/ __ \ __\ | |_> > __ \_/ __ \_\___ \\ \___| |_( <_> ) | / /_/ | | | \ ___/| | | __(____ (____ /____ >\___ >____/\____/|____/\____ | /\ |___| /\___ >__| |__| \/ \/ \/ \/ Powered by liuzhaoming\/ \/ \/ \/ ================================================ FILE: paascloud-eureka/src/main/resources/bootstrap.yml ================================================ spring: cloud: inetutils: ignoredInterfaces: - docker0 - veth.* - VM.* preferredNetworks: - 192.168 eureka: server: enable-self-preservation: false instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka ================================================ FILE: paascloud-eureka/src/main/resources/logback-spring.xml ================================================ ${LOG_PATH}/${LOG_FILE} %date [%level] [%thread] %logger{60} [%file : %line] %msg%n ${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz 30 ================================================ FILE: paascloud-gateway/.gitignore ================================================ target/ !.mvn/wrapper/maven-wrapper.jar ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr ### NetBeans ### nbproject/private/ build/ nbbuild/ dist/ nbdist/ .nb-gradle/ ================================================ FILE: paascloud-gateway/README.md ================================================ filterOrder:filter执行顺序, 通过数字指定 shouldFilter:filter是否需要执行 true执行 false 不执行 run : filter具体逻辑 filterType :filter类型,分为以下几种 pre:请求执行之前filter route: 处理请求, 进行路由 post: 请求处理完成后执行的filter error:出现错误时执行的filter ================================================ FILE: paascloud-gateway/pom.xml ================================================ 4.0.0 com.liuzm.paascloud.gateway paascloud-gateway jar paascloud-gateway Demo project for Spring Boot com.liuzm.paascloud paascloud-master 1.0 UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-starter-config org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-starter-zuul com.liuzm.paascloud.common paascloud-common-util com.liuzm.paascloud.common paascloud-common-core de.codecentric spring-boot-admin-starter-client org.springframework.cloud spring-cloud-starter-security org.springframework.cloud spring-cloud-starter-oauth2 org.springframework.security spring-security-jwt com.didispace swagger-butler-core 1.1.0 org.springframework.cloud spring-cloud-starter-zipkin org.springframework.amqp spring-rabbit net.logstash.logback logstash-logback-encoder ${artifactId} org.springframework.boot spring-boot-maven-plugin build-info com.spotify docker-maven-plugin 0.4.13 ${project.artifactId}:${project.version} java ["java", "-jar", "/${project.build.finalName}.jar"] / ${project.build.directory} ${project.build.finalName}.jar ================================================ FILE: paascloud-gateway/src/main/java/com/paascloud/gateway/PaasCloudGatewayApplication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudGatewayApplication.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.gateway; import com.didispace.swagger.butler.EnableSwaggerButler; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.cloud.netflix.zuul.EnableZuulProxy; import org.springframework.context.annotation.Bean; import org.springframework.web.cors.CorsConfiguration; import org.springframework.web.cors.UrlBasedCorsConfigurationSource; import org.springframework.web.filter.CorsFilter; /** * The class Paas cloud gateway application. * * @author paascloud.net@gmail.com */ @SpringBootApplication @EnableDiscoveryClient @EnableZuulProxy @EnableOAuth2Sso @EnableHystrix @EnableSwaggerButler public class PaasCloudGatewayApplication { public static void main(String[] args) { SpringApplication.run(PaasCloudGatewayApplication.class, args); } @Bean public CorsFilter corsFilter() { final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); final CorsConfiguration config = new CorsConfiguration(); // 允许cookies跨域 config.setAllowCredentials(true); // #允许向该服务器提交请求的URI,*表示全部允许,在SpringMVC中,如果设成*,会自动转成当前请求头中的Origin config.addAllowedOrigin("*"); // #允许访问的头信息,*表示全部 config.addAllowedHeader("*"); // 预检请求的缓存时间(秒),即在这个时间段里,对于相同的跨域请求不会再预检了 config.setMaxAge(18000L); // 允许提交请求的方法,*表示全部允许 config.addAllowedMethod("OPTIONS"); config.addAllowedMethod("HEAD"); // 允许Get的请求方法 config.addAllowedMethod("GET"); config.addAllowedMethod("PUT"); config.addAllowedMethod("POST"); config.addAllowedMethod("DELETE"); config.addAllowedMethod("PATCH"); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); } } ================================================ FILE: paascloud-gateway/src/main/java/com/paascloud/gateway/config/SecurityConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SecurityConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.gateway.config; import org.springframework.boot.autoconfigure.security.oauth2.client.EnableOAuth2Sso; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; /** * The class Security config. * * @author paascloud.net @gmail.com */ @Configuration @EnableOAuth2Sso public class SecurityConfig extends WebSecurityConfigurerAdapter { /** * Configure. * * @param http the http * * @throws Exception the exception */ @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); } } ================================================ FILE: paascloud-gateway/src/main/java/com/paascloud/gateway/fallback/UacFallbackProvider.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacFallbackProvider.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.gateway.fallback; import com.netflix.hystrix.exception.HystrixTimeoutException; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.netflix.zuul.filters.route.FallbackProvider; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.client.ClientHttpResponse; import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.InputStream; /** * The class Uac fallback provider. * * @author paascloud.net@gmail.com */ @Component @Slf4j public class UacFallbackProvider implements FallbackProvider { @Override public String getRoute() { return "*"; } @Override public ClientHttpResponse fallbackResponse(final Throwable cause) { if (cause instanceof HystrixTimeoutException) { return response(HttpStatus.GATEWAY_TIMEOUT); } else { return fallbackResponse(); } } @Override public ClientHttpResponse fallbackResponse() { return response(HttpStatus.INTERNAL_SERVER_ERROR); } private ClientHttpResponse response(final HttpStatus status) { return new ClientHttpResponse() { @Override public HttpStatus getStatusCode() { return status; } @Override public int getRawStatusCode() { return status.value(); } @Override public String getStatusText() { return status.getReasonPhrase(); } @Override public void close() { log.info("close"); } @Override public InputStream getBody() { String message = "{\n" + "\"code\": 200,\n" + "\"message\": \"微服务故障, 请稍后再试\"\n" + "}"; return new ByteArrayInputStream(message.getBytes()); } @Override public HttpHeaders getHeaders() { HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); return headers; } }; } } ================================================ FILE: paascloud-gateway/src/main/java/com/paascloud/gateway/filter/AuthHeaderFilter.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AuthHeaderFilter.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.gateway.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.netflix.zuul.exception.ZuulException; import com.paascloud.PublicUtil; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import com.paascloud.core.interceptor.CoreHeaderInterceptor; import com.paascloud.core.utils.RequestUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; /** * The class Auth header filter. * * @author paascloud.net @gmail.com */ @Slf4j @Component public class AuthHeaderFilter extends ZuulFilter { private static final String BEARER_TOKEN_TYPE = "bearer "; private static final String OPTIONS = "OPTIONS"; private static final String AUTH_PATH = "/auth"; private static final String LOGOUT_URI = "/oauth/token"; private static final String ALIPAY_CALL_URI = "/pay/alipayCallback"; /** * Filter type string. * * @return the string */ @Override public String filterType() { return "pre"; } /** * Filter order int. * * @return the int */ @Override public int filterOrder() { return 0; } /** * Should filter boolean. * * @return the boolean */ @Override public boolean shouldFilter() { return true; } /** * Run object. * * @return the object */ @Override public Object run() { log.info("AuthHeaderFilter - 开始鉴权..."); RequestContext requestContext = RequestContext.getCurrentContext(); try { doSomething(requestContext); } catch (Exception e) { log.error("AuthHeaderFilter - [FAIL] EXCEPTION={}", e.getMessage(), e); throw new BusinessException(ErrorCodeEnum.UAC10011041); } return null; } private void doSomething(RequestContext requestContext) throws ZuulException { HttpServletRequest request = requestContext.getRequest(); String requestURI = request.getRequestURI(); if (OPTIONS.equalsIgnoreCase(request.getMethod()) || !requestURI.contains(AUTH_PATH) || !requestURI.contains(LOGOUT_URI) || !requestURI.contains(ALIPAY_CALL_URI)) { return; } String authHeader = RequestUtil.getAuthHeader(request); if (PublicUtil.isEmpty(authHeader)) { throw new ZuulException("刷新页面重试", 403, "check token fail"); } if (authHeader.startsWith(BEARER_TOKEN_TYPE)) { requestContext.addZuulRequestHeader(HttpHeaders.AUTHORIZATION, authHeader); log.info("authHeader={} ", authHeader); // 传递给后续微服务 requestContext.addZuulRequestHeader(CoreHeaderInterceptor.HEADER_LABEL, authHeader); } } } ================================================ FILE: paascloud-gateway/src/main/java/com/paascloud/gateway/filter/RenewFilter.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RenewFilter.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.gateway.filter; import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.provider.token.store.JwtTokenStore; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * The class Renew filter. * * @author paascloud.net @gmail.com */ @Component @Slf4j public class RenewFilter extends ZuulFilter { @Resource private JwtTokenStore jwtTokenStore; private static final int EXPIRES_IN = 60 * 20; /** * Filter type string. * * @return the string */ @Override public String filterType() { return "post"; } /** * Filter order int. * * @return the int */ @Override public int filterOrder() { return 10; } /** * Should filter boolean. * * @return the boolean */ @Override public boolean shouldFilter() { return true; } /** * Run object. * * @return the object */ @Override public Object run() { log.info("RenewFilter - token续租..."); RequestContext requestContext = RequestContext.getCurrentContext(); try { doSomething(requestContext); } catch (Exception e) { log.error("RenewFilter - token续租. [FAIL] EXCEPTION={}", e.getMessage(), e); throw new BusinessException(ErrorCodeEnum.UAC10011041); } return null; } private void doSomething(RequestContext requestContext) { HttpServletRequest request = requestContext.getRequest(); String token = StringUtils.substringAfter(request.getHeader(HttpHeaders.AUTHORIZATION), "bearer "); if (StringUtils.isEmpty(token)) { return; } OAuth2AccessToken oAuth2AccessToken = jwtTokenStore.readAccessToken(token); int expiresIn = oAuth2AccessToken.getExpiresIn(); if (expiresIn < EXPIRES_IN) { HttpServletResponse servletResponse = requestContext.getResponse(); servletResponse.addHeader("Renew-Header", "true"); } } } ================================================ FILE: paascloud-gateway/src/main/resources/application.yml ================================================ server: port: 7979 spring: profiles: active: dev application: name: @pom.artifactId@ swagger: title: @pom.artifactId@ description: @pom.description@ ================================================ FILE: paascloud-gateway/src/main/resources/banner.txt ================================================ ${AnsiColor.BRIGHT_CYAN} .__ .___ __ ___________ _____ ______ ____ | | ____ __ __ __| _/ ____ _____/ |_ \____ \__ \ \__ \ / ___// ___\| | / _ \| | \/ __ | / \_/ __ \ __\ | |_> > __ \_/ __ \_\___ \\ \___| |_( <_> ) | / /_/ | | | \ ___/| | | __(____ (____ /____ >\___ >____/\____/|____/\____ | /\ |___| /\___ >__| |__| \/ \/ \/ \/ Powered by liuzhaoming\/ \/ \/ \/ ================================================ FILE: paascloud-gateway/src/main/resources/bootstrap.yml ================================================ spring: cloud: config: fail-fast: true discovery: service-id: paascloud-discovery enabled: true label: ${spring.profiles.active} profile: ${spring.profiles.active} username: admin password: admin eureka: client: serviceUrl: defaultZone: http://root:root@paascloud-eureka:8761/eureka/ instance: instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port} ================================================ FILE: paascloud-gateway/src/main/resources/logback-spring.xml ================================================ DEBUG ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE} ${LOG_FILE}.%d{yyyy-MM-dd}.gz 7 ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE}.json ${LOG_FILE}.json.%d{yyyy-MM-dd}.gz 7 UTC { "severity": "%level", "service": "${springAppName:-}", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "parent": "%X{X-B3-ParentSpanId:-}", "exportable": "%X{X-Span-Export:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" } ================================================ FILE: paascloud-generator/.gitignore ================================================ paas-cloud-eureka/target/ !.mvn/wrapper/maven-wrapper.jar ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr ### NetBeans ### nbproject/private/ build/ nbbuild/ dist/ nbdist/ .nb-gradle/ ================================================ FILE: paascloud-generator/README.md ================================================ #SSM集成的基础项目, 项目使用Maven管理 #MyBatis3.3.0 #Spring[MVC]4.1.2.RELEASE 项目使用Spring4.1.2.RELEASE + SpringMVC4.1.2.RELEASE + Mybatis3.3.0 项目集成了Mybatis分页插件和通用Mapper插件 项目使用的mysql数据库, 根据需要可以切换为其他数据库 ##Spring Boot集成MyBatis的基础项目 ###https://github.com/abel533/MyBatis-Spring-Boot ##MyBatis工具 ###http://www.mybatis.tk ##推荐使用Mybatis通用Mapper3 ###https://github.com/abel533/Mapper ##推荐使用Mybatis分页插件PageHelper ###https://github.com/pagehelper/Mybatis-PageHelper ##作者信息 - 作者博客:http://blog.csdn.net/isea533 - 作者邮箱:abel533@gmail.com - Mybatis工具群: 211286137 (Mybatis相关工具插件等等) mybatis-generator:generate ================================================ FILE: paascloud-generator/paascloud-generator-mdc/pom.xml ================================================ com.liuzm.paascloud paascloud-generator 1.0 4.0.0 paascloud-generator-mdc jar paascloud-generator-mdc http://maven.apache.org UTF-8 4.1.6.RELEASE ${basedir}/src/main/java com.paascloud.provider.mapper com.paascloud.provider.model.domain ${basedir}/src/main/resources mapper ================================================ FILE: paascloud-generator/paascloud-generator-mdc/src/main/java/com/paascloud/provider/main/PaginationPlugin.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaginationPlugin.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.main; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.ShellRunner; import java.util.List; /** * The class Pagination plugin. * * @author paascloud.net@gmail.com */ public class PaginationPlugin extends PluginAdapter { /** * Validate boolean. * * @param warnings the warnings * * @return the boolean */ @Override public boolean validate(List warnings) { return true; } private static void generate() { String config = PaginationPlugin.class.getClassLoader().getResource("generator/generatorConfig-B.xml").getFile(); String[] arg = {"-configfile", config, "-overwrite"}; ShellRunner.main(arg); } /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { generate(); } } ================================================ FILE: paascloud-generator/paascloud-generator-mdc/src/main/resources/config.properties ================================================ # \u6570\u636E\u5E93\u914D\u7F6E jdbc.driverClass = com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_mdc?useUnicode=true&characterEncoding=UTF-8 jdbc.user=root jdbc.password=123456 #c3p0 jdbc.maxPoolSize=50 jdbc.minPoolSize=10 jdbc.maxStatements=100 jdbc.testConnection=true # \u901A\u7528Mapper\u914D\u7F6E mapper.plugin = tk.mybatis.mapper.generator.MapperPlugin mapper.Mapper = tk.mybatis.mapper.common.Mapper ================================================ FILE: paascloud-generator/paascloud-generator-mdc/src/main/resources/generator/generatorConfig-A.xml ================================================
================================================ FILE: paascloud-generator/paascloud-generator-mdc/src/main/resources/generator/generatorConfig-B.xml ================================================
================================================ FILE: paascloud-generator/paascloud-generator-omc/pom.xml ================================================ com.liuzm.paascloud paascloud-generator 1.0 4.0.0 paascloud-generator-omc jar paascloud-generator-omc http://maven.apache.org UTF-8 4.1.6.RELEASE ${basedir}/src/main/java com.paascloud.provider.mapper com.paascloud.provider.model.domain ${basedir}/src/main/resources mapper ================================================ FILE: paascloud-generator/paascloud-generator-omc/src/main/java/com/paascloud/provider/main/PaginationPlugin.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaginationPlugin.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.main; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.ShellRunner; import java.util.List; /** * The class Pagination plugin. * * @author paascloud.net@gmail.com */ public class PaginationPlugin extends PluginAdapter { /** * Validate boolean. * * @param warnings the warnings * * @return the boolean */ @Override public boolean validate(List warnings) { return true; } private static void generate() { System.out.println("开始生成表结构..."); String config = PaginationPlugin.class.getClassLoader().getResource("generator/generatorConfig-B.xml").getFile(); String[] arg = {"-configfile", config, "-overwrite"}; ShellRunner.main(arg); System.out.println("生成表结构成功..."); } /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { generate(); } } ================================================ FILE: paascloud-generator/paascloud-generator-omc/src/main/resources/config.properties ================================================ # \u6570\u636E\u5E93\u914D\u7F6E jdbc.driverClass = com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_omc?useUnicode=true&characterEncoding=UTF-8 jdbc.user=root jdbc.password=123456 #c3p0 jdbc.maxPoolSize=50 jdbc.minPoolSize=10 jdbc.maxStatements=100 jdbc.testConnection=true # \u901A\u7528Mapper\u914D\u7F6E mapper.plugin = tk.mybatis.mapper.generator.MapperPlugin mapper.Mapper = tk.mybatis.mapper.common.Mapper ================================================ FILE: paascloud-generator/paascloud-generator-omc/src/main/resources/generator/generatorConfig-A.xml ================================================
================================================ FILE: paascloud-generator/paascloud-generator-omc/src/main/resources/generator/generatorConfig-B.xml ================================================
================================================ FILE: paascloud-generator/paascloud-generator-opc/pom.xml ================================================ com.liuzm.paascloud paascloud-generator 1.0 4.0.0 paascloud-generator-opc jar paascloud-generator-opc http://maven.apache.org UTF-8 4.1.6.RELEASE ${basedir}/src/main/java com.paascloud.provider.mapper com.paascloud.provider.model.domain ${basedir}/src/main/resources mapper ================================================ FILE: paascloud-generator/paascloud-generator-opc/src/main/java/com/paascloud/provider/main/PaginationPlugin.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaginationPlugin.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.main; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.ShellRunner; import java.util.List; /** * The class Pagination plugin. * * @author paascloud.net@gmail.com */ public class PaginationPlugin extends PluginAdapter { /** * Validate boolean. * * @param warnings the warnings * * @return the boolean */ @Override public boolean validate(List warnings) { return true; } private static void generate() { String config = PaginationPlugin.class.getClassLoader().getResource("generator/generatorConfig-B.xml").getFile(); String[] arg = {"-configfile", config, "-overwrite"}; ShellRunner.main(arg); } /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { generate(); } } ================================================ FILE: paascloud-generator/paascloud-generator-opc/src/main/resources/config.properties ================================================ # \u6570\u636E\u5E93\u914D\u7F6E jdbc.driverClass = com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_opc?useUnicode=true&characterEncoding=UTF-8 jdbc.user=root jdbc.password=123456 #c3p0 jdbc.maxPoolSize=50 jdbc.minPoolSize=10 jdbc.maxStatements=100 jdbc.testConnection=true # \u901A\u7528Mapper\u914D\u7F6E mapper.plugin = tk.mybatis.mapper.generator.MapperPlugin mapper.Mapper = tk.mybatis.mapper.common.Mapper ================================================ FILE: paascloud-generator/paascloud-generator-opc/src/main/resources/generator/generatorConfig-A.xml ================================================
================================================ FILE: paascloud-generator/paascloud-generator-opc/src/main/resources/generator/generatorConfig-B.xml ================================================
================================================ FILE: paascloud-generator/paascloud-generator-tpc/pom.xml ================================================ com.liuzm.paascloud paascloud-generator 1.0 4.0.0 paascloud-generator-tpc jar paascloud-generator-tpc http://maven.apache.org UTF-8 4.1.6.RELEASE ${basedir}/src/main/java com.paascloud.provider.mapper com.paascloud.provider.model.domain ${basedir}/src/main/resources mapper ================================================ FILE: paascloud-generator/paascloud-generator-tpc/src/main/java/com/paascloud/provider/main/PaginationPlugin.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaginationPlugin.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.main; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.ShellRunner; import java.util.List; /** * The class Pagination plugin. * * @author paascloud.net@gmail.com */ public class PaginationPlugin extends PluginAdapter { /** * Validate boolean. * * @param warnings the warnings * * @return the boolean */ @Override public boolean validate(List warnings) { return true; } private static void generate() { String config = PaginationPlugin.class.getClassLoader().getResource("generator/generatorConfig-B.xml").getFile(); String[] arg = {"-configfile", config, "-overwrite"}; ShellRunner.main(arg); } /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { generate(); } } ================================================ FILE: paascloud-generator/paascloud-generator-tpc/src/main/resources/config.properties ================================================ # \u6570\u636E\u5E93\u914D\u7F6E jdbc.driverClass = com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_tpc?useUnicode=true&characterEncoding=UTF-8 jdbc.user=root jdbc.password=123456 #c3p0 jdbc.maxPoolSize=50 jdbc.minPoolSize=10 jdbc.maxStatements=100 jdbc.testConnection=true # \u901A\u7528Mapper\u914D\u7F6E mapper.plugin = tk.mybatis.mapper.generator.MapperPlugin mapper.Mapper = tk.mybatis.mapper.common.Mapper ================================================ FILE: paascloud-generator/paascloud-generator-tpc/src/main/resources/generator/generatorConfig-A.xml ================================================
================================================ FILE: paascloud-generator/paascloud-generator-tpc/src/main/resources/generator/generatorConfig-B.xml ================================================
================================================ FILE: paascloud-generator/paascloud-generator-uac/pom.xml ================================================ com.liuzm.paascloud paascloud-generator 1.0 4.0.0 paascloud-generator-uac jar paascloud-generator-uac http://maven.apache.org UTF-8 4.1.6.RELEASE ${basedir}/src/main/java com.paascloud.provider.mapper com.paascloud.provider.model.domain ${basedir}/src/main/resources mapper ================================================ FILE: paascloud-generator/paascloud-generator-uac/src/main/java/com/paascloud/provider/main/PaginationPlugin.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaginationPlugin.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.main; import org.mybatis.generator.api.PluginAdapter; import org.mybatis.generator.api.ShellRunner; import java.util.List; /** * The class Pagination plugin. * * @author paascloud.net@gmail.com */ public class PaginationPlugin extends PluginAdapter { /** * Validate boolean. * * @param warnings the warnings * * @return the boolean */ @Override public boolean validate(List warnings) { return true; } private static void generate() { String config = PaginationPlugin.class.getClassLoader().getResource("generator/generatorConfig-B.xml").getFile(); String[] arg = {"-configfile", config, "-overwrite"}; ShellRunner.main(arg); } /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { generate(); } } ================================================ FILE: paascloud-generator/paascloud-generator-uac/src/main/resources/config.properties ================================================ # \u6570\u636E\u5E93\u914D\u7F6E jdbc.driverClass = com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_uac?useUnicode=true&characterEncoding=UTF-8 jdbc.user=root jdbc.password=123456 #c3p0 jdbc.maxPoolSize=50 jdbc.minPoolSize=10 jdbc.maxStatements=100 jdbc.testConnection=true # \u901A\u7528Mapper\u914D\u7F6E mapper.plugin = tk.mybatis.mapper.generator.MapperPlugin mapper.Mapper = tk.mybatis.mapper.common.Mapper ================================================ FILE: paascloud-generator/paascloud-generator-uac/src/main/resources/generator/generatorConfig-A.xml ================================================
================================================ FILE: paascloud-generator/paascloud-generator-uac/src/main/resources/generator/generatorConfig-B.xml ================================================
================================================ FILE: paascloud-generator/pom.xml ================================================ com.liuzm.paascloud paascloud-master 1.0 4.0.0 paascloud-generator 1.0 paascloud-generator-uac paascloud-generator-mdc paascloud-generator-omc paascloud-generator-opc paascloud-generator-tpc pom paascloud-generator http://maven.apache.org UTF-8 4.1.6.RELEASE ${basedir}/src/main/java com.paascloud.uac.mapper com.paascloud.uac.domain ${basedir}/src/main/resources mapper commons-fileupload commons-fileupload 1.3.1 mysql mysql-connector-java 5.1.39 commons-dbcp commons-dbcp 1.4 org.mybatis mybatis 3.2.8 org.mybatis mybatis-spring 1.2.2 com.alibaba druid 1.0.18 com.github.pagehelper pagehelper 4.1.6 tk.mybatis mapper 3.3.9 com.liuzm.mybatis mybatis-generator 1.0 org.mybatis.generator mybatis-generator-maven-plugin 1.3.2 ${basedir}/src/main/resources/generator/generatorConfig-A.xml true true mysql mysql-connector-java 5.1.39 tk.mybatis mapper 3.3.9 ================================================ FILE: paascloud-monitor/pom.xml ================================================ 4.0.0 com.liuzm.paascloud.monitor paascloud-monitor jar 1.0 paascloud-monitor Demo project for Spring Boot com.liuzm.paascloud paascloud-master 1.0 UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-starter-config org.springframework.cloud spring-cloud-starter-hystrix org.springframework.cloud spring-cloud-starter-hystrix-dashboard de.codecentric spring-boot-admin-server de.codecentric spring-boot-admin-server-ui org.springframework.boot spring-boot-starter-mail org.springframework.boot spring-boot-starter-actuator de.codecentric spring-boot-admin-server-ui-hystrix de.codecentric spring-boot-admin-server-ui-turbine org.jolokia jolokia-core com.hazelcast hazelcast org.springframework.boot spring-boot-starter-security de.codecentric spring-boot-admin-server-ui-login de.codecentric spring-boot-admin-starter-client org.springframework.cloud spring-cloud-netflix-turbine ${project.artifactId} org.springframework.boot spring-boot-maven-plugin repackage build-info com.spotify docker-maven-plugin 0.4.13 ${project.artifactId}:${project.version} java ["java", "-jar", "/${project.build.finalName}.jar"] / ${project.build.directory} ${project.build.finalName}.jar dev dev true pro pro ================================================ FILE: paascloud-monitor/src/main/java/com/paascloud/discovery/PaasCloudMonitorApplication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaginationPlugin.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.discovery; import com.hazelcast.config.Config; import com.hazelcast.config.EvictionPolicy; import com.hazelcast.config.ListConfig; import com.hazelcast.config.MapConfig; import de.codecentric.boot.admin.config.EnableAdminServer; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard; import org.springframework.cloud.netflix.turbine.EnableTurbine; import org.springframework.context.annotation.Bean; /** * The class Paas cloud monitor application. * * @author paascloud.net@gmail.com */ @SpringBootApplication @EnableDiscoveryClient @EnableTurbine @EnableHystrixDashboard @EnableCircuitBreaker @EnableAdminServer public class PaasCloudMonitorApplication { /** * Hazelcast config config. * * @return the config */ @Bean public Config hazelcastConfig() { return new Config().setProperty("hazelcast.jmx", "true") .addMapConfig(new MapConfig("spring-boot-admin-application-store").setBackupCount(1) .setEvictionPolicy(EvictionPolicy.NONE)) .addListConfig(new ListConfig("spring-boot-admin-event-store").setBackupCount(1) .setMaxSize(1000)); } /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { SpringApplication.run(PaasCloudMonitorApplication.class, args); } } ================================================ FILE: paascloud-monitor/src/main/java/com/paascloud/discovery/SecurityConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaginationPlugin.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.discovery; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; /** * The class Security config. * * @author paascloud.net @gmail.com */ @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { /** * Configure. * * @param http the http * * @throws Exception the exception */ @Override protected void configure(HttpSecurity http) throws Exception { http.headers().frameOptions().disable() .and() .formLogin() .loginPage("/login.html") .loginProcessingUrl("/login") .and() .logout().logoutUrl("/logout") .and() .csrf().disable() .authorizeRequests() .antMatchers("/api/**", "/applications/**", "/api/applications/**", "/login.html", "/**/*.css", "/img/**", "/third-party/**") .permitAll() .anyRequest().authenticated(); } } ================================================ FILE: paascloud-monitor/src/main/resources/application.yml ================================================ server: port: 8010 spring: profiles: active: dev application: name: @pom.artifactId@ ================================================ FILE: paascloud-monitor/src/main/resources/banner.txt ================================================ ${AnsiColor.BRIGHT_CYAN} .__ .___ __ ___________ _____ ______ ____ | | ____ __ __ __| _/ ____ _____/ |_ \____ \__ \ \__ \ / ___// ___\| | / _ \| | \/ __ | / \_/ __ \ __\ | |_> > __ \_/ __ \_\___ \\ \___| |_( <_> ) | / /_/ | | | \ ___/| | | __(____ (____ /____ >\___ >____/\____/|____/\____ | /\ |___| /\___ >__| |__| \/ \/ \/ \/ Powered by liuzhaoming\/ \/ \/ \/ ================================================ FILE: paascloud-monitor/src/main/resources/bootstrap.yml ================================================ spring: cloud: config: fail-fast: true discovery: service-id: paascloud-discovery enabled: true label: ${spring.profiles.active} profile: ${spring.profiles.active} username: admin password: admin eureka: client: serviceUrl: defaultZone: http://root:root@paascloud-eureka:8761/eureka/ instance: instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port} #management: # context-path: / ================================================ FILE: paascloud-monitor/src/main/resources/logback-spring.xml ================================================ ${LOG_PATH}${LOG_FILE} %date [%level] [%thread] %logger{60} [%file : %line] %msg%n ${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz 30 ================================================ FILE: paascloud-provider/paascloud-provider-mdc/pom.xml ================================================ 4.0.0 com.liuzm.paascloud.provider paascloud-provider 1.0 paascloud-provider-mdc jar paascloud-provider-mdc 数据中心 - Master data center UTF-8 UTF-8 1.8 org.apache.rocketmq rocketmq-client 4.1.0-incubating com.liuzm.paascloud.provider.api paascloud-provider-mdc-api mysql mysql-connector-java runtime joda-time joda-time org.mybatis.spring.boot mybatis-spring-boot-starter tk.mybatis mapper-spring-boot-starter com.github.pagehelper pagehelper-spring-boot-starter org.springframework.boot spring-boot-starter-jdbc com.alibaba druid-spring-boot-starter de.codecentric spring-boot-admin-starter-client com.liuzm.paascloud.provider.api paascloud-provider-sdk-api com.liuzm.paascloud.provider.api paascloud-provider-opc-api ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/PaasCloudMdcApplication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudMdcApplication.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import liquibase.integration.spring.SpringLiquibase; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.context.annotation.Bean; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; /** * The class Paas cloud mdc application. * * @author paascloud.net@gmail.com */ @EnableCaching @EnableHystrix @EnableFeignClients @EnableDiscoveryClient @SpringBootApplication @EnableTransactionManagement public class PaasCloudMdcApplication { /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { SpringApplication.run(PaasCloudMdcApplication.class, args); } @Bean public SpringLiquibase springLiquibase(DataSource dataSource) { SpringLiquibase springLiquibase = new SpringLiquibase(); springLiquibase.setDataSource(dataSource); springLiquibase.setChangeLog("classpath:/liquibase/index.xml"); return springLiquibase; } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/config/MdcWebMvcConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcWebMvcConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.paascloud.core.config.PcObjectMapper; import com.paascloud.core.config.SwaggerConfiguration; import com.paascloud.core.interceptor.TokenInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import javax.annotation.Resource; import java.util.List; /** * The class Mdc web mvc config. * * @author paascloud.net @gmail.com */ @Configuration @EnableWebMvc @Import(SwaggerConfiguration.class) public class MdcWebMvcConfig extends WebMvcConfigurerAdapter { @Resource private TokenInterceptor vueViewInterceptor; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/"); } /** * Add interceptors. * * @param registry the registry */ @Override public void addInterceptors(InterceptorRegistry registry) { super.addInterceptors(registry); registry.addInterceptor(vueViewInterceptor) .addPathPatterns("/**") .excludePathPatterns("/swagger-resources/**", "*.js", "/**/*.js", "*.css", "/**/*.css", "*.html", "/**/*.html"); } @Override public void configureMessageConverters(List> converters) { PcObjectMapper.buidMvcMessageConverter(converters); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/config/ResourceServerConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ResourceServerConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import javax.servlet.http.HttpServletResponse; /** * The class Resource server config. * * @author paascloud.net @gmail.com */ @Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http .headers().frameOptions().disable() .and() .csrf().disable() .exceptionHandling() .authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED)) .and() .authorizeRequests().antMatchers("/druid/**", "/pay/alipayCallback", "/swagger-ui.html", "/swagger-resources/**", "/v2/api-docs", "/api/applications").permitAll() .anyRequest().authenticated(); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/manager/MdcProductManager.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductManager.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.manager; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.annotation.MqProducerStore; import com.paascloud.provider.exceptions.MdcBizException; import com.paascloud.provider.mapper.MdcProductMapper; import com.paascloud.provider.model.domain.MdcProduct; import com.paascloud.provider.model.domain.MqMessageData; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; /** * The class User manager. * * @author paascloud.net @gmail.com */ @Slf4j @Component @Transactional(rollbackFor = Exception.class) public class MdcProductManager { @Resource private MdcProductMapper mdcProductMapper; /** * Save product. * * @param mqMessageData the mq message data * @param product the product * @param addFlag the add flag */ @MqProducerStore public void saveProduct(final MqMessageData mqMessageData, final MdcProduct product, boolean addFlag) { log.info("保存商品信息. mqMessageData={}, product={}", mqMessageData, product); if (addFlag) { mdcProductMapper.insertSelective(product); } else { int result = mdcProductMapper.updateByPrimaryKeySelective(product); if (result < 1) { throw new MdcBizException(ErrorCodeEnum.MDC10021022, product.getId()); } } } /** * Delete product. * * @param mqMessageData the mq message data * @param productId the product id */ @MqProducerStore public void deleteProduct(final MqMessageData mqMessageData, final Long productId) { log.info("删除商品信息. mqMessageData={}, productId={}", mqMessageData, productId); int result = mdcProductMapper.deleteByPrimaryKey(productId); if (result < 1) { throw new MdcBizException(ErrorCodeEnum.MDC10021023, productId); } } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/mapper/MdcAddressMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcAddressMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.MdcAddress; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Mdc address mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface MdcAddressMapper extends MyMapper { /** * Select mdc address list. * * @param address the address * * @return the list */ List selectMdcAddress(MdcAddress address); /** * Select address by pid list. * * @param pid the pid * * @return the list */ List selectAddressByPid(Long pid); } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/mapper/MdcDictMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcDictMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.MdcDict; import com.paascloud.provider.model.vo.MdcDictVo; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Mdc dict mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface MdcDictMapper extends MyMapper { /** * List dict vo list. * * @return the list */ List listDictVo(); } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/mapper/MdcExceptionLogMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcExceptionLogMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.MdcExceptionLog; import com.paascloud.provider.model.dto.MdcExceptionQueryDto; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Mdc exception log mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface MdcExceptionLogMapper extends MyMapper { /** * Query exception list with page list. * * @param mdcExceptionQueryDto the mdc exception query dto * * @return the list */ List queryExceptionListWithPage(MdcExceptionQueryDto mdcExceptionQueryDto); } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/mapper/MdcProductCategoryMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategoryMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.MdcProductCategory; import com.paascloud.provider.model.dto.ProductCategoryDto; import com.paascloud.provider.model.vo.MdcCategoryVo; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Mdc product category mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface MdcProductCategoryMapper extends MyMapper { /** * Select category dto list list. * * @param categoryPid the category pid * * @return the list */ List selectCategoryDtoList(Long categoryPid); /** * List category vo list. * * @return the list */ List listCategoryVo(); } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/mapper/MdcProductMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.MdcProduct; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.vo.ProductVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Mdc product mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface MdcProductMapper extends MyMapper { /** * Select by name and category ids list. * * @param productName the product name * @param categoryIdList the category id list * @param orderBy the order by * * @return the list */ List selectByNameAndCategoryIds(@Param("productName") String productName, @Param("categoryIdList") List categoryIdList, @Param("orderBy") String orderBy); /** * Update product stock by id int. * * @param productDto the product dto * * @return the int */ int updateProductStockById(ProductDto productDto); /** * Query product list with page list. * * @param mdcProduct the mdc product * * @return the list */ List queryProductListWithPage(MdcProduct mdcProduct); } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/constant/MallConstant.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MallConstant.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.constant; /** * The class Mall constant. * * @author paascloud.net@gmail.com */ public class MallConstant { /** * The enum Product status enum. * * @author paascloud.net@gmail.com */ public enum ProductStatusEnum { /** * On sale product status enum. */ ON_SALE(1, "在线"); private String value; private int code; ProductStatusEnum(int code, String value) { this.code = code; this.value = value; } /** * Gets value. * * @return the value */ public String getValue() { return value; } /** * Gets code. * * @return the code */ public int getCode() { return code; } } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/domain/MdcAddress.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcAddress.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import javax.persistence.*; /** * The class Mdc address. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_mdc_address") public class MdcAddress extends BaseEntity { private static final long serialVersionUID = -499010884211394846L; /** * 地址名称 */ private String name; /** * 父ID */ private Long pid; /** * 城市编码 */ @Column(name = "city_code") private String cityCode; /** * 级别(省市区县) */ private Integer level; /** * 区域编码 */ @Column(name = "ad_code") private String adCode; /** * 行政区边界坐标点 */ private String polyline; /** * 城市中心点 */ private String center; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/domain/MdcDict.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcDict.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; /** * 数据字典. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_mdc_dict") @Alias(value = "mdcDict") public class MdcDict extends BaseEntity { private static final long serialVersionUID = -4257346287088805156L; /** * 字典类型 -0 常量 - 1 文件夹 */ private Integer type; /** * 枚举编码 */ @Column(name = "dict_key") private String dictKey; /** * 枚举扩展字段 */ @Column(name = "extend_key") private String extendKey; /** * 枚举值 */ @Column(name = "dict_value") private String dictValue; /** * 字典编码 */ @Column(name = "dict_code") private String dictCode; /** * 字典名称 */ @Column(name = "dict_name") private String dictName; /** * 父ID */ private Long pid; /** * 序号 */ private Integer number; /** * 状态 */ private Integer status; /** * 备注 */ private String remark; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/domain/MdcExceptionLog.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcExceptionLog.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.ibatis.type.Alias; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.*; import java.util.Date; /** * The class Mdc exception log. * * @author paascloud.net @gmail.com */ @Alias("mdcExceptionLog") @Table(name = "pc_mdc_exception_log") @Data @NoArgsConstructor public class MdcExceptionLog { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 系统应用名 */ @Column(name = "application_name") private String applicationName; /** * 异常类型 */ @Column(name = "exception_simple_name") private String exceptionSimpleName; /** * 异常信息(通过exception.getMessage()获取到的内容) */ @Column(name = "exception_message") private String exceptionMessage; /** * 异常原因(通过exception.getCause()获取到的内容) */ @Column(name = "exception_cause") private String exceptionCause; /** * 异常堆栈信息 */ @Column(name = "exception_stack") private String exceptionStack; /** * 操作者姓名 */ private String creator; /** * 操作者id */ @Column(name = "creator_id") private String creatorId; /** * 创建时间 */ @Column(name = "create_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/domain/MdcProduct.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProduct.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; import java.math.BigDecimal; /** * The class Mdc product. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_mdc_product") @Alias(value = "mdcProduct") public class MdcProduct extends BaseEntity { private static final long serialVersionUID = 2051481072581512778L; /** * 商品名称 */ private String name; /** * 商品编码 */ @Column(name = "product_code") private String productCode; @Column(name = "category_id") private Long categoryId; /** * 商品副标题 */ private String subtitle; /** * 产品主图,url相对地址 */ @Column(name = "main_image") private String mainImage; /** * 价格,单位-元保留两位小数 */ private BigDecimal price; /** * 库存数量 */ private Integer stock; /** * 商品状态.1-在售 2-下架 3-删除 */ private Integer status; /** * 图片地址,json格式,扩展用 */ @Column(name = "sub_images") private String subImages; /** * 商品详情 */ private String detail; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/domain/MdcProductCategory.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategory.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import com.paascloud.provider.model.enums.MdcCategoryStatusEnum; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; /** * The class Mdc product category. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_mdc_product_category") @Alias(value = "mdcProductCategory") public class MdcProductCategory extends BaseEntity { private static final long serialVersionUID = 6966836239624795099L; /** * 分类编码 */ @Column(name = "category_code") private String categoryCode; /** * 首图的流水号 */ @Column(name = "img_id") private Long imgId; /** * 父类别id当id=0时说明是根节点,一级类别 */ private Long pid; /** * 类别名称 */ private String name; /** * 类别状态1-启用,2-禁用 * {@link MdcCategoryStatusEnum} */ private Integer status; /** * 排序编号,同类展示顺序,数值相等则自然排序 */ @Column(name = "sort_order") private Integer sortOrder; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcCategoryCheckNameDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcCategoryCheckNameDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import java.io.Serializable; /** * The class Mdc category check name dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel public class MdcCategoryCheckNameDto implements Serializable { private static final long serialVersionUID = 8687848883145768024L; /** * 菜单的id */ @ApiModelProperty(value = "分类id") private Long categoryId; /** * 菜单的url */ @ApiModelProperty(value = "分类名称") @NotBlank(message = "分类名称不能为空") private String categoryName; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcDictCheckCodeDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcDictCheckCodeDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import java.io.Serializable; /** * The class Uac menu check code dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class MdcDictCheckCodeDto implements Serializable { private static final long serialVersionUID = 8687848883145768024L; /** * 菜单的id */ @ApiModelProperty(value = "数据字典id") private Long dictId; /** * 菜单的url */ @ApiModelProperty(value = "数据字典编码") @NotBlank(message = "数据字典编码不能为空") private String dictCode; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcDictCheckNameDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcDictCheckNameDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import java.io.Serializable; /** * The class Uac menu check code dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class MdcDictCheckNameDto implements Serializable { private static final long serialVersionUID = 8687848883145768024L; /** * 菜单的id */ @ApiModelProperty(value = "数据字典id") private Long dictId; /** * 菜单的url */ @ApiModelProperty(value = "数据字典名称") @NotBlank(message = "数据字典名称不能为空") private String dictName; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcEditCategoryDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcEditCategoryDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import lombok.Data; import java.io.Serializable; /** * The class Mdc edit category dto. * * @author paascloud.net @gmail.com */ @Data public class MdcEditCategoryDto implements Serializable { private static final long serialVersionUID = 8578699727403591194L; /** * 首图的流水号 */ private Long imgId; /** * ID */ private Long id; /** * 父类别id当id=0时说明是根节点,一级类别 */ private Long pid; /** * 类别名称 */ private String name; /** * 类别状态1-正常,2-已废弃 */ private Integer status; /** * 排序编号,同类展示顺序,数值相等则自然排序 */ private Integer sortOrder; /** * 分类编码 */ private String categoryCode; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcEditDictDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcEditDictDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import io.swagger.annotations.ApiModel; import lombok.Data; import java.io.Serializable; /** * The class Mdc edit dict dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel public class MdcEditDictDto implements Serializable { private static final long serialVersionUID = 3530155770606863044L; /** * 字典类型 -0 常量 - 1 文件夹 */ private Integer type; /** * 枚举编码 */ private String dictKey; /** * 枚举扩展字段 */ private String extendKey; /** * 枚举值 */ private String dictValue; /** * 字典编码 */ private String dictCode; /** * 字典名称 */ private String dictName; /** * ID */ private Long id; /** * 父ID */ private Long pid; /** * 序号 */ private Integer number; /** * 状态 */ private Integer status; /** * 备注 */ private String remark; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcEditProductDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcEditProductDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; /** * The class Mdc edit category dto. * * @author paascloud.net @gmail.com */ @Data public class MdcEditProductDto implements Serializable { private static final long serialVersionUID = 8578699727403591194L; /** * 商品ID */ private Long id; /** * 商品名称 */ @NotBlank(message = "商品名称不能为空") private String name; /** * 商品编码 */ @NotBlank(message = "商品编码不能为空") private String productCode; /** * 品类Id集合 */ @NotBlank(message = "品类不能为空") private List categoryIdList; /** * 商品副标题 */ @NotBlank(message = "品类不能为空") private String subtitle; /** * 产品主图,url相对地址 */ private String mainImage; /** * 价格,单位-元保留两位小数 */ @NotBlank(message = "品类价格不能为空") private BigDecimal price; /** * 库存数量 */ @NotBlank(message = "品类库存不能为空") private Integer stock; /** * 商品状态.1-在售 2-下架 3-删除 */ @NotBlank(message = "品类状态不能为空") private Integer status; /** * 商品图片流水号集合 */ private List attachmentIdList; /** * 商品详情 */ private String detail; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/dto/MdcExceptionQueryDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcExceptionQueryDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.paascloud.base.dto.BaseQuery; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; /** * The class Mdc exception query dto. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @ApiModel public class MdcExceptionQueryDto extends BaseQuery { private static final long serialVersionUID = 3967075132487249652L; /** * 操作用户名称 */ @ApiModelProperty(value = "操作用户名称") private String creator; /** * 异常原因 */ @ApiModelProperty(value = "异常原因") private String exceptionCause; /** * 异常栈信息 */ @ApiModelProperty(value = "异常栈信息") private String exceptionStack; /** * 开始时间 */ @ApiModelProperty(value = "开始时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startQueryTime; /** * 结束时间 */ @ApiModelProperty(value = "结束时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endQueryTime; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/enums/AddressTypeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AddressTypeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * 地址类型枚举类 * * @author paascloud.net @gmail.com */ public enum AddressTypeEnum { /** * Province address type enum. */ PROVINCE("province"), /** * City address type enum. */ CITY("city"), /** * District address type enum. */ DISTRICT("district"), /** * Street address type enum. */ STREET("street"); private String type; AddressTypeEnum(String type) { this.type = type; } /** * Gets type. * * @return the type */ public String getType() { return type; } /** * Gets enum. * * @param type the type * * @return the enum */ public static AddressTypeEnum getEnum(String type) { for (AddressTypeEnum ele : AddressTypeEnum.values()) { if (ele.getType().equals(type)) { return ele; } } return null; } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/enums/MdcCategoryStatusEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcCategoryStatusEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Mdc category status enum. * * @author paascloud.net @gmail.com */ public enum MdcCategoryStatusEnum { /** * 启用 */ ENABLE(1, "启用"), /** * 禁用 */ DISABLE(2, "禁用"); /** * The Type. */ int type; /** * The Name. */ String name; MdcCategoryStatusEnum(int type, String name) { this.type = type; this.name = name; } /** * Gets type. * * @return the type */ public int getType() { return type; } /** * Gets name. * * @return the name */ public String getName() { return name; } /** * Gets name. * * @param type the type * * @return the name */ public static String getName(int type) { for (MdcCategoryStatusEnum ele : MdcCategoryStatusEnum.values()) { if (type == ele.getType()) { return ele.getName(); } } return null; } /** * Gets enum. * * @param type the type * * @return the enum */ public static MdcCategoryStatusEnum getEnum(int type) { for (MdcCategoryStatusEnum ele : MdcCategoryStatusEnum.values()) { if (type == ele.getType()) { return ele; } } return MdcCategoryStatusEnum.ENABLE; } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/enums/MdcDictStatusEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcDictStatusEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Uac menu status enum. * * @author paascloud.net @gmail.com */ public enum MdcDictStatusEnum { /** * 启用 */ ENABLE(10, "启用"), /** * 禁用 */ DISABLE(20, "禁用"); /** * The Type. */ int type; /** * The Name. */ String name; MdcDictStatusEnum(int type, String name) { this.type = type; this.name = name; } /** * Gets type. * * @return the type */ public int getType() { return type; } /** * Gets name. * * @return the name */ public String getName() { return name; } /** * Gets name. * * @param type the type * * @return the name */ public static String getName(int type) { for (MdcDictStatusEnum ele : MdcDictStatusEnum.values()) { if (type == ele.getType()) { return ele.getName(); } } return null; } /** * Gets enum. * * @param type the type * * @return the enum */ public static MdcDictStatusEnum getEnum(int type) { for (MdcDictStatusEnum ele : MdcDictStatusEnum.values()) { if (type == ele.getType()) { return ele; } } return MdcDictStatusEnum.ENABLE; } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/vo/MdcCategoryVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcCategoryVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseTree; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Mdc dict vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class MdcCategoryVo extends BaseTree { private static final long serialVersionUID = 5310269803239754048L; /** * 父分类名称 */ private String parentCategoryName; /** * 字典类型 -0 常量 - 1 文件夹 */ private Integer type; /** * 字典名称 */ private String name; /** * 序号 */ private Integer number; /** * 状态 */ private Integer status; /** * 排序编号,同类展示顺序,数值相等则自然排序 */ private Integer sortOrder; /** * 分类编码 */ private String categoryCode; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/vo/MdcDictVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcDictVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseTree; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Mdc dict vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class MdcDictVo extends BaseTree { private static final long serialVersionUID = -6759243808584390573L; /** * 父数据字典名称 */ private String parentDictName; /** * 字典类型 -0 常量 - 1 文件夹 */ private Integer type; /** * 枚举编码 */ private String dictKey; /** * 枚举扩展字段 */ private String extendKey; /** * 枚举值 */ private String dictValue; /** * 字典编码 */ private String dictCode; /** * 字典名称 */ private String dictName; /** * 序号 */ private Integer number; /** * 状态 */ private Integer status; /** * 备注 */ private String remark; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/model/vo/ProductVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ProductVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import com.paascloud.provider.model.dto.oss.ElementImgUrlDto; import lombok.Data; import lombok.EqualsAndHashCode; import javax.persistence.Column; import java.math.BigDecimal; import java.util.List; /** * The class Product vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class ProductVo extends BaseVo { private static final long serialVersionUID = 5719854343599455196L; /** * 商品名称 */ private String name; /** * 商品编码 */ private String productCode; /** * 商品副标题 */ private String subtitle; /** * 产品主图,url相对地址 */ @Column(name = "main_image") private String mainImage; /** * 价格,单位-元保留两位小数 */ private BigDecimal price; /** * 库存数量 */ private Integer stock; /** * 商品状态.1-在售 2-下架 3-删除 */ private Integer status; /** * 图片地址,json格式,扩展用 */ @Column(name = "sub_images") private String subImages; /** * 商品详情 */ private String detail; /** * 分类ID */ private List categoryIdList; /** * 图片集合 */ private List imgUrlList; } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/MdcAddressService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcAddressService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.TreeNode; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.MdcAddress; import java.util.List; /** * The interface Mdc address service. * * @author paascloud.net@gmail.com */ public interface MdcAddressService extends IService { /** * 根据PID查询地址信息 * * @param pid the pid * * @return the list */ List listByPid(Long pid); /** * Gets by id. * * @param id the id * * @return the by id */ MdcAddress getById(Long id); /** * Gets 4 city. * * @return the 4 city */ List get4City(); } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/MdcDictService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcDictService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UpdateStatusDto; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.MdcDict; import com.paascloud.provider.model.vo.MdcDictVo; import java.util.List; /** * The interface Mdc dict service. * * @author paascloud.net @gmail.com */ public interface MdcDictService extends IService { /** * 获取字典树. * * @return the dict tree list */ List getDictTreeList(); /** * 根据ID获取字典信息. * * @param dictId the dict id * * @return the mdc dict vo by id */ MdcDictVo getMdcDictVoById(Long dictId); /** * 根据id修改字典信息. * * @param updateStatusDto the update status dto * @param loginAuthDto the login auth dto * * @return the int */ void updateMdcDictStatusById(UpdateStatusDto updateStatusDto, LoginAuthDto loginAuthDto); /** * 编辑字典. * * @param mdcDict the mdc dict * @param loginAuthDto the login auth dto */ void saveMdcDict(MdcDict mdcDict, LoginAuthDto loginAuthDto); /** * Check dict has child dict boolean. * * @param dictId the dict id * * @return the boolean */ boolean checkDictHasChildDict(Long dictId); } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/MdcExceptionLogService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcExceptionLogService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.MdcExceptionLog; import com.paascloud.provider.model.dto.GlobalExceptionLogDto; import com.paascloud.provider.model.dto.MdcExceptionQueryDto; /** * The interface Mdc exception log service. * * @author paascloud.net @gmail.com */ public interface MdcExceptionLogService extends IService { /** * 保存日志并发送钉钉消息. * * @param exceptionLogDto the exception log dto */ void saveAndSendExceptionLog(GlobalExceptionLogDto exceptionLogDto); /** * Query exception list with page page info. * * @param mdcExceptionQueryDto the mdc exception query dto * * @return the page info */ PageInfo queryExceptionListWithPage(MdcExceptionQueryDto mdcExceptionQueryDto); } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/MdcProductCategoryService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategoryService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UpdateStatusDto; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.MdcProductCategory; import com.paascloud.provider.model.dto.ProductCategoryDto; import com.paascloud.provider.model.vo.MdcCategoryVo; import java.util.List; /** * The interface Mdc product category service. * * @author paascloud.net @gmail.com */ public interface MdcProductCategoryService extends IService { /** * Gets category dto list. * * @param categoryId the category id * * @return the category dto list */ List getCategoryDtoList(Long categoryId); /** * Gets product category list by pid. * * @param pid the pid * * @return the product category list by pid */ List getProductCategoryListByPid(Long pid); /** * 递归查询本节点的id及孩子节点的id. * * @param categoryId the category id * * @return the list */ List selectCategoryAndChildrenById(Long categoryId); /** * Gets by category id. * * @param categoryId the category id * * @return the by category id */ MdcProductCategory getByCategoryId(Long categoryId); /** * 获取商品分类树. * * @return the category tree list */ List getCategoryTreeList(); /** * 根据ID获取商品分类信息. * * @param id the id * * @return the mdc category vo by id */ MdcCategoryVo getMdcCategoryVoById(Long id); /** * 更新商品分类信息. * * @param updateStatusDto the update status dto * @param loginAuthDto the login auth dto */ void updateMdcCategoryStatusById(UpdateStatusDto updateStatusDto, LoginAuthDto loginAuthDto); /** * 保存商品分类信息. * * @param mdcCategory the mdc category * @param loginAuthDto the login auth dto */ void saveMdcCategory(MdcProductCategory mdcCategory, LoginAuthDto loginAuthDto); /** * Check category has child category boolean. * * @param id the id * * @return the boolean */ boolean checkCategoryHasChildCategory(Long id); } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/MdcProductService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.MdcProduct; import com.paascloud.provider.model.dto.MdcEditProductDto; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.vo.ProductDetailVo; import com.paascloud.provider.model.vo.ProductVo; import java.util.List; /** * The interface Mdc product service. * * @author paascloud.net @gmail.com */ public interface MdcProductService extends IService { /** * Select by name and category ids list. * * @param productName the product name * @param categoryIdList the category id list * @param orderBy the order by * * @return the list */ List selectByNameAndCategoryIds(String productName, List categoryIdList, String orderBy); /** * 根据商品ID查询商品详细信息. * * @param productId the product id * * @return the product detail */ ProductDetailVo getProductDetail(Long productId); /** * 更新商品库存. * * @param productDto the product dto * * @return the int */ int updateProductStockById(ProductDto productDto); /** * 查询商品集合. * * @param mdcProduct the mdc product * * @return the list */ List queryProductListWithPage(MdcProduct mdcProduct); /** * 新增商品信息. * * @param mdcEditProductDto the mdc edit product dto * @param loginAuthDto the login auth dto */ void saveProduct(MdcEditProductDto mdcEditProductDto, LoginAuthDto loginAuthDto); /** * 删除商品信息. * * @param id the id */ void deleteProductById(Long id); /** * Gets product vo. * * @param id the id * * @return the product vo */ ProductVo getProductVo(Long id); /** * Gets main image. * * @param productId the product id * * @return the main image */ String getMainImage(Long productId); } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/OpcRpcService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcRpcService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.oss.ElementImgUrlDto; import com.paascloud.provider.model.dto.oss.OptBatchGetUrlRequest; import com.paascloud.provider.model.dto.oss.OptGetUrlRequest; import com.paascloud.provider.model.dto.robot.ChatRobotMsgDto; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; /** * The class Opc rpc service. * * @author paascloud.net @gmail.com */ @Component public class OpcRpcService { @Resource private DingtalkFeignApi dingtalkFeignApi; @Resource private OpcOssFeignApi opcOssFeignApi; public boolean sendChatRobotMsg(ChatRobotMsgDto chatRobotMsgDto) { Wrapper result = dingtalkFeignApi.sendChatRobotMsg(chatRobotMsgDto); return result.getResult(); } public List listFileUrl(OptBatchGetUrlRequest urlRequest) { Wrapper> result = opcOssFeignApi.listFileUrl(urlRequest); return result.getResult(); } public String getFileUrl(final OptGetUrlRequest request) { Wrapper result = opcOssFeignApi.getFileUrl(request); return result.getResult(); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/impl/MdcAddressServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcAddressServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.collect.Lists; import com.paascloud.RecursionTreeUtil; import com.paascloud.TreeNode; import com.paascloud.provider.mapper.MdcAddressMapper; import com.paascloud.provider.model.domain.MdcAddress; import com.paascloud.core.support.BaseService; import com.paascloud.provider.service.MdcAddressService; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /** * The class Mdc address service. * * @author paascloud.net@gmail.com */ @Service public class MdcAddressServiceImpl extends BaseService implements MdcAddressService { @Resource private MdcAddressMapper mdcAddressMapper; /** * Find by pid list. * * @param pid the pid * * @return the list */ @Override public List listByPid(Long pid) { return mdcAddressMapper.selectAddressByPid(pid); } @Override @Cacheable(cacheNames = "mdc-cache", key = "#id") public MdcAddress getById(Long id) { return mdcAddressMapper.selectByPrimaryKey(id); } @Override @Cacheable(cacheNames = "mdc-cache", keyGenerator = "keyGenerator") public List get4City() { List mdcAddresses = mdcAddressMapper.selectAll(); List treeNodeList = buildGroupTree(mdcAddresses); logger.info("treeNodeList={}", treeNodeList); return treeNodeList; } private List buildGroupTree(List mdcAddressesList) { List list = Lists.newArrayList(); TreeNode node; for (MdcAddress group : mdcAddressesList) { node = new TreeNode(); node.setId(group.getId()); node.setPid(group.getPid()); node.setNodeCode(group.getAdCode()); node.setNodeName(group.getName()); list.add(node); } return RecursionTreeUtil.getChildTreeNodes(list, 368100107951677440L); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/impl/MdcDictServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcDictServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.collect.Lists; import com.paascloud.PublicUtil; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UpdateStatusDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.core.support.TreeUtils; import com.paascloud.provider.exceptions.MdcBizException; import com.paascloud.provider.mapper.MdcDictMapper; import com.paascloud.provider.model.domain.MdcDict; import com.paascloud.provider.model.enums.MdcDictStatusEnum; import com.paascloud.provider.model.vo.MdcDictVo; import com.paascloud.provider.service.MdcDictService; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * The class Mdc dict service. * * @author paascloud.net @gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class MdcDictServiceImpl extends BaseService implements MdcDictService { @Resource private MdcDictMapper mdcDictMapper; @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getDictTreeList() { List list = mdcDictMapper.listDictVo(); return new TreeUtils().getChildTreeObjects(list, 0L); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public MdcDictVo getMdcDictVoById(Long dictId) { MdcDict dict = mdcDictMapper.selectByPrimaryKey(dictId); if (dict == null) { logger.error("找不到数据字典信息id={}", dictId); throw new MdcBizException(ErrorCodeEnum.MDC10021018, dictId); } // 获取父级菜单信息 MdcDict parentDict = mdcDictMapper.selectByPrimaryKey(dict.getPid()); ModelMapper modelMapper = new ModelMapper(); MdcDictVo dictVo = modelMapper.map(dict, MdcDictVo.class); if (parentDict != null) { dictVo.setParentDictName(parentDict.getDictName()); } return dictVo; } @Override public void updateMdcDictStatusById(UpdateStatusDto updateStatusDto, LoginAuthDto loginAuthDto) { Long id = updateStatusDto.getId(); Integer status = updateStatusDto.getStatus(); // 要处理的菜单集合 List mdcDictList = Lists.newArrayList(); int result; if (status.equals(MdcDictStatusEnum.DISABLE.getType())) { // 获取菜单以及子菜单 mdcDictList = this.getAllDictFolder(id, MdcDictStatusEnum.ENABLE.getType()); } else { // 获取菜单、其子菜单以及父菜单 MdcDict uacMenu = new MdcDict(); uacMenu.setPid(id); result = this.selectCount(uacMenu); // 此菜单含有子菜单 if (result > 0) { mdcDictList = this.getAllDictFolder(id, MdcDictStatusEnum.DISABLE.getType()); } List dictListTemp = this.getAllParentDictFolderByMenuId(id); for (MdcDict dict : dictListTemp) { if (!mdcDictList.contains(dict)) { mdcDictList.add(dict); } } } this.updateDictStatus(mdcDictList, loginAuthDto, status); } private void updateDictStatus(List mdcDictList, LoginAuthDto loginAuthDto, int status) { MdcDict update = new MdcDict(); for (MdcDict dict : mdcDictList) { update.setId(dict.getId()); update.setVersion(dict.getVersion() + 1); update.setStatus(status); update.setUpdateInfo(loginAuthDto); int result = mapper.updateByPrimaryKeySelective(update); if (result < 1) { throw new MdcBizException(ErrorCodeEnum.MDC10021019, dict.getId()); } } } private List getAllDictFolder(Long id, int dictStatus) { MdcDict mdcDict = new MdcDict(); mdcDict.setId(id); mdcDict = mapper.selectOne(mdcDict); List mdcDictList = Lists.newArrayList(); mdcDictList = buildNode(mdcDictList, mdcDict, dictStatus); return mdcDictList; } private List getAllParentDictFolderByMenuId(Long dictId) { MdcDict mdcDictQuery = new MdcDict(); mdcDictQuery.setId(dictId); mdcDictQuery = mapper.selectOne(mdcDictQuery); List mdcDictList = Lists.newArrayList(); mdcDictList = buildParentNote(mdcDictList, mdcDictQuery); return mdcDictList; } /** * 递归获取菜单的子节点 */ private List buildNode(List mdcDictList, MdcDict uacMenu, int dictStatus) { List uacMenuQueryList = mapper.select(uacMenu); MdcDict uacMenuQuery; for (MdcDict dict : uacMenuQueryList) { if (dictStatus == dict.getStatus()) { mdcDictList.add(dict); } uacMenuQuery = new MdcDict(); uacMenuQuery.setPid(dict.getId()); buildNode(mdcDictList, uacMenuQuery, dictStatus); } return mdcDictList; } /** * 递归获取菜单的父菜单 */ private List buildParentNote(List mdcDictList, MdcDict mdcDict) { List mdcDictQueryList = mapper.select(mdcDict); MdcDict uacMenuQuery; for (MdcDict dict : mdcDictQueryList) { if (MdcDictStatusEnum.DISABLE.getType() == dict.getStatus()) { mdcDictList.add(dict); } uacMenuQuery = new MdcDict(); uacMenuQuery.setId(dict.getPid()); buildParentNote(mdcDictList, uacMenuQuery); } return mdcDictList; } @Override public void saveMdcDict(MdcDict mdcDict, LoginAuthDto loginAuthDto) { Long pid = mdcDict.getPid(); mdcDict.setUpdateInfo(loginAuthDto); MdcDict parentMenu = mapper.selectByPrimaryKey(pid); if (PublicUtil.isEmpty(parentMenu)) { throw new MdcBizException(ErrorCodeEnum.MDC10021020, pid); } if (mdcDict.isNew()) { MdcDict updateMenu = new MdcDict(); updateMenu.setId(pid); Long dictId = super.generateId(); mdcDict.setId(dictId); mapper.insertSelective(mdcDict); } else { mapper.updateByPrimaryKeySelective(mdcDict); } } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public boolean checkDictHasChildDict(Long dictId) { logger.info("检查数据字典id={}是否存在生效节点", dictId); MdcDict uacMenu = new MdcDict(); uacMenu.setStatus(MdcDictStatusEnum.ENABLE.getType()); uacMenu.setPid(dictId); return mapper.selectCount(uacMenu) > 0; } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/impl/MdcExceptionLogServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcExceptionLogServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.MdcExceptionLogMapper; import com.paascloud.provider.model.domain.MdcExceptionLog; import com.paascloud.provider.model.dto.GlobalExceptionLogDto; import com.paascloud.provider.model.dto.MdcExceptionQueryDto; import com.paascloud.provider.model.dto.robot.ChatRobotMsgDto; import com.paascloud.provider.model.factory.ChatRobotMsgFactory; import com.paascloud.provider.service.MdcExceptionLogService; import com.paascloud.provider.service.OpcRpcService; import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.task.TaskExecutor; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Calendar; import java.util.Date; import java.util.List; /** * The class Mdc exception log service. * * @author paascloud.net @gmail.com */ @Service public class MdcExceptionLogServiceImpl extends BaseService implements MdcExceptionLogService { @Resource private MdcExceptionLogMapper mdcExceptionLogMapper; @Resource private TaskExecutor taskExecutor; @Resource private OpcRpcService opcRpcService; @Value("${paascloud.dingTalk.webhookToken.sendException}") private String webhookToken; @Override public void saveAndSendExceptionLog(final GlobalExceptionLogDto exceptionLogDto) { MdcExceptionLog exceptionLog = new ModelMapper().map(exceptionLogDto, MdcExceptionLog.class); exceptionLog.setId(generateId()); exceptionLog.setCreateTime(new Date()); mdcExceptionLogMapper.insertSelective(exceptionLog); taskExecutor.execute(() -> { if (judgeIsSend(exceptionLogDto.getProfile())) { String text = exceptionLog.getApplicationName() + "出现异常. 环境:" + exceptionLogDto.getProfile() + ",操作人:" + exceptionLogDto.getCreator() + ".异常类型:" + exceptionLogDto.getExceptionSimpleName(); ChatRobotMsgDto chatRobotMsgDto = ChatRobotMsgFactory.createChatRobotTextMsg(webhookToken, text, false, null); opcRpcService.sendChatRobotMsg(chatRobotMsgDto); } }); } @Override public PageInfo queryExceptionListWithPage(final MdcExceptionQueryDto mdcExceptionQueryDto) { PageHelper.startPage(mdcExceptionQueryDto.getPageNum(), mdcExceptionQueryDto.getPageSize()); List actionList = mdcExceptionLogMapper.queryExceptionListWithPage(mdcExceptionQueryDto); return new PageInfo<>(actionList); } private boolean judgeIsSend(String profile) { Calendar calendar = Calendar.getInstance(); int time = calendar.get(Calendar.HOUR_OF_DAY); return GlobalConstant.PRO_PROFILE.equals(profile) || time >= 10 && time <= 18; } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/impl/MdcProductCategoryServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategoryServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.paascloud.PublicUtil; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UpdateStatusDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.core.support.TreeUtils; import com.paascloud.provider.exceptions.MdcBizException; import com.paascloud.provider.mapper.MdcProductCategoryMapper; import com.paascloud.provider.model.domain.MdcProductCategory; import com.paascloud.provider.model.dto.ProductCategoryDto; import com.paascloud.provider.model.enums.MdcCategoryStatusEnum; import com.paascloud.provider.model.vo.MdcCategoryVo; import com.paascloud.provider.service.MdcProductCategoryService; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; import java.util.Set; /** * The class Mdc product category service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class MdcProductCategoryServiceImpl extends BaseService implements MdcProductCategoryService { @Resource private MdcProductCategoryMapper mdcProductCategoryMapper; @Override public List getCategoryDtoList(Long categoryId) { return mdcProductCategoryMapper.selectCategoryDtoList(categoryId); } @Override public List selectCategoryAndChildrenById(Long categoryId) { Set categorySet = Sets.newHashSet(); findChildCategory(categorySet, categoryId); List categoryIdList = Lists.newArrayList(); if (categoryId != null) { for (MdcProductCategory categoryItem : categorySet) { categoryIdList.add(categoryItem.getId()); } } return categoryIdList; } @Override public MdcProductCategory getByCategoryId(Long categoryId) { Preconditions.checkArgument(categoryId != null, "分类ID不能为空"); MdcProductCategory query = new MdcProductCategory(); query.setId(categoryId); return mdcProductCategoryMapper.selectOne(query); } @Override public List getCategoryTreeList() { List list = mdcProductCategoryMapper.listCategoryVo(); return new TreeUtils().getChildTreeObjects(list, 0L); } @Override public MdcCategoryVo getMdcCategoryVoById(final Long categoryId) { MdcProductCategory category = mdcProductCategoryMapper.selectByPrimaryKey(categoryId); if (category == null) { logger.error("找不到数据字典信息id={}", categoryId); throw new MdcBizException(ErrorCodeEnum.MDC10023001, categoryId); } // 获取父级菜单信息 MdcProductCategory parentCategory = mdcProductCategoryMapper.selectByPrimaryKey(category.getPid()); ModelMapper modelMapper = new ModelMapper(); MdcCategoryVo categoryVo = modelMapper.map(category, MdcCategoryVo.class); categoryVo.setId(category.getId()); categoryVo.setPid(category.getPid()); if (parentCategory != null) { categoryVo.setParentCategoryName(parentCategory.getName()); } return categoryVo; } @Override public void updateMdcCategoryStatusById(final UpdateStatusDto updateStatusDto, final LoginAuthDto loginAuthDto) { Long id = updateStatusDto.getId(); Integer status = updateStatusDto.getStatus(); // 要处理的菜单集合 List mdcCategoryList = Lists.newArrayList(); int result; if (status.equals(MdcCategoryStatusEnum.DISABLE.getType())) { // 获取菜单以及子菜单 mdcCategoryList = this.getAllCategoryFolder(id, MdcCategoryStatusEnum.ENABLE.getType()); } else { // 获取菜单、其子菜单以及父菜单 MdcProductCategory uacMenu = new MdcProductCategory(); uacMenu.setPid(id); result = this.selectCount(uacMenu); // 此菜单含有子菜单 if (result > 0) { mdcCategoryList = this.getAllCategoryFolder(id, MdcCategoryStatusEnum.DISABLE.getType()); } List categoryListTemp = this.getAllParentCategoryFolderByMenuId(id); for (MdcProductCategory category : categoryListTemp) { if (!mdcCategoryList.contains(category)) { mdcCategoryList.add(category); } } } this.updateCategoryStatus(mdcCategoryList, loginAuthDto, status); } @Override public void saveMdcCategory(final MdcProductCategory mdcCategory, final LoginAuthDto loginAuthDto) { Long pid = mdcCategory.getPid(); mdcCategory.setUpdateInfo(loginAuthDto); MdcProductCategory parentMenu = mapper.selectByPrimaryKey(pid); if (PublicUtil.isEmpty(parentMenu)) { throw new MdcBizException(ErrorCodeEnum.MDC10023002, pid); } if (mdcCategory.isNew()) { MdcProductCategory updateMenu = new MdcProductCategory(); updateMenu.setId(pid); Long categoryId = super.generateId(); mdcCategory.setId(categoryId); mapper.insertSelective(mdcCategory); } else { mapper.updateByPrimaryKeySelective(mdcCategory); } } @Override public boolean checkCategoryHasChildCategory(final Long categoryId) { logger.info("检查数据字典id={}是否存在生效节点", categoryId); MdcProductCategory uacMenu = new MdcProductCategory(); uacMenu.setStatus(MdcCategoryStatusEnum.ENABLE.getType()); uacMenu.setPid(categoryId); return mapper.selectCount(uacMenu) > 0; } /** * 递归算法,算出子节点 */ private Set findChildCategory(Set categorySet, Long categoryId) { MdcProductCategory category = mdcProductCategoryMapper.selectByPrimaryKey(categoryId); if (category != null) { categorySet.add(category); } //查找子节点,递归算法一定要有一个退出的条件 List categoryList = this.getProductCategoryListByPid(categoryId); for (MdcProductCategory categoryItem : categoryList) { findChildCategory(categorySet, categoryItem.getId()); } return categorySet; } @Override public List getProductCategoryListByPid(Long pid) { Preconditions.checkArgument(pid != null, "pid is null"); MdcProductCategory query = new MdcProductCategory(); query.setPid(pid); return mdcProductCategoryMapper.select(query); } private void updateCategoryStatus(List mdcCategoryList, LoginAuthDto loginAuthDto, int status) { MdcProductCategory update = new MdcProductCategory(); for (MdcProductCategory category : mdcCategoryList) { update.setId(category.getId()); update.setVersion(category.getVersion() + 1); update.setStatus(status); update.setUpdateInfo(loginAuthDto); int result = mapper.updateByPrimaryKeySelective(update); if (result < 1) { throw new MdcBizException(ErrorCodeEnum.MDC10023003, category.getId()); } } } private List getAllCategoryFolder(Long id, int categoryStatus) { MdcProductCategory mdcCategory = new MdcProductCategory(); mdcCategory.setId(id); mdcCategory = mapper.selectOne(mdcCategory); List mdcCategoryList = Lists.newArrayList(); mdcCategoryList = buildNode(mdcCategoryList, mdcCategory, categoryStatus); return mdcCategoryList; } private List getAllParentCategoryFolderByMenuId(Long categoryId) { MdcProductCategory mdcCategoryQuery = new MdcProductCategory(); mdcCategoryQuery.setId(categoryId); mdcCategoryQuery = mapper.selectOne(mdcCategoryQuery); List mdcCategoryList = Lists.newArrayList(); mdcCategoryList = buildParentNote(mdcCategoryList, mdcCategoryQuery); return mdcCategoryList; } /** * 递归获取菜单的子节点 */ private List buildNode(List mdcCategoryList, MdcProductCategory uacMenu, int categoryStatus) { List uacMenuQueryList = mapper.select(uacMenu); MdcProductCategory uacMenuQuery; for (MdcProductCategory category : uacMenuQueryList) { if (categoryStatus == category.getStatus()) { mdcCategoryList.add(category); } uacMenuQuery = new MdcProductCategory(); uacMenuQuery.setPid(category.getId()); buildNode(mdcCategoryList, uacMenuQuery, categoryStatus); } return mdcCategoryList; } /** * 递归获取菜单的父菜单 */ private List buildParentNote(List mdcCategoryList, MdcProductCategory mdcCategory) { List mdcCategoryQueryList = mapper.select(mdcCategory); MdcProductCategory uacMenuQuery; for (MdcProductCategory category : mdcCategoryQueryList) { if (MdcCategoryStatusEnum.DISABLE.getType() == category.getStatus()) { mdcCategoryList.add(category); } uacMenuQuery = new MdcProductCategory(); uacMenuQuery.setId(category.getPid()); buildParentNote(mdcCategoryList, uacMenuQuery); } return mdcCategoryList; } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/service/impl/MdcProductServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.alibaba.fastjson.JSON; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.paascloud.PubUtils; import com.paascloud.PublicUtil; import com.paascloud.RedisKeyUtil; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.exceptions.MdcBizException; import com.paascloud.provider.manager.MdcProductManager; import com.paascloud.provider.mapper.MdcProductMapper; import com.paascloud.provider.model.constant.MallConstant; import com.paascloud.provider.model.domain.MdcProduct; import com.paascloud.provider.model.domain.MdcProductCategory; import com.paascloud.provider.model.domain.MqMessageData; import com.paascloud.provider.model.dto.MdcEditProductDto; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.dto.UpdateAttachmentDto; import com.paascloud.provider.model.dto.oss.ElementImgUrlDto; import com.paascloud.provider.model.dto.oss.OptBatchGetUrlRequest; import com.paascloud.provider.model.dto.oss.OptGetUrlRequest; import com.paascloud.provider.model.vo.ProductDetailVo; import com.paascloud.provider.model.vo.ProductVo; import com.paascloud.provider.service.MdcProductCategoryService; import com.paascloud.provider.service.MdcProductService; import com.paascloud.provider.service.OpcRpcService; import org.apache.commons.lang3.StringUtils; import org.modelmapper.ModelMapper; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Collections; import java.util.List; /** * The class Mdc product service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class MdcProductServiceImpl extends BaseService implements MdcProductService { @Resource private MdcProductMapper mdcProductMapper; @Resource private MdcProductCategoryService mdcProductCategoryService; @Resource private MdcProductManager mdcProductManager; @Resource private OpcRpcService opcRpcService; @Override public List selectByNameAndCategoryIds(String productName, List categoryIdList, String orderBy) { return mdcProductMapper.selectByNameAndCategoryIds(productName, categoryIdList, orderBy); } @Override public ProductDetailVo getProductDetail(Long productId) { logger.info("获取商品明细信息, productId={}", productId); Preconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg()); MdcProduct product = mdcProductMapper.selectByPrimaryKey(productId); if (product == null) { throw new MdcBizException(ErrorCodeEnum.MDC10021017, productId); } if (product.getStatus() != MallConstant.ProductStatusEnum.ON_SALE.getCode()) { throw new MdcBizException(ErrorCodeEnum.MDC10021017, productId); } return assembleProductDetailVo(product); } @Override public int updateProductStockById(ProductDto productDto) { Preconditions.checkArgument(!PubUtils.isNull(productDto, productDto.getId()), ErrorCodeEnum.MDC10021021.msg()); return mdcProductMapper.updateProductStockById(productDto); } @Override public List queryProductListWithPage(final MdcProduct mdcProduct) { return mdcProductMapper.queryProductListWithPage(mdcProduct); } @Override public void saveProduct(final MdcEditProductDto mdcEditProductDto, final LoginAuthDto loginAuthDto) { String productCode = mdcEditProductDto.getProductCode(); MdcProduct product = new MdcProduct(); BeanUtils.copyProperties(mdcEditProductDto, product); List categoryIdList = mdcEditProductDto.getCategoryIdList(); Long categoryId = categoryIdList.get(categoryIdList.size() - 1); product.setCategoryId(categoryId); List attachmentIdList = mdcEditProductDto.getAttachmentIdList(); product.setUpdateInfo(loginAuthDto); if (PublicUtil.isNotEmpty(attachmentIdList)) { product.setMainImage(String.valueOf(attachmentIdList.get(0))); product.setSubImages(Joiner.on(GlobalConstant.Symbol.COMMA).join(attachmentIdList)); } MqMessageData mqMessageData; if (product.isNew()) { productCode = String.valueOf(generateId()); } else { Preconditions.checkArgument(StringUtils.isNotEmpty(productCode), ErrorCodeEnum.MDC10021024.msg()); } product.setProductCode(productCode); UpdateAttachmentDto updateAttachmentDto = new UpdateAttachmentDto(productCode, attachmentIdList, loginAuthDto); String body = JSON.toJSONString(updateAttachmentDto); String topic = AliyunMqTopicConstants.MqTagEnum.UPDATE_ATTACHMENT.getTopic(); String tag = AliyunMqTopicConstants.MqTagEnum.UPDATE_ATTACHMENT.getTag(); String key = RedisKeyUtil.createMqKey(topic, tag, product.getProductCode(), body); if (product.isNew() && PublicUtil.isNotEmpty(attachmentIdList)) { product.setId(generateId()); mqMessageData = new MqMessageData(body, topic, tag, key); mdcProductManager.saveProduct(mqMessageData, product, true); } else if (product.isNew() && PublicUtil.isEmpty(attachmentIdList)) { product.setId(generateId()); mdcProductMapper.insertSelective(product); } else { mqMessageData = new MqMessageData(body, topic, tag, key); mdcProductManager.saveProduct(mqMessageData, product, false); } } @Override public void deleteProductById(final Long id) { MdcProduct product = mdcProductMapper.selectByPrimaryKey(id); if (product != null) { String body = product.getProductCode(); String topic = AliyunMqTopicConstants.MqTagEnum.DELETE_ATTACHMENT.getTopic(); String tag = AliyunMqTopicConstants.MqTagEnum.DELETE_ATTACHMENT.getTag(); String key = RedisKeyUtil.createMqKey(topic, tag, product.getProductCode(), body); MqMessageData mqMessageData = new MqMessageData(body, topic, tag, key); mdcProductManager.deleteProduct(mqMessageData, id); } } @Override public ProductVo getProductVo(final Long id) { MdcProduct mdcProduct = mdcProductMapper.selectByPrimaryKey(id); ProductVo productVo = new ModelMapper().map(mdcProduct, ProductVo.class); List categoryIdList = Lists.newArrayList(); buildCategoryIdList(categoryIdList, mdcProduct.getCategoryId()); // 获取分类节点集合 Collections.reverse(categoryIdList); productVo.setCategoryIdList(categoryIdList); // 获取图片集合 final OptBatchGetUrlRequest request = new OptBatchGetUrlRequest(mdcProduct.getProductCode()); request.setEncrypt(true); List imgUrlList = opcRpcService.listFileUrl(request); productVo.setImgUrlList(imgUrlList); return productVo; } @Override public String getMainImage(final Long productId) { MdcProduct product = mdcProductMapper.selectByPrimaryKey(productId); String url = null; if (product != null) { final OptGetUrlRequest request = new OptGetUrlRequest(); request.setEncrypt(true); request.setAttachmentId(Long.valueOf(product.getMainImage())); request.setExpires(3600 * 12 * 7L); url = opcRpcService.getFileUrl(request); } return url; } private List buildCategoryIdList(List categoryIdList, Long categoryId) { MdcProductCategory category = mdcProductCategoryService.getByCategoryId(categoryId); if (category != null) { categoryIdList.add(categoryId); buildCategoryIdList(categoryIdList, category.getPid()); } return categoryIdList; } private ProductDetailVo assembleProductDetailVo(MdcProduct product) { ProductDetailVo productDetailVo = new ProductDetailVo(); String mainImage = product.getMainImage(); String subImages = product.getSubImages(); if (StringUtils.isNotEmpty(mainImage)) { // 图片查询 OptGetUrlRequest request = new OptGetUrlRequest(); request.setAttachmentId(Long.valueOf(mainImage)); request.setEncrypt(true); String url = opcRpcService.getFileUrl(request); productDetailVo.setMainImage(url); } if (StringUtils.isNotEmpty(subImages)) { List urlList = Lists.newArrayList(); List subImageList = Splitter.on(GlobalConstant.Symbol.COMMA).trimResults().splitToList(subImages); for (final String subImage : subImageList) { OptGetUrlRequest request = new OptGetUrlRequest(); request.setAttachmentId(Long.valueOf(subImage)); request.setEncrypt(true); String url = opcRpcService.getFileUrl(request); urlList.add(url); } productDetailVo.setSubImages(Joiner.on(GlobalConstant.Symbol.COMMA).join(urlList)); } productDetailVo.setId(product.getId()); productDetailVo.setSubtitle(product.getSubtitle()); productDetailVo.setPrice(product.getPrice()); productDetailVo.setDetail(product.getDetail()); productDetailVo.setName(product.getName()); productDetailVo.setStatus(product.getStatus()); productDetailVo.setStock(product.getStock()); productDetailVo.setImageHost(""); MdcProductCategory category = mdcProductCategoryService.getByCategoryId(product.getId()); if (category == null) { //默认根节点 productDetailVo.setPid(0L); } else { productDetailVo.setPid(category.getPid()); } return productDetailVo; } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/GlobalExceptionHandler.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GlobalExceptionHandler.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import com.paascloud.provider.model.dto.GlobalExceptionLogDto; import com.paascloud.provider.service.MdcExceptionLogFeignApi; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.annotation.Resource; /** * 全局的的异常拦截器 * * @author paascloud.net @gmail.com */ @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @Resource private TaskExecutor taskExecutor; @Value("${spring.profiles.active}") String profile; @Value("${spring.application.name}") String applicationName; @Resource private MdcExceptionLogFeignApi mdcExceptionLogFeignApi; /** * 参数非法异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper illegalArgumentException(IllegalArgumentException e) { log.error("参数非法异常={}", e.getMessage(), e); return WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage()); } /** * 业务异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(BusinessException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper businessException(BusinessException e) { log.error("业务异常={}", e.getMessage(), e); return WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage()); } /** * 全局异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody public Wrapper exception(Exception e) { log.info("保存全局异常信息 ex={}", e.getMessage(), e); taskExecutor.execute(() -> { GlobalExceptionLogDto globalExceptionLogDto = new GlobalExceptionLogDto().getGlobalExceptionLogDto(e, profile, applicationName); mdcExceptionLogFeignApi.saveAndSendExceptionLog(globalExceptionLogDto); }); return WrapMapper.error(); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/MdcAddressRest.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcAddressRest.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.paascloud.TreeNode; import com.paascloud.provider.service.MdcAddressService; import com.paascloud.core.support.BaseController; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * The class Mdc address rest. * * @author paascloud.net@gmail.com */ @RestController @RequestMapping(value = "/address", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - MdcAddressRest", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcAddressRest extends BaseController { @Resource private MdcAddressService mdcAddressService; /** * Gets 4 city. * * @return the 4 city */ @PostMapping(value = "/get4City") @ApiOperation(httpMethod = "POST", value = "查看四级地址") public Wrapper> get4City() { logger.info("get4City - 获取四级地址"); List treeNodeList = mdcAddressService.get4City(); return WrapMapper.ok(treeNodeList); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/MdcDictMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcDictMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UpdateStatusDto; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.MdcDict; import com.paascloud.provider.model.dto.MdcEditDictDto; import com.paascloud.provider.model.vo.MdcDictVo; import com.paascloud.provider.service.MdcDictService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.BeanUtils; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * The class Mdc dict main controller. * * @author paascloud.net@gmail.com */ @RestController @RequestMapping(value = "/dict", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - MdcDictMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcDictMainController extends BaseController { @Resource private MdcDictService mdcDictService; /** * 获取字典列表数据 * * @return the wrapper */ @PostMapping(value = "/getTree") @ApiOperation(httpMethod = "POST", value = "获取字典树") public Wrapper> queryDictTreeList() { List dictVoList = mdcDictService.getDictTreeList(); return WrapMapper.ok(dictVoList); } /** * 根据ID获取字典信息. * * @param id the id * * @return the wrapper */ @PostMapping(value = "/queryById/{id}") @ApiOperation(httpMethod = "POST", value = "根据ID获取字典信息") public Wrapper queryDictVoById(@ApiParam(name = "id", value = "字典id") @PathVariable Long id) { logger.info("根据Id查询字典信息, dictId={}", id); MdcDictVo mdcDictVo = mdcDictService.getMdcDictVoById(id); return WrapMapper.ok(mdcDictVo); } /** * 根据id修改字典的禁用状态 * * @return the wrapper */ @PostMapping(value = "/modifyStatus") @ApiOperation(httpMethod = "POST", value = "根据id修改字典的禁用状态") public Wrapper updateMdcDictStatusById(@ApiParam(name = "mdcDictStatusDto", value = "修改字典状态Dto") @RequestBody UpdateStatusDto updateStatusDto) { logger.info("根据id修改字典的禁用状态 updateStatusDto={}", updateStatusDto); LoginAuthDto loginAuthDto = getLoginAuthDto(); mdcDictService.updateMdcDictStatusById(updateStatusDto, loginAuthDto); return WrapMapper.ok(); } @PostMapping(value = "/save") @ApiOperation(httpMethod = "POST", value = "编辑字典") public Wrapper saveDict(@ApiParam(name = "saveDict", value = "编辑字典") @RequestBody MdcEditDictDto mdcDictAddDto) { MdcDict mdcDict = new MdcDict(); LoginAuthDto loginAuthDto = getLoginAuthDto(); BeanUtils.copyProperties(mdcDictAddDto, mdcDict); mdcDictService.saveMdcDict(mdcDict, loginAuthDto); return WrapMapper.ok(); } /** * 根据id删除字典 * * @param id the id * * @return the wrapper */ @PostMapping(value = "/deleteById/{id}") @ApiOperation(httpMethod = "POST", value = "根据id删除字典") public Wrapper deleteMdcDictById(@ApiParam(name = "id", value = "字典id") @PathVariable Long id) { logger.info(" 根据id删除字典 id={}", id); // 判断此字典是否有子节点 boolean hasChild = mdcDictService.checkDictHasChildDict(id); if (hasChild) { return WrapMapper.wrap(Wrapper.ERROR_CODE, "此字典含有子字典, 请先删除子字典"); } int result = mdcDictService.deleteByKey(id); return super.handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/MdcExceptionMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcExceptionMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.github.pagehelper.PageInfo; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.MdcExceptionQueryDto; import com.paascloud.provider.service.MdcExceptionLogService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; 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; import javax.annotation.Resource; /** * 异常管理. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/exception", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - MdcExceptionMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcExceptionMainController extends BaseController { @Resource private MdcExceptionLogService mdcExceptionLogService; /** * 异常日志列表. * * @param mdcExceptionQueryDto the mdc exception query dto * * @return the wrapper */ @PostMapping(value = "/queryListWithPage") @ApiOperation(httpMethod = "POST", value = "查询日志列表") public Wrapper queryLogListWithPage(@ApiParam(name = "mdcExceptionQueryDto", value = "异常查询条件") @RequestBody MdcExceptionQueryDto mdcExceptionQueryDto) { logger.info("查询日志处理列表 mdcExceptionQueryDto={}", mdcExceptionQueryDto); PageInfo pageInfo = mdcExceptionLogService.queryExceptionListWithPage(mdcExceptionQueryDto); return WrapMapper.ok(pageInfo); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/MdcProductCategoryMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategoryMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UpdateStatusDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.MdcProductCategory; import com.paascloud.provider.model.dto.MdcEditCategoryDto; import com.paascloud.provider.model.vo.MdcCategoryVo; import com.paascloud.provider.service.MdcProductCategoryService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.BeanUtils; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * The class Mdc category main controller. * * @author paascloud.net@gmail.com */ @RestController @RequestMapping(value = "/category", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - MdcProductCategoryMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcProductCategoryMainController extends BaseController { @Resource private MdcProductCategoryService mdcProductCategoryService; /** * 获取商品分类列表数据 * * @return the wrapper */ @PostMapping(value = "/getTree") @ApiOperation(httpMethod = "POST", value = "获取商品分类树") public Wrapper> queryCategoryTreeList() { List categoryVoList = mdcProductCategoryService.getCategoryTreeList(); return WrapMapper.ok(categoryVoList); } /** * 根据ID获取商品分类信息. * * @param id the id * * @return the wrapper */ @PostMapping(value = "/queryById/{id}") @ApiOperation(httpMethod = "POST", value = "根据ID获取商品分类信息") public Wrapper queryCategoryVoById(@ApiParam(name = "id", value = "商品分类id") @PathVariable Long id) { logger.info("根据Id查询商品分类信息, categoryId={}", id); MdcCategoryVo mdcCategoryVo = mdcProductCategoryService.getMdcCategoryVoById(id); return WrapMapper.ok(mdcCategoryVo); } /** * 根据id修改商品分类的禁用状态 * * @return the wrapper */ @PostMapping(value = "/modifyStatus") @ApiOperation(httpMethod = "POST", value = "根据id修改商品分类的禁用状态") @LogAnnotation public Wrapper updateMdcCategoryStatusById(@ApiParam(name = "mdcCategoryStatusDto", value = "修改商品分类状态Dto") @RequestBody UpdateStatusDto updateStatusDto) { logger.info("根据id修改商品分类的禁用状态 updateStatusDto={}", updateStatusDto); LoginAuthDto loginAuthDto = getLoginAuthDto(); mdcProductCategoryService.updateMdcCategoryStatusById(updateStatusDto, loginAuthDto); return WrapMapper.ok(); } @PostMapping(value = "/save") @ApiOperation(httpMethod = "POST", value = "编辑商品分类") @LogAnnotation public Wrapper saveCategory(@ApiParam(name = "saveCategory", value = "编辑商品分类") @RequestBody MdcEditCategoryDto mdcCategoryAddDto) { MdcProductCategory mdcCategory = new MdcProductCategory(); LoginAuthDto loginAuthDto = getLoginAuthDto(); BeanUtils.copyProperties(mdcCategoryAddDto, mdcCategory); mdcProductCategoryService.saveMdcCategory(mdcCategory, loginAuthDto); return WrapMapper.ok(); } /** * 根据id删除商品分类 * * @param id the id * * @return the wrapper */ @PostMapping(value = "/deleteById/{id}") @ApiOperation(httpMethod = "POST", value = "根据id删除商品分类") @LogAnnotation public Wrapper deleteMdcCategoryById(@ApiParam(name = "id", value = "商品分类id") @PathVariable Long id) { logger.info(" 根据id删除商品分类 id={}", id); // 判断此商品分类是否有子节点 boolean hasChild = mdcProductCategoryService.checkCategoryHasChildCategory(id); if (hasChild) { return WrapMapper.wrap(Wrapper.ERROR_CODE, "此商品分类含有子商品分类, 请先删除子商品分类"); } int result = mdcProductCategoryService.deleteByKey(id); return super.handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/MdcProductMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.MdcProduct; import com.paascloud.provider.model.dto.MdcEditProductDto; import com.paascloud.provider.model.vo.ProductVo; import com.paascloud.provider.service.MdcProductService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * The class Mdc dict main controller. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/product", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - MdcProductMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcProductMainController extends BaseController { @Resource private MdcProductService mdcProductService; /** * 分页查询商品列表. * * @param mdcProduct the mdc product * * @return the wrapper */ @PostMapping(value = "/queryProductListWithPage") @ApiOperation(httpMethod = "POST", value = "分页查询商品列表") public Wrapper> queryProductListWithPage(@ApiParam(name = "mdcProduct", value = "商品信息") @RequestBody MdcProduct mdcProduct) { logger.info("分页查询商品列表, mdcProduct={}", mdcProduct); PageHelper.startPage(mdcProduct.getPageNum(), mdcProduct.getPageSize()); mdcProduct.setOrderBy("update_time desc"); List roleVoList = mdcProductService.queryProductListWithPage(mdcProduct); return WrapMapper.ok(new PageInfo<>(roleVoList)); } /** * 商品详情. */ @PostMapping(value = "/getById/{id}") @ApiOperation(httpMethod = "POST", value = "分页查询商品列表") public Wrapper getById(@PathVariable Long id) { logger.info("查询商品详情, id={}", id); ProductVo productVo = mdcProductService.getProductVo(id); return WrapMapper.ok(productVo); } @PostMapping(value = "/save") @ApiOperation(httpMethod = "POST", value = "编辑商品") @LogAnnotation public Wrapper saveCategory(@RequestBody MdcEditProductDto mdcCategoryAddDto) { logger.info("编辑商品. mdcCategoryAddDto={}", mdcCategoryAddDto); mdcProductService.saveProduct(mdcCategoryAddDto, getLoginAuthDto()); return WrapMapper.ok(); } @PostMapping(value = "/deleteProductById/{id}") @ApiOperation(httpMethod = "POST", value = "删除商品信息") @LogAnnotation public Wrapper deleteProductById(@PathVariable Long id) { logger.info("删除商品信息, id={}", id); mdcProductService.deleteProductById(id); return WrapMapper.ok(); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/UacDictCommonController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacDictCommonController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.MdcDict; import com.paascloud.provider.model.dto.MdcDictCheckCodeDto; import com.paascloud.provider.model.dto.MdcDictCheckNameDto; import com.paascloud.provider.service.MdcDictService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; 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; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; /** * The class Uac dict common controller. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/dict", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - UacDictCommonController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacDictCommonController extends BaseController { @Resource private MdcDictService mdcDictService; /** * 检测菜单编码是否已存在 * * @param mdcDictCheckCodeDto the mdc dict check code dto * * @return the wrapper */ @PostMapping(value = "/checkDictCode") @ApiOperation(httpMethod = "POST", value = "检测数据字典编码是否已存在") public Wrapper checkDictCode(@ApiParam(name = "uacMenuCheckCodeDto", value = "id与url") @RequestBody MdcDictCheckCodeDto mdcDictCheckCodeDto) { logger.info("检测数据字典编码是否已存在 mdcDictCheckCodeDto={}", mdcDictCheckCodeDto); Long id = mdcDictCheckCodeDto.getDictId(); String dictCode = mdcDictCheckCodeDto.getDictCode(); Example example = new Example(MdcDict.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("dictCode", dictCode); int result = mdcDictService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 检测数据字典名称是否已存在. * * @param mdcDictCheckNameDto the mdc dict check name dto * * @return the wrapper */ @PostMapping(value = "/checkDictName") @ApiOperation(httpMethod = "POST", value = "检测数据字典名称是否已存在") public Wrapper checkDictName(@ApiParam(name = "uacMenuCheckCodeDto", value = "id与url") @RequestBody MdcDictCheckNameDto mdcDictCheckNameDto) { logger.info("检测数据字典名称是否已存在 mdcDictCheckNameDto={}", mdcDictCheckNameDto); Long id = mdcDictCheckNameDto.getDictId(); String dictName = mdcDictCheckNameDto.getDictName(); Example example = new Example(MdcDict.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("dictName", dictName); int result = mdcDictService.selectCountByExample(example); return WrapMapper.ok(result < 1); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/frontend/UacProductCategoryCommonController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacProductCategoryCommonController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.MdcProductCategory; import com.paascloud.provider.model.dto.MdcCategoryCheckNameDto; import com.paascloud.provider.service.MdcProductCategoryService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; 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; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; /** * The class Uac dict common controller. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/dict", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - UacDictCommonController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacProductCategoryCommonController extends BaseController { @Resource private MdcProductCategoryService mdcProductCategoryService; /** * 检测数据分类名称是否已存在. * * @param categoryCheckNameDto the category check name dto * * @return the wrapper */ @PostMapping(value = "/checkCategoryName") @ApiOperation(httpMethod = "POST", value = "检测数据分类名称是否已存在") public Wrapper checkCategoryName(@RequestBody MdcCategoryCheckNameDto categoryCheckNameDto) { logger.info("检测数据分类名称是否已存在 categoryCheckNameDto={}", categoryCheckNameDto); Long id = categoryCheckNameDto.getCategoryId(); String categoryName = categoryCheckNameDto.getCategoryName(); Example example = new Example(MdcProductCategory.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("name", categoryName); int result = mdcProductCategoryService.selectCountByExample(example); return WrapMapper.ok(result < 1); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcAddressQueryFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcAddressQueryFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.PublicUtil; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.MdcAddress; import com.paascloud.provider.model.dto.AddressDTO; import com.paascloud.provider.service.MdcAddressQueryFeignApi; import com.paascloud.provider.service.MdcAddressService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * The class Mdc product query feign client. * * @author paascloud.net @gmail.com */ @RefreshScope @RestController @Api(value = "API - MdcAddressQueryFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcAddressQueryFeignClient extends BaseController implements MdcAddressQueryFeignApi { @Resource private MdcAddressService mdcAddressService; /** * 根据ID获取地址信息. * * @param addressId the address id * * @return the by id */ @Override @ApiOperation(httpMethod = "POST", value = "根据ID获取地址信息") public Wrapper getById(@PathVariable("addressId") Long addressId) { logger.info("根据ID获取地址信息 addressId={}", addressId); AddressDTO addressDTO = null; MdcAddress mdcAddress = mdcAddressService.selectByKey(addressId); if (PublicUtil.isNotEmpty(mdcAddress)) { addressDTO = new AddressDTO(); BeanUtils.copyProperties(mdcAddress, addressDTO); } return WrapMapper.ok(addressDTO); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcExceptionLogFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcExceptionLogFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.GlobalExceptionLogDto; import com.paascloud.provider.service.MdcExceptionLogFeignApi; import com.paascloud.provider.service.MdcExceptionLogService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * The class Mdc product feign client. * * @author paascloud.net@gmail.com */ @Slf4j @RefreshScope @RestController @Api(value = "API - MdcExceptionLogFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcExceptionLogFeignClient extends BaseController implements MdcExceptionLogFeignApi { @Resource private MdcExceptionLogService mdcExceptionLogService; @Override @ApiOperation(httpMethod = "POST", value = "保存日志并发送钉钉消息") public Wrapper saveAndSendExceptionLog(@RequestBody GlobalExceptionLogDto exceptionLogDto) { try { mdcExceptionLogService.saveAndSendExceptionLog(exceptionLogDto); } catch (Exception e) { log.error("saveAndSendExceptionLog={}", e.getMessage(), e); } return WrapMapper.ok(); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcMqMessageFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcMqMessageFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.core.support.BaseController; import com.paascloud.provider.service.MdcMqMessageFeignApi; import com.paascloud.provider.service.MqMessageService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * Mq 消息. * * @author paascloud.net @gmail.com */ @RestController @Api(value = "API - MdcMqMessageFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcMqMessageFeignClient extends BaseController implements MdcMqMessageFeignApi { @Resource private MqMessageService mqMessageService; @Override @ApiOperation(httpMethod = "POST", value = "查询含有的messageKey") public Wrapper> queryMessageKeyList(@RequestParam("messageKeyList") List messageKeyList) { logger.info("查询消息KEY. messageKeyList={}", messageKeyList); return WrapMapper.ok(mqMessageService.queryMessageKeyList(messageKeyList)); } @Override public Wrapper> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto) { return mqMessageService.queryMessageListWithPage(messageQueryDto); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcProductCategoryFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategoryFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.provider.service.MdcProductCategoryFeignApi; import com.paascloud.core.support.BaseController; import io.swagger.annotations.Api; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RestController; /** * The class Mdc product category feign client. * * @author paascloud.net@gmail.com */ @RefreshScope @RestController @Api(value = "API - MdcProductCategoryFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcProductCategoryFeignClient extends BaseController implements MdcProductCategoryFeignApi { } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcProductCategoryQueryFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategoryQueryFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; import com.paascloud.PublicUtil; import com.paascloud.core.support.BaseService; import com.paascloud.provider.model.domain.MdcProduct; import com.paascloud.provider.model.domain.MdcProductCategory; import com.paascloud.provider.model.dto.ProductCategoryDto; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.dto.ProductReqDto; import com.paascloud.provider.service.MdcProductCategoryQueryFeignApi; import com.paascloud.provider.service.MdcProductCategoryService; import com.paascloud.provider.service.MdcProductService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * The class Mdc product category query feign client. * * @author paascloud.net @gmail.com */ @RefreshScope @RestController @Api(value = "API - MdcProductCategoryQueryFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcProductCategoryQueryFeignClient extends BaseService implements MdcProductCategoryQueryFeignApi { @Resource private MdcProductCategoryService mdcProductCategoryService; @Resource private MdcProductService mdcProductService; /** * 获取商品品类信息. * * @param pid the pid * * @return the product category data */ @Override @ApiOperation(httpMethod = "POST", value = "获取商品品类信息") public Wrapper> getProductCategoryData(@PathVariable("pid") Long pid) { logger.info("获取商品品类信息. pid={}", pid); List list; if (0L == pid) { // 查询所有一级分类 list = mdcProductCategoryService.getCategoryDtoList(pid); for (ProductCategoryDto productCategoryDto : list) { Long categoryPid = productCategoryDto.getCategoryId(); if (PublicUtil.isEmpty(categoryPid)) { continue; } List product2CategoryDtoList = mdcProductCategoryService.getCategoryDtoList(categoryPid); if (product2CategoryDtoList.size() > 5) { product2CategoryDtoList = product2CategoryDtoList.subList(0, 4); } productCategoryDto.setCategoryList(product2CategoryDtoList); } } else { // 根据分类ID 查询分类下的所有二级分类 list = mdcProductCategoryService.getCategoryDtoList(pid); } return WrapMapper.ok(list); } /** * 获取商品列表信息. * * @param productReqDto the product req dto * * @return the product list */ @Override @ApiOperation(httpMethod = "POST", value = "获取商品列表信息") public Wrapper getProductList(@RequestBody ProductReqDto productReqDto) { logger.info("获取商品列表信息. productReqDto={}", productReqDto); Long categoryId = productReqDto.getCategoryId(); String keyword = productReqDto.getKeyword(); Integer pageNum = productReqDto.getPageNum(); Integer pageSize = productReqDto.getPageSize(); String orderBy = productReqDto.getOrderBy(); if (StringUtils.isBlank(keyword) && null == categoryId) { return WrapMapper.ok(new PageInfo()); } List categoryIdList = Lists.newArrayList(); if (categoryId != null) { MdcProductCategory category = mdcProductCategoryService.selectByKey(categoryId); if (category == null && StringUtils.isBlank(keyword)) { // 没有该分类,并且还没有关键字,这个时候返回一个空的结果集,不报错 PageHelper.startPage(pageNum, pageSize); return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, new PageInfo()); } categoryIdList = mdcProductCategoryService.selectCategoryAndChildrenById(categoryId); } PageHelper.startPage(pageNum, pageSize); //排序处理 List productList = mdcProductService.selectByNameAndCategoryIds(StringUtils.isBlank(keyword) ? null : keyword, PublicUtil.isEmpty(categoryIdList) ? null : categoryIdList, orderBy); List productListVoList = Lists.newArrayList(); for (MdcProduct product : productList) { ProductDto productListVo = assembleProductListVo(product); String url = mdcProductService.getMainImage(product.getId()); productListVo.setMainImage(url); productListVoList.add(productListVo); } return PublicUtil.isNotEmpty(productListVoList) ? WrapMapper.ok(new PageInfo<>(productListVoList)) : WrapMapper.ok(); } private ProductDto assembleProductListVo(MdcProduct product) { ProductDto productListVo = new ProductDto(); productListVo.setId(product.getId()); productListVo.setName(product.getName()); productListVo.setCategoryId(product.getId()); productListVo.setImageHost(""); productListVo.setMainImage(product.getMainImage()); productListVo.setPrice(product.getPrice()); productListVo.setSubtitle(product.getSubtitle()); productListVo.setStatus(product.getStatus()); return productListVo; } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcProductFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.google.common.base.Preconditions; import com.paascloud.PubUtils; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.service.MdcProductFeignApi; import com.paascloud.provider.service.MdcProductService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * The class Mdc product feign client. * * @author paascloud.net@gmail.com */ @RefreshScope @RestController @Api(value = "API - UacUserQueryFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcProductFeignClient extends BaseController implements MdcProductFeignApi { @Resource private MdcProductService mdcProductService; @Override @ApiOperation(httpMethod = "POST", value = "更新商品库存") public Wrapper updateProductStockById(@RequestBody ProductDto productDto) { logger.info("更新商品库存. productDto={}", productDto); Preconditions.checkArgument(!PubUtils.isNull(productDto, productDto.getId()), ErrorCodeEnum.MDC10021021.msg()); int result = mdcProductService.updateProductStockById(productDto); return WrapMapper.ok(result); } @Override public Wrapper getMainImage(@RequestParam("productId") Long productId) { String mainImage = mdcProductService.getMainImage(productId); return WrapMapper.ok(mainImage); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/java/com/paascloud/provider/web/rpc/MdcProductQueryFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductQueryFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.PublicUtil; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.MdcProduct; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.vo.ProductDetailVo; import com.paascloud.provider.service.MdcProductQueryFeignApi; import com.paascloud.provider.service.MdcProductService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * The class Mdc product query feign client. * * @author paascloud.net@gmail.com */ @RefreshScope @RestController @Api(value = "API - MdcProductQueryFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MdcProductQueryFeignClient extends BaseController implements MdcProductQueryFeignApi { @Resource private MdcProductService mdcProductService; @Override @ApiOperation(httpMethod = "POST", value = "根据商品ID查询商品详细信息") public Wrapper getProductDetail(@PathVariable("productId") Long productId) { logger.info("根据商品ID查询商品详细信息. productId={}", productId); ProductDetailVo productDto = mdcProductService.getProductDetail(productId); return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, productDto); } @Override @ApiOperation(httpMethod = "POST", value = "根据商品ID查询商品信息") public Wrapper selectById(@PathVariable("productId") Long productId) { logger.info("根据商品ID查询商品信息. productId={}", productId); ProductDto productDto = null; MdcProduct mdcProduct = mdcProductService.selectByKey(productId); if (PublicUtil.isNotEmpty(mdcProduct)) { productDto = new ProductDto(); BeanUtils.copyProperties(mdcProduct, productDto); } return WrapMapper.ok(productDto); } } ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/META-INF/spring-devtools.properties ================================================ restart.include.mapper=/mapper-[\\w-\\.]+jar restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/ValidationMessages.properties ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/application.yml ================================================ server: port: 8030 spring: profiles: active: dev application: name: @pom.artifactId@ datasource: username: root password: 123456 ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/banner.txt ================================================ ${AnsiColor.BRIGHT_CYAN} .__ .___ __ ___________ _____ ______ ____ | | ____ __ __ __| _/ ____ _____/ |_ \____ \__ \ \__ \ / ___// ___\| | / _ \| | \/ __ | / \_/ __ \ __\ | |_> > __ \_/ __ \_\___ \\ \___| |_( <_> ) | / /_/ | | | \ ___/| | | __(____ (____ /____ >\___ >____/\____/|____/\____ | /\ |___| /\___ >__| |__| \/ \/ \/ \/ Powered by liuzhaoming\/ \/ \/ \/ ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/bootstrap.yml ================================================ spring: cloud: config: fail-fast: true discovery: service-id: paascloud-discovery enabled: true label: ${spring.profiles.active} profile: ${spring.profiles.active} username: admin password: admin eureka: client: serviceUrl: defaultZone: http://root:root@paascloud-eureka:8761/eureka/ instance: instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port} ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/conf/liquibase.properties ================================================ spring.datasource.driver-class-name= com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_mdc?characterEncoding=utf8&useSSL=false spring.datasource.username= root spring.datasource.password= 123456 ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/liquibase/index.xml ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/logback-spring.xml ================================================ DEBUG ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE} ${LOG_FILE}.%d{yyyy-MM-dd}.gz 7 ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE}.json ${LOG_FILE}.json.%d{yyyy-MM-dd}.gz 7 UTC { "severity": "%level", "service": "${springAppName:-}", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "parent": "%X{X-B3-ParentSpanId:-}", "exportable": "%X{X-Span-Export:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" } ${LOG_FILE}.sql.%d{yyyy-MM-dd}.gz 10 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-%msg%n ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/mapper/MdcAddressMapper.xml ================================================ id, pid, city_code, ad_code, name, level, polyline, center AND id = #{id,jdbcType=BIGINT} AND pid = #{pid,jdbcType=BIGINT} AND city_code = #{cityCode,jdbcType=VARCHAR} AND ad_code = #{adCode,jdbcType=VARCHAR} AND name = #{name,jdbcType=VARCHAR} AND level = #{level,jdbcType=BIT} AND polyline = #{polyline,jdbcType=VARCHAR} AND center = #{center,jdbcType=VARCHAR} ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/mapper/MdcDictMapper.xml ================================================ ${alias}.id, ${alias}.version, ${alias}.type, ${alias}.dict_key, ${alias}.extend_key, ${alias}.dict_value, ${alias}.dict_code, ${alias}.dict_name, ${alias}.pid, ${alias}.number, ${alias}.status, ${alias}.remark, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/mapper/MdcExceptionLogMapper.xml ================================================ id, application_name, exception_simple_name, exception_message, exception_cause, creator, creator_id, create_time exception_stack ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/mapper/MdcProductCategoryMapper.xml ================================================ ${alias}.id, ${alias}.version, ${alias}.category_code, ${alias}.img_id, ${alias}.pid, ${alias}.name, ${alias}.status, ${alias}.sort_order, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/main/resources/mapper/MdcProductMapper.xml ================================================ ORDER BY ${orderBy} id, version, product_code, category_id, name, subtitle, main_image, price, stock, status, creator, creator_id, created_time, last_operator, last_operator_id, update_time UPDATE pc_mdc_product SET stock = stock + #{changeStock} WHERE id = #{id} ================================================ FILE: paascloud-provider/paascloud-provider-mdc/src/test/java/com/paascloud/provider/PaasCloudMdcApplicationTests.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudMdcApplicationTests.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class PaasCloudMdcApplicationTests { } ================================================ FILE: paascloud-provider/paascloud-provider-omc/pom.xml ================================================ 4.0.0 paascloud-provider-omc jar 1.0 paascloud-provider-omc 订单管理中心 - Order management center com.liuzm.paascloud.provider paascloud-provider 1.0 UTF-8 UTF-8 1.8 mysql mysql-connector-java runtime joda-time joda-time org.mybatis.spring.boot mybatis-spring-boot-starter tk.mybatis mapper-spring-boot-starter com.github.pagehelper pagehelper-spring-boot-starter com.alibaba druid-spring-boot-starter org.springframework.cloud spring-cloud-starter-feign com.fasterxml.jackson.core jackson-databind com.liuzm.paascloud.provider.api paascloud-provider-omc-api com.liuzm.paascloud.provider.api paascloud-provider-mdc-api de.codecentric spring-boot-admin-starter-client com.alipay alipay-sdk-java 20170725114550 com.alipay alipay-trade-sdk 20161215 commons-configuration commons-configuration 1.10 commons-lang commons-lang 2.6 commons-logging commons-logging 1.1.1 com.google.zxing core 2.1 com.google.code.gson gson 2.3.1 org.hamcrest hamcrest-core 1.3 com.liuzm.paascloud.provider.api paascloud-provider-opc-api ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/PaasCloudOmcApplication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudOmcApplication.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import liquibase.integration.spring.SpringLiquibase; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.context.annotation.Bean; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; /** * The class Paas cloud omc application. * * @author paascloud.net@gmail.com */ @EnableCaching @EnableHystrix @EnableFeignClients @EnableDiscoveryClient @SpringBootApplication @EnableTransactionManagement public class PaasCloudOmcApplication { /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { SpringApplication.run(PaasCloudOmcApplication.class, args); } @Bean public SpringLiquibase springLiquibase(DataSource dataSource) { SpringLiquibase springLiquibase = new SpringLiquibase(); springLiquibase.setDataSource(dataSource); springLiquibase.setChangeLog("classpath:/liquibase/index.xml"); return springLiquibase; } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/config/OmcWebMvcConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcWebMvcConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.paascloud.core.config.PcObjectMapper; import com.paascloud.core.config.SwaggerConfiguration; import com.paascloud.core.interceptor.TokenInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import javax.annotation.Resource; import java.util.List; /** * The class Mdc web mvc config. * * @author paascloud.net @gmail.com */ @Configuration @EnableWebMvc @Import(SwaggerConfiguration.class) public class OmcWebMvcConfig extends WebMvcConfigurerAdapter { @Resource private TokenInterceptor vueViewInterceptor; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/"); } /** * Add interceptors. * * @param registry the registry */ @Override public void addInterceptors(InterceptorRegistry registry) { super.addInterceptors(registry); registry.addInterceptor(vueViewInterceptor) .addPathPatterns("/**") .excludePathPatterns("/pay/alipayCallback", "/swagger-resources/**", "*.js", "/**/*.js", "*.css", "/**/*.css", "*.html", "/**/*.html"); } @Override public void configureMessageConverters(List> converters) { PcObjectMapper.buidMvcMessageConverter(converters); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/config/ResourceServerConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ResourceServerConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import javax.servlet.http.HttpServletResponse; /** * The class Resource server config. * * @author paascloud.net @gmail.com */ @Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http .headers().frameOptions().disable() .and() .csrf().disable() .exceptionHandling() .authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED)) .and() .authorizeRequests().antMatchers("/pay/alipayCallback", "/druid/**", "/swagger-ui.html", "/swagger-resources/**", "/v2/api-docs", "/api/applications").permitAll() .anyRequest().authenticated(); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/mapper/OmcCartMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcCartMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.OmcCart; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Omc cart mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface OmcCartMapper extends MyMapper { /** * Select un checked cart product count by user id int. * * @param userId the user id * * @return the int */ int selectUnCheckedCartProductCountByUserId(Long userId); /** * Select by product id and user id omc cart. * * @param productId the product id * @param userId the user id * * @return the omc cart */ OmcCart selectByProductIdAndUserId(@Param("productId") Long productId, @Param("userId") Long userId); /** * Delete by user id product ids int. * * @param userId the user id * @param productIdList the product id list * * @return the int */ int deleteByUserIdProductIds(@Param("userId") Long userId, @Param("productIdList") List productIdList); /** * Checked or unchecked product int. * * @param userId the user id * @param productId the product id * @param checked the checked * * @return the int */ int checkedOrUncheckedProduct(@Param("userId") Long userId, @Param("productId") Long productId, @Param("checked") int checked); /** * Select cart product count int. * * @param userId the user id * * @return the int */ int selectCartProductCount(Long userId); /** * Select checked cart by user id list. * * @param userId the user id * * @return the list */ List selectCheckedCartByUserId(Long userId); /** * Batch delete cart int. * * @param idList the id list * * @return the int */ int batchDeleteCart(@Param("idList") List idList); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/mapper/OmcOrderDetailMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderDetailMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.OmcOrderDetail; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Omc order detail mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface OmcOrderDetailMapper extends MyMapper { /** * Gets list by order no user id. * * @param orderNo the order no * @param userId the user id * * @return the list by order no user id */ List getListByOrderNoUserId(@Param("orderNo") String orderNo, @Param("userId") Long userId); /** * Gets list by order no. * * @param orderNo the order no * * @return the list by order no */ List getListByOrderNo(String orderNo); /** * Batch insert order detail int. * * @param orderItemList the order item list * * @return the int */ int batchInsertOrderDetail(@Param("orderDetailList") List orderItemList); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/mapper/OmcOrderMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.OmcOrder; import com.paascloud.provider.model.dto.OrderPageQuery; import com.paascloud.provider.model.vo.OrderDocVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Omc order mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface OmcOrderMapper extends MyMapper { /** * Select by user id and order no omc order. * * @param userId the user id * @param orderNo the order no * * @return the omc order */ OmcOrder selectByUserIdAndOrderNo(@Param("userId") Long userId, @Param("orderNo") String orderNo); /** * Select by order no omc order. * * @param orderNo the order no * * @return the omc order */ OmcOrder selectByOrderNo(String orderNo); /** * Select by user id list. * * @param userId the user id * * @return the list */ List selectByUserId(Long userId); /** * Select all order list. * * @return the list */ List selectAllOrder(); /** * Query order list with page list. * * @param orderPageQuery the order page query * * @return the list */ List queryOrderListWithPage(OrderPageQuery orderPageQuery); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/mapper/OmcShippingMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcShippingMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.OmcShipping; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Omc shipping mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface OmcShippingMapper extends MyMapper { /** * Delete by shipping id user id int. * * @param userId the user id * @param shippingId the shipping id * * @return the int */ int deleteByShippingIdUserId(@Param("userId") Long userId, @Param("shippingId") Integer shippingId); /** * Select by shipping id user id omc shipping. * * @param userId the user id * @param shippingId the shipping id * * @return the omc shipping */ OmcShipping selectByShippingIdUserId(@Param("userId") Long userId, @Param("shippingId") Long shippingId); /** * Select by user id list. * * @param userId the user id * * @return the list */ List selectByUserId(@Param("userId") Long userId); /** * Select default address by user id omc shipping. * * @param userId the user id * * @return the omc shipping */ OmcShipping selectDefaultAddressByUserId(Long userId); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/mapper/PtcPayInfoMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PtcPayInfoMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.PtcPayInfo; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; /** * The interface Ptc pay info mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface PtcPayInfoMapper extends MyMapper { } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/model/domain/OmcCart.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcCart.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import javax.persistence.Column; import javax.persistence.Table; /** * The class Omc cart. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_omc_cart") public class OmcCart extends BaseEntity { private static final long serialVersionUID = 5333646386138778574L; @Column(name = "user_id") private Long userId; @Column(name = "product_id") private Long productId; /** * 数量 */ private Integer quantity; /** * 是否选择,1=已勾选,0=未勾选 */ private Integer checked; } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/model/domain/OmcOrder.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrder.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import javax.persistence.Column; import javax.persistence.Table; import java.math.BigDecimal; import java.util.Date; /** * The class Omc order. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_omc_order") public class OmcOrder extends BaseEntity { private static final long serialVersionUID = -8434937678211570532L; /** * 订单号 */ @Column(name = "order_no") private String orderNo; /** * 用户id */ @Column(name = "user_id") private Long userId; @Column(name = "shipping_id") private Long shippingId; /** * 实际付款金额,单位是元,保留两位小数 */ private BigDecimal payment; /** * 支付类型,1-在线支付 */ @Column(name = "payment_type") private Integer paymentType; /** * 运费,单位是元 */ private Integer postage; /** * 订单状态:0-已取消-10-未付款, 20-已付款, 40-已发货, 50-交易成功, 60-交易关闭 */ private Integer status; /** * 支付时间 */ @Column(name = "payment_time") private Date paymentTime; /** * 发货时间 */ @Column(name = "send_time") private Date sendTime; /** * 交易完成时间 */ @Column(name = "end_time") private Date endTime; /** * 交易关闭时间 */ @Column(name = "close_time") private Date closeTime; } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/model/domain/OmcOrderDetail.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderDetail.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import javax.persistence.Column; import javax.persistence.Table; import java.math.BigDecimal; /** * The class Omc order detail. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_omc_order_detail") public class OmcOrderDetail extends BaseEntity { private static final long serialVersionUID = -2167960069551022897L; /** * 订单明细序列号 */ @Column(name = "detail_no") private String detailNo; @Column(name = "user_id") private Long userId; @Column(name = "order_no") private String orderNo; @Column(name = "product_id") private Long productId; /** * 商品名称 */ @Column(name = "product_name") private String productName; /** * 商品图片地址 */ @Column(name = "product_image") private String productImage; /** * 生成订单时的商品单价, 单位是元,保留两位小数 */ @Column(name = "current_unit_price") private BigDecimal currentUnitPrice; /** * 商品数量 */ private Integer quantity; /** * 商品总价,单位是元,保留两位小数 */ @Column(name = "total_price") private BigDecimal totalPrice; } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/model/domain/OmcShipping.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcShipping.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import javax.persistence.Column; import javax.persistence.Table; /** * The class Omc shipping. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_omc_shipping") public class OmcShipping extends BaseEntity { private static final long serialVersionUID = 7337074530378267740L; /** * 用户id */ @Column(name = "user_id") private Long userId; /** * 收货姓名 */ @Column(name = "receiver_name") private String receiverName; /** * 收货固定电话 */ @Column(name = "receiver_phone_no") private String receiverPhoneNo; /** * 收货移动电话 */ @Column(name = "receiver_mobile_no") private String receiverMobileNo; /** * 收货人省ID */ @Column(name = "province_id") private Long provinceId; /** * 省份 */ @Column(name = "province_name") private String provinceName; /** * 收货人城市ID */ @Column(name = "city_id") private Long cityId; /** * 收货人城市名称 */ @Column(name = "city_name") private String cityName; /** * 区/县 */ @Column(name = "district_name") private String districtName; /** * 区/县 编码 */ @Column(name = "district_id") private Long districtId; /** * 街道ID */ @Column(name = "street_id") private Long streetId; /** * 接到名称 */ @Column(name = "street_name") private String streetName; /** * 详细地址 */ @Column(name = "detail_address") private String detailAddress; /** * 邮编 */ @Column(name = "receiver_zip_code") private String receiverZipCode; /** * 邮编 */ @Column(name = "default_address") private Integer defaultAddress; } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/model/domain/PtcPayInfo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PtcPayInfo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import javax.persistence.Column; import javax.persistence.Table; /** * The class Ptc pay info. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Table(name = "pc_ptc_pay_info") @Data public class PtcPayInfo extends BaseEntity { private static final long serialVersionUID = 7949091072343450552L; /** * 用户id */ @Column(name = "user_id") private Long userId; /** * 订单号 */ @Column(name = "order_no") private String orderNo; /** * 支付平台:1-支付宝,2-微信 */ @Column(name = "pay_platform") private Integer payPlatform; /** * 支付宝支付流水号 */ @Column(name = "platform_number") private String platformNumber; /** * 支付宝支付状态 */ @Column(name = "platform_status") private String platformStatus; } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/MdcProductService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.vo.ProductDetailVo; /** * The interface Mdc product service. * * @author paascloud.net @gmail.com */ public interface MdcProductService { /** * Select by id product dto. * * @param productId the product id * * @return the product dto */ ProductDto selectById(Long productId); /** * Gets product detail. * * @param productId the product id * * @return the product detail */ ProductDetailVo getProductDetail(Long productId); /** * Update product stock by id int. * * @param productDto the product dto * * @return the int */ int updateProductStockById(ProductDto productDto); /** * Gets main image. * * @param productId the product id * * @return the main image */ String getMainImage(Long productId); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/OmcCartService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcCartService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.OmcCart; import com.paascloud.provider.model.domain.OmcOrderDetail; import com.paascloud.provider.model.vo.CartProductVo; import com.paascloud.provider.model.vo.CartVo; import com.paascloud.provider.model.vo.OrderProductVo; import java.util.List; /** * The interface Omc cart service. * * @author paascloud.net@gmail.com */ public interface OmcCartService extends IService { /** * 获取购物车信息. * * @param userId the user id * * @return the car vo */ CartVo getCarVo(Long userId); /** * Select cart list by user id list. * * @param userId the user id * * @return the list */ List selectCartListByUserId(Long userId); /** * 更新购物车. * * @param cartProductVoList the cart product vo list * * @return the int */ int updateCartList(List cartProductVoList); /** * Save cart. * * @param omcCart the omc cart * @param authDto the auth dto */ void saveCart(OmcCart omcCart, LoginAuthDto authDto); /** * 保存购物车信息. * * @param userId the user id * @param productId the product id * @param count the count * * @return the int */ int saveCart(Long userId, Long productId, int count); /** * Gets cart by user id and product id. * * @param userId the user id * @param productId the product id * * @return the cart by user id and product id */ OmcCart getCartByUserIdAndProductId(Long userId, Long productId); /** * 删除购物车商品信息. * * @param userId the user id * @param productIds the product ids * * @return the int */ int deleteProduct(Long userId, String productIds); /** * 选中或者反选商品信息. * * @param userId the user id * @param productId the product id * @param checked the checked * * @return the int */ int selectOrUnSelect(Long userId, Long productId, int checked); /** * 更新购物车信息. * * @param userId the user id * @param productId the product id * @param count the count * * @return the int */ int updateCart(Long userId, Long productId, int count); /** * 获取购物车商品数量. * * @param userId the user id * * @return the or cart product */ OrderProductVo getOrderCartProduct(Long userId); /** * Gets cart order item. * * @param userId the user id * @param cartList the cart list * * @return the cart order item */ List getCartOrderItem(Long userId, List cartList); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/OmcOrderDetailService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderDetailService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.OmcOrderDetail; import java.util.List; /** * The interface Omc order detail service. * * @author paascloud.net@gmail.com */ public interface OmcOrderDetailService extends IService { /** * 获取用户订单详情. * * @param orderNo the order no * @param userId the user id * * @return the list by order no user id */ List getListByOrderNoUserId(String orderNo, Long userId); /** * Gets list by order no. * * @param orderNo the order no * * @return the list by order no */ List getListByOrderNo(String orderNo); /** * Batch insert order detail. * * @param omcOrderDetailList the omc order detail list */ void batchInsertOrderDetail(List omcOrderDetailList); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/OmcOrderService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.BaseQuery; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.OmcOrder; import com.paascloud.provider.model.dto.OrderDto; import com.paascloud.provider.model.dto.OrderPageQuery; import com.paascloud.provider.model.vo.OrderVo; /** * The interface Omc order service. * * @author paascloud.net @gmail.com */ public interface OmcOrderService extends IService { /** * 创建订单. * * @param loginAuthDto the login auth dto * @param shippingId the shipping id * * @return the order vo */ OrderVo createOrderDoc(LoginAuthDto loginAuthDto, Long shippingId); /** * 取消订单. * * @param loginAuthDto the login auth dto * @param orderNo the order no * * @return the int */ int cancelOrderDoc(LoginAuthDto loginAuthDto, String orderNo); /** * 查询用户订单列表. * * @param userId the user id * @param baseQuery the base query * * @return the page info */ PageInfo queryUserOrderListWithPage(Long userId, BaseQuery baseQuery); /** * 查询订单状态. * * @param userId the user id * @param orderNo the order no * * @return the boolean */ boolean queryOrderPayStatus(Long userId, String orderNo); /** * Query by order no omc order. * * @param orderNo the order no * * @return the omc order */ OmcOrder queryByOrderNo(String orderNo); /** * Query by user id and order no omc order. * * @param userId the user id * @param orderNo the order no * * @return the omc order */ OmcOrder queryByUserIdAndOrderNo(Long userId, String orderNo); /** * 根据订单号查询订单信息. * * @param orderNo the order no * * @return the order dto */ OrderDto queryOrderDtoByOrderNo(String orderNo); /** * 根据订单号查询用户订单信息. * * @param userId the user id * @param orderNo the order no * * @return the order dto */ OrderDto queryOrderDtoByUserIdAndOrderNo(Long userId, String orderNo); /** * 查询用户订单详情. * * @param userId the user id * @param orderNo the order no * * @return the order detail */ OrderVo getOrderDetail(Long userId, String orderNo); /** * 查询订单详情. * * @param orderNo the order no * * @return the order detail */ OrderVo getOrderDetail(String orderNo); /** * 分页查询订单列表. * * @param orderPageQuery the order page query * * @return the page info */ PageInfo queryOrderListWithPage(OrderPageQuery orderPageQuery); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/OmcShippingService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcShippingService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.OmcShipping; import java.util.List; /** * The interface Omc shipping service. * * @author paascloud.net@gmail.com */ public interface OmcShippingService extends IService { /** * 编辑收货人地址. * * @param loginAuthDto the login auth dto * @param shipping the shipping * * @return the int */ int saveShipping(LoginAuthDto loginAuthDto, OmcShipping shipping); /** * 删除收货人地址. * * @param userId the user id * @param shippingId the shipping id * * @return the int */ int deleteShipping(Long userId, Integer shippingId); /** * 根据Id查询收货人地址. * * @param userId the user id * @param shippingId the shipping id * * @return the omc shipping */ OmcShipping selectByShippingIdUserId(Long userId, Long shippingId); /** * Query shipping list list. * * @param omcShipping the omc shipping * * @return the list */ List queryShippingList(OmcShipping omcShipping); /** * 分页查询收货人地址列表. * * @param omcShipping the omc shipping * * @return the page info */ PageInfo queryShippingListWithPage(OmcShipping omcShipping); /** * 分页查询当前用户收货人地址列表. * * @param userId the user id * @param pageNum the page num * @param pageSize the page size * * @return the page info */ PageInfo queryListWithPageByUserId(Long userId, int pageNum, int pageSize); /** * Select by user id list. * * @param userId the user id * * @return the list */ List selectByUserId(Long userId); /** * 设置默认收货地址. * * @param loginAuthDto the login auth dto * @param addressId the address id * * @return the default address */ int setDefaultAddress(LoginAuthDto loginAuthDto, Long addressId); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/OpcOssService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcOssService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.oss.OptGetUrlRequest; import com.paascloud.provider.model.dto.oss.OptUploadFileReqDto; import com.paascloud.provider.model.dto.oss.OptUploadFileRespDto; /** * The interface Opc oss service. * * @author paascloud.net@gmail.com */ public interface OpcOssService { /** * Upload file opt upload file resp dto. * * @param optUploadFileReqDto the opt upload file req dto * * @return the opt upload file resp dto */ OptUploadFileRespDto uploadFile(OptUploadFileReqDto optUploadFileReqDto); /** * Gets file url. * * @param optGetUrlRequest the opt get url request * * @return the file url */ String getFileUrl(OptGetUrlRequest optGetUrlRequest); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/PtcAlipayService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PtcAlipayService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.wrapper.Wrapper; import java.util.Map; /** * The interface Ptc alipay service. * * @author paascloud.net@gmail.com */ public interface PtcAlipayService { /** * 生成付款二维码. * * @param orderNo the order no * @param loginAuthDto the login auth dto * * @return the wrapper */ Wrapper pay(String orderNo, LoginAuthDto loginAuthDto); /** * Ali pay callback wrapper. * * @param params the params * * @return the wrapper */ Wrapper aliPayCallback(Map params); } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/PtcPayInfoService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PtcPayInfoService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.PtcPayInfo; /** * The interface Ptc pay info service. * * @author paascloud.net@gmail.com */ public interface PtcPayInfoService extends IService { } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/MdcProductServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.exceptions.MdcBizException; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.vo.ProductDetailVo; import com.paascloud.provider.service.MdcProductFeignApi; import com.paascloud.provider.service.MdcProductQueryFeignApi; import com.paascloud.provider.service.MdcProductService; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * The class Mdc product service. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class MdcProductServiceImpl implements MdcProductService { @Resource private MdcProductQueryFeignApi mdcProductQueryFeignApi; @Resource private MdcProductFeignApi mdcProductFeignApi; @Override public ProductDto selectById(Long productId) { log.info("查询商品信息. productId={}", productId); Preconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg()); Wrapper productDtoWrapper = mdcProductQueryFeignApi.selectById(productId); if (productDtoWrapper == null) { throw new MdcBizException(ErrorCodeEnum.MDC10021003); } if (productDtoWrapper.error()) { throw new MdcBizException(ErrorCodeEnum.MDC10021004, productId); } return productDtoWrapper.getResult(); } @Override public ProductDetailVo getProductDetail(Long productId) { log.info("获取商品详情. productId={}", productId); Preconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg()); Wrapper wrapper = mdcProductQueryFeignApi.getProductDetail(productId); if (wrapper == null) { throw new MdcBizException(ErrorCodeEnum.GL99990002); } if (wrapper.error()) { throw new MdcBizException(ErrorCodeEnum.MDC10021004, productId); } return wrapper.getResult(); } @Override public int updateProductStockById(ProductDto productDto) { Preconditions.checkArgument(productDto.getId() != null, ErrorCodeEnum.MDC10021021.msg()); Wrapper wrapper = mdcProductFeignApi.updateProductStockById(productDto); if (wrapper == null) { throw new MdcBizException(ErrorCodeEnum.GL99990002); } if (wrapper.error()) { throw new MdcBizException(ErrorCodeEnum.MDC10021022, productDto.getId()); } return wrapper.getResult(); } @Override public String getMainImage(final Long productId) { Wrapper wrapper = mdcProductFeignApi.getMainImage(productId); if (wrapper == null) { throw new MdcBizException(ErrorCodeEnum.GL99990002); } return wrapper.getResult(); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/OmcCartServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcCartServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.google.common.base.Splitter; import com.google.common.collect.Lists; import com.paascloud.BigDecimalUtil; import com.paascloud.PublicUtil; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.exceptions.MdcBizException; import com.paascloud.provider.exceptions.OmcBizException; import com.paascloud.provider.mapper.OmcCartMapper; import com.paascloud.provider.model.constant.MdcApiConstant; import com.paascloud.provider.model.constant.OmcApiConstant; import com.paascloud.provider.model.domain.OmcCart; import com.paascloud.provider.model.domain.OmcOrderDetail; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.dto.oss.OptGetUrlRequest; import com.paascloud.provider.model.vo.CartProductVo; import com.paascloud.provider.model.vo.CartVo; import com.paascloud.provider.model.vo.OrderItemVo; import com.paascloud.provider.model.vo.OrderProductVo; import com.paascloud.provider.service.MdcProductService; import com.paascloud.provider.service.OmcCartService; import com.paascloud.provider.service.OpcOssService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.List; /** * The class Omc cart service. * * @author paascloud.net@gmail.com */ @Service public class OmcCartServiceImpl extends BaseService implements OmcCartService { @Resource private OmcCartMapper omcCartMapper; @Resource private MdcProductService mdcProductService; @Resource private OpcOssService opcOssService; @Override public CartVo getCarVo(Long userId) { logger.info("getCarVo - 获取购物车列表 -- userId={}", userId); CartVo cartVo = new CartVo(); List cartList = this.selectCartListByUserId(userId); List cartProductVoList = Lists.newArrayList(); BigDecimal cartTotalPrice = new BigDecimal("0"); if (PublicUtil.isNotEmpty(cartList)) { for (OmcCart cartItem : cartList) { CartProductVo cartProductVo = new CartProductVo(); cartProductVo.setId(cartItem.getId()); cartProductVo.setUserId(userId); cartProductVo.setProductId(cartItem.getProductId()); ProductDto product = mdcProductService.selectById(cartItem.getProductId()); if (product == null) { throw new MdcBizException(ErrorCodeEnum.MDC10021004, cartItem.getProductId()); } cartProductVo.setProductMainImage(product.getMainImage()); cartProductVo.setProductName(product.getName()); cartProductVo.setProductSubtitle(product.getSubtitle()); cartProductVo.setProductStatus(product.getStatus()); cartProductVo.setProductPrice(product.getPrice()); cartProductVo.setProductStock(product.getStock()); //判断库存 int buyLimitCount; if (product.getStock() >= cartItem.getQuantity()) { //库存充足的时候 buyLimitCount = cartItem.getQuantity(); cartProductVo.setLimitQuantity(OmcApiConstant.Cart.LIMIT_NUM_SUCCESS); } else { buyLimitCount = product.getStock(); cartProductVo.setLimitQuantity(OmcApiConstant.Cart.LIMIT_NUM_FAIL); //购物车中更新有效库存 OmcCart cartForQuantity = new OmcCart(); cartForQuantity.setId(cartItem.getId()); cartForQuantity.setQuantity(buyLimitCount); omcCartMapper.updateByPrimaryKeySelective(cartForQuantity); } cartProductVo.setQuantity(buyLimitCount); //计算总价 cartProductVo.setProductTotalPrice(BigDecimalUtil.mul(product.getPrice().doubleValue(), cartProductVo.getQuantity())); cartProductVo.setChecked(cartItem.getChecked()); if (cartItem.getChecked() == OmcApiConstant.Cart.CHECKED) { //如果已经勾选,增加到整个的购物车总价中 cartTotalPrice = BigDecimalUtil.add(cartTotalPrice.doubleValue(), cartProductVo.getProductTotalPrice().doubleValue()); } cartProductVoList.add(cartProductVo); } } cartVo.setCartTotalPrice(cartTotalPrice); cartVo.setCartProductVoList(cartProductVoList); cartVo.setAllChecked(this.getAllCheckedStatus(userId)); return cartVo; } @Override public List selectCartListByUserId(Long userId) { logger.info("selectCartListByUserId - 查询购物车记录 userId={}", userId); Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); OmcCart omcCart = new OmcCart(); omcCart.setUserId(userId); return omcCartMapper.select(omcCart); } @Override public int updateCartList(List cartProductVoList) { logger.info("updateCartList - 更新购物车集合 cartProductVoList={}", cartProductVoList); LoginAuthDto loginUser = new LoginAuthDto(); loginUser.setLoginName(GlobalConstant.Sys.SUPER_MANAGER_LOGIN_NAME); loginUser.setUserId(1L); for (CartProductVo cartProductVo : cartProductVoList) { Integer quantity = cartProductVo.getQuantity(); Integer productChecked = cartProductVo.getChecked(); Long productId = cartProductVo.getProductId(); ProductDto productDto = mdcProductService.selectById(productId); if (PublicUtil.isEmpty(productDto)) { throw new MdcBizException(ErrorCodeEnum.MDC10021004, productId); } OmcCart omcCart = new OmcCart(); omcCart.setUserId(loginUser.getUserId()); omcCart.setQuantity(quantity); omcCart.setChecked(productChecked); omcCart.setProductId(productId); omcCart.setQuantity(quantity); this.saveCart(omcCart, loginUser); } return 1; } @Override public void saveCart(OmcCart omcCart, LoginAuthDto authDto) { logger.info("saveCart - 保存购物车记录 omcCart={}, userId={}", omcCart, authDto.getUserId()); Long productId = omcCart.getProductId(); Long userId = authDto.getUserId(); Preconditions.checkArgument(productId != null, "货品ID不能为空"); Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); omcCart.setUpdateInfo(authDto); OmcCart omcCartExist = omcCartMapper.selectByProductIdAndUserId(productId, userId); if (PublicUtil.isEmpty(omcCartExist)) { try { omcCartMapper.insertSelective(omcCart); } catch (Exception e) { logger.error("新增购物车, 出现异常={}", e.getMessage(), e); } return; } omcCart.setId(omcCartExist.getId()); omcCart.setQuantity(omcCart.getQuantity() + omcCartExist.getQuantity()); int updateResult = omcCartMapper.updateByPrimaryKeySelective(omcCart); if (updateResult < 1) { throw new OmcBizException(ErrorCodeEnum.OMC10031014, omcCartExist.getId()); } } @Override public int saveCart(Long userId, Long productId, int count) { logger.info("saveCart - 保存购物车记录 userId={}, productId={}, count={}", userId, productId, count); Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); Preconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg()); Preconditions.checkArgument(count != 0, "数量不符"); int resultInt = 0; OmcCart cart = this.getCartByUserIdAndProductId(userId, productId); if (cart == null) { cart = new OmcCart(); cart.setQuantity(count); cart.setChecked(OmcApiConstant.Cart.CHECKED); cart.setProductId(productId); cart.setUserId(userId); resultInt = omcCartMapper.insertSelective(cart); } else { count = cart.getQuantity() == null ? 0 : cart.getQuantity() + count; cart.setQuantity(count); omcCartMapper.updateByPrimaryKeySelective(cart); } return resultInt; } @Override public OmcCart getCartByUserIdAndProductId(Long userId, Long productId) { logger.info("getCartByUserIdAndProductId - 查询购物车记录 userId={}, productId={}", userId, productId); Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); Preconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg()); return omcCartMapper.selectByProductIdAndUserId(productId, userId); } @Override public int deleteProduct(Long userId, String productIds) { logger.info("deleteProduct - 删除购物车记录 userId={}, productIds={}", userId, productIds); Preconditions.checkArgument(StringUtils.isNotEmpty(productIds), ErrorCodeEnum.MDC10021021.msg()); List productList = Splitter.on(",").splitToList(productIds); Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); return omcCartMapper.deleteByUserIdProductIds(userId, productList); } @Override public int selectOrUnSelect(Long userId, Long productId, int checked) { logger.info("selectOrUnSelect - 选中购物车记录 userId={}, productId={}, checked={}", userId, productId, checked); Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); return omcCartMapper.checkedOrUncheckedProduct(userId, productId, checked); } @Override public int updateCart(Long userId, Long productId, int count) { logger.info("updateCart - 更新货品数量 userId={}, productId={}, count={}", userId, productId, count); Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); Preconditions.checkArgument(productId != null, ErrorCodeEnum.MDC10021021.msg()); int resultInt; OmcCart cart = this.getCartByUserIdAndProductId(userId, productId); if (cart == null) { logger.error("找不到商品信息, userId={}, productId={}", userId, productId); throw new MdcBizException(ErrorCodeEnum.MDC10021004, productId); } if (count == 0) { List productList = Lists.newArrayList(); productList.add(productId.toString()); resultInt = omcCartMapper.deleteByUserIdProductIds(userId, productList); } else { cart.setQuantity(count); resultInt = omcCartMapper.updateByPrimaryKeySelective(cart); } return resultInt; } @Override public OrderProductVo getOrderCartProduct(Long userId) { Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); OrderProductVo orderProductVo = new OrderProductVo(); List omcCartList = omcCartMapper.selectCheckedCartByUserId(userId); List orderItemList = this.getCartOrderItem(userId, omcCartList); List orderItemVoList = Lists.newArrayList(); BigDecimal payment = new BigDecimal("0"); for (OmcOrderDetail orderItem : orderItemList) { payment = BigDecimalUtil.add(payment.doubleValue(), orderItem.getTotalPrice().doubleValue()); final OptGetUrlRequest request = new OptGetUrlRequest(); request.setAttachmentId(Long.valueOf(orderItem.getProductImage())); request.setEncrypt(true); String fileUrl = opcOssService.getFileUrl(request); OrderItemVo orderItemVo = assembleOrderItemVo(orderItem); orderItemVo.setProductImage(fileUrl); orderItemVoList.add(orderItemVo); } orderProductVo.setProductTotalPrice(payment); orderProductVo.setOrderItemVoList(orderItemVoList); return orderProductVo; } private boolean getAllCheckedStatus(Long userId) { Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); return omcCartMapper.selectUnCheckedCartProductCountByUserId(userId) == 0; } @Override public List getCartOrderItem(Long userId, List cartList) { List orderItemList = Lists.newArrayList(); if (CollectionUtils.isEmpty(cartList)) { throw new OmcBizException(ErrorCodeEnum.OMC10031001, userId); } //校验购物车的数据,包括产品的状态和数量 for (OmcCart cartItem : cartList) { OmcOrderDetail orderDetail = new OmcOrderDetail(); ProductDto product = mdcProductService.selectById(cartItem.getProductId()); if (MdcApiConstant.ProductStatusEnum.ON_SALE.getCode() != product.getStatus()) { logger.error("商品不是在线售卖状态, productId={}", product.getId()); throw new OmcBizException(ErrorCodeEnum.MDC10021015, product.getId()); } //校验库存 if (cartItem.getQuantity() > product.getStock()) { logger.error("商品库存不足, productId={}", product.getId()); throw new OmcBizException(ErrorCodeEnum.MDC10021016, product.getId()); } orderDetail.setUserId(userId); orderDetail.setProductId(product.getId()); orderDetail.setProductName(product.getName()); orderDetail.setProductImage(product.getMainImage()); orderDetail.setCurrentUnitPrice(product.getPrice()); orderDetail.setQuantity(cartItem.getQuantity()); orderDetail.setTotalPrice(BigDecimalUtil.mul(product.getPrice().doubleValue(), cartItem.getQuantity())); orderItemList.add(orderDetail); } return orderItemList; } private OrderItemVo assembleOrderItemVo(OmcOrderDetail orderItem) { OrderItemVo orderItemVo = new OrderItemVo(); orderItemVo.setOrderNo(orderItem.getOrderNo()); orderItemVo.setProductId(orderItem.getProductId()); orderItemVo.setProductName(orderItem.getProductName()); orderItemVo.setProductImage(orderItem.getProductImage()); orderItemVo.setCurrentUnitPrice(orderItem.getCurrentUnitPrice()); orderItemVo.setQuantity(orderItem.getQuantity()); orderItemVo.setTotalPrice(orderItem.getTotalPrice()); orderItemVo.setCreateTime(orderItem.getCreatedTime()); return orderItemVo; } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/OmcOrderDetailServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderDetailServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.exceptions.OmcBizException; import com.paascloud.provider.mapper.OmcOrderDetailMapper; import com.paascloud.provider.model.domain.OmcOrderDetail; import com.paascloud.provider.service.OmcOrderDetailService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /** * The class Omc order detail service. * * @author paascloud.net@gmail.com */ @Service public class OmcOrderDetailServiceImpl extends BaseService implements OmcOrderDetailService { @Resource private OmcOrderDetailMapper omcOrderDetailMapper; @Override public List getListByOrderNoUserId(String orderNo, Long userId) { Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); Preconditions.checkArgument(StringUtils.isNotEmpty(orderNo), "订单号不能为空"); return omcOrderDetailMapper.getListByOrderNoUserId(orderNo, userId); } @Override public List getListByOrderNo(String orderNo) { Preconditions.checkArgument(StringUtils.isNotEmpty(orderNo), "订单号不能为空"); return omcOrderDetailMapper.getListByOrderNo(orderNo); } @Override public void batchInsertOrderDetail(List omcOrderDetailList) { int insertResult = omcOrderDetailMapper.batchInsertOrderDetail(omcOrderDetailList); if (insertResult < omcOrderDetailList.size()) { throw new OmcBizException(ErrorCodeEnum.OMC10031009); } } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/OmcOrderServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.paascloud.BigDecimalUtil; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.BaseQuery; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.exceptions.OmcBizException; import com.paascloud.provider.mapper.OmcCartMapper; import com.paascloud.provider.mapper.OmcOrderMapper; import com.paascloud.provider.mapper.OmcShippingMapper; import com.paascloud.provider.model.constant.OmcApiConstant; import com.paascloud.provider.model.domain.OmcCart; import com.paascloud.provider.model.domain.OmcOrder; import com.paascloud.provider.model.domain.OmcOrderDetail; import com.paascloud.provider.model.domain.OmcShipping; import com.paascloud.provider.model.dto.OrderDto; import com.paascloud.provider.model.dto.OrderPageQuery; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.vo.OrderDocVo; import com.paascloud.provider.model.vo.OrderItemVo; import com.paascloud.provider.model.vo.OrderVo; import com.paascloud.provider.model.vo.ShippingVo; import com.paascloud.provider.service.MdcProductService; import com.paascloud.provider.service.OmcCartService; import com.paascloud.provider.service.OmcOrderDetailService; import com.paascloud.provider.service.OmcOrderService; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.List; import java.util.Objects; /** * The class Omc order service. * * @author paascloud.net@gmail.com */ @Service public class OmcOrderServiceImpl extends BaseService implements OmcOrderService { @Resource private OmcOrderMapper omcOrderMapper; @Resource private OmcCartMapper omcCartMapper; @Resource private OmcShippingMapper omcShippingMapper; @Resource private OmcCartService omcCartService; @Resource private OmcOrderDetailService omcOrderDetailService; @Resource private MdcProductService mdcProductService; @Override @Transactional(rollbackFor = Exception.class) public OrderVo createOrderDoc(LoginAuthDto loginAuthDto, Long shippingId) { Long userId = loginAuthDto.getUserId(); //从购物车中获取数据 List cartList = omcCartMapper.selectCheckedCartByUserId(userId); if (CollectionUtils.isEmpty(cartList)) { throw new OmcBizException(ErrorCodeEnum.OMC10031001, userId); } //计算这个订单的总价 List omcOrderDetailList = omcCartService.getCartOrderItem(userId, cartList); if (CollectionUtils.isEmpty(omcOrderDetailList)) { throw new OmcBizException(ErrorCodeEnum.OMC10031001, userId); } BigDecimal payment = this.getOrderTotalPrice(omcOrderDetailList); //生成订单 OmcOrder order = this.assembleOrder(userId, shippingId, payment); if (order == null) { logger.error("生成订单失败, userId={}, shippingId={}, payment={}", userId, shippingId, payment); throw new OmcBizException(ErrorCodeEnum.OMC10031002); } order.setUpdateInfo(loginAuthDto); for (OmcOrderDetail orderDetail : omcOrderDetailList) { orderDetail.setUpdateInfo(loginAuthDto); orderDetail.setOrderNo(order.getOrderNo()); orderDetail.setId(super.generateId()); orderDetail.setUpdateInfo(loginAuthDto); } //mybatis 批量插入 omcOrderDetailService.batchInsertOrderDetail(omcOrderDetailList); //生成成功,我们要减少我们产品的库存 this.reduceProductStock(omcOrderDetailList); //清空一下购物车 this.cleanCart(cartList); //返回给前端数据 return assembleOrderVo(order, omcOrderDetailList); } @Override public int cancelOrderDoc(LoginAuthDto loginAuthDto, String orderNo) { Long userId = loginAuthDto.getUserId(); OmcOrder order = omcOrderMapper.selectByUserIdAndOrderNo(userId, orderNo); if (order == null) { logger.error("该用户此订单不存在, userId={}, orderNo={}", userId, orderNo); throw new OmcBizException(ErrorCodeEnum.OMC10031003); } if (order.getStatus() != OmcApiConstant.OrderStatusEnum.NO_PAY.getCode()) { throw new OmcBizException(ErrorCodeEnum.OMC10031004); } OmcOrder updateOrder = new OmcOrder(); updateOrder.setId(order.getId()); updateOrder.setStatus(OmcApiConstant.OrderStatusEnum.CANCELED.getCode()); return omcOrderMapper.updateByPrimaryKeySelective(updateOrder); } @Override public PageInfo queryUserOrderListWithPage(Long userId, BaseQuery baseQuery) { PageHelper.startPage(baseQuery.getPageNum(), baseQuery.getPageSize()); List orderList = omcOrderMapper.selectByUserId(userId); List orderVoList = assembleOrderVoList(orderList, userId); return new PageInfo<>(orderVoList); } @Override public boolean queryOrderPayStatus(Long userId, String orderNo) { OmcOrder order = omcOrderMapper.selectByUserIdAndOrderNo(userId, orderNo); if (order == null) { throw new OmcBizException(ErrorCodeEnum.OMC10031003); } return order.getStatus() >= OmcApiConstant.OrderStatusEnum.PAID.getCode(); } @Override public OmcOrder queryByOrderNo(String orderNo) { Preconditions.checkArgument(StringUtils.isNotEmpty(orderNo), "订单号不能为空"); return omcOrderMapper.selectByOrderNo(orderNo); } @Override public OmcOrder queryByUserIdAndOrderNo(Long userId, String orderNo) { Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); Preconditions.checkArgument(StringUtils.isNotEmpty(orderNo), "订单号不能为空"); return omcOrderMapper.selectByUserIdAndOrderNo(userId, orderNo); } @Override public OrderDto queryOrderDtoByOrderNo(String orderNo) { OmcOrder omcOrder = this.queryByOrderNo(orderNo); if (omcOrder == null) { throw new OmcBizException(ErrorCodeEnum.OMC10031005, orderNo); } ModelMapper modelMapper = new ModelMapper(); return modelMapper.map(omcOrder, OrderDto.class); } @Override public OrderDto queryOrderDtoByUserIdAndOrderNo(Long userId, String orderNo) { OmcOrder omcOrder = this.queryByUserIdAndOrderNo(userId, orderNo); if (omcOrder == null) { throw new OmcBizException(ErrorCodeEnum.OMC10031005, orderNo); } ModelMapper modelMapper = new ModelMapper(); return modelMapper.map(omcOrder, OrderDto.class); } private BigDecimal getOrderTotalPrice(List orderItemList) { BigDecimal payment = new BigDecimal("0"); for (OmcOrderDetail orderItem : orderItemList) { payment = BigDecimalUtil.add(payment.doubleValue(), orderItem.getTotalPrice().doubleValue()); } return payment; } private OmcOrder assembleOrder(Long userId, Long shippingId, BigDecimal payment) { OmcOrder order = new OmcOrder(); long orderNo = this.generateOrderNo(); order.setOrderNo(String.valueOf(orderNo)); order.setStatus(OmcApiConstant.OrderStatusEnum.NO_PAY.getCode()); order.setPostage(0); order.setPaymentType(GlobalConstant.PaymentTypeEnum.ONLINE_PAY.getCode()); order.setPayment(payment); order.setUserId(userId); order.setShippingId(shippingId); order.setId(super.generateId()); //发货时间等等 //付款时间等等 int rowCount = omcOrderMapper.insertSelective(order); if (rowCount > 0) { return order; } return null; } private long generateOrderNo() { return super.generateId(); } private OrderVo assembleOrderVo(OmcOrder order, List orderItemList) { OrderVo orderVo = new OrderVo(); orderVo.setOrderNo(order.getOrderNo()); orderVo.setPayment(order.getPayment()); orderVo.setPaymentType(order.getPaymentType()); orderVo.setPaymentTypeDesc(Objects.requireNonNull(GlobalConstant.PaymentTypeEnum.codeOf(order.getPaymentType())).getValue()); orderVo.setPostage(order.getPostage()); orderVo.setStatus(order.getStatus()); orderVo.setStatusDesc(OmcApiConstant.OrderStatusEnum.codeOf(order.getStatus()).getValue()); orderVo.setShippingId(order.getShippingId()); OmcShipping shipping = omcShippingMapper.selectByPrimaryKey(order.getShippingId()); if (shipping != null) { orderVo.setReceiverName(shipping.getReceiverName()); orderVo.setShippingVo(assembleShippingVo(shipping)); } orderVo.setPaymentTime(order.getPaymentTime()); orderVo.setSendTime(order.getSendTime()); orderVo.setEndTime(order.getEndTime()); orderVo.setCreateTime(order.getCreatedTime()); orderVo.setCloseTime(order.getCloseTime()); orderVo.setCreator(order.getCreator()); orderVo.setImageHost(""); List orderItemVoList = Lists.newArrayList(); for (OmcOrderDetail orderItem : orderItemList) { OrderItemVo orderItemVo = assembleOrderItemVo(orderItem); orderItemVoList.add(orderItemVo); } orderVo.setOrderItemVoList(orderItemVoList); return orderVo; } private ShippingVo assembleShippingVo(OmcShipping shipping) { ShippingVo shippingVo = new ShippingVo(); shippingVo.setReceiverName(shipping.getReceiverName()); shippingVo.setReceiverAddress(shipping.getDetailAddress()); shippingVo.setReceiverProvince(shipping.getProvinceName()); shippingVo.setReceiverCity(shipping.getCityName()); shippingVo.setReceiverDistrict(shipping.getDistrictName()); shippingVo.setReceiverMobile(shipping.getReceiverMobileNo()); shippingVo.setReceiverZip(shipping.getReceiverZipCode()); shippingVo.setReceiverPhone(shippingVo.getReceiverPhone()); return shippingVo; } private OrderItemVo assembleOrderItemVo(OmcOrderDetail orderItem) { logger.info("订单信息 orderItem={}", orderItem); OrderItemVo orderItemVo = new OrderItemVo(); orderItemVo.setOrderNo(orderItem.getOrderNo()); orderItemVo.setProductId(orderItem.getProductId()); orderItemVo.setProductName(orderItem.getProductName()); // 查询商品的头图 String url = mdcProductService.getMainImage(orderItem.getProductId()); orderItemVo.setProductImage(url); orderItemVo.setCurrentUnitPrice(orderItem.getCurrentUnitPrice()); orderItemVo.setQuantity(orderItem.getQuantity()); orderItemVo.setTotalPrice(orderItem.getTotalPrice()); orderItemVo.setCreateTime(orderItem.getCreatedTime()); return orderItemVo; } private void reduceProductStock(List omcOrderDetailList) { for (OmcOrderDetail orderItem : omcOrderDetailList) { ProductDto product = mdcProductService.selectById(orderItem.getProductId()); product.setChangeStock(0 - orderItem.getQuantity()); mdcProductService.updateProductStockById(product); } } private void cleanCart(List cartList) { List idList = Lists.newArrayList(); for (OmcCart cart : cartList) { idList.add(cart.getId()); } int deleteCount = omcCartMapper.batchDeleteCart(idList); if (deleteCount < idList.size()) { throw new OmcBizException(ErrorCodeEnum.OMC10031006); } } private List assembleOrderVoList(List orderList, Long userId) { List orderVoList = Lists.newArrayList(); for (OmcOrder order : orderList) { List orderItemList; if (userId == null) { orderItemList = omcOrderDetailService.getListByOrderNo(order.getOrderNo()); } else { orderItemList = omcOrderDetailService.getListByOrderNoUserId(order.getOrderNo(), userId); } OrderVo orderVo = assembleOrderVo(order, orderItemList); orderVoList.add(orderVo); } return orderVoList; } @Override public OrderVo getOrderDetail(Long userId, String orderNo) { logger.info("获取订单明细, userId={}, orderNo={}", userId, orderNo); OmcOrder order = omcOrderMapper.selectByUserIdAndOrderNo(userId, orderNo); if (null == order) { throw new OmcBizException(ErrorCodeEnum.OMC10031005, orderNo); } List orderItemList = omcOrderDetailService.getListByOrderNoUserId(orderNo, userId); return assembleOrderVo(order, orderItemList); } @Override public OrderVo getOrderDetail(final String orderNo) { logger.info("获取订单明细, orderNo={}", orderNo); OmcOrder order = omcOrderMapper.selectByOrderNo(orderNo); if (null == order) { throw new OmcBizException(ErrorCodeEnum.OMC10031005, orderNo); } List orderItemList = omcOrderDetailService.getListByOrderNo(orderNo); return assembleOrderVo(order, orderItemList); } @Override public PageInfo queryOrderListWithPage(final OrderPageQuery orderPageQuery) { PageHelper.startPage(orderPageQuery.getPageNum(), orderPageQuery.getPageSize()); List orderList = omcOrderMapper.queryOrderListWithPage(orderPageQuery); return new PageInfo<>(orderList); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/OmcShippingServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcShippingServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.base.Preconditions; import com.paascloud.PublicUtil; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.exceptions.OmcBizException; import com.paascloud.provider.mapper.OmcShippingMapper; import com.paascloud.provider.model.constant.OmcApiConstant; import com.paascloud.provider.model.domain.OmcShipping; import com.paascloud.provider.service.OmcShippingService; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * The class Omc shipping service. * * @author paascloud.net@gmail.com */ @Service public class OmcShippingServiceImpl extends BaseService implements OmcShippingService { @Resource private OmcShippingMapper omcShippingMapper; @Override public int saveShipping(LoginAuthDto loginAuthDto, OmcShipping shipping) { int resultInt; shipping.setUpdateInfo(loginAuthDto); if (shipping.isNew()) { resultInt = omcShippingMapper.insertSelective(shipping); } else { resultInt = omcShippingMapper.updateByPrimaryKeySelective(shipping); } return resultInt; } @Override public int deleteShipping(Long userId, Integer shippingId) { return omcShippingMapper.deleteByShippingIdUserId(userId, shippingId); } @Override public OmcShipping selectByShippingIdUserId(Long userId, Long shippingId) { return omcShippingMapper.selectByShippingIdUserId(userId, shippingId); } @Override public List queryShippingList(OmcShipping shipping) { return omcShippingMapper.select(shipping); } @Override public PageInfo queryShippingListWithPage(OmcShipping shipping) { shipping.setOrderBy("update_time desc"); PageHelper.startPage(shipping.getPageNum(), shipping.getPageSize()); if (StringUtils.isEmpty(shipping.getReceiverName())) { shipping.setReceiverName(null); } if (StringUtils.isEmpty(shipping.getReceiverMobileNo())) { shipping.setReceiverMobileNo(null); } List omcShippingList = this.queryShippingList(shipping); return new PageInfo<>(omcShippingList); } @Override public PageInfo queryListWithPageByUserId(Long userId, int pageNum, int pageSize) { Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); PageHelper.startPage(pageNum, pageSize); //TODO 写死 不维护收人列表 List omcShippingList = this.selectByUserId(1L); return new PageInfo<>(omcShippingList); } @Override public List selectByUserId(Long userId) { Preconditions.checkArgument(userId != null, ErrorCodeEnum.UAC10011001.msg()); return omcShippingMapper.selectByUserId(userId); } @Transactional(rollbackFor = Exception.class) @Override public int setDefaultAddress(LoginAuthDto loginAuthDto, Long addressId) { Long userId = loginAuthDto.getUserId(); Preconditions.checkArgument(addressId != null, "地址ID不能为空"); // 1. 查找当前默认地址 OmcShipping omcShipping = omcShippingMapper.selectDefaultAddressByUserId(userId); if (PublicUtil.isEmpty(omcShipping)) { throw new OmcBizException(ErrorCodeEnum.OMC10031007); } // 2. 判断默认地址和当前传入地址是否相同 if (addressId.equals(omcShipping.getId())) { logger.info("所选地址和当前用户默认地址相同 userId={}, addressId={}", userId, addressId); return 1; } // 3. 相同不处理不相同把当前改为非默认, 把当前地址改为默认地址 setDefault(loginAuthDto, addressId, OmcApiConstant.Shipping.DEFAULT); setDefault(loginAuthDto, omcShipping.getId(), OmcApiConstant.Shipping.NOT_DEFAULT); return 1; } private void setDefault(LoginAuthDto loginAuthDto, Long addressId, int isDefault) { int result; OmcShipping updateNotDefault = new OmcShipping(); updateNotDefault.setDefaultAddress(isDefault); updateNotDefault.setUpdateInfo(loginAuthDto); updateNotDefault.setId(addressId); result = omcShippingMapper.updateByPrimaryKeySelective(updateNotDefault); if (result < 1) { throw new OmcBizException(ErrorCodeEnum.OMC10031008, addressId); } } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/OpcOssServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcOssServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.exceptions.OmcBizException; import com.paascloud.provider.model.dto.oss.OptGetUrlRequest; import com.paascloud.provider.model.dto.oss.OptUploadFileReqDto; import com.paascloud.provider.model.dto.oss.OptUploadFileRespDto; import com.paascloud.provider.service.OpcOssFeignApi; import com.paascloud.provider.service.OpcOssService; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * The class Opc oss service. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class OpcOssServiceImpl implements OpcOssService { @Resource private OpcOssFeignApi opcOssFeignApi; @Override public OptUploadFileRespDto uploadFile(OptUploadFileReqDto optUploadFileReqDto) { log.info("uploadFile - 上传附件. optUploadFileReqDto={}", optUploadFileReqDto); Wrapper wrapper = opcOssFeignApi.uploadFile(optUploadFileReqDto); if (null == wrapper || wrapper.error()) { throw new OmcBizException(ErrorCodeEnum.OMC10031012); } return wrapper.getResult(); } @Override public String getFileUrl(OptGetUrlRequest optGetUrlRequest) { log.info("getFileUrl - 获取附件地址. optUploadFileReqDto={}", optGetUrlRequest); Wrapper wrapper = opcOssFeignApi.getFileUrl(optGetUrlRequest); if (null == wrapper || wrapper.error()) { throw new OmcBizException(ErrorCodeEnum.OMC10031013); } return wrapper.getResult(); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/PtcAlipayServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PtcAlipayServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.alipay.api.AlipayResponse; import com.alipay.api.response.AlipayTradePrecreateResponse; import com.alipay.demo.trade.config.Configs; import com.alipay.demo.trade.model.ExtendParams; import com.alipay.demo.trade.model.GoodsDetail; import com.alipay.demo.trade.model.builder.AlipayTradePrecreateRequestBuilder; import com.alipay.demo.trade.model.result.AlipayF2FPrecreateResult; import com.alipay.demo.trade.service.AlipayTradeService; import com.alipay.demo.trade.service.impl.AlipayTradeServiceImpl; import com.alipay.demo.trade.utils.ZxingUtils; import com.google.common.collect.Lists; import com.paascloud.BigDecimalUtil; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.generator.UniqueIdGenerator; import com.paascloud.provider.exceptions.OmcBizException; import com.paascloud.provider.mapper.PtcPayInfoMapper; import com.paascloud.provider.model.constant.OmcApiConstant; import com.paascloud.provider.model.constant.PtcApiConstant; import com.paascloud.provider.model.domain.OmcOrder; import com.paascloud.provider.model.domain.OmcOrderDetail; import com.paascloud.provider.model.domain.PtcPayInfo; import com.paascloud.provider.model.dto.OrderDto; import com.paascloud.provider.model.dto.attachment.OptUploadFileByteInfoReqDto; import com.paascloud.provider.model.dto.oss.OptGetUrlRequest; import com.paascloud.provider.model.dto.oss.OptUploadFileReqDto; import com.paascloud.provider.model.dto.oss.OptUploadFileRespDto; import com.paascloud.provider.service.OmcOrderDetailService; import com.paascloud.provider.service.OmcOrderService; import com.paascloud.provider.service.OpcOssService; import com.paascloud.provider.service.PtcAlipayService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import com.xiaoleilu.hutool.date.DateUtil; import com.xiaoleilu.hutool.io.FileUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.File; import java.util.Date; import java.util.List; import java.util.Map; /** * The class Ptc alipay service. * * @author paascloud.net @gmail.com */ @Slf4j @Service public class PtcAlipayServiceImpl implements PtcAlipayService { private static AlipayTradeService tradeService; static { Configs.init("zfbinfo.properties"); tradeService = new AlipayTradeServiceImpl.ClientBuilder().build(); } @Resource private OmcOrderService omcOrderService; @Resource private OmcOrderDetailService omcOrderDetailService; @Resource private PtcPayInfoMapper ptcPayInfoMapper; @Resource private OpcOssService opcOssService; @Value("${paascloud.alipay.callback.url}") private String alipayCallbackUrl; @Value("${paascloud.alipay.qrCode.pcPath}") private String qrCodePcPath; @Value("${paascloud.alipay.qrCode.qiniuPath}") private String qrCodeQiniuPath; /** * Pay wrapper. * * @param orderNo the order no * @param loginAuthDto the login auth dto * * @return the wrapper */ @Override public Wrapper pay(String orderNo, LoginAuthDto loginAuthDto) { Long userId = loginAuthDto.getUserId(); OrderDto order = omcOrderService.queryOrderDtoByUserIdAndOrderNo(userId, orderNo); if (order == null) { throw new OmcBizException(ErrorCodeEnum.OMC10031003); } // (必填) 商户网站订单系统中唯一订单号, 64个字符以内, 只能包含字母、数字、下划线, // 需保证商户系统端不能重复, 建议通过数据库sequence生成, String outTradeNo = order.getOrderNo(); // (必填) 订单标题, 粗略描述用户的支付目的。如“xxx品牌xxx门店当面付扫码消费” String subject = "PCMall扫码支付,订单号:" + outTradeNo; // (必填) 订单总金额, 单位为元, 不能超过1亿元 // 如果同时传入了【打折金额】,【不可打折金额】,【订单总金额】三者,则必须满足如下条件:【订单总金额】=【打折金额】+【不可打折金额】 String totalAmount = order.getPayment().toString(); // (可选) 订单不可打折金额, 可以配合商家平台配置折扣活动, 如果酒水不参与打折, 则将对应金额填写至此字段 // 如果该值未传入,但传入了【订单总金额】,【打折金额】,则该值默认为【订单总金额】-【打折金额】 String undiscountableAmount = "0"; // 卖家支付宝账号ID, 用于支持一个签约账号下支持打款到不同的收款账号, (打款到sellerId对应的支付宝账号) // 如果该字段为空, 则默认为与支付宝签约的商户的PID, 也就是appid对应的PID String sellerId = ""; // 订单描述, 可以对交易或商品进行一个详细地描述, 比如填写"购买商品2件共15.00元" String body = "订单" + outTradeNo + "购买商品共" + totalAmount + "元"; // 商户操作员编号, 添加此参数可以为商户操作员做销售统计 String operatorId = "test_operator_id"; // (必填) 商户门店编号, 通过门店号和商家后台可以配置精准到门店的折扣信息, 详询支付宝技术支持 String storeId = "test_store_id"; // 业务扩展参数, 目前可添加由支付宝分配的系统商编号(通过setSysServiceProviderId方法), 详情请咨询支付宝技术支持 ExtendParams extendParams = new ExtendParams(); extendParams.setSysServiceProviderId("2088100200300400500"); // 支付超时, 定义为120分钟 String timeoutExpress = "120m"; // 商品明细列表, 需填写购买商品详细信息, List goodsDetailList = Lists.newArrayList(); List orderItemList = omcOrderDetailService.getListByOrderNoUserId(orderNo, userId); for (OmcOrderDetail orderItem : orderItemList) { GoodsDetail goods = GoodsDetail.newInstance(orderItem.getProductId().toString(), orderItem.getProductName(), BigDecimalUtil.mul(orderItem.getCurrentUnitPrice().doubleValue(), 100D).longValue(), orderItem.getQuantity()); goodsDetailList.add(goods); } // 创建扫码支付请求builder, 设置请求参数 AlipayTradePrecreateRequestBuilder builder = new AlipayTradePrecreateRequestBuilder() .setSubject(subject).setTotalAmount(totalAmount).setOutTradeNo(outTradeNo) .setUndiscountableAmount(undiscountableAmount).setSellerId(sellerId).setBody(body) .setOperatorId(operatorId).setStoreId(storeId).setExtendParams(extendParams) .setTimeoutExpress(timeoutExpress) //支付宝服务器主动通知商户服务器里指定的页面http路径,根据需要设置 .setNotifyUrl(alipayCallbackUrl) .setGoodsDetailList(goodsDetailList); AlipayF2FPrecreateResult result = tradeService.tradePrecreate(builder); switch (result.getTradeStatus()) { case SUCCESS: log.info("支付宝预下单成功: )"); AlipayTradePrecreateResponse response = result.getResponse(); dumpResponse(response); // 需要修改为运行机器上的路径 File folder = new File(qrCodePcPath); if (!folder.exists()) { folder.setWritable(true); folder.mkdirs(); } //细节细节细节 String qrPath = String.format(qrCodePcPath + "/qr-%s.png", response.getOutTradeNo()); String qrFileName = String.format("qr-%s.png", response.getOutTradeNo()); ZxingUtils.getQRCodeImge(response.getQrCode(), 256, qrPath); File qrCodeImage = new File(qrPath); OptUploadFileReqDto optUploadFileReqDto = new OptUploadFileReqDto(); optUploadFileReqDto.setBucketName("paascloud-oss-bucket"); optUploadFileReqDto.setFilePath(qrCodeQiniuPath); optUploadFileReqDto.setFileType("png"); optUploadFileReqDto.setUserId(loginAuthDto.getUserId()); optUploadFileReqDto.setUserName(loginAuthDto.getUserName()); OptUploadFileByteInfoReqDto optUploadFileByteInfoReqDto = new OptUploadFileByteInfoReqDto(); optUploadFileByteInfoReqDto.setFileName(qrFileName); byte[] bytes = FileUtil.readBytes(qrCodeImage); optUploadFileByteInfoReqDto.setFileByteArray(bytes); optUploadFileReqDto.setUploadFileByteInfoReqDto(optUploadFileByteInfoReqDto); OptUploadFileRespDto optUploadFileRespDto = null; try { optUploadFileRespDto = opcOssService.uploadFile(optUploadFileReqDto); optUploadFileRespDto.setRefNo(orderNo); // 获取二维码 final OptGetUrlRequest request = new OptGetUrlRequest(); request.setAttachmentId(optUploadFileRespDto.getAttachmentId()); request.setEncrypt(true); String fileUrl = opcOssService.getFileUrl(request); optUploadFileRespDto.setAttachmentUrl(fileUrl); } catch (Exception e) { log.error("上传二维码异常", e); } return WrapMapper.ok(optUploadFileRespDto); case FAILED: log.error("支付宝预下单失败!!!"); return WrapMapper.error("支付宝预下单失败!!!"); case UNKNOWN: log.error("系统异常, 预下单状态未知!!!"); return WrapMapper.error("系统异常, 预下单状态未知!!!"); default: log.error("不支持的交易状态, 交易返回异常!!!"); return WrapMapper.error("不支持的交易状态, 交易返回异常!!!"); } } /** * 简单打印应答 */ private void dumpResponse(AlipayResponse response) { if (response != null) { log.info(String.format("code:%s, msg:%s", response.getCode(), response.getMsg())); if (StringUtils.isNotEmpty(response.getSubCode())) { log.info(String.format("subCode:%s, subMsg:%s", response.getSubCode(), response.getSubMsg())); } log.info("body:" + response.getBody()); } } @Override public Wrapper aliPayCallback(Map params) { log.info("支付宝回调. - aliPayCallback. params={}", params); String orderNo = params.get("out_trade_no"); String tradeNo = params.get("trade_no"); String tradeStatus = params.get("trade_status"); OrderDto order = omcOrderService.queryOrderDtoByOrderNo(orderNo); if (order == null) { throw new OmcBizException(ErrorCodeEnum.OMC10031010); } if (order.getStatus() >= OmcApiConstant.OrderStatusEnum.PAID.getCode()) { throw new OmcBizException(ErrorCodeEnum.OMC10031011); } if (PtcApiConstant.AlipayCallback.TRADE_STATUS_TRADE_SUCCESS.equals(tradeStatus)) { order.setPaymentTime(DateUtil.parseDate(params.get("gmt_payment"))); order.setStatus(OmcApiConstant.OrderStatusEnum.PAID.getCode()); ModelMapper modelMapper = new ModelMapper(); OmcOrder omcOrder = modelMapper.map(order, OmcOrder.class); omcOrderService.update(omcOrder); } PtcPayInfo payInfo = new PtcPayInfo(); payInfo.setUserId(order.getUserId()); payInfo.setOrderNo(order.getOrderNo()); payInfo.setPayPlatform(PtcApiConstant.PayPlatformEnum.ALIPAY.getCode()); payInfo.setPlatformNumber(tradeNo); payInfo.setPlatformStatus(tradeStatus); payInfo.setUpdateTime(new Date()); payInfo.setCreatedTime(new Date()); payInfo.setCreator(order.getCreator()); payInfo.setCreatorId(order.getUserId()); payInfo.setLastOperator(order.getLastOperator()); payInfo.setLastOperatorId(order.getLastOperatorId()); payInfo.setId(UniqueIdGenerator.generateId()); ptcPayInfoMapper.insertSelective(payInfo); return WrapMapper.ok(); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/service/impl/PtcPayInfoServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PtcPayInfoServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.paascloud.provider.model.domain.PtcPayInfo; import com.paascloud.core.support.BaseService; import com.paascloud.provider.service.PtcPayInfoService; import org.springframework.stereotype.Service; /** * The class Ptc pay info service. * * @author paascloud.net@gmail.com */ @Service public class PtcPayInfoServiceImpl extends BaseService implements PtcPayInfoService { } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/GlobalExceptionHandler.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GlobalExceptionHandler.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import com.paascloud.provider.model.dto.GlobalExceptionLogDto; import com.paascloud.provider.service.MdcExceptionLogFeignApi; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.annotation.Resource; /** * 全局的的异常拦截器 * * @author paascloud.net @gmail.com */ @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @Resource private TaskExecutor taskExecutor; @Value("${spring.profiles.active}") String profile; @Value("${spring.application.name}") String applicationName; @Resource private MdcExceptionLogFeignApi mdcExceptionLogFeignApi; /** * 参数非法异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper illegalArgumentException(IllegalArgumentException e) { log.error("参数非法异常={}", e.getMessage(), e); return WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage()); } /** * 业务异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(BusinessException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper businessException(BusinessException e) { log.error("业务异常={}", e.getMessage(), e); return WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage()); } /** * 全局异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody public Wrapper exception(Exception e) { log.info("保存全局异常信息 ex={}", e.getMessage(), e); taskExecutor.execute(() -> { GlobalExceptionLogDto globalExceptionLogDto = new GlobalExceptionLogDto().getGlobalExceptionLogDto(e, profile, applicationName); mdcExceptionLogFeignApi.saveAndSendExceptionLog(globalExceptionLogDto); }); return WrapMapper.error(); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/frontend/OmcOrderController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.BaseQuery; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.OrderPageQuery; import com.paascloud.provider.model.vo.OrderProductVo; import com.paascloud.provider.model.vo.OrderVo; import com.paascloud.provider.service.OmcCartService; import com.paascloud.provider.service.OmcOrderService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * The class Omc order controller. * * @author paascloud.net@gmail.com */ @RestController @RequestMapping(value = "/order") @Api(value = "WEB - OmcOrderController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class OmcOrderController extends BaseController { @Resource private OmcOrderService omcOrderService; @Resource private OmcCartService omcCartService; /** * 获取购物车数量. * * @return the cart count */ @PostMapping(value = "getCartCount") public Wrapper getCartCount() { return WrapMapper.ok(0); } /** * 获取购物车商品数量. * * @return the order cart product */ @PostMapping("/getOrderCartProduct") @ApiOperation(httpMethod = "POST", value = "获取购物车商品数量") public Wrapper getOrderCartProduct() { logger.info("getOrderCartProduct - 获取购物车商品数量"); OrderProductVo orderCartProduct = omcCartService.getOrderCartProduct(getLoginAuthDto().getUserId()); return WrapMapper.ok(orderCartProduct); } /** * 创建订单. * * @param shippingId the shipping id * * @return the wrapper */ @PostMapping("createOrderDoc/{shippingId}") @ApiOperation(httpMethod = "POST", value = "创建订单") public Wrapper createOrderDoc(@PathVariable Long shippingId) { logger.info("createOrderDoc - 创建订单. shippingId={}", shippingId); LoginAuthDto loginAuthDto = getLoginAuthDto(); logger.info("操作人信息. loginAuthDto={}", loginAuthDto); OrderVo orderDoc = omcOrderService.createOrderDoc(loginAuthDto, shippingId); return WrapMapper.ok(orderDoc); } /** * 取消订单. * * @param orderNo the order no * * @return the wrapper */ @PostMapping("cancelOrderDoc/{orderNo}") @ApiOperation(httpMethod = "POST", value = "取消订单") public Wrapper cancelOrderDoc(@PathVariable String orderNo) { logger.info("cancelOrderDoc - 取消订单. orderNo={}", orderNo); LoginAuthDto loginAuthDto = getLoginAuthDto(); logger.info("操作人信息. loginAuthDto={}", loginAuthDto); int result = omcOrderService.cancelOrderDoc(loginAuthDto, orderNo); return handleResult(result); } /** * 查询订单详情. * * @param orderNo the order no * * @return the wrapper */ @PostMapping("queryUserOrderDetailList/{orderNo}") @ApiOperation(httpMethod = "POST", value = "查询订单详情") public Wrapper queryUserOrderDetailList(@PathVariable String orderNo) { logger.info("queryUserOrderDetailList - 查询用户订单明细. orderNo={}", orderNo); Long userId = getLoginAuthDto().getUserId(); logger.info("操作人信息. userId={}", userId); OrderVo orderVo = omcOrderService.getOrderDetail(userId, orderNo); return WrapMapper.ok(orderVo); } @PostMapping("queryUserOrderDetail/{orderNo}") @ApiOperation(httpMethod = "POST", value = "查询订单详情") public Wrapper queryUserOrderDetail(@PathVariable String orderNo) { logger.info("queryUserOrderDetail - 查询订单明细. orderNo={}", orderNo); OrderVo orderVo = omcOrderService.getOrderDetail(orderNo); return WrapMapper.ok(orderVo); } /** * Query user order list with page wrapper. * * @param baseQuery the base query * * @return the wrapper */ @PostMapping("queryUserOrderListWithPage") @ApiOperation(httpMethod = "POST", value = "查询用户订单列表") public Wrapper queryUserOrderListWithPage(@RequestBody BaseQuery baseQuery) { logger.info("queryUserOrderListWithPage - 查询用户订单集合. baseQuery={}", baseQuery); Long userId = getLoginAuthDto().getUserId(); logger.info("操作人信息. userId={}", userId); PageInfo pageInfo = omcOrderService.queryUserOrderListWithPage(userId, baseQuery); return WrapMapper.ok(pageInfo); } @PostMapping("queryOrderListWithPage") @ApiOperation(httpMethod = "POST", value = "查询用户订单列表") public Wrapper queryOrderListWithPage(@RequestBody OrderPageQuery orderPageQuery) { logger.info("queryOrderListWithPage - 查询订单集合. orderPageQuery={}", orderPageQuery); PageInfo pageInfo = omcOrderService.queryOrderListWithPage(orderPageQuery); return WrapMapper.ok(pageInfo); } /** * 查询订单状态. * * @param orderNo the order no * * @return the wrapper */ @PostMapping("queryOrderPayStatus/{orderNo}") @ApiOperation(httpMethod = "POST", value = "查询订单状态") public Wrapper queryOrderPayStatus(@PathVariable String orderNo) { logger.info("queryOrderPayStatus - 查询订单状态. orderNo={}", orderNo); boolean result = omcOrderService.queryOrderPayStatus(getLoginAuthDto().getUserId(), orderNo); return WrapMapper.ok(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/frontend/OmcShippingController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcShippingController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.github.pagehelper.PageInfo; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.OmcShipping; import com.paascloud.provider.service.OmcShippingService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * The class Omc shipping controller. * * @author paascloud.net@gmail.com */ @RestController @RequestMapping(value = "/shipping", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - OmcShippingController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class OmcShippingController extends BaseController { @Resource private OmcShippingService omcShippingService; /** * 增加收货人地址. * * @param shipping the shipping * * @return the wrapper */ @PostMapping("/addShipping") @ApiOperation(httpMethod = "POST", value = "增加收货人地址") public Wrapper addShipping(OmcShipping shipping) { logger.info("addShipping - 增加收货人地址. shipping={}", shipping); int result = omcShippingService.saveShipping(getLoginAuthDto(), shipping); return handleResult(result); } /** * 删除收货人地址. * * @param shippingId the shipping id * * @return the wrapper */ @PostMapping("/deleteShipping/{shippingId}") @ApiOperation(httpMethod = "POST", value = "删除收货人地址") public Wrapper deleteShipping(@PathVariable Integer shippingId) { Long userId = getLoginAuthDto().getUserId(); logger.info("deleteShipping - 删除收货人地址. userId={}, shippingId={}", userId, shippingId); int result = omcShippingService.deleteShipping(userId, shippingId); return handleResult(result); } /** * 编辑收货人地址. * * @param shipping the shipping * * @return the wrapper */ @PostMapping("/updateShipping") @ApiOperation(httpMethod = "POST", value = "编辑收货人地址") public Wrapper updateShipping(OmcShipping shipping) { logger.info("updateShipping - 编辑收货人地址. shipping={}", shipping); int result = omcShippingService.saveShipping(getLoginAuthDto(), shipping); return handleResult(result); } /** * 设置默认收货地址. * * @param addressId the address id * * @return the default address */ @PostMapping("/setDefaultAddress/{addressId}") @ApiOperation(httpMethod = "POST", value = "设置默认收货地址") public Wrapper setDefaultAddress(@PathVariable Long addressId) { logger.info("updateShipping - 设置默认地址. addressId={}", addressId); int result = omcShippingService.setDefaultAddress(getLoginAuthDto(), addressId); return handleResult(result); } /** * 根据Id查询收货人地址. * * @param shippingId the shipping id * * @return the wrapper */ @PostMapping("/selectShippingById/{shippingId}") @ApiOperation(httpMethod = "POST", value = "根据Id查询收货人地址") public Wrapper selectShippingById(@PathVariable Long shippingId) { Long userId = getLoginAuthDto().getUserId(); logger.info("selectShippingById - 根据Id查询收货人地址. userId={}, shippingId={}", userId, shippingId); OmcShipping omcShipping = omcShippingService.selectByShippingIdUserId(userId, shippingId); return WrapMapper.ok(omcShipping); } /** * 分页查询当前用户收货人地址列表. * * @param shipping the shipping * * @return the wrapper */ @PostMapping("queryUserShippingListWithPage") @ApiOperation(httpMethod = "POST", value = "分页查询当前用户收货人地址列表") public Wrapper queryUserShippingListWithPage(@RequestBody OmcShipping shipping) { Long userId = getLoginAuthDto().getUserId(); logger.info("queryUserShippingListWithPage - 分页查询当前用户收货人地址列表.userId={} shipping={}", userId, shipping); PageInfo pageInfo = omcShippingService.queryListWithPageByUserId(userId, shipping.getPageNum(), shipping.getPageSize()); return WrapMapper.ok(pageInfo); } /** * 分页查询收货人地址列表. * * @param shipping the shipping * * @return the wrapper */ @PostMapping("queryShippingListWithPage") @ApiOperation(httpMethod = "POST", value = "分页查询收货人地址列表") public Wrapper queryShippingListWithPage(@RequestBody OmcShipping shipping) { logger.info("queryShippingListWithPage - 分页查询收货人地址列表. shipping={}", shipping); PageInfo pageInfo = omcShippingService.queryShippingListWithPage(shipping); return WrapMapper.ok(pageInfo); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/frontend/PtcPayController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PtcPayController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.alipay.api.AlipayApiException; import com.alipay.api.internal.util.AlipaySignature; import com.alipay.demo.trade.config.Configs; import com.google.common.collect.Maps; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.constant.PtcApiConstant; import com.paascloud.provider.service.PtcAlipayService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.Map; /** * The class Ptc pay controller. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/pay") @Api(value = "WEB - PtcPayController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class PtcPayController extends BaseController { @Resource private PtcAlipayService ptcAlipayService; /** * 生成付款二维码. * * @param orderNo the order no * * @return the wrapper */ @PostMapping("/createQrCodeImage/{orderNo}") @ApiOperation(httpMethod = "POST", value = "生成付款二维码") public Wrapper createQrCodeImage(@PathVariable String orderNo) { LoginAuthDto loginAuthDto = getLoginAuthDto(); return ptcAlipayService.pay(orderNo, loginAuthDto); } /** * 支付宝回调信息. * * @param request the request * * @return the object */ @PostMapping("/alipayCallback") @ApiOperation(httpMethod = "POST", value = "支付宝回调信息") public Object alipayCallback(HttpServletRequest request) { logger.info("收到支付宝回调信息"); Map params = Maps.newHashMap(); Map requestParams = request.getParameterMap(); for (Object o : requestParams.keySet()) { String name = (String) o; String[] values = (String[]) requestParams.get(name); String valueStr = ""; for (int i = 0; i < values.length; i++) { valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; } params.put(name, valueStr); } logger.info("支付宝回调,sign:{},trade_status:{},参数:{}", params.get("sign"), params.get("trade_status"), params.toString()); //非常重要,验证回调的正确性,是不是支付宝发的.并且呢还要避免重复通知. params.remove("sign_type"); try { boolean alipayRSACheckedV2 = AlipaySignature.rsaCheckV2(params, Configs.getAlipayPublicKey(), "utf-8", Configs.getSignType()); if (!alipayRSACheckedV2) { return WrapMapper.error("非法请求,验证不通过,再恶意请求我就报警找网警了"); } } catch (AlipayApiException e) { logger.error("支付宝验证回调异常", e); } //todo 验证各种数据 Wrapper serverResponse = ptcAlipayService.aliPayCallback(params); if (serverResponse.success()) { return PtcApiConstant.AlipayCallback.RESPONSE_SUCCESS; } return PtcApiConstant.AlipayCallback.RESPONSE_FAILED; } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/MallCartFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MallCartFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.vo.CartProductVo; import com.paascloud.provider.service.OmcCartFeignApi; import com.paascloud.provider.service.OmcCartService; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * The class Mall cart feign client. * * @author paascloud.net@gmail.com */ @RefreshScope @RestController @Api(value = "API - MallCartFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MallCartFeignClient extends BaseController implements OmcCartFeignApi { @Resource private OmcCartService omcCartService; @Override @ApiOperation(httpMethod = "POST", value = "更新购物车") public Wrapper updateCartList(@RequestBody List cartProductVoList) { logger.info("updateCartList - 更新购物车. cartProductVoList={}", cartProductVoList); int result = omcCartService.updateCartList(cartProductVoList); return handleResult(result); } @Override @ApiOperation(httpMethod = "POST", value = "保存购物车信息") public Wrapper addProduct(@RequestParam("userId") Long userId, @RequestParam("productId") Long productId, @RequestParam(value = "count") Integer count) { logger.info("updateCartList - 保存购物车信息. productId={}, count={}", productId, count); int result = omcCartService.saveCart(userId, productId, count); return handleResult(result); } @Override @ApiOperation(httpMethod = "POST", value = "更新购物车信息") public Wrapper updateProduct(@RequestParam("userId") Long userId, @RequestParam("productId") Long productId, @RequestParam("count") Integer count) { logger.info("updateProduct - 更新购物车信息. productId={}, count={}", productId, count); int result = omcCartService.updateCart(userId, productId, count); return handleResult(result); } @Override @ApiOperation(httpMethod = "POST", value = "删除购物车商品信息") public Wrapper deleteProduct(@RequestParam("userId") Long userId, @RequestParam("productIds") String productIds) { logger.info("deleteProduct - 删除购物车商品信息. productIds={}, userId={}", productIds, userId); int result = omcCartService.deleteProduct(userId, productIds); return handleResult(result); } @Override @ApiOperation(httpMethod = "POST", value = "选中或者反选商品信息") public Wrapper selectOrUnSelect(@RequestParam(name = "userId") Long userId, @RequestParam(name = "productId", required = false) Long productId, @RequestParam(name = "checked") Integer checked) { logger.info("selectOrUnSelect - 选中或者反选商品信息. productId={}, userId={}, checked={}", productId, userId, checked); int result = omcCartService.selectOrUnSelect(userId, productId, checked); return handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/MallCartQueryFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MallCartQueryFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.vo.CartVo; import com.paascloud.provider.service.OmcCartQueryFeignApi; import com.paascloud.provider.service.OmcCartService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * The class Mall cart query feign client. * * @author paascloud.net@gmail.com */ @RefreshScope @RestController @Api(value = "API - MallCartQueryFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MallCartQueryFeignClient extends BaseController implements OmcCartQueryFeignApi { @Resource private OmcCartService omcCartService; @Override @ApiOperation(httpMethod = "POST", value = "获取购物车信息") public Wrapper getCartVo(@RequestParam("userId") Long userId) { logger.info("getCartVo - 获取购物车信息. userId={}", userId); CartVo cartVo = omcCartService.getCarVo(userId); return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, cartVo); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/OmcOrderDetailFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderDetailFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.provider.service.OmcOrderDetailFeignApi; import com.paascloud.core.support.BaseController; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RestController; import io.swagger.annotations.Api; /** * The class Omc order detail feign client. * * @author paascloud.net@gmail.com */ @RefreshScope @RestController @Api(value = "API - OmcOrderDetailFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class OmcOrderDetailFeignClient extends BaseController implements OmcOrderDetailFeignApi { } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/OmcOrderDetailQueryFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderDetailQueryFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.google.common.collect.Lists; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.OmcOrderDetail; import com.paascloud.provider.model.dto.OrderDetailDto; import com.paascloud.provider.service.OmcOrderDetailQueryFeignApi; import com.paascloud.provider.service.OmcOrderDetailService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.BeanUtils; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * The class Omc order detail query feign client. * * @author paascloud.net@gmail.com */ @RefreshScope @RestController @Api(value = "API - MallCartQueryFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class OmcOrderDetailQueryFeignClient extends BaseController implements OmcOrderDetailQueryFeignApi { @Resource private OmcOrderDetailService omcOrderDetailService; @Override @ApiOperation(httpMethod = "POST", value = "获取用户订单详情") public Wrapper> getListByOrderNoUserId(@PathVariable("orderNo") String orderNo, @PathVariable("userId") Long userId) { logger.info("getListByOrderNoUserId - 获取用户订单详情. orderNo={}, userId={}", orderNo, userId); List list = omcOrderDetailService.getListByOrderNoUserId(orderNo, userId); List orderDetailDtoList = Lists.newArrayList(); for (OmcOrderDetail orderDetail : list) { OrderDetailDto orderDetailDto = new OrderDetailDto(); BeanUtils.copyProperties(orderDetail, orderDetailDto); orderDetailDtoList.add(orderDetailDto); } return WrapMapper.ok(orderDetailDtoList); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/OmcOrderFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.OmcOrder; import com.paascloud.provider.model.dto.OrderDto; import com.paascloud.provider.service.OmcOrderFeignApi; import com.paascloud.provider.service.OmcOrderService; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.modelmapper.ModelMapper; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * The class Omc order feign client. * * @author paascloud.net@gmail.com */ @RefreshScope @RestController @Api(value = "API - OmcOrderFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class OmcOrderFeignClient extends BaseController implements OmcOrderFeignApi { @Resource private OmcOrderService omcOrderService; @Override @ApiOperation(httpMethod = "POST", value = "更新订单信息") public Wrapper updateOrderById(@RequestBody OrderDto orderDto) { logger.info("updateOrderById - 更新订单信息. orderDto={}", orderDto); ModelMapper modelMapper = new ModelMapper(); OmcOrder omcOrder = modelMapper.map(orderDto, OmcOrder.class); int updateResult = omcOrderService.update(omcOrder); return handleResult(updateResult); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/java/com/paascloud/provider/web/rpc/OmcOrderQueryFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderQueryFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.OrderDto; import com.paascloud.provider.service.OmcOrderQueryFeignApi; import com.paascloud.provider.service.OmcOrderService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * The class Omc order query feign client. * * @author paascloud.net@gmail.com */ @RefreshScope @RestController @Api(value = "API - OmcOrderQueryFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class OmcOrderQueryFeignClient extends BaseController implements OmcOrderQueryFeignApi { @Resource private OmcOrderService omcOrderService; @Override @ApiOperation(httpMethod = "POST", value = "根据订单号查询订单信息") public Wrapper queryByOrderNo(@PathVariable("orderNo") String orderNo) { logger.info("selectByOrderNo - 根据订单号查询订单信息. orderNo={}", orderNo); OrderDto orderDto = omcOrderService.queryOrderDtoByOrderNo(orderNo); return WrapMapper.ok(orderDto); } @Override @ApiOperation(httpMethod = "POST", value = "根据订单号查询用户订单信息") public Wrapper queryByUserIdAndOrderNo(@PathVariable("userId") Long userId, @PathVariable("orderNo") String orderNo) { logger.info("selectByUserIdAndOrderNo - 根据订单号查询用户订单信息. userId={}, orderNo={}", userId, orderNo); OrderDto orderDto = omcOrderService.queryOrderDtoByUserIdAndOrderNo(userId, orderNo); return WrapMapper.ok(orderDto); } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/META-INF/spring-devtools.properties ================================================ restart.include.mapper=/mapper-[\\w-\\.]+jar restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/ValidationMessages.properties ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/application.yml ================================================ server: port: 8050 spring: profiles: active: dev application: name: @pom.artifactId@ datasource: username: root password: 123456 ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/banner.txt ================================================ ${AnsiColor.BRIGHT_CYAN} .__ .___ __ ___________ _____ ______ ____ | | ____ __ __ __| _/ ____ _____/ |_ \____ \__ \ \__ \ / ___// ___\| | / _ \| | \/ __ | / \_/ __ \ __\ | |_> > __ \_/ __ \_\___ \\ \___| |_( <_> ) | / /_/ | | | \ ___/| | | __(____ (____ /____ >\___ >____/\____/|____/\____ | /\ |___| /\___ >__| |__| \/ \/ \/ \/ Powered by liuzhaoming\/ \/ \/ \/ ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/bootstrap.yml ================================================ spring: cloud: config: fail-fast: true discovery: service-id: paascloud-discovery enabled: true label: ${spring.profiles.active} profile: ${spring.profiles.active} username: admin password: admin eureka: client: serviceUrl: defaultZone: http://root:root@paascloud-eureka:8761/eureka/ instance: instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port} ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/conf/liquibase.properties ================================================ spring.datasource.driver-class-name= com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_omc?characterEncoding=utf8&useSSL=false spring.datasource.username= root spring.datasource.password= 123456 ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/liquibase/index.xml ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/logback-spring.xml ================================================ DEBUG ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE} ${LOG_FILE}.%d{yyyy-MM-dd}.gz 7 ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE}.json ${LOG_FILE}.json.%d{yyyy-MM-dd}.gz 7 UTC { "severity": "%level", "service": "${springAppName:-}", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "parent": "%X{X-B3-ParentSpanId:-}", "exportable": "%X{X-Span-Export:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" } ${LOG_FILE}.sql.%d{yyyy-MM-dd}.gz 10 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-%msg%n ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/mapper/OmcCartMapper.xml ================================================ delete from pc_omc_cart where user_id = #{userId} and product_id in #{item} UPDATE pc_omc_cart set checked = #{checked}, update_time = now() where user_id = #{userId} and product_id = #{productId} delete from pc_omc_cart where id IN #{item} ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/mapper/OmcOrderDetailMapper.xml ================================================ id, version, detail_no, user_id, order_no, product_id, product_name, product_image, current_unit_price, quantity, total_price, creator, creator_id, created_time, last_operator, last_operator_id, update_time insert into pc_omc_order_detail (id, version, detail_no, user_id, order_no, product_id, product_name, product_image, current_unit_price, quantity, total_price, creator, creator_id, created_time, last_operator, last_operator_id, update_time) values (#{item.id,jdbcType=BIGINT}, #{item.version,jdbcType=INTEGER}, #{item.detailNo,jdbcType=VARCHAR}, #{item.userId,jdbcType=BIGINT}, #{item.orderNo,jdbcType=VARCHAR}, #{item.productId,jdbcType=BIGINT}, #{item.productName,jdbcType=VARCHAR}, #{item.productImage,jdbcType=VARCHAR}, #{item.currentUnitPrice,jdbcType=DECIMAL}, #{item.quantity,jdbcType=INTEGER}, #{item.totalPrice,jdbcType=DECIMAL}, #{item.creator,jdbcType=VARCHAR}, #{item.creatorId,jdbcType=BIGINT}, #{item.createdTime,jdbcType=TIMESTAMP}, #{item.lastOperator,jdbcType=VARCHAR}, #{item.lastOperatorId,jdbcType=BIGINT}, #{item.updateTime,jdbcType=TIMESTAMP}) ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/mapper/OmcOrderMapper.xml ================================================ ${alias}.id, ${alias}.version, ${alias}.order_no, ${alias}.user_id, ${alias}.shipping_id, ${alias}.payment, ${alias}.payment_type, ${alias}.postage, ${alias}.status, ${alias}.payment_time, ${alias}.send_time, ${alias}.end_time, ${alias}.close_time, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/mapper/OmcShippingMapper.xml ================================================ id, version, receiver_name, receiver_phone_no, receiver_mobile_no, province_id, province_name, city_id, city_name, district_name, district_id, street_id, street_name, detail_address, receiver_zip_code, creator, creator_id, created_time, last_operator, last_operator_id, update_time DELETE FROM pc_omc_shipping WHERE id = #{shippingId} AND user_id = #{userId} ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/mapper/PtcPayInfoMapper.xml ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/main/resources/zfbinfo.properties ================================================ # \u652F\u4ED8\u5B9D\u7F51\u5173\u540D\u3001partnerId\u548CappId open_api_domain = https://openapi.alipaydev.com/gateway.do mcloud_api_domain = http://mcloudmonitor.com/gateway.do # \u5546\u6237UID pid = 20881021********* # APPID appid = 20160805********* # RSA\u79C1\u94A5\u3001\u516C\u94A5\u548C\u652F\u4ED8\u5B9D\u516C\u94A5 private_key = ********* public_key = ********* #SHA256withRsa\u5BF9\u5E94\u652F\u4ED8\u5B9D\u516C\u94A5 alipay_public_key = ********* # \u7B7E\u540D\u7C7B\u578B: RSA->SHA1withRsa,RSA2->SHA256withRsa sign_type = RSA2 # \u5F53\u9762\u4ED8\u6700\u5927\u67E5\u8BE2\u6B21\u6570\u548C\u67E5\u8BE2\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09 max_query_retry = 5 query_duration = 5000 # \u5F53\u9762\u4ED8\u6700\u5927\u64A4\u9500\u6B21\u6570\u548C\u64A4\u9500\u95F4\u9694\uFF08\u6BEB\u79D2\uFF09 max_cancel_retry = 3 cancel_duration = 2000 # \u4EA4\u6613\u4FDD\u969C\u7EBF\u7A0B\u7B2C\u4E00\u6B21\u8C03\u5EA6\u5EF6\u8FDF\u548C\u8C03\u5EA6\u95F4\u9694\uFF08\u79D2\uFF09 heartbeat_delay = 5 heartbeat_duration = 900 ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/test/java/com/paascloud/provider/PaasCloudOmcApplicationTests.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudOmcApplicationTests.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class PaasCloudOmcApplicationTests { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Test public void contextLoads() { } } ================================================ FILE: paascloud-provider/paascloud-provider-omc/src/test/resources/generator/generatorConfig.xml ================================================
================================================ FILE: paascloud-provider/paascloud-provider-opc/pom.xml ================================================ 4.0.0 paascloud-provider-opc jar 1.0 paascloud-provider-opc 开放平台中心 - Open platform center com.liuzm.paascloud.provider paascloud-provider 1.0 UTF-8 UTF-8 1.8 mysql mysql-connector-java runtime joda-time joda-time org.mybatis.spring.boot mybatis-spring-boot-starter tk.mybatis mapper-spring-boot-starter com.github.pagehelper pagehelper-spring-boot-starter com.alibaba druid-spring-boot-starter org.springframework.cloud spring-cloud-starter-feign com.fasterxml.jackson.core jackson-databind com.liuzm.paascloud.provider.api paascloud-provider-omc-api com.liuzm.paascloud.provider.api paascloud-provider-mdc-api com.aliyun aliyun-java-sdk-core com.aliyun aliyun-java-sdk-dysmsapi com.qiniu qiniu-java-sdk com.liuzm.paascloud.provider.api paascloud-provider-opc-api org.springframework.boot spring-boot-starter-mail org.springframework.boot spring-boot-starter-freemarker de.codecentric spring-boot-admin-starter-client com.github.penggle kaptcha com.liuzm.paascloud.provider.api paascloud-provider-sdk-api commons-io commons-io org.springframework.retry spring-retry ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/PaasCloudOpcApplication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudOpcApplication.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import liquibase.integration.spring.SpringLiquibase; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.context.annotation.Bean; import org.springframework.retry.annotation.EnableRetry; import org.springframework.transaction.annotation.EnableTransactionManagement; import springfox.documentation.swagger2.annotations.EnableSwagger2; import javax.sql.DataSource; import java.util.Properties; /** * The class Paas cloud opc application. * * @author paascloud.net@gmail.com */ @EnableRetry @EnableCaching @EnableHystrix @EnableSwagger2 @EnableFeignClients @EnableDiscoveryClient @SpringBootApplication @EnableTransactionManagement public class PaasCloudOpcApplication { /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { SpringApplication.run(PaasCloudOpcApplication.class, args); } /** * Get kaptcha bean default kaptcha. * * @return the default kaptcha */ @Bean(name = "captchaProducer") public DefaultKaptcha getKaptchaBean() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); properties.setProperty("kaptcha.border", "yes"); properties.setProperty("kaptcha.border.color", "105,179,90"); properties.setProperty("kaptcha.textproducer.font.color", "blue"); properties.setProperty("kaptcha.image.width", "125"); properties.setProperty("kaptcha.image.height", "45"); properties.setProperty("kaptcha.session.key", "code"); properties.setProperty("kaptcha.textproducer.char.length", "4"); properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } @Bean public SpringLiquibase springLiquibase(DataSource dataSource) { SpringLiquibase springLiquibase = new SpringLiquibase(); springLiquibase.setDataSource(dataSource); springLiquibase.setChangeLog("classpath:/liquibase/index.xml"); return springLiquibase; } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/config/AliyunMqConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AliyunMqConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.paascloud.PublicUtil; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.provider.consumer.listener.OptPushMessageListener; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.common.consumer.ConsumeFromWhere; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.TaskExecutor; import javax.annotation.Resource; /** * The class Aliyun mq configuration. * * @author paascloud.net@gmail.com */ @Slf4j @Configuration public class AliyunMqConfiguration { @Resource private PaascloudProperties paascloudProperties; @Resource private OptPushMessageListener optPushConsumer; @Resource private TaskExecutor taskExecutor; /** * Default mq push consumer default mq push consumer. * * @return the default mq push consumer * * @throws MQClientException the mq client exception */ @Bean public DefaultMQPushConsumer defaultMQPushConsumer() throws MQClientException { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(paascloudProperties.getAliyun().getRocketMq().getConsumerGroup()); consumer.setNamesrvAddr(paascloudProperties.getAliyun().getRocketMq().getNamesrvAddr()); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET); String[] strArray = AliyunMqTopicConstants.ConsumerTopics.OPT.split(GlobalConstant.Symbol.COMMA); for (String aStrArray : strArray) { String[] topicArray = aStrArray.split(GlobalConstant.Symbol.AT); String topic = topicArray[0]; String tags = topicArray[1]; if (PublicUtil.isEmpty(tags)) { tags = "*"; } consumer.subscribe(topic, tags); log.info("RocketMq OpcPushConsumer topic = {}, tags={}", topic, tags); } consumer.registerMessageListener(optPushConsumer); consumer.setConsumeThreadMax(2); consumer.setConsumeThreadMin(2); taskExecutor.execute(() -> { try { Thread.sleep(5000); consumer.start(); log.info("RocketMq OpcPushConsumer OK."); } catch (InterruptedException | MQClientException e) { log.error("RocketMq OpcPushConsumer, 出现异常={}", e.getMessage(), e); } }); return consumer; } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/config/AliyunSmsConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AliyunSmsConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.profile.DefaultProfile; import com.aliyuncs.profile.IClientProfile; import com.paascloud.config.properties.PaascloudProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; /** * The class Aliyun sms configuration. * * @author paascloud.net@gmail.com */ @Slf4j @Configuration public class AliyunSmsConfiguration { @Resource private PaascloudProperties paascloudProperties; /** * Acs client acs client. * * @return the acs client * * @throws ClientException the client exception */ @Bean public IAcsClient acsClient() throws ClientException { log.info("SMS Bean IAcsClient Start"); IClientProfile profile = DefaultProfile.getProfile(paascloudProperties.getAliyun().getSms().getRegionId(), paascloudProperties.getAliyun().getKey().getAccessKeyId(), paascloudProperties.getAliyun().getKey().getAccessKeySecret()); DefaultProfile.addEndpoint(paascloudProperties.getAliyun().getSms().getEndpointName(), paascloudProperties.getAliyun().getSms().getRegionId(), paascloudProperties.getAliyun().getSms().getProduct(), paascloudProperties.getAliyun().getSms().getDomain()); DefaultAcsClient defaultAcsClient = new DefaultAcsClient(profile); log.info("加载SMS Bean IAcsClient OK"); return defaultAcsClient; } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/config/OpcWebMvcConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcWebMvcConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.paascloud.core.config.PcObjectMapper; import com.paascloud.core.config.SwaggerConfiguration; import com.paascloud.core.interceptor.TokenInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import javax.annotation.Resource; import java.util.List; /** * The class Mdc web mvc config. * * @author paascloud.net @gmail.com */ @Configuration @EnableWebMvc @Import(SwaggerConfiguration.class) public class OpcWebMvcConfig extends WebMvcConfigurerAdapter { @Resource private TokenInterceptor vueViewInterceptor; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/"); } /** * Add interceptors. * * @param registry the registry */ @Override public void addInterceptors(InterceptorRegistry registry) { super.addInterceptors(registry); registry.addInterceptor(vueViewInterceptor) .addPathPatterns("/**") .excludePathPatterns("/swagger-resources/**", "*.js", "/**/*.js", "*.css", "/**/*.css", "*.html", "/**/*.html"); } @Override public void configureMessageConverters(List> converters) { PcObjectMapper.buidMvcMessageConverter(converters); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/config/QiniuOssConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:QiniuOssConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.paascloud.config.properties.PaascloudProperties; import com.qiniu.common.Zone; import com.qiniu.storage.BucketManager; import com.qiniu.storage.UploadManager; import com.qiniu.util.Auth; import lombok.extern.slf4j.Slf4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.annotation.Resource; /** * The class Qiniu oss configuration. * * @author paascloud.net@gmail.com */ @Slf4j @Configuration public class QiniuOssConfiguration { @Resource private PaascloudProperties paascloudProperties; /** * Auth auth. * * @return the auth */ @Bean public Auth auth() { Auth auth = Auth.create(paascloudProperties.getQiniu().getKey().getAccessKey(), paascloudProperties.getQiniu().getKey().getSecretKey()); log.info("Create Auth OK."); return auth; } /** * Upload manager upload manager. * * @return the upload manager */ @Bean public UploadManager uploadManager() { Zone zone = Zone.autoZone(); //创建上传对象 UploadManager uploadManager = new UploadManager(new com.qiniu.storage.Configuration(zone)); log.info("Create UploadManager OK."); return uploadManager; } /** * Bucket manager bucket manager. * * @return the bucket manager */ @Bean public BucketManager bucketManager() { Zone zone = Zone.autoZone(); //创建上传对象 BucketManager uploadManager = new BucketManager(auth(), new com.qiniu.storage.Configuration(zone)); log.info("Create BucketManager OK."); return uploadManager; } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/config/ResourceServerConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ResourceServerConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import javax.servlet.http.HttpServletResponse; /** * The class Resource server config. * * @author paascloud.net @gmail.com */ @Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http .headers().frameOptions().disable() .and() .csrf().disable() .exceptionHandling() .authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED)) .and() .authorizeRequests().antMatchers("/pay/alipayCallback", "/druid/**", "/swagger-ui.html", "/swagger-resources/**", "/v2/api-docs", "/api/applications").permitAll() .anyRequest().authenticated(); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/consumer/MdcTopicConsumer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcTopicConsumer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.consumer; import com.paascloud.JacksonUtil; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.core.mq.MqMessage; import com.paascloud.provider.model.dto.UpdateAttachmentDto; import com.paascloud.provider.service.OpcAttachmentService; import com.qiniu.common.QiniuException; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * The class Opt send sms topic consumer. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class MdcTopicConsumer { @Resource private OpcAttachmentService opcAttachmentService; /** * Handler send sms topic. * * @param body the body * @param topicName the topic name * @param tags the tags * @param keys the keys */ @Transactional(rollbackFor = Exception.class) public void handlerSendSmsTopic(String body, String topicName, String tags, String keys) throws QiniuException { MqMessage.checkMessage(body, keys, topicName); if (StringUtils.equals(tags, AliyunMqTopicConstants.MqTagEnum.DELETE_ATTACHMENT.getTag())) { List idList = opcAttachmentService.queryAttachmentByRefNo(body); for (final Long id : idList) { opcAttachmentService.deleteFile(id); } } else { UpdateAttachmentDto attachmentDto; try { attachmentDto = JacksonUtil.parseJson(body, UpdateAttachmentDto.class); } catch (Exception e) { log.error("发送短信MQ出现异常={}", e.getMessage(), e); throw new IllegalArgumentException("JSON转换异常", e); } opcAttachmentService.updateAttachment(attachmentDto); } } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/consumer/OptSendEmailTopicConsumer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptSendEmailTopicConsumer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.consumer; import com.paascloud.JacksonUtil; import com.paascloud.core.mq.MqMessage; import com.paascloud.provider.model.dto.PcSendEmailRequest; import com.paascloud.provider.service.OptSendMailService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Set; /** * The class Opt send email topic consumer. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class OptSendEmailTopicConsumer { @Resource private OptSendMailService optSendMailService; /** * Handler send email topic. * * @param body the body * @param topicName the topic name * @param tags the tags * @param keys the keys */ public void handlerSendEmailTopic(String body, String topicName, String tags, String keys) { MqMessage.checkMessage(body, keys, topicName); PcSendEmailRequest request; try { request = JacksonUtil.parseJson(body, PcSendEmailRequest.class); } catch (Exception e) { log.error("发送短信MQ出现异常={}", e.getMessage(), e); throw new IllegalArgumentException("处理MQ信息,JSON转换异常"); } String subject = request.getSubject(); String text = request.getText(); Set to = request.getTo(); optSendMailService.sendTemplateMail(subject, text, to); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/consumer/OptSendSmsTopicConsumer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptSendSmsTopicConsumer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.consumer; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.paascloud.JacksonUtil; import com.paascloud.core.mq.MqMessage; import com.paascloud.provider.service.OptSmsService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * The class Opt send sms topic consumer. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class OptSendSmsTopicConsumer { @Resource private OptSmsService smsService; /** * Handler send sms topic. * * @param body the body * @param topicName the topic name * @param tags the tags * @param keys the keys */ public void handlerSendSmsTopic(String body, String topicName, String tags, String keys) { MqMessage.checkMessage(body, keys, topicName); SendSmsRequest sendSmsRequest; try { sendSmsRequest = JacksonUtil.parseJson(body, SendSmsRequest.class); } catch (Exception e) { log.error("发送短信MQ出现异常={}", e.getMessage(), e); throw new IllegalArgumentException("JSON转换异常", e); } String ipAddr = sendSmsRequest.getOutId(); if (StringUtils.isEmpty(ipAddr)) { throw new IllegalArgumentException("outId不能为空"); } smsService.sendSms(sendSmsRequest); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/consumer/listener/OptPushMessageListener.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptPushMessageListener.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.consumer.listener; import com.paascloud.PublicUtil; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.core.mq.MqMessage; import com.paascloud.provider.annotation.MqConsumerStore; import com.paascloud.provider.consumer.MdcTopicConsumer; import com.paascloud.provider.consumer.OptSendEmailTopicConsumer; import com.paascloud.provider.consumer.OptSendSmsTopicConsumer; import com.paascloud.provider.service.MqMessageService; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.common.message.MessageExt; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; import java.util.concurrent.TimeUnit; /** * The class Opt push message listener. * * @author paascloud.net@gmail.com */ @Slf4j @Component public class OptPushMessageListener implements MessageListenerConcurrently { @Resource private OptSendSmsTopicConsumer optSendSmsTopicService; @Resource private OptSendEmailTopicConsumer optSendEmailTopicService; @Resource private MdcTopicConsumer mdcTopicConsumer; @Resource private MqMessageService mqMessageService; @Resource private StringRedisTemplate srt; /** * Consume message consume concurrently status. * * @param messageExtList the message ext list * @param consumeConcurrentlyContext the consume concurrently context * * @return the consume concurrently status */ @Override @MqConsumerStore public ConsumeConcurrentlyStatus consumeMessage(List messageExtList, ConsumeConcurrentlyContext consumeConcurrentlyContext) { MessageExt msg = messageExtList.get(0); String body = new String(msg.getBody()); String topicName = msg.getTopic(); String tags = msg.getTags(); String keys = msg.getKeys(); log.info("MQ消费Topic={},tag={},key={}", topicName, tags, keys); ValueOperations ops = srt.opsForValue(); // 控制幂等性使用的key try { MqMessage.checkMessage(body, topicName, tags, keys); String mqKV = null; if (srt.hasKey(keys)) { mqKV = ops.get(keys); } if (PublicUtil.isNotEmpty(mqKV)) { log.error("MQ消费Topic={},tag={},key={}, 重复消费", topicName, tags, keys); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } if (AliyunMqTopicConstants.MqTopicEnum.SEND_SMS_TOPIC.getTopic().equals(topicName)) { optSendSmsTopicService.handlerSendSmsTopic(body, topicName, tags, keys); } if (AliyunMqTopicConstants.MqTopicEnum.SEND_EMAIL_TOPIC.getTopic().equals(topicName)) { optSendEmailTopicService.handlerSendEmailTopic(body, topicName, tags, keys); } if (AliyunMqTopicConstants.MqTopicEnum.TPC_TOPIC.getTopic().equals(topicName)) { mqMessageService.deleteMessageTopic(body, tags); } if (AliyunMqTopicConstants.MqTopicEnum.MDC_TOPIC.getTopic().equals(topicName)) { mdcTopicConsumer.handlerSendSmsTopic(body, topicName, tags, keys); } else { log.info("OPC订单信息消 topicName={} 不存在", topicName); } } catch (IllegalArgumentException ex) { log.error("校验MQ message 失败 ex={}", ex.getMessage(), ex); } catch (Exception e) { log.error("处理MQ message 失败 topicName={}, keys={}, ex={}", topicName, keys, e.getMessage(), e); return ConsumeConcurrentlyStatus.RECONSUME_LATER; } ops.set(keys, keys, 10, TimeUnit.DAYS); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/mapper/OpcSmsSettingMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcSmsSettingMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.OpcSmsSetting; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; /** * The interface Opc sms setting mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface OpcSmsSettingMapper extends MyMapper { } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/mapper/OptAttachmentMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptAttachmentMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.OptAttachment; import com.paascloud.provider.model.dto.attachment.OptAttachmentReqDto; import com.paascloud.provider.model.dto.attachment.OptAttachmentRespDto; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Opt attachment mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface OptAttachmentMapper extends MyMapper { /** * Query attachment list. * * @param optAttachmentReqDto the opt attachment req dto * * @return the list */ List queryAttachment(OptAttachmentReqDto optAttachmentReqDto); /** * Query attachment by ref no list. * * @param refNo the ref no * * @return the list */ List queryAttachmentByRefNo(@Param("refNo") String refNo); /** * Delete by id list int. * * @param attachmentIdList the attachment id list * * @return the int */ int deleteByIdList(@Param("idList") List attachmentIdList); /** * List expire file list. * * @return the list */ List listExpireFile(); } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/model/domain/OpcSmsSetting.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcSmsSetting.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; /** * The class Opc sms setting. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_opc_sms_setting") @Alias(value = "opcSmsSetting") public class OpcSmsSetting extends BaseEntity { private static final long serialVersionUID = -1811960778993500439L; /** * 可再次发送时间(毫秒) */ @Column(name = "again_send_time") private Integer againSendTime; /** * 失效时间(分钟) */ @Column(name = "invalid_time") private Integer invalidTime; /** * 短信类型 */ private String type; /** * 类型描述 */ @Column(name = "type_desc") private String typeDesc; /** * 模板code */ @Column(name = "templet_code") private String templetCode; /** * 模板内容 */ @Column(name = "templet_content") private String templetContent; /** * 一天中可发送的最大数量 */ @Column(name = "send_max_num") private Integer sendMaxNum; /** * 一个IP一天中可发送的最大数量 */ @Column(name = "ip_send_max_num") private Integer ipSendMaxNum; /** * 备注 */ private String remark; /** * 删除标识(1-已删除;0-未删除) */ private Integer yn; } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/model/domain/OptAttachment.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptAttachment.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import javax.persistence.Column; import javax.persistence.Table; /** * The class Opt attachment. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_opt_attachment") public class OptAttachment extends BaseEntity { private static final long serialVersionUID = -2419047791219240612L; /** * 中心名称(英文简写) */ @Column(name = "center_name") private String centerName; /** * 文件服务器根目录 */ @Column(name = "bucket_name") private String bucketName; /** * 上传附件的相关业务流水号 */ @Column(name = "ref_no") private String refNo; /** * 附件名称 */ private String name; /** * 附件存储相对路径 */ private String path; /** * 附件类型 */ private String type; /** * 附件格式 */ private String format; /** * 备注 */ private String description; } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/model/dto/attachment/OptAttachmentReqDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptAttachmentReqDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.attachment; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Opt attachment req dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "OptAttachmentReqDto") public class OptAttachmentReqDto implements Serializable { private static final long serialVersionUID = -1727131719075160349L; /** * 主键 */ @ApiModelProperty(value = "主键") private Long id; /** * 附件流水号 */ @ApiModelProperty(value = "附件流水号") private String serialNo; /** * 上传附件的相关业务流水号 */ @ApiModelProperty(value = "上传附件的相关业务流水号") private String refNo; } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/model/dto/mail/MailEntity.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MailEntity.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.mail; import com.google.common.base.Preconditions; import com.google.common.collect.Sets; import com.paascloud.PubUtils; import com.paascloud.PublicUtil; import lombok.Data; import lombok.extern.slf4j.Slf4j; import org.springframework.mail.SimpleMailMessage; import java.util.Date; import java.util.Set; /** * The class Mail entity. * * @author paascloud.net@gmail.com */ @Slf4j @Data public class MailEntity { /** * 获取或设置电子邮件的回复地址。 */ private String replyTo; /** * 获取包含此电子邮件的收件人的地址集合。 */ private Set to; /** * 获取包含此电子邮件的抄送 (CC) 收件人的地址集合。 */ private Set cc; /** * 获取包含此电子邮件的密件抄送 (BCC) 收件人的地址集合。 */ private Set bcc; /** * 发送时间 */ private Date sentDate; /** * 获取或设置此电子邮件的主题行。 */ private String subject; /** * 内容 */ private String text; /** * Instantiates a new Mail entity. * * @param subject the subject * @param text the text * @param to the to */ public MailEntity(String subject, String text, Set to) { this.subject = subject; this.text = text; this.to = to; this.sentDate = new Date(); } /** * Instantiates a new Mail entity. * * @param subject the subject * @param text the text * @param to the to * @param cc the cc */ public MailEntity(String subject, String text, Set to, Set cc) { this.subject = subject; this.text = text; this.to = to; this.cc = cc; this.sentDate = new Date(); } /** * Create simple mail message simple mail message. * * @param subject the subject * @param text the text * @param to the to * * @return the simple mail message */ public static SimpleMailMessage createSimpleMailMessage(String subject, String text, Set to) { log.info("参数异常, 邮件信息不完整 subject={}, text={}, to={}", subject, text, to); Preconditions.checkArgument(!PubUtils.isNull(subject, text, to), "参数异常, 邮件信息不完整"); String[] toArray = setToArray(to); SimpleMailMessage simpleMailMessage = new SimpleMailMessage(); simpleMailMessage.setSubject(subject); simpleMailMessage.setText(text); simpleMailMessage.setTo(toArray); return simpleMailMessage; } private static String[] setToArray(Set to) { Set toSet = Sets.newHashSet(); for (String toStr : to) { toStr = toStr.trim(); if (PubUtils.isEmail(toStr)) { toSet.add(toStr); } } if (PublicUtil.isEmpty(toSet)) { return null; } return toSet.toArray(new String[toSet.size()]); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/OpcAttachmentService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcAttachmentService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.OptAttachment; import com.paascloud.provider.model.dto.UpdateAttachmentDto; import com.paascloud.provider.model.dto.attachment.OptAttachmentRespDto; import com.paascloud.provider.model.dto.oss.*; import com.qiniu.common.QiniuException; import org.springframework.web.multipart.MultipartHttpServletRequest; import java.io.IOException; import java.util.List; /** * The interface Opc attachment service. * * @author paascloud.net @gmail.com */ public interface OpcAttachmentService extends IService { /** * Upload file string. * * @param multipartRequest the multipart request * @param optUploadFileReqDto the opt upload file req dto * @param loginAuthDto the login auth dto * @param storeDbFlag the store db flag * * @return the string */ List uploadFile(MultipartHttpServletRequest multipartRequest, OptUploadFileReqDto optUploadFileReqDto, LoginAuthDto loginAuthDto, boolean storeDbFlag); /** * 根据ID查询附件信息. * * @param id the id * * @return the opt attachment resp dto */ OptAttachmentRespDto queryAttachmentById(Long id); /** * 根据关联单号查询附件信息. * * @param refNo the ref no * * @return the list */ List queryAttachmentListByRefNo(String refNo); /** * Query attachment by ref no list. * * @param refNo the ref no * * @return the list */ List queryAttachmentByRefNo(String refNo); /** * Delete file int. * * @param fileName the file name * @param bucketName the bucket name * @param attachmentId the attachment id * * @return the int * * @throws QiniuException the qiniu exception */ int deleteFile(String fileName, String bucketName, Long attachmentId) throws QiniuException; /** * Delete file int. * * @param attachmentId the attachment id * * @return the int * * @throws QiniuException the qiniu exception */ int deleteFile(Long attachmentId) throws QiniuException; /** * Save attachment. * * @param optAttachment the opt attachment * @param loginAuthDto the login auth dto */ void saveAttachment(OptAttachment optAttachment, LoginAuthDto loginAuthDto); /** * RPC上传附件信息. * * @param optUploadFileReqDto the opt upload file req dto * * @return the opt upload file resp dto * * @throws IOException the io exception */ OptUploadFileRespDto rpcUploadFile(OptUploadFileReqDto optUploadFileReqDto) throws IOException; /** * 获取附件完整路径. * * @param optGetUrlRequest the opt get url request * * @return the string */ String rpcGetFileUrl(OptGetUrlRequest optGetUrlRequest); /** * Gets by id. * * @param attachmentId the attachment id * * @return the by id */ OptAttachment getById(Long attachmentId); /** * Upload file opt upload file resp dto. * * @param uploadBytes the upload bytes * @param fileName the file name * @param fileType the file type * @param filePath the file path * @param bucketName the bucket name * @param loginAuthDto the login auth dto * * @return the opt upload file resp dto * * @throws IOException the io exception */ OptUploadFileRespDto uploadFile(byte[] uploadBytes, String fileName, String fileType, String filePath, String bucketName, LoginAuthDto loginAuthDto) throws IOException; /** * 更新附件. * * @param attachmentDto the attachment dto * * @throws QiniuException the qiniu exception */ void updateAttachment(UpdateAttachmentDto attachmentDto) throws QiniuException; /** * List file url list. * * @param urlRequest the url request * * @return the list */ List listFileUrl(OptBatchGetUrlRequest urlRequest); /** * List by ref no list. * * @param refNo the ref no * * @return the list */ List listByRefNo(final String refNo); /** * 查询已过期的文件. * * @return the list */ List listExpireFile(); } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/OpcOssService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcOssService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.oss.OptUploadFileRespDto; import com.qiniu.common.QiniuException; import java.io.IOException; import java.util.Set; /** * The interface Opc oss service. * * @author paascloud.net@gmail.com */ public interface OpcOssService { /** * 删除文件 * * @param fileName 文件路径 + 文件名 * @param bucketName oss对象名称 * * @throws QiniuException the qiniu exception */ void deleteFile(String fileName, String bucketName) throws QiniuException; /** * Batch delete file set. * * @param fileNameList the file name list * @param bucketName the bucket name * * @return the set * * @throws QiniuException the qiniu exception */ Set batchDeleteFile(String[] fileNameList, String bucketName) throws QiniuException; /** * 获取查看文件的Url * * @param domainOfBucket the domain of bucket * @param fileName 文件路径 + 文件名 * @param expires 失效时间 * * @return the file url */ String getFileUrl(String domainOfBucket, String fileName, Long expires); /** * Gets file url. * * @param domainOfBucket the domain of bucket * @param fileName the file name * * @return the file url */ String getFileUrl(String domainOfBucket, String fileName); /** * Upload file opt upload file resp dto. * * @param uploadBytes the upload bytes * @param fileName the file name * @param filePath the file path * @param bucketName the bucket name * * @return the opt upload file resp dto * * @throws IOException the io exception */ OptUploadFileRespDto uploadFile(byte[] uploadBytes, String fileName, String filePath, String bucketName) throws IOException; } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/OptFreeMarkerService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptFreeMarkerService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import freemarker.template.TemplateException; import java.io.IOException; import java.util.Map; /** * The interface Opt free marker service. * * @author paascloud.net@gmail.com */ public interface OptFreeMarkerService { /** * Gets template. * * @param map the map * @param templateLocation the template location * * @return the template * * @throws IOException the io exception * @throws TemplateException the template exception */ String getTemplate(Map map, String templateLocation) throws IOException, TemplateException; } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/OptSendMailService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptSendMailService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import java.util.Map; import java.util.Set; /** * The interface Opt send mail service. * * @author paascloud.net@gmail.com */ public interface OptSendMailService { /** * Send simple mail int. * * @param subject the subject * @param text the text * @param to the to * * @return the int */ int sendSimpleMail(String subject, String text, Set to); /** * Send template mail int. * * @param subject the subject * @param text the text * @param to the to * * @return the int */ int sendTemplateMail(String subject, String text, Set to); /** * Send template mail int. * * @param model the model * @param templateLocation the template location * @param subject the subject * @param to the to * * @return the int */ int sendTemplateMail(Map model, String templateLocation, String subject, Set to); } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/OptSmsService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptSmsService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; /** * The interface Opt sms service. * * @author paascloud.net@gmail.com */ public interface OptSmsService { /** * Send sms send sms response. * * @param sendSmsRequest the send sms request * * @return the send sms response */ SendSmsResponse sendSms(SendSmsRequest sendSmsRequest); } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/impl/OptAttachmentServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptAttachmentServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.paascloud.PublicUtil; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.core.support.BaseService; import com.paascloud.provider.exceptions.OpcBizException; import com.paascloud.provider.mapper.OptAttachmentMapper; import com.paascloud.provider.model.domain.OptAttachment; import com.paascloud.provider.model.dto.UpdateAttachmentDto; import com.paascloud.provider.model.dto.attachment.OptAttachmentReqDto; import com.paascloud.provider.model.dto.attachment.OptAttachmentRespDto; import com.paascloud.provider.model.dto.attachment.OptUploadFileByteInfoReqDto; import com.paascloud.provider.model.dto.oss.*; import com.paascloud.provider.service.OpcAttachmentService; import com.paascloud.provider.service.OpcOssService; import com.paascloud.provider.utils.CheckFileUtil; import com.qiniu.common.QiniuException; import com.xiaoleilu.hutool.io.FileTypeUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.annotation.Resource; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.List; /** * The class Opt attachment service. * * @author paascloud.net @gmail.com */ @Service public class OptAttachmentServiceImpl extends BaseService implements OpcAttachmentService { @Resource private OptAttachmentMapper optAttachmentMapper; @Resource private OpcOssService optOssService; @Resource private PaascloudProperties paascloudProperties; @Override public List uploadFile(MultipartHttpServletRequest multipartRequest, OptUploadFileReqDto optUploadFileReqDto, LoginAuthDto loginAuthDto, boolean storeDbFlag) { String fileType = optUploadFileReqDto.getFileType(); String filePath = optUploadFileReqDto.getFilePath(); String bucketName = optUploadFileReqDto.getBucketName(); List result = Lists.newArrayList(); if (PublicUtil.isEmpty(filePath)) { filePath = GlobalConstant.Sys.DEFAULT_FILE_PATH; } try { List fileList = multipartRequest.getFiles("file"); if (fileList.isEmpty()) { return result; } for (MultipartFile multipartFile : fileList) { String fileName = multipartFile.getOriginalFilename(); if (PublicUtil.isEmpty(fileName)) { continue; } Preconditions.checkArgument(multipartFile.getSize() <= GlobalConstant.FILE_MAX_SIZE, "上传文件不能大于5M"); InputStream inputStream = multipartFile.getInputStream(); String inputStreamFileType = FileTypeUtil.getType(inputStream); CheckFileUtil.checkFileType(fileType, inputStreamFileType); OptUploadFileRespDto fileInfo; if (storeDbFlag) { fileInfo = this.uploadFile(multipartFile.getBytes(), fileName, fileType, filePath, bucketName, loginAuthDto); } else { fileInfo = optOssService.uploadFile(multipartFile.getBytes(), fileName, filePath, bucketName); } result.add(fileInfo); } } catch (IOException e) { logger.error("上传文件失败={}", e.getMessage(), e); } return result; } @Override public OptAttachmentRespDto queryAttachmentById(Long id) { Preconditions.checkArgument(id != null, "ID不能为空"); OptAttachmentReqDto optAttachmentReqDto = new OptAttachmentReqDto(); optAttachmentReqDto.setId(id); List optAttachmentRespDtos = optAttachmentMapper.queryAttachment(optAttachmentReqDto); return optAttachmentRespDtos == null ? null : optAttachmentRespDtos.get(0); } @Override public List queryAttachmentListByRefNo(String refNo) { Preconditions.checkArgument(StringUtils.isNotEmpty(refNo), "关联单号不能为空"); OptAttachmentReqDto optAttachmentReqDto = new OptAttachmentReqDto(); optAttachmentReqDto.setRefNo(refNo); return optAttachmentMapper.queryAttachment(optAttachmentReqDto); } @Override public List queryAttachmentByRefNo(final String refNo) { return optAttachmentMapper.queryAttachmentByRefNo(refNo); } @Override public int deleteFile(String fileName, String bucketName, Long attachmentId) throws QiniuException { Preconditions.checkArgument(StringUtils.isNotEmpty(fileName), ErrorCodeEnum.OPC10040010.msg()); Preconditions.checkArgument(StringUtils.isNotEmpty(bucketName), "存储空间不能为空"); optOssService.deleteFile(fileName, bucketName); return optAttachmentMapper.deleteByPrimaryKey(attachmentId); } @Override public int deleteFile(final Long attachmentId) throws QiniuException { OptAttachment optAttachment = optAttachmentMapper.selectByPrimaryKey(attachmentId); if (optAttachment != null) { optOssService.deleteFile(optAttachment.getPath() + optAttachment.getName(), optAttachment.getBucketName()); return optAttachmentMapper.deleteByPrimaryKey(attachmentId); } return 1; } @Override public void saveAttachment(OptAttachment optAttachment, LoginAuthDto loginAuthDto) { optAttachment.setUpdateInfo(loginAuthDto); if (optAttachment.isNew()) { optAttachmentMapper.insertSelective(optAttachment); } else { int result = optAttachmentMapper.updateByPrimaryKeySelective(optAttachment); if (result < 1) { throw new OpcBizException(ErrorCodeEnum.OPC10040007, optAttachment.getId()); } } } @Override public OptUploadFileRespDto rpcUploadFile(OptUploadFileReqDto optUploadFileReqDto) throws IOException { String fileType = optUploadFileReqDto.getFileType(); String filePath = optUploadFileReqDto.getFilePath(); String bucketName = optUploadFileReqDto.getBucketName(); OptUploadFileByteInfoReqDto uploadFileByteInfoReqDto = optUploadFileReqDto.getUploadFileByteInfoReqDto(); LoginAuthDto authResDto = new LoginAuthDto(); authResDto.setUserId(optUploadFileReqDto.getUserId()); authResDto.setUserName(optUploadFileReqDto.getUserName()); if (PublicUtil.isEmpty(filePath)) { filePath = GlobalConstant.Oss.DEFAULT_FILE_PATH; } InputStream is = null; try { Preconditions.checkArgument(uploadFileByteInfoReqDto != null, "上传数据不能为空"); byte[] fileByteArray = uploadFileByteInfoReqDto.getFileByteArray(); Preconditions.checkArgument(fileByteArray.length / GlobalConstant.M_SIZE <= GlobalConstant.FILE_MAX_SIZE, "上传文件不能大于5M"); String fileName = uploadFileByteInfoReqDto.getFileName(); is = new ByteArrayInputStream(fileByteArray); String type = FileTypeUtil.getType(is); Preconditions.checkArgument(type.equals(fileType), "文件类型不符"); fileName = filePath + fileName; OptUploadFileRespDto optUploadFileRespDto = this.uploadFile(fileByteArray, fileName, fileType, filePath, bucketName, authResDto); optUploadFileRespDto.setFileType(fileType); return optUploadFileRespDto; } catch (IOException e) { logger.error("上传文件失败={}", e.getMessage(), e); } finally { if (null != is) { is.close(); } } return null; } /** * Rpc get file url string. * * @param optGetUrlRequest the opt get url request * * @return the string */ @Override public String rpcGetFileUrl(OptGetUrlRequest optGetUrlRequest) { Long attachmentId = optGetUrlRequest.getAttachmentId(); Long expires = optGetUrlRequest.getExpires(); boolean encrypt = optGetUrlRequest.isEncrypt(); if (null == attachmentId) { throw new IllegalArgumentException("参数异常, 请检查参数"); } OptAttachment optAttachment = this.getById(attachmentId); String fileName = optAttachment.getPath() + optAttachment.getName(); return getUrl(expires, encrypt, fileName); } private String getUrl(final Long expires, final boolean encrypt, final String fileName) { final String domainOfBucket; if (encrypt) { domainOfBucket = paascloudProperties.getQiniu().getOss().getPrivateHost(); return optOssService.getFileUrl(domainOfBucket, fileName, expires); } else { domainOfBucket = paascloudProperties.getQiniu().getOss().getPublicHost(); return domainOfBucket + "/" + fileName; } } @Override public OptAttachment getById(Long attachmentId) { Preconditions.checkArgument(attachmentId != null, "文件流水号不能为空"); OptAttachment optAttachment = optAttachmentMapper.selectByPrimaryKey(attachmentId); if (PublicUtil.isEmpty(optAttachment)) { throw new OpcBizException(ErrorCodeEnum.OPC10040008, attachmentId); } return optAttachment; } @Override public OptUploadFileRespDto uploadFile(byte[] uploadBytes, String fileName, String fileType, String filePath, String bucketName, LoginAuthDto loginAuthDto) throws IOException { OptUploadFileRespDto fileInfo = optOssService.uploadFile(uploadBytes, fileName, filePath, bucketName); insertAttachment(fileType, bucketName, loginAuthDto, fileInfo); return fileInfo; } @Override @Transactional(rollbackFor = Exception.class) public void updateAttachment(final UpdateAttachmentDto attachmentDto) throws QiniuException { List attachmentIdList = attachmentDto.getAttachmentIdList(); LoginAuthDto loginAuthDto = attachmentDto.getLoginAuthDto(); String refNo = attachmentDto.getRefNo(); List idList = optAttachmentMapper.queryAttachmentByRefNo(refNo); if (PublicUtil.isNotEmpty(idList)) { idList.removeAll(attachmentIdList); for (final Long id : idList) { this.deleteFile(id); } } for (final Long id : attachmentIdList) { OptAttachment optAttachment = new OptAttachment(); optAttachment.setId(id); optAttachment.setRefNo(refNo); optAttachment.setUpdateInfo(loginAuthDto); optAttachmentMapper.updateByPrimaryKeySelective(optAttachment); } } @Override public List listFileUrl(final OptBatchGetUrlRequest urlRequest) { List result = Lists.newArrayList(); String refNo = urlRequest.getRefNo(); Long expires = urlRequest.getExpires(); boolean encrypt = urlRequest.isEncrypt(); Preconditions.checkArgument(StringUtils.isNotEmpty(refNo), "业务单号不能为空"); List list = this.listByRefNo(refNo); for (final OptAttachment optAttachment : list) { String fileName = optAttachment.getPath() + optAttachment.getName(); String url = getUrl(expires, encrypt, fileName); if (StringUtils.isNotEmpty(url)) { ElementImgUrlDto dto = new ElementImgUrlDto(url, optAttachment.getName(), optAttachment.getId()); result.add(dto); } } return result; } @Override public List listByRefNo(final String refNo) { OptAttachment optAttachment = new OptAttachment(); optAttachment.setRefNo(refNo); return optAttachmentMapper.select(optAttachment); } @Override public List listExpireFile() { return optAttachmentMapper.listExpireFile(); } private void insertAttachment(String fileType, String bucketName, LoginAuthDto loginAuthDto, OptUploadFileRespDto fileInfo) { String attachmentName = fileInfo.getAttachmentName(); long id = generateId(); OptAttachment optAttachment = new OptAttachment(); optAttachment.setBucketName(bucketName); optAttachment.setFormat(fileInfo.getFileType()); optAttachment.setName(attachmentName); optAttachment.setType(fileType); optAttachment.setFormat(StringUtils.substringAfterLast(attachmentName, ".")); optAttachment.setPath(fileInfo.getAttachmentPath()); optAttachment.setId(id); optAttachment.setCenterName(bucketName); fileInfo.setAttachmentId(id); optAttachment.setUpdateInfo(loginAuthDto); optAttachmentMapper.insertSelective(optAttachment); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/impl/OptFreeMarkerServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptFreeMarkerServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.paascloud.PublicUtil; import com.paascloud.provider.service.OptFreeMarkerService; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.springframework.stereotype.Service; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import javax.annotation.Resource; import java.io.IOException; import java.util.Map; /** * The class Opt free marker service. * * @author paascloud.net@gmail.com */ @Service public class OptFreeMarkerServiceImpl implements OptFreeMarkerService { @Resource private Configuration configuration; @Override public String getTemplate(Map map, String templateLocation) throws IOException, TemplateException { Preconditions.checkArgument(PublicUtil.isNotEmpty(templateLocation), "模板不能为空"); Template t = configuration.getTemplate(templateLocation, "UTF-8"); return FreeMarkerTemplateUtils.processTemplateIntoString(t, map); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/impl/OptQiniuOssServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptQiniuOssServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.google.common.collect.Sets; import com.google.gson.Gson; import com.paascloud.PublicUtil; import com.paascloud.RedisKeyUtil; import com.paascloud.UrlUtil; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.core.generator.UniqueIdGenerator; import com.paascloud.provider.exceptions.OpcBizException; import com.paascloud.provider.model.dto.oss.OptUploadFileRespDto; import com.paascloud.provider.service.OpcOssService; import com.qiniu.common.QiniuException; import com.qiniu.http.Response; import com.qiniu.storage.BucketManager; import com.qiniu.storage.UploadManager; import com.qiniu.storage.model.BatchStatus; import com.qiniu.storage.model.DefaultPutRet; import com.qiniu.util.Auth; import com.xiaoleilu.hutool.io.FileTypeUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.util.Set; import java.util.concurrent.TimeUnit; /** * The class Opt qiniu oss service. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class OptQiniuOssServiceImpl implements OpcOssService { @Resource private BucketManager bucketManager; @Resource private Auth auth; @Resource private PaascloudProperties paascloudProperties; @Resource private UploadManager uploadManager; @Resource private StringRedisTemplate srt; private static final String OPEN_IMG_BUCKET = "open-img-bucket"; @Override @Retryable(value = Exception.class, backoff = @Backoff(delay = 5000, multiplier = 2)) public void deleteFile(String fileName, String bucketName) throws QiniuException { log.info("deleteFile - 删除OSS文件. fileName={}, bucketName={}", fileName, bucketName); Preconditions.checkArgument(StringUtils.isNotEmpty(fileName), ErrorCodeEnum.OPC10040010.msg()); Preconditions.checkArgument(StringUtils.isNotEmpty(bucketName), "存储空间不能为空"); Response response = bucketManager.delete(bucketName, fileName); log.info("deleteFile - 删除OSS文件. [OK] response={}", response); } @Override public Set batchDeleteFile(String[] fileNameList, String bucketName) throws QiniuException { log.info("batchDeleteFile - 删除OSS文件. fileNameList={}, bucketName={}", fileNameList, bucketName); BucketManager.BatchOperations batchOperations = new BucketManager.BatchOperations(); batchOperations.addDeleteOp(bucketName, fileNameList); Response response = bucketManager.batch(batchOperations); BatchStatus[] batchStatusList = response.jsonToObject(BatchStatus[].class); Set failSet = Sets.newHashSet(); for (int i = 0; i < fileNameList.length; i++) { BatchStatus status = batchStatusList[i]; String fileName = fileNameList[i]; if (status.code != 200) { failSet.add(fileName); log.error("batchDeleteFile - 删除OSS文件. [FAIL] fileName={}, error={}", fileName, status.data.error); } else { log.info("batchDeleteFile - 删除OSS文件. [OK] fileName={}, bucketName={}", fileName, bucketName); } } return failSet; } @Override public String getFileUrl(String domainOfBucket, String fileName, Long expires) { String downloadUrl; String encodedFileName = UrlUtil.getURLEncoderString(fileName); String url = String.format("%s/%s", domainOfBucket, encodedFileName); log.info("getFileUrl - 获取文件全路径. url={}", url); if (null == expires) { downloadUrl = auth.privateDownloadUrl(url); } else { downloadUrl = auth.privateDownloadUrl(url, expires); } log.info("getFileUrl - 获取文件全路径. [OK] downloadUrl={}", downloadUrl); return downloadUrl; } @Override public String getFileUrl(String domainOfBucket, String fileName) { return this.getFileUrl(domainOfBucket, fileName, null); } @Override public OptUploadFileRespDto uploadFile(byte[] uploadBytes, String fileName, String filePath, String bucketName) throws IOException { log.info("uploadFile - 上传文件. fileName={}, bucketName={}", fileName, bucketName); Preconditions.checkArgument(uploadBytes != null, "读取文件失败"); Preconditions.checkArgument(StringUtils.isNotEmpty(fileName), ErrorCodeEnum.OPC10040010.msg()); Preconditions.checkArgument(StringUtils.isNotEmpty(filePath), "文件路径不能为空"); Preconditions.checkArgument(StringUtils.isNotEmpty(bucketName), "存储节点不能为空"); InputStream is = new ByteArrayInputStream(uploadBytes); String inputStreamFileType = FileTypeUtil.getType(is); String newFileName = UniqueIdGenerator.generateId() + "." + inputStreamFileType; // 检查数据大小 this.checkFileSize(uploadBytes); Response response = uploadManager.put(uploadBytes, filePath + newFileName, getUpToken(bucketName)); DefaultPutRet putRet = new Gson().fromJson(response.bodyString(), DefaultPutRet.class); log.info("uploadFile - 上传文件. [OK] putRet={}", putRet); if (PublicUtil.isEmpty(putRet) || StringUtils.isEmpty(putRet.key)) { throw new OpcBizException(ErrorCodeEnum.OPC10040009); } String fileUrl; // 获取图片路径 if (StringUtils.equals(OPEN_IMG_BUCKET, bucketName)) { fileUrl = paascloudProperties.getQiniu().getOss().getPublicHost() + "/" + filePath + newFileName; } else { String domainUrl = paascloudProperties.getQiniu().getOss().getPrivateHost(); fileUrl = this.getFileUrl(domainUrl, fileName); } OptUploadFileRespDto result = new OptUploadFileRespDto(); result.setAttachmentUrl(fileUrl); result.setAttachmentName(newFileName); result.setAttachmentPath(filePath); return result; } private String getUpToken(String bucketName) { return auth.uploadToken(bucketName); } private void checkFileSize(byte[] uploadFileByte) { long redisFileSize; Long fileMaxSize = paascloudProperties.getQiniu().getOss().getFileMaxSize(); Preconditions.checkArgument(fileMaxSize != null, "每天上传文件最大值没有配置"); String fileSizeKey = RedisKeyUtil.getFileSizeKey(); long fileSize = uploadFileByte.length; String redisFileSizeStr = srt.opsForValue().get(fileSizeKey); if(StringUtils.isEmpty(redisFileSizeStr)) { redisFileSizeStr = "0"; } redisFileSize = Long.valueOf(redisFileSizeStr); if (fileSize + redisFileSize > fileMaxSize) { throw new OpcBizException(ErrorCodeEnum.OPC10040011); } srt.opsForValue().set(fileSizeKey, String.valueOf(redisFileSize + fileSize), 1, TimeUnit.DAYS); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/impl/OptSendMailServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptSendMailServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.google.common.collect.Sets; import com.paascloud.PubUtils; import com.paascloud.PublicUtil; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.exceptions.OpcBizException; import com.paascloud.provider.model.dto.mail.MailEntity; import com.paascloud.provider.service.OptFreeMarkerService; import com.paascloud.provider.service.OptSendMailService; import freemarker.template.TemplateException; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.task.TaskExecutor; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.mail.MessagingException; import javax.mail.internet.MimeMessage; import java.io.IOException; import java.util.Map; import java.util.Set; /** * The class Opt send mail service. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class OptSendMailServiceImpl implements OptSendMailService { @Resource private TaskExecutor taskExecutor; @Resource private OptFreeMarkerService optVelocityService; @Resource private JavaMailSender mailSender; @Value("${spring.mail.username}") private String from; @Override public int sendSimpleMail(String subject, String text, Set to) { log.info("sendSimpleMail - 发送简单邮件. subject={}, text={}, to={}", subject, text, to); int result = 1; try { SimpleMailMessage message = MailEntity.createSimpleMailMessage(subject, text, to); message.setFrom(from); taskExecutor.execute(() -> mailSender.send(message)); } catch (Exception e) { log.info("sendSimpleMail [FAIL] ex={}", e.getMessage(), e); result = 0; } return result; } @Override public int sendTemplateMail(String subject, String text, Set to) { log.info("sendTemplateMail - 发送模板邮件. subject={}, text={}, to={}", subject, text, to); int result = 1; try { MimeMessage mimeMessage = getMimeMessage(subject, text, to); taskExecutor.execute(() -> mailSender.send(mimeMessage)); } catch (Exception e) { log.info("sendTemplateMail [FAIL] ex={}", e.getMessage(), e); result = 0; } return result; } private MimeMessage getMimeMessage(String subject, String text, Set to) { Preconditions.checkArgument(!PubUtils.isNull(subject, text, to), "参数异常, 邮件信息不完整"); String[] toArray = setToArray(to); Preconditions.checkArgument(PublicUtil.isNotEmpty(toArray), "请输入收件人邮箱"); MimeMessage mimeMessage = mailSender.createMimeMessage(); MimeMessageHelper helper; try { helper = new MimeMessageHelper(mimeMessage, true); helper.setFrom(from); helper.setTo(toArray); helper.setSubject(subject); helper.setText(text, true); } catch (MessagingException e) { log.error("生成邮件消息体, 出现异常={}", e.getMessage(), e); throw new OpcBizException(ErrorCodeEnum.OPC10040005); } return mimeMessage; } @Override public int sendTemplateMail(Map model, String templateLocation, String subject, Set to) { log.info("sendTemplateMail - 发送模板邮件. subject={}, model={}, to={}, templateLocation={}", subject, model, to, templateLocation); String text; try { text = optVelocityService.getTemplate(model, templateLocation); } catch (IOException | TemplateException e) { log.info("sendTemplateMail [FAIL] ex={}", e.getMessage(), e); throw new OpcBizException(ErrorCodeEnum.OPC10040006, e); } return this.sendTemplateMail(subject, text, to); } private String[] setToArray(Set to) { Preconditions.checkArgument(PublicUtil.isNotEmpty(to), "请输入收件人邮箱"); Set toSet = Sets.newHashSet(); for (String toStr : to) { toStr = toStr.trim(); if (PubUtils.isEmail(toStr)) { toSet.add(toStr); } } if (PublicUtil.isEmpty(toSet)) { return null; } return toSet.toArray(new String[toSet.size()]); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/service/impl/OptSmsServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptSmsServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.aliyuncs.IAcsClient; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.aliyuncs.exceptions.ClientException; import com.google.common.base.Preconditions; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.provider.exceptions.OpcBizException; import com.paascloud.provider.service.OptSmsService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * The class Opt sms service. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class OptSmsServiceImpl implements OptSmsService { @Resource private IAcsClient iAcsClient; @Resource private PaascloudProperties paascloudProperties; @Value("${spring.profiles.active}") private String profile; @Override public SendSmsResponse sendSms(SendSmsRequest sendSmsRequest) { checkParam(sendSmsRequest); SendSmsResponse acsResponse; try { if (GlobalConstant.DEV_PROFILE.equals(profile)) { log.error("dev环境不发送短信"); return new SendSmsResponse(); } if (GlobalConstant.TEST_PROFILE.equals(profile)) { log.error("test环境不发送短信"); return new SendSmsResponse(); } acsResponse = iAcsClient.getAcsResponse(sendSmsRequest); } catch (ClientException e) { log.error("send sms message error={}", e.getMessage(), e); throw new OpcBizException(ErrorCodeEnum.OPC10040004, e); } log.info("send sms message OK acsResponse={}", acsResponse); return acsResponse; } private void checkParam(SendSmsRequest sendSmsRequest) { String templateCode = sendSmsRequest.getTemplateCode(); String signName = sendSmsRequest.getSignName(); if (StringUtils.isBlank(signName)) { sendSmsRequest.setSignName(paascloudProperties.getAliyun().getSms().getSignName()); } String templateParam = sendSmsRequest.getTemplateParam(); String phoneNumbers = sendSmsRequest.getPhoneNumbers(); Preconditions.checkArgument(StringUtils.isNotEmpty(templateCode), "短信模板不能为空"); Preconditions.checkArgument(StringUtils.isNotEmpty(phoneNumbers), "手机号码不能为空"); Preconditions.checkArgument(StringUtils.isNotEmpty(templateParam), "短信内容不能为空"); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/utils/CheckFileUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CheckFileUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.utils; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Map; /** * The class Check file util. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class CheckFileUtil { private static final Map FILE_TYPE_MAP = Maps.newHashMap(); /** * Check file type. * * @param fileType the file type * @param inputStreamFileType the input stream file type */ public static void checkFileType(String fileType, String inputStreamFileType) { Preconditions.checkArgument(FileTypeEnum.getTypes().contains(fileType), "上传文件类型不正确"); // 获取文件类型 FILE_TYPE_MAP.clear(); // 上传的是图片 if (FileTypeEnum.PICTURE.getType().equals(fileType)) { getPicFileType(); Preconditions.checkArgument(FILE_TYPE_MAP.containsKey(inputStreamFileType), "图片格式非法"); } // 上传的是音频 if (FileTypeEnum.AUDIO.getType().equals(fileType)) { getAudioFileType(); Preconditions.checkArgument(FILE_TYPE_MAP.containsKey(inputStreamFileType), "音频格式非法"); } // 上传的是视频 if (FileTypeEnum.VIDEO.getType().equals(fileType)) { getVideoFileType(); Preconditions.checkArgument(FILE_TYPE_MAP.containsKey(inputStreamFileType), "视频格式非法"); } } private static void getVideoFileType() { // Real Audio (ram) FILE_TYPE_MAP.put("ram", "2E7261FD"); // Real Media (rm) FILE_TYPE_MAP.put("rm", "2E524D46"); // Quicktime (mov) FILE_TYPE_MAP.put("mov", "00000014667479707174"); // rmvb FILE_TYPE_MAP.put("rmvb", "2e524d46000000120001"); FILE_TYPE_MAP.put("avi", "41564920"); FILE_TYPE_MAP.put("avi", "52494646b440c02b4156"); FILE_TYPE_MAP.put("flv", "464C5601050000000900"); FILE_TYPE_MAP.put("mp4", "00000020667479706d70"); FILE_TYPE_MAP.put("wmv", "3026b2758e66CF11a6d9"); FILE_TYPE_MAP.put("3gp", "00000014667479703367"); FILE_TYPE_MAP.put("mkv", "1a45dfa3010000000000"); } private static void getPicFileType() { FILE_TYPE_MAP.put("jpg", "FFD8FF"); FILE_TYPE_MAP.put("png", "89504E47"); FILE_TYPE_MAP.put("gif", "47494638"); FILE_TYPE_MAP.put("bmp", "424D"); FILE_TYPE_MAP.put("png", "89504E470D0a1a0a0000"); // 16色位图(bmp) FILE_TYPE_MAP.put("bmp", "424d228c010000000000"); // 24位位图(bmp) FILE_TYPE_MAP.put("bmp", "424d8240090000000000"); // 256色位图(bmp FILE_TYPE_MAP.put("bmp", "424d8e1b030000000000"); } private static void getAudioFileType() { // Wave (wav) FILE_TYPE_MAP.put("wav", "57415645"); // MIDI (mid) FILE_TYPE_MAP.put("mid", "4D546864"); FILE_TYPE_MAP.put("mp3", "49443303000000002176"); FILE_TYPE_MAP.put("wav", "52494646e27807005741"); FILE_TYPE_MAP.put("aac", "fff1508003fffcda004c"); FILE_TYPE_MAP.put("wv", "7776706ba22100000704"); FILE_TYPE_MAP.put("flac", "664c6143800000221200"); } /** * The enum File type enum. * * @author paascloud.net@gmail.com */ public enum FileTypeEnum { /** * 音频 */ AUDIO("audio", "音频"), /** * 图片 */ PICTURE("picture", "图片"), /** * 视频 */ VIDEO("video", "视频"); /** * The Type. */ String type; /** * The Name. */ String name; FileTypeEnum(String type, String name) { this.type = type; this.name = name; } /** * Gets type. * * @return the type */ public String getType() { return type; } /** * Gets name. * * @return the name */ public String getName() { return name; } /** * Gets name. * * @param type the type * * @return the name */ public static String getName(String type) { for (FileTypeEnum ele : FileTypeEnum.values()) { if (ele.getType().equals(type)) { return ele.getName(); } } return null; } /** * Gets types. * * @return the types */ public static List getTypes() { List list = new ArrayList<>(); for (FileTypeEnum ele : FileTypeEnum.values()) { list.add(ele.getType()); } return list; } /** * 获取List集合 * * @return List list */ public static List getList() { return Arrays.asList(FileTypeEnum.values()); } } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/utils/GaoDeUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GaoDeUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.utils; import com.arronlong.httpclientutil.HttpClientUtil; import com.arronlong.httpclientutil.common.HttpConfig; import com.fasterxml.jackson.databind.ObjectMapper; import com.paascloud.provider.model.dto.gaode.GaodeLocation; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; /** * The class Gao de util. * * @author paascloud.net @gmail.com */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) public class GaoDeUtil { /** * Gets city by ip addr. * * @param ipAddr the ip addr * * @return the city by ip addr */ public static GaodeLocation getCityByIpAddr(String ipAddr) { // http://lbs.amap.com/api/webservice/guide/api/ipconfig/ log.info("getCityByIpAddr - 根据IP定位. ipAddr={}", ipAddr); GaodeLocation location = null; String urlAddressIp = "http://restapi.amap.com/v3/ip?key=f8bdce6f882a98635bb0b7b897331327&ip=%s"; String url = String.format(urlAddressIp, ipAddr); try { String str = HttpClientUtil.get(HttpConfig.custom().url(url)); location = new ObjectMapper().readValue(str, GaodeLocation.class); } catch (Exception e) { log.error("getCityByIpAddr={}", e.getMessage(), e); } log.info("getCityByIpAddr - 根据IP定位. ipAddr={}, location={}", ipAddr, location); return location; } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/GlobalExceptionHandler.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GlobalExceptionHandler.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import com.paascloud.provider.model.dto.GlobalExceptionLogDto; import com.paascloud.provider.service.MdcExceptionLogFeignApi; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import org.springframework.web.multipart.MultipartException; import javax.annotation.Resource; /** * 全局的的异常拦截器 * * @author paascloud.net @gmail.com */ @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @Resource private TaskExecutor taskExecutor; @Value("${spring.profiles.active}") String profile; @Value("${spring.application.name}") String applicationName; @Resource private MdcExceptionLogFeignApi mdcExceptionLogFeignApi; /** * 参数非法异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper illegalArgumentException(IllegalArgumentException e) { log.error("参数非法异常={}", e.getMessage(), e); return WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage()); } /** * 业务异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(BusinessException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper businessException(BusinessException e) { log.error("业务异常={}", e.getMessage(), e); return WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage()); } /** * 全局异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody public Wrapper exception(Exception e) { log.info("保存全局异常信息 ex={}", e.getMessage(), e); taskExecutor.execute(() -> { GlobalExceptionLogDto globalExceptionLogDto = new GlobalExceptionLogDto().getGlobalExceptionLogDto(e, profile, applicationName); mdcExceptionLogFeignApi.saveAndSendExceptionLog(globalExceptionLogDto); }); return WrapMapper.error(); } @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody @ExceptionHandler(MultipartException.class) public Wrapper multipartException(Throwable t) { log.error("上传文件, 出现错误={}", t.getMessage(), t); return WrapMapper.wrap(Wrapper.ERROR_CODE, "文件超过限制"); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/frontend/OpcFileController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcFileController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.exception.BusinessException; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.attachment.OptAttachmentRespDto; import com.paascloud.provider.model.dto.oss.OptUploadFileReqDto; import com.paascloud.provider.model.dto.oss.OptUploadFileRespDto; import com.paascloud.provider.service.OpcAttachmentService; import com.paascloud.provider.service.OpcOssService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartHttpServletRequest; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.List; import java.util.Map; /** * The class Opt file controller. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/file", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - OptFileRest", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class OpcFileController extends BaseController { @Resource private OpcAttachmentService optAttachmentService; @Resource private OpcOssService opcOssService; /** * 上传文件. * * @param request the request * @param optUploadFileReqDto the opt upload file req dto * * @return the wrapper */ @PostMapping(consumes = "multipart/form-data", value = "/uploadFile") @ApiOperation(httpMethod = "POST", value = "上传文件") public Wrapper uploadFile(HttpServletRequest request, OptUploadFileReqDto optUploadFileReqDto) { StringBuilder temp = new StringBuilder(); logger.info("uploadFile - 上传文件. optUploadFileReqDto={}", optUploadFileReqDto); Preconditions.checkArgument(StringUtils.isNotEmpty(optUploadFileReqDto.getFileType()), "文件类型为空"); Preconditions.checkArgument(StringUtils.isNotEmpty(optUploadFileReqDto.getBucketName()), "存储地址为空"); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; List optUploadFileRespDtos = optAttachmentService.uploadFile(multipartRequest, optUploadFileReqDto, getLoginAuthDto(), true); for (final OptUploadFileRespDto fileRespDto : optUploadFileRespDtos) { temp.append(fileRespDto.getAttachmentId()).append(","); } String attachmentIds = temp.toString(); if (StringUtils.isNotEmpty(attachmentIds)) { attachmentIds = StringUtils.substringBeforeLast(attachmentIds, GlobalConstant.Symbol.COMMA); } return WrapMapper.ok(attachmentIds); } /** * Upload picture with wang editor map. * * @param request the request * @param optUploadFileReqDto the opt upload file req dto * * @return the map */ @PostMapping(consumes = "multipart/form-data", value = "/uploadPictureWithWangEditor") @ApiOperation(httpMethod = "POST", value = "上传文件") public Map uploadPictureWithWangEditor(HttpServletRequest request, OptUploadFileReqDto optUploadFileReqDto) { logger.info("uploadWangEditor - 上传文件. optUploadFileReqDto={}", optUploadFileReqDto); String fileType = optUploadFileReqDto.getFileType(); String bucketName = optUploadFileReqDto.getBucketName(); Preconditions.checkArgument(StringUtils.isNotEmpty(fileType), "文件类型为空"); Preconditions.checkArgument(StringUtils.isNotEmpty(bucketName), "存储地址为空"); optUploadFileReqDto.setFilePath("paascloud/picture/wangEditor/"); MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; List optUploadFileRespDtos = optAttachmentService.uploadFile(multipartRequest, optUploadFileReqDto, getLoginAuthDto(), false); List imgUrlList = Lists.newArrayList(); for (final OptUploadFileRespDto fileRespDto : optUploadFileRespDtos) { imgUrlList.add(fileRespDto.getAttachmentUrl()); } Map map = Maps.newHashMap(); map.put("errno", 0); map.put("data", imgUrlList.toArray()); return map; } /** * 根据ID查询附件信息. * * @param id the id * * @return the wrapper */ @PostMapping(value = "/queryAttachmentById/{id}") @ApiOperation(httpMethod = "POST", value = "根据ID查询附件信息") public Wrapper queryAttachment(@PathVariable Long id) { logger.info("queryAttachment -根据ID查询文件信息. id={}", id); OptAttachmentRespDto optAttachmentRespDto = optAttachmentService.queryAttachmentById(id); return WrapMapper.ok(optAttachmentRespDto); } /** * 根据关联单号查询附件信息. * * @param refNo the ref no * * @return the wrapper */ @PostMapping(value = "/queryAttachmentListByRefNo/{refNo}") @ApiOperation(httpMethod = "POST", value = "根据关联单号查询附件信息") public Wrapper> queryAttachmentListByRefNo(@PathVariable String refNo) { logger.info("queryAttachment -查询附件信息. refNo={}", refNo); List optAttachmentRespDtos = optAttachmentService.queryAttachmentListByRefNo(refNo); return WrapMapper.ok(optAttachmentRespDtos); } /** * 删除附件信息. * * @param attachmentId the attachment id * * @return the wrapper */ @PostMapping(value = "/deleteAttachment/{attachmentId}") @ApiOperation(httpMethod = "POST", value = "删除附件信息") public Wrapper deleteAttachment(@PathVariable Long attachmentId) { logger.info("deleteAttachment - 删除文件. attachmentId={}", attachmentId); int result; try { result = optAttachmentService.deleteFile(attachmentId); } catch (BusinessException ex) { logger.error("删除文件, 出现异常={}", ex.getMessage(), ex); return WrapMapper.wrap(Wrapper.ERROR_CODE, "出现异常"); } catch (Exception e) { logger.error("删除取文件, 出现异常={}", e.getMessage(), e); return WrapMapper.error(); } return handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/rpc/DingtalkFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:DingtalkFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.common.base.Preconditions; import com.paascloud.PublicUtil; import com.paascloud.ValidateUtil; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.robot.*; import com.paascloud.provider.model.enums.RobotMsgTypeEnum; import com.paascloud.provider.service.DingtalkFeignApi; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.http.HttpResponse; import org.apache.http.HttpStatus; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.HttpClients; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; /** * The class Opc attachment feign client. * * @author paascloud.net @gmail.com */ @RestController @Api(value = "API - DingtalkFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class DingtalkFeignClient extends BaseController implements DingtalkFeignApi { @Override @ApiOperation(httpMethod = "POST", value = "发送钉钉消息") public Wrapper sendChatRobotMsg(@RequestBody ChatRobotMsgDto chatRobotMsgDto) { logger.info("sendChatRobotMsg - 钉钉机器人开始发送消息. chatRobotMsgDto = {}", chatRobotMsgDto); boolean result; try { checkChatReBotMsg(chatRobotMsgDto); HttpClient httpclient = HttpClients.createDefault(); String webhookToken = "https://oapi.dingtalk.com/robot/send?access_token=" + chatRobotMsgDto.getWebhookToken(); HttpPost httpPost = new HttpPost(webhookToken); ObjectMapper mapper = new ObjectMapper(); String robotJson = mapper.writeValueAsString(chatRobotMsgDto); logger.info("robotJson = {}", robotJson); httpPost.addHeader("Content-Type", "application/json; charset=utf-8"); StringEntity se = new StringEntity(robotJson, "utf-8"); httpPost.setEntity(se); logger.info("robotJson={}", robotJson); logger.info("httpPost={}", httpPost); HttpResponse response; response = httpclient.execute(httpPost); if (HttpStatus.SC_OK == response.getStatusLine().getStatusCode()) { logger.info("钉钉机器人发送消息成功 response={}", response); result = true; } else { logger.error("钉钉机器人发送消息失败 response={}", response); result = false; } } catch (IOException e) { logger.error("发送钉钉消息,出现异常 ex={}", e.getMessage(), e); return WrapMapper.error("发送钉钉消息失败"); } return WrapMapper.ok(result); } /** * 校验消息体 */ private void checkChatReBotMsg(ChatRobotMsgDto chatRobotMsgDto) { String webhookToken = chatRobotMsgDto.getWebhookToken(); String msgType = chatRobotMsgDto.getMsgType(); Preconditions.checkArgument(PublicUtil.isNotEmpty(webhookToken), "钉钉机器人token为空"); Preconditions.checkArgument(PublicUtil.isNotEmpty(msgType), "钉钉机器人消息类型为空"); if (RobotMsgTypeEnum.MARKDOWN.getName().equals(msgType)) { MarkdownDto markdown = chatRobotMsgDto.getMarkdown(); String text = markdown.getText(); String title = markdown.getTitle(); Preconditions.checkArgument(PublicUtil.isNotEmpty(markdown), "markdown类型消息体为空"); Preconditions.checkArgument(PublicUtil.isNotEmpty(text), "markdown文档内容为空"); Preconditions.checkArgument(PublicUtil.isNotEmpty(title), "markdown文档标题为空"); } else if (RobotMsgTypeEnum.LINK.getName().equals(msgType)) { LinkDto link = chatRobotMsgDto.getLink(); String text = link.getText(); String title = link.getTitle(); String messageUrl = link.getMessageUrl(); Preconditions.checkArgument(PublicUtil.isNotEmpty(link), "link类型消息体空"); Preconditions.checkArgument(PublicUtil.isNotEmpty(text), "link文档内容为空"); Preconditions.checkArgument(PublicUtil.isNotEmpty(title), "link文档标题为空"); Preconditions.checkArgument(PublicUtil.isNotEmpty(messageUrl), "link文档点击消息跳转的URL空"); } else if (RobotMsgTypeEnum.TEXT.getName().equals(msgType)) { TextDto text = chatRobotMsgDto.getText(); AtDto at = chatRobotMsgDto.getAt(); String content = text.getContent(); Preconditions.checkArgument(PublicUtil.isNotEmpty(text), "text类型消息体空"); Preconditions.checkArgument(PublicUtil.isNotEmpty(content), "text类型消息体内容为空"); if (PublicUtil.isNotEmpty(at)) { String[] atMobiles = at.getAtMobiles(); if (PublicUtil.isNotEmpty(atMobiles)) { for (String atMobile : atMobiles) { Preconditions.checkArgument(ValidateUtil.isMobileNumber(atMobile), "手机号码:" + atMobile + "格式错误"); } } } } else { throw new IllegalArgumentException("钉钉机器人消息类型错误"); } } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/rpc/OpcAttachmentFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcAttachmentFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.base.exception.BusinessException; import com.paascloud.core.support.BaseController; import com.paascloud.provider.exceptions.OpcBizException; import com.paascloud.provider.model.domain.OptAttachment; import com.paascloud.provider.model.dto.oss.*; import com.paascloud.provider.service.OpcAttachmentService; import com.paascloud.provider.service.OpcOssFeignApi; import com.paascloud.provider.service.OpcOssService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import com.qiniu.common.QiniuException; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import java.util.List; /** * The class Opc attachment feign client. * * @author paascloud.net@gmail.com */ @RestController @Api(value = "API - OpcAttachmentFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class OpcAttachmentFeignClient extends BaseController implements OpcOssFeignApi { @Resource private OpcAttachmentService opcAttachmentService; @Resource private OpcOssService opcOssService; @Override @ApiOperation(httpMethod = "POST", value = "上传文件") public Wrapper uploadFile(@RequestBody OptUploadFileReqDto optUploadFileReqDto) throws OpcBizException { OptUploadFileRespDto result; try { logger.info("rpcUploadFile - RPC上传附件信息. optUploadFileReqDto={}", optUploadFileReqDto); result = opcAttachmentService.rpcUploadFile(optUploadFileReqDto); } catch (BusinessException ex) { logger.error("RPC上传附件信息, 出现异常={}", ex.getMessage(), ex); return WrapMapper.wrap(ex); } catch (Exception e) { logger.error("RPC上传附件信息, 出现异常={}", e.getMessage(), e); return WrapMapper.error(); } return WrapMapper.wrap(Wrapper.SUCCESS_CODE, "操作成功", result); } @Override @ApiOperation(httpMethod = "POST", value = "获取附件完整路径") public Wrapper getFileUrl(@RequestBody OptGetUrlRequest optGetUrlRequest) { String result; try { logger.info("getFileUrl - 获取附件完整路径. optGetUrlRequest={}", optGetUrlRequest); result = opcAttachmentService.rpcGetFileUrl(optGetUrlRequest); } catch (BusinessException ex) { logger.error("RPC获取附件完整路径, 出现异常={}", ex.getMessage(), ex); return WrapMapper.wrap(ex); } catch (Exception e) { logger.error("RPC获取附件完整路径, 出现异常={}", e.getMessage(), e); return WrapMapper.error(); } return WrapMapper.ok(result); } @Override public Wrapper> listFileUrl(@RequestBody OptBatchGetUrlRequest urlRequest) { logger.info("getFileUrl - 批量获取url链接. urlRequest={}", urlRequest); List result = opcAttachmentService.listFileUrl(urlRequest); return WrapMapper.ok(result); } @Override public Wrapper handleFileUpload(@RequestPart(value = "file") MultipartFile file) { return null; } @Override public void deleteExpireFile() { // 1.查询过期的文件 List list = opcAttachmentService.listExpireFile(); // 2.删除这些文件 for (final OptAttachment attachment : list) { try { opcAttachmentService.deleteFile(attachment.getPath() + attachment.getName(), attachment.getBucketName(), attachment.getId()); } catch (QiniuException e) { logger.info("删除文件失败, attachmentId={}", attachment.getId(), e); } } } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/rpc/OpcGaodeFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcGaodeFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.gaode.GaodeLocation; import com.paascloud.provider.service.OpcGaodeFeignApi; import com.paascloud.provider.utils.GaoDeUtil; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; /** * The class Opc attachment feign client. * * @author paascloud.net@gmail.com */ @RestController @Api(value = "API - OpcGaodeFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class OpcGaodeFeignClient extends BaseController implements OpcGaodeFeignApi { @Override @ApiOperation(httpMethod = "POST", value = "根据IP获取位置信息") public Wrapper getLocationByIpAddr(@RequestParam("ipAddr") String ipAddr) { String temp = "127.0."; String temp2 = "192.168."; if (ipAddr.startsWith(temp) || ipAddr.startsWith(temp2)) { ipAddr = "111.199.188.14"; } return WrapMapper.ok(GaoDeUtil.getCityByIpAddr(ipAddr)); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/java/com/paascloud/provider/web/rpc/OpcMqMessageFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcMqMessageFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.core.support.BaseController; import com.paascloud.provider.service.MqMessageService; import com.paascloud.provider.service.OpcMqMessageFeignApi; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * Mq 消息. * * @author paascloud.net @gmail.com */ @RestController @Api(value = "API - OpcMqMessageFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class OpcMqMessageFeignClient extends BaseController implements OpcMqMessageFeignApi { @Resource private MqMessageService mqMessageService; @Override @ApiOperation(httpMethod = "POST", value = "查询含有的messageKey") public Wrapper> queryMessageKeyList(@RequestParam("messageKeyList") List messageKeyList) { logger.info("查询消息KEY. messageKeyList={}", messageKeyList); return WrapMapper.ok(mqMessageService.queryMessageKeyList(messageKeyList)); } @Override public Wrapper> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto) { return mqMessageService.queryMessageListWithPage(messageQueryDto); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/META-INF/spring-devtools.properties ================================================ restart.include.mapper=/mapper-[\\w-\\.]+jar restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/ValidationMessages.properties ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/application.yml ================================================ server: port: 8070 spring: profiles: active: dev application: name: @pom.artifactId@ datasource: username: root password: 123456 ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/banner.txt ================================================ ${AnsiColor.BRIGHT_CYAN} .__ .___ __ ___________ _____ ______ ____ | | ____ __ __ __| _/ ____ _____/ |_ \____ \__ \ \__ \ / ___// ___\| | / _ \| | \/ __ | / \_/ __ \ __\ | |_> > __ \_/ __ \_\___ \\ \___| |_( <_> ) | / /_/ | | | \ ___/| | | __(____ (____ /____ >\___ >____/\____/|____/\____ | /\ |___| /\___ >__| |__| \/ \/ \/ \/ Powered by liuzhaoming\/ \/ \/ \/ ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/bootstrap.yml ================================================ spring: cloud: config: fail-fast: true discovery: service-id: paascloud-discovery enabled: true label: ${spring.profiles.active} profile: ${spring.profiles.active} username: admin password: admin eureka: client: serviceUrl: defaultZone: http://root:root@paascloud-eureka:8761/eureka/ instance: instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port} ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/conf/liquibase.properties ================================================ spring.datasource.driver-class-name= com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_opc?characterEncoding=utf8&useSSL=false spring.datasource.username= root spring.datasource.password= 123456 ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/liquibase/index.xml ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/logback-spring.xml ================================================ DEBUG ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE} ${LOG_FILE}.%d{yyyy-MM-dd}.gz 7 ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE}.json ${LOG_FILE}.json.%d{yyyy-MM-dd}.gz 7 UTC { "severity": "%level", "service": "${springAppName:-}", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "parent": "%X{X-B3-ParentSpanId:-}", "exportable": "%X{X-Span-Export:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" } ${LOG_FILE}.sql.%d{yyyy-MM-dd}.gz 10 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-%msg%n ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/mapper/OpcSmsSettingMapper.xml ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/mapper/OptAttachmentMapper.xml ================================================ delete from pc_opt_attachment where id in #{item} ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/templates/mail/sendRegisterSuccessTemplate.ftl ================================================

尊敬的, ${username}, 您好!

感谢您注册 paascloud快乐学习网, 请您在24小时内点击下面的认证链接, 完成账号邮箱认证。 ${url} 过期后链接将会自动失效(如果无法点击该链接, 可以将链接复制并粘帖到浏览器的地址输入框, 然后单击回车即可)。 如果您已经通过验证了, 请忽略这封邮件。 该邮件为系统自动发出, 请勿回复! paascloud.net ${dateTime} Aug 8, 2017 2:05:58 PM ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/main/resources/templates/mail/sendRegisterVerifyCodeTemplate.vm ================================================

尊敬的, ${!username}, 您好!

感谢您注册 paascloud快乐学习网, 请您在24小时内点击下面的认证链接, 完成账号邮箱认证。 ${!url} 过期后链接将会自动失效(如果无法点击该链接, 可以将链接复制并粘帖到浏览器的地址输入框, 然后单击回车即可)。 如果您已经通过验证了, 请忽略这封邮件。 该邮件为系统自动发出, 请勿回复! paascloud.net ${!dateTime} Aug 8, 2017 2:05:58 PM ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/test/java/com/paascloud/provider/PaasCloudOmcApplicationTests.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudOmcApplicationTests.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class PaasCloudOmcApplicationTests { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Test public void contextLoads() { } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/test/java/com/paascloud/provider/aliyun/MqProducerTest.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqProducerTest.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.aliyun; import com.paascloud.provider.PaasCloudOmcApplicationTests; public class MqProducerTest extends PaasCloudOmcApplicationTests { } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/test/java/com/paascloud/provider/aliyun/OptSmsServiceTest.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptSmsServiceTest.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.aliyun; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest; import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse; import com.paascloud.provider.PaasCloudOmcApplicationTests; import com.paascloud.provider.service.OptSmsService; import org.junit.Test; import javax.annotation.Resource; public class OptSmsServiceTest extends PaasCloudOmcApplicationTests { @Resource private OptSmsService optSmsService; @Test public void sendMessageProducerTest() throws InterruptedException { SendSmsRequest request = new SendSmsRequest(); //必填:待发送手机号 request.setPhoneNumbers("13718891700"); //必填:短信签名-可在短信控制台中找到 request.setSignName("快乐学习网"); //必填:短信模板-可在短信控制台中找到 request.setTemplateCode("SMS_78725128"); //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为 request.setTemplateParam("{\"code\":\"963852\"}"); //选填-上行短信扩展码(无特殊需求用户请忽略此字段) //request.setSmsUpExtendCode("90997"); //可选:outId为提供给业务方扩展字段,最终在短信回执消息中将此值带回给调用者 request.setOutId("yourOutId"); SendSmsResponse sendSmsResponse = optSmsService.sendSms(request); logger.info("发送 生产数据 sendSmsResponse={}", sendSmsResponse); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/test/java/com/paascloud/provider/mail/MailTest.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MailTest.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mail; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.paascloud.provider.PaasCloudOmcApplicationTests; import com.paascloud.provider.service.OptFreeMarkerService; import com.paascloud.provider.service.OptSendMailService; import lombok.extern.slf4j.Slf4j; import org.junit.Ignore; import org.junit.Test; import javax.annotation.Resource; import java.util.Map; import java.util.Set; @Slf4j public class MailTest extends PaasCloudOmcApplicationTests{ @Resource private OptSendMailService optSendMailService; @Resource private OptFreeMarkerService optVelocityService; @Test @Ignore public void sendSimpleMailText() throws Exception { String subject = "测试sendSimpleMail邮件"; String text = "123456"; Set to = Sets.newHashSet(); to.add("xxxx@163.com"); optSendMailService.sendSimpleMail(subject, text, to); Thread.sleep(20000); } @Test @Ignore public void getTemplateText() throws Exception { Map map = Maps.newHashMap(); map.put("username", "paascloud"); map.put("url", "http://www.beian.gov.cn/uac/user/activeEmail?token=04fd7024ba324d6d841614a7d44507cd"); map.put("dateTime", "2017-01-01 22:22:22"); String templateLocation = "mail/sendRegisterSuccessTemplate.ftl"; String template = optVelocityService.getTemplate(map, templateLocation); log.info(template); } @Test public void sendTemplateMailTest() throws Exception { Map map = Maps.newHashMap(); map.put("username", "paascloud"); map.put("url", "http://www.beian.gov.cn/uac/user/activeEmail?token=04fd7024ba324d6d841614a7d44507cd"); map.put("dateTime", "2017-01-01 22:22:22"); String templateLocation = "mail/sendRegisterSuccessTemplate.ftl"; String text = optVelocityService.getTemplate(map, templateLocation); String subject = "测试sendSimpleMail邮件"; Set to = Sets.newHashSet(); to.add("xxxxx@163.com"); int sendTemplateMail = optSendMailService.sendTemplateMail(subject, text, to); log.info("sendTemplateMailTest={}", sendTemplateMail); } @Test public void sendTemplateMailTest2() { Map map = Maps.newHashMap(); map.put("username", "paascloud-sendTemplateMailTest2"); map.put("url", "http://www.beian.gov.cn/uac/user/activeEmail?token=04fd7024ba324d6d841614a7d44507cd"); map.put("dateTime", "2017-01-01 22:22:22"); String templateLocation = "mail/sendRegisterSuccessTemplate.ftl"; String subject = "测试sendSimpleMail邮件"; Set to = Sets.newHashSet(); to.add("xxxx@qq.com"); int sendTemplateMail = optSendMailService.sendTemplateMail(map, templateLocation, subject, to); log.info("sendTemplateMailTest2={}", sendTemplateMail); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/test/java/com/paascloud/provider/qiniu/OpcOssServiceTest.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcOssServiceTest.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.qiniu; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.provider.PaasCloudOmcApplicationTests; import com.paascloud.provider.service.OpcOssService; import com.qiniu.common.QiniuException; import org.junit.Test; import javax.annotation.Resource; import java.io.File; import java.io.FileInputStream; import java.io.IOException; public class OpcOssServiceTest extends PaasCloudOmcApplicationTests { @Resource private OpcOssService optOssService; @Resource private PaascloudProperties paascloudProperties; @Test public void uploadFileTest() throws InterruptedException, IOException { File file = new File("C:\\Users\\Lenovo\\Pictures\\love\\love6.jpg"); FileInputStream inputStream = new FileInputStream(file); // DefaultPutRet defaultPutRet = optOssService.uploadFile(inputStream, "love6.jpg", "picture", "paascloud-oss-bucket"); // logger.info("发送 生产数据 defaultPutRet={}", defaultPutRet); } @Test public void deleteFileTest() throws QiniuException { optOssService.deleteFile("picture/2017-08-03/2a55cf5b4fab42d0984c7fa4c3d1f95f.jpg", "paascloud-oss-bucket"); logger.info("删除成功"); } @Test public void batchDeleteFileTest() throws QiniuException { String[] arr = new String[]{"love1.jpg", "image/jpg/love3.jpg"}; optOssService.batchDeleteFile(arr, "paascloud-oss-bucket"); logger.info("删除成功"); } @Test public void getFileUrlTest() throws QiniuException { String fileUrl = optOssService.getFileUrl(paascloudProperties.getQiniu().getOss().getPrivateHost(), "alipay/QRCode14e5d60fb30d4f7ea83ed3ec936ec54d.png", 3600L); logger.info("获取File url成功 fileUrl={}", fileUrl); } @Test public void getFileUrlTest2() throws QiniuException { String fileUrl = optOssService.getFileUrl(paascloudProperties.getQiniu().getOss().getPrivateHost(), "alipay/QRCode/5be9c68b531f471bb85948a4954d5e6f.png"); logger.info("获取File url成功 fileUrl={}", fileUrl); } } ================================================ FILE: paascloud-provider/paascloud-provider-opc/src/test/resources/generator/generatorConfig.xml ================================================
================================================ FILE: paascloud-provider/paascloud-provider-tpc/pom.xml ================================================ 4.0.0 com.liuzm.paascloud.provider paascloud-provider 1.0 paascloud-provider-tpc jar paascloud-provider-tpc 任务中心 - Task processing center UTF-8 UTF-8 1.8 org.apache.rocketmq rocketmq-client 4.1.0-incubating com.liuzm.paascloud.provider.api paascloud-provider-opc-api com.liuzm.paascloud.provider.api paascloud-provider-mdc-api mysql mysql-connector-java runtime joda-time joda-time org.mybatis.spring.boot mybatis-spring-boot-starter tk.mybatis mapper-spring-boot-starter com.github.pagehelper pagehelper-spring-boot-starter org.springframework.boot spring-boot-starter-jdbc com.alibaba druid-spring-boot-starter de.codecentric spring-boot-admin-starter-client org.springframework.cloud spring-cloud-starter-feign com.liuzm.paascloud elastic-job-lite-starter 1.0 com.liuzm.paascloud.provider.api paascloud-provider-tpc-api com.liuzm.paascloud.provider.api paascloud-provider-uac-api org.springframework.retry spring-retry ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/PaasCloudTpcApplication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudTpcApplication.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import liquibase.integration.spring.SpringLiquibase; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCaching; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.context.annotation.Bean; import org.springframework.retry.annotation.EnableRetry; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; /** * The class Paas cloud mdc application. * * @author paascloud.net@gmail.com */ @EnableRetry @EnableCaching @EnableHystrix @EnableFeignClients @EnableDiscoveryClient @SpringBootApplication @EnableTransactionManagement public class PaasCloudTpcApplication { /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { SpringApplication.run(PaasCloudTpcApplication.class, args); } @Bean public SpringLiquibase springLiquibase(DataSource dataSource) { SpringLiquibase springLiquibase = new SpringLiquibase(); springLiquibase.setDataSource(dataSource); springLiquibase.setChangeLog("classpath:/liquibase/index.xml"); return springLiquibase; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/config/MqBeanInitRunner.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqBeanInitRunner.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.alibaba.fastjson.JSON; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.core.registry.RegistryCenterFactory; import com.paascloud.core.registry.base.CoordinatorRegistryCenter; import com.paascloud.core.registry.base.ReliableMessageRegisterDto; import com.paascloud.provider.listener.MqConsumerChangeListener; import com.paascloud.provider.listener.MqProducerChangeListener; import com.paascloud.provider.service.MqProducerBeanFactory; import com.paascloud.provider.service.TpcMqProducerService; import lombok.extern.slf4j.Slf4j; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.recipes.cache.TreeCache; import org.springframework.boot.CommandLineRunner; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; /** * The class Redis init runner. * * @author paascloud.net @gmail.com */ @Component @Order(Ordered.HIGHEST_PRECEDENCE) @Slf4j public class MqBeanInitRunner implements CommandLineRunner { @Resource private PaascloudProperties paascloudProperties; @Resource private MqProducerChangeListener producerChangeListener; @Resource private MqConsumerChangeListener consumerChangeListener; @Resource private TpcMqProducerService tpcMqProducerService; /** * Run. * * @param args the args */ @Override public void run(String... args) throws Exception { CoordinatorRegistryCenter coordinatorRegistryCenter = RegistryCenterFactory.createCoordinatorRegistryCenter(paascloudProperties.getZk()); List childrenKeys = coordinatorRegistryCenter.getChildrenKeys(GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH); this.initMqListener(coordinatorRegistryCenter); for (final String childrenKey : childrenKeys) { int count = coordinatorRegistryCenter.getNumChildren(GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH + GlobalConstant.Symbol.SLASH + childrenKey); if (count == 0) { continue; } String producerString = coordinatorRegistryCenter.getDirectly(GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH + GlobalConstant.Symbol.SLASH + childrenKey); ReliableMessageRegisterDto producerDto = JSON.parseObject(producerString, ReliableMessageRegisterDto.class); MqProducerBeanFactory.buildProducerBean(producerDto); try { tpcMqProducerService.updateOnLineStatusByPid(producerDto.getProducerGroup()); } catch (Exception e) { log.error("更新生产者状态为离线出现异常, ex={}", e.getMessage(), e); } } } private void initMqListener(CoordinatorRegistryCenter coordinatorRegistryCenter) throws Exception { CuratorFramework cf = (CuratorFramework) coordinatorRegistryCenter.getRawClient(); initProducerListener(cf); initConsumerListener(cf); } private void initProducerListener(CuratorFramework cf) throws Exception { TreeCache treeCache = new TreeCache(cf, GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH); treeCache.getListenable().addListener(producerChangeListener); treeCache.start(); } private void initConsumerListener(CuratorFramework cf) throws Exception { TreeCache treeCache = new TreeCache(cf, GlobalConstant.ZK_REGISTRY_CONSUMER_ROOT_PATH); treeCache.getListenable().addListener(consumerChangeListener); treeCache.start(); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/config/ResourceServerConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ResourceServerConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer; import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter; import javax.servlet.http.HttpServletResponse; /** * The class Resource server config. * * @author paascloud.net @gmail.com */ @Configuration @EnableResourceServer public class ResourceServerConfig extends ResourceServerConfigurerAdapter { @Override public void configure(HttpSecurity http) throws Exception { http .headers().frameOptions().disable() .and() .csrf().disable() .exceptionHandling() .authenticationEntryPoint((request, response, authException) -> response.sendError(HttpServletResponse.SC_UNAUTHORIZED)) .and() .authorizeRequests().antMatchers("/pay/alipayCallback", "/druid/**", "/swagger-ui.html", "/swagger-resources/**", "/v2/api-docs", "/api/applications").permitAll() .anyRequest().authenticated(); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/config/TpcWebMvcConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcWebMvcConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.paascloud.core.config.PcObjectMapper; import com.paascloud.core.config.SwaggerConfiguration; import com.paascloud.core.interceptor.TokenInterceptor; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import javax.annotation.Resource; import java.util.List; /** * The class Mdc web mvc config. * * @author paascloud.net @gmail.com */ @Configuration @EnableWebMvc @Import(SwaggerConfiguration.class) public class TpcWebMvcConfig extends WebMvcConfigurerAdapter { @Resource private TokenInterceptor vueViewInterceptor; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/"); } /** * Add interceptors. * * @param registry the registry */ @Override public void addInterceptors(InterceptorRegistry registry) { super.addInterceptors(registry); registry.addInterceptor(vueViewInterceptor) .addPathPatterns("/**") .excludePathPatterns("/swagger-resources/**", "*.js", "/**/*.js", "*.css", "/**/*.css", "*.html", "/**/*.html"); } @Override public void configureMessageConverters(List> converters) { PcObjectMapper.buidMvcMessageConverter(converters); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/dataflow/HandleSendingMessageJob.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:HandleSendingMessageJob.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.job.dataflow; import com.google.common.collect.Lists; import com.paascloud.DateUtil; import com.paascloud.elastic.lite.JobParameter; import com.paascloud.elastic.lite.annotation.ElasticJobConfig; import com.paascloud.elastic.lite.job.AbstractBaseDataflowJob; import com.paascloud.provider.mapper.TpcMqConfirmMapper; import com.paascloud.provider.model.domain.TpcMqMessage; import com.paascloud.provider.model.dto.MessageTaskQueryDto; import com.paascloud.provider.model.enums.JobTaskStatusEnum; import com.paascloud.provider.model.enums.MqSendStatusEnum; import com.paascloud.provider.service.TpcMqMessageService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Calendar; import java.util.Date; import java.util.List; /** * 处理发送中的消息数据. * * @author paascloud.net @gmail.com */ @Component @Slf4j @ElasticJobConfig(cron = "0/30 * * * * ?", jobParameter = "fetchNum=200") public class HandleSendingMessageJob extends AbstractBaseDataflowJob { @Resource private TpcMqMessageService tpcMqMessageService; @Value("${paascloud.message.handleTimeout}") private int timeOutMinute; @Value("${paascloud.message.maxSendTimes}") private int messageMaxSendTimes; @Value("${paascloud.message.resendMultiplier}") private int messageResendMultiplier; @Resource private TpcMqConfirmMapper tpcMqConfirmMapper; /** * Fetch job data list. * * @param jobParameter the job parameter * * @return the list */ @Override protected List fetchJobData(JobParameter jobParameter) { MessageTaskQueryDto query = new MessageTaskQueryDto(); query.setCreateTimeBefore(DateUtil.getBeforeTime(timeOutMinute)); query.setMessageStatus(MqSendStatusEnum.SENDING.sendStatus()); query.setFetchNum(jobParameter.getFetchNum()); query.setShardingItem(jobParameter.getShardingItem()); query.setShardingTotalCount(jobParameter.getShardingTotalCount()); query.setTaskStatus(JobTaskStatusEnum.TASK_CREATE.status()); return tpcMqMessageService.listMessageForWaitingProcess(query); } /** * Process job data. * * @param taskList the task list */ @Override @Transactional(rollbackFor = Exception.class) protected void processJobData(List taskList) { for (TpcMqMessage message : taskList) { Integer resendTimes = message.getResendTimes(); if (resendTimes >= messageMaxSendTimes) { tpcMqMessageService.setMessageToAlreadyDead(message.getId()); continue; } int times = (resendTimes == 0 ? 1 : resendTimes) * messageResendMultiplier; long currentTimeInMillis = Calendar.getInstance().getTimeInMillis(); long needTime = currentTimeInMillis - times * 60 * 1000; long hasTime = message.getUpdateTime().getTime(); // 判断是否达到了可以再次发送的时间条件 if (hasTime > needTime) { log.debug("currentTime[" + com.xiaoleilu.hutool.date.DateUtil.formatDateTime(new Date()) + "],[SENDING]消息上次发送时间[" + com.xiaoleilu.hutool.date.DateUtil.formatDateTime(message.getUpdateTime()) + "],必须过了[" + times + "]分钟才可以再发送。"); continue; } // 前置状态 List preStatusList = Lists.newArrayList(JobTaskStatusEnum.TASK_CREATE.status()); // 设置任务状态为执行中 message.setPreStatusList(preStatusList); message.setTaskStatus(JobTaskStatusEnum.TASK_EXETING.status()); int updateRes = tpcMqMessageService.updateMqMessageTaskStatus(message); if (updateRes > 0) { try { // 查询是否全部订阅者都确认了消息 是 则更新消息状态完成, 否则重发消息 int count = tpcMqConfirmMapper.selectUnConsumedCount(message.getMessageKey()); int status = JobTaskStatusEnum.TASK_CREATE.status(); if (count < 1) { TpcMqMessage update = new TpcMqMessage(); update.setMessageStatus(MqSendStatusEnum.FINISH.sendStatus()); update.setId(message.getId()); tpcMqMessageService.updateMqMessageStatus(update); status = JobTaskStatusEnum.TASK_SUCCESS.status(); } else { tpcMqMessageService.resendMessageByMessageId(message.getId()); } // 前置状态 preStatusList = Lists.newArrayList(JobTaskStatusEnum.TASK_EXETING.status()); // 设置任务状态为执行中 message.setPreStatusList(preStatusList); message.setTaskStatus(status); tpcMqMessageService.updateMqMessageTaskStatus(message); } catch (Exception e) { log.error("重发失败 ex={}", e.getMessage(), e); // 设置任务状态为执行中 preStatusList = Lists.newArrayList(JobTaskStatusEnum.TASK_EXETING.status()); message.setPreStatusList(preStatusList); message.setTaskStatus(JobTaskStatusEnum.TASK_SUCCESS.status()); tpcMqMessageService.updateMqMessageTaskStatus(message); } } } } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/dataflow/HandleWaitingConfirmMessageJob.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:HandleWaitingConfirmMessageJob.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.job.dataflow; import com.google.common.collect.Lists; import com.paascloud.DateUtil; import com.paascloud.elastic.lite.JobParameter; import com.paascloud.elastic.lite.annotation.ElasticJobConfig; import com.paascloud.elastic.lite.job.AbstractBaseDataflowJob; import com.paascloud.provider.model.dto.MessageTaskQueryDto; import com.paascloud.provider.model.enums.JobTaskStatusEnum; import com.paascloud.provider.model.enums.MqSendStatusEnum; import com.paascloud.provider.service.TpcMqMessageService; import com.paascloud.provider.service.UacRpcService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; /** * 处理待确认的消息数据. * * @author paascloud.net @gmail.com */ @Slf4j @Component @ElasticJobConfig(cron = "0 0/10 * * * ?", jobParameter = "fetchNum=1000") public class HandleWaitingConfirmMessageJob extends AbstractBaseDataflowJob { @Resource private TpcMqMessageService tpcMqMessageService; @Resource private UacRpcService uacRpcService; @Value("${paascloud.message.handleTimeout}") private int timeOutMinute; private static final String PID_UAC = "PID_UAC"; /** * Fetch job data list. * * @param jobParameter the job parameter * * @return the list */ @Override protected List fetchJobData(JobParameter jobParameter) { MessageTaskQueryDto query = new MessageTaskQueryDto(); query.setCreateTimeBefore(DateUtil.getBeforeTime(timeOutMinute)); query.setMessageStatus(MqSendStatusEnum.WAIT_SEND.sendStatus()); query.setFetchNum(jobParameter.getFetchNum()); query.setShardingItem(jobParameter.getShardingItem()); query.setShardingTotalCount(jobParameter.getShardingTotalCount()); query.setTaskStatus(JobTaskStatusEnum.TASK_CREATE.status()); query.setProducerGroup(PID_UAC); return tpcMqMessageService.queryWaitingConfirmMessageKeyList(query); } /** * Process job data. * * @param messageKeyList the message key list */ @Override protected void processJobData(List messageKeyList) { if (messageKeyList == null) { return; } List resendMessageList = uacRpcService.queryWaitingConfirmMessageKeyList(messageKeyList); if (resendMessageList == null) { resendMessageList = Lists.newArrayList(); } messageKeyList.removeAll(resendMessageList); tpcMqMessageService.handleWaitingConfirmMessage(messageKeyList, resendMessageList); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/listener/HandleUserTokenJobListener.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:HandleUserTokenJobListener.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.job.listener; import com.dangdang.ddframe.job.executor.ShardingContexts; import com.dangdang.ddframe.job.lite.api.listener.ElasticJobListener; import com.paascloud.provider.model.dto.robot.ChatRobotMsgDto; import com.paascloud.provider.model.factory.ChatRobotMsgFactory; import com.paascloud.provider.service.OpcRpcService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import javax.annotation.Resource; import java.util.concurrent.atomic.AtomicLong; /** * The class Handle user token job listener. * * @author paascloud.net @gmail.com */ @Slf4j public class HandleUserTokenJobListener implements ElasticJobListener { @Resource private OpcRpcService opcRpcService; private AtomicLong startTime = new AtomicLong(); private AtomicLong endTimestamp = new AtomicLong(); @Value("paascloud.dingTalk.webhookToken.jobListener") private String webhookToken; /** * Before job executed. * * @param shardingContexts the sharding contexts */ @Override public void beforeJobExecuted(ShardingContexts shardingContexts) { log.info("beforeJobExecuted - shardingContexts={}", shardingContexts); startTime.set(System.currentTimeMillis()); } /** * After job executed. * * @param shardingContexts the sharding contexts */ @Override public void afterJobExecuted(ShardingContexts shardingContexts) { log.info("afterJobExecuted - shardingContexts={}", shardingContexts); endTimestamp.set(System.currentTimeMillis()); long exeTime = endTimestamp.get() - startTime.get(); String message = String.format("jobName: %s | 执行完毕, 总耗时: %s", shardingContexts.getJobName(), exeTime + "毫秒"); this.sendDingTalk(message); } private void sendDingTalk(String message) { log.info("开始发送消息. message={}", message); ChatRobotMsgDto chatRobotMsgDto = ChatRobotMsgFactory.createChatRobotTextMsg(webhookToken, message, false, null); boolean result = opcRpcService.sendChatRobotMsg(chatRobotMsgDto); if (result) { log.info("发送消息成功. message={}", message); } else { log.error("发送消息失败. message={}", message); } } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/simple/DeleteRpcConsumerMessageJob.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:DeleteRpcConsumerMessageJob.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.job.simple; import com.alibaba.fastjson.JSON; import com.dangdang.ddframe.job.api.ShardingContext; import com.dangdang.ddframe.job.api.simple.SimpleJob; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.base.dto.ShardingContextDto; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.core.generator.UniqueIdGenerator; import com.paascloud.elastic.lite.annotation.ElasticJobConfig; import com.paascloud.provider.model.dto.TpcMqMessageDto; import com.paascloud.provider.service.TpcMqMessageService; import lombok.extern.slf4j.Slf4j; import javax.annotation.Resource; /** * 定时清理所有订阅者消费成功的消息数据. * * @author paascloud.net @gmail.com */ @Slf4j @ElasticJobConfig(cron = "0 0 0 1/1 * ?") public class DeleteRpcConsumerMessageJob implements SimpleJob { @Resource private PaascloudProperties paascloudProperties; @Resource private TpcMqMessageService tpcMqMessageService; /** * Execute. * * @param shardingContext the sharding context */ @Override public void execute(final ShardingContext shardingContext) { ShardingContextDto shardingContextDto = new ShardingContextDto(shardingContext.getShardingTotalCount(), shardingContext.getShardingItem()); final TpcMqMessageDto message = new TpcMqMessageDto(); message.setMessageBody(JSON.toJSONString(shardingContextDto)); message.setMessageTag(AliyunMqTopicConstants.MqTagEnum.DELETE_CONSUMER_MESSAGE.getTag()); message.setMessageTopic(AliyunMqTopicConstants.MqTopicEnum.TPC_TOPIC.getTopic()); message.setProducerGroup(paascloudProperties.getAliyun().getRocketMq().getProducerGroup()); String refNo = Long.toString(UniqueIdGenerator.generateId()); message.setRefNo(refNo); message.setMessageKey(refNo); tpcMqMessageService.saveAndSendMessage(message); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/simple/DeleteRpcExpireFileJob.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:DeleteRpcExpireFileJob.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.job.simple; import com.dangdang.ddframe.job.api.ShardingContext; import com.dangdang.ddframe.job.api.simple.SimpleJob; import com.paascloud.elastic.lite.annotation.ElasticJobConfig; import com.paascloud.provider.service.OpcRpcService; import lombok.extern.slf4j.Slf4j; import javax.annotation.Resource; /** * 定时清理无效OSS文件. * * @author paascloud.net @gmail.com */ @Slf4j @ElasticJobConfig(cron = "0 0 0 1/1 * ?") public class DeleteRpcExpireFileJob implements SimpleJob { @Resource private OpcRpcService opcRpcService; /** * Execute. * * @param shardingContext the sharding context */ @Override public void execute(final ShardingContext shardingContext) { opcRpcService.deleteExpireFile(); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/simple/DeleteRpcProducerMessageJob.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:DeleteRpcProducerMessageJob.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.job.simple; import com.alibaba.fastjson.JSON; import com.dangdang.ddframe.job.api.ShardingContext; import com.dangdang.ddframe.job.api.simple.SimpleJob; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.core.generator.UniqueIdGenerator; import com.paascloud.elastic.lite.annotation.ElasticJobConfig; import com.paascloud.provider.model.dto.TpcMqMessageDto; import com.paascloud.provider.service.TpcMqMessageService; import lombok.extern.slf4j.Slf4j; import javax.annotation.Resource; /** * 定时清理所有生产者发送成功的消息数据. * * @author paascloud.net @gmail.com */ @Slf4j @ElasticJobConfig(cron = "0 0 1 1/1 * ?") public class DeleteRpcProducerMessageJob implements SimpleJob { @Resource private PaascloudProperties paascloudProperties; @Resource private TpcMqMessageService tpcMqMessageService; /** * Execute. * * @param shardingContext the sharding context */ @Override public void execute(final ShardingContext shardingContext) { final TpcMqMessageDto message = new TpcMqMessageDto(); message.setMessageBody(JSON.toJSONString(shardingContext)); message.setMessageTag(AliyunMqTopicConstants.MqTagEnum.DELETE_PRODUCER_MESSAGE.getTag()); message.setMessageTopic(AliyunMqTopicConstants.MqTopicEnum.TPC_TOPIC.getTopic()); message.setProducerGroup(paascloudProperties.getAliyun().getRocketMq().getProducerGroup()); String refNo = Long.toString(UniqueIdGenerator.generateId()); message.setRefNo(refNo); message.setMessageKey(refNo); tpcMqMessageService.saveAndSendMessage(message); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/job/simple/HandleUserJwtTokenJob.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:HandleUserJwtTokenJob.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.job.simple; import com.dangdang.ddframe.job.api.ShardingContext; import com.dangdang.ddframe.job.api.simple.SimpleJob; import com.paascloud.elastic.lite.annotation.ElasticJobConfig; import com.paascloud.provider.service.UacRpcService; import lombok.extern.slf4j.Slf4j; import javax.annotation.Resource; /** * The class Spring simple job. * * @author paascloud.net @gmail.com */ @Slf4j @ElasticJobConfig(cron = "0 0/30 * * * ?") public class HandleUserJwtTokenJob implements SimpleJob { @Resource private UacRpcService uacRpcService; /** * Execute. * * @param shardingContext the sharding context */ @Override public void execute(final ShardingContext shardingContext) { uacRpcService.batchUpdateTokenOffLine(); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/listener/MqConsumerChangeListener.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqConsumerChangeListener.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.listener; import com.alibaba.fastjson.JSON; import com.google.common.base.Charsets; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.core.registry.base.ReliableMessageRegisterDto; import com.paascloud.core.registry.exception.RegExceptionHandler; import com.paascloud.provider.service.MqProducerBeanFactory; import com.paascloud.provider.service.TpcMqConsumerService; import lombok.extern.slf4j.Slf4j; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.recipes.cache.ChildData; import org.apache.curator.framework.recipes.cache.TreeCacheEvent; import org.apache.curator.framework.recipes.cache.TreeCacheListener; import org.apache.zookeeper.data.Stat; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * The class Mq consumer change listener. * * @author paascloud.net @gmail.com */ @Slf4j @Component public class MqConsumerChangeListener implements TreeCacheListener { @Resource private TpcMqConsumerService tpcMqConsumerService; /** * Child event. * * @param client the client * @param event the event */ @Override public void childEvent(final CuratorFramework client, final TreeCacheEvent event) { ChildData data = event.getData(); if (data == null) { return; } String path = data.getPath(); if (GlobalConstant.ZK_REGISTRY_CONSUMER_ROOT_PATH.equals(path) || GlobalConstant.ZK_REGISTRY_CONSUMER_ROOT_PATH.equals(path)) { return; } String[] split = path.split(GlobalConstant.Symbol.SLASH); String dataStr = new String(data.getData()); switch (event.getType()) { case NODE_ADDED: log.info("MqConsumerChangeListener CHILD_ADDED path={}, data={}", path, dataStr); if (split.length == GlobalConstant.Number.SIX_INT) { String appPath = path.substring(0, path.lastIndexOf(GlobalConstant.Symbol.SLASH)); ReliableMessageRegisterDto dto = JSON.parseObject(getDirectly(client, appPath), ReliableMessageRegisterDto.class); if (this.getNumChildrenCount(client, appPath) > 0) { tpcMqConsumerService.updateOnLineStatusByCid(dto.getConsumerGroup()); MqProducerBeanFactory.putCid(dto.getConsumerGroup()); } } break; case NODE_REMOVED: log.info("MqConsumerChangeListener NODE_REMOVED path={}, data={}", path, dataStr); if (split.length == GlobalConstant.Number.SIX_INT) { String appPath = path.substring(0, path.lastIndexOf(GlobalConstant.Symbol.SLASH)); ReliableMessageRegisterDto dto = JSON.parseObject(getDirectly(client, appPath), ReliableMessageRegisterDto.class); if (this.getNumChildrenCount(client, appPath) < 1) { tpcMqConsumerService.updateOffLineStatusByCid(dto.getConsumerGroup()); MqProducerBeanFactory.rmCid(dto.getConsumerGroup()); } } break; case NODE_UPDATED: log.error("MqConsumerChangeListener 本次版本不对更新做处理, path={}, data={}", path, new String(data.getData())); break; default: break; } } private int getNumChildrenCount(CuratorFramework client, final String key) { log.info("获取消费者节点个数 path={}", key); Stat stat = null; try { stat = client.checkExists().forPath(key); } catch (final Exception ex) { log.error("获取目录 key={}的子节点个数出现异常={}", key, ex.getMessage(), ex); } return stat == null ? 0 : stat.getNumChildren(); } private String getDirectly(CuratorFramework client, final String key) { try { return new String(client.getData().forPath(key), Charsets.UTF_8); } catch (final Exception ex) { RegExceptionHandler.handleException(ex); return null; } } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/listener/MqProducerChangeListener.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqProducerChangeListener.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.listener; import com.alibaba.fastjson.JSON; import com.google.common.base.Charsets; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.core.registry.base.ReliableMessageRegisterDto; import com.paascloud.core.registry.exception.RegExceptionHandler; import com.paascloud.provider.service.MqProducerBeanFactory; import com.paascloud.provider.service.TpcMqProducerService; import lombok.extern.slf4j.Slf4j; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.recipes.cache.ChildData; import org.apache.curator.framework.recipes.cache.TreeCacheEvent; import org.apache.curator.framework.recipes.cache.TreeCacheListener; import org.apache.zookeeper.data.Stat; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * The class Mq producer change listener. * * @author paascloud.net @gmail.com */ @Component @Slf4j public class MqProducerChangeListener implements TreeCacheListener { @Resource private TpcMqProducerService tpcMqProducerService; /** * Child event. * * @param client the client * @param event the event */ @Override public void childEvent(final CuratorFramework client, final TreeCacheEvent event) { ChildData data = event.getData(); if (data == null) { return; } String path = data.getPath(); if (GlobalConstant.ZK_REGISTRY_PRODUCER_ROOT_PATH.equals(path) || GlobalConstant.ZK_REGISTRY_CONSUMER_ROOT_PATH.equals(path)) { return; } String[] split = path.split(GlobalConstant.Symbol.SLASH); String dataStr = new String(data.getData()); switch (event.getType()) { case NODE_ADDED: log.info("MqProducerChangeListener CHILD_ADDED path={}, data={}", path, dataStr); if (split.length == GlobalConstant.Number.SIX_INT) { String appPath = path.substring(0, path.lastIndexOf(GlobalConstant.Symbol.SLASH)); ReliableMessageRegisterDto dto = JSON.parseObject(getDirectly(client, appPath), ReliableMessageRegisterDto.class); if (this.getNumChildren(client, appPath) > 0) { tpcMqProducerService.updateOnLineStatusByPid(dto.getProducerGroup()); MqProducerBeanFactory.buildProducerBean(dto); MqProducerBeanFactory.putPid(dto.getProducerGroup()); } } break; case NODE_REMOVED: log.info("MqProducerChangeListener NODE_REMOVED path={}, data={}", path, dataStr); if (split.length == GlobalConstant.Number.SIX_INT) { String appPath = path.substring(0, path.lastIndexOf(GlobalConstant.Symbol.SLASH)); ReliableMessageRegisterDto dto = JSON.parseObject(getDirectly(client, appPath), ReliableMessageRegisterDto.class); if (this.getNumChildren(client, appPath) < 1) { tpcMqProducerService.updateOffLineStatusByPid(dto.getProducerGroup()); MqProducerBeanFactory.rmPid(dto.getProducerGroup()); } } break; case NODE_UPDATED: log.error("本次版本不对更新做处理, path={}, data={}", path, new String(data.getData())); break; default: break; } } private int getNumChildren(CuratorFramework client, final String key) { log.info("获取生产者节点个数 path={}", key); Stat stat = null; try { stat = client.checkExists().forPath(key); } catch (final Exception ex) { log.error("获取目录 key={}的子节点个数出现异常={}", key, ex.getMessage(), ex); } return stat == null ? 0 : stat.getNumChildren(); } private String getDirectly(CuratorFramework client, final String key) { try { return new String(client.getData().forPath(key), Charsets.UTF_8); } catch (final Exception ex) { RegExceptionHandler.handleException(ex); return null; } } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcJobTaskMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcJobTaskMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.TpcJobTask; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; /** * The interface Tpc job task mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface TpcJobTaskMapper extends MyMapper { } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqConfirmMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqConfirmMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.TpcMqConfirm; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Tpc mq confirm mapper. * * @author paascloud.net @gmail.com */ @Component @Mapper public interface TpcMqConfirmMapper extends MyMapper { /** * Confirm receive message. * * @param confirmId the confirm id */ void confirmReceiveMessage(@Param("cid") Long confirmId); /** * Confirm consumed message. * * @param confirmId the confirm id */ void confirmConsumedMessage(@Param("cid") Long confirmId); /** * Gets id mq confirm. * * @param cid the cid * @param messageKey the message key * * @return the id mq confirm */ Long getIdMqConfirm(@Param("cid") String cid, @Param("messageKey") String messageKey); /** * Batch create mq confirm int. * * @param list the list * * @return the int */ int batchCreateMqConfirm(@Param("tpcMqConfirmList") List list); /** * 查询没有消费的数量. * * @param messageKey the message key * * @return the int */ int selectUnConsumedCount(@Param("messageKey") String messageKey); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqConsumerMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqConsumerMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.TpcMqConsumer; import com.paascloud.provider.model.vo.TpcMqConsumerVo; import com.paascloud.provider.model.vo.TpcMqSubscribeVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Tpc mq consumer mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface TpcMqConsumerMapper extends MyMapper { /** * 查询消费者列表. * * @param tpcMqConsumer the tpc mq consumer * * @return the list */ List listTpcMqConsumerVoWithPage(TpcMqConsumer tpcMqConsumer); /** * 分页查询MQ订阅列表. * * @param tpcMqConsumer the tpc mq consumer * * @return the list */ List listTpcMqSubscribeVoWithPage(TpcMqConsumer tpcMqConsumer); /** * Delete subscribe tag by tag id int. * * @param tagId the tag id * * @return the int */ int deleteSubscribeTagByTagId(@Param("tagId") Long tagId); /** * List subscribe id by consumer id list. * * @param consumerId the consumer id * * @return the list */ List listSubscribeIdByConsumerId(@Param("consumerId") Long consumerId); /** * Delete subscribe by consumer id. * * @param consumerId the consumer id * * @return the int */ int deleteSubscribeByConsumerId(@Param("consumerId") Long consumerId); /** * Delete subscribe tag by subscribe id list. * * @param subscribeIdList the subscribe id list * * @return the int */ int deleteSubscribeTagBySubscribeIdList(@Param("subscribeIdList") List subscribeIdList); /** * List subscribe vo list. * * @param subscribeIdList the subscribe id list * * @return the list */ List listSubscribeVo(@Param("subscribeIdList") List subscribeIdList); /** * List consumer group by topic list. * * @param topic the topic * * @return the list */ List listConsumerGroupByTopic(@Param("topic") String topic); /** * Gets by cid. * * @param consumerGroup the consumer group * * @return the by cid */ TpcMqConsumer getByCid(String consumerGroup); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqMessageMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqMessageMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.TpcMqMessage; import com.paascloud.provider.model.dto.MessageTaskQueryDto; import com.paascloud.provider.model.vo.TpcMessageVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Tpc mq message mapper. * * @author paascloud.net @gmail.com */ @Component @Mapper public interface TpcMqMessageMapper extends MyMapper { /** * Gets message by message key. * * @param messageKey the message key * * @return the message by message key */ TpcMqMessage getByMessageKey(@Param("messageKey") String messageKey); /** * Delete message by message key int. * * @param messageKey the message key * * @return the int */ int deleteMessageByMessageKey(@Param("messageKey") String messageKey); /** * Update already dead by task id. * * @param messageId the message id * * @return the int */ int updateAlreadyDeadByMessageId(@Param("messageId") Long messageId); /** * Add task exe count by id int. * * @param messageId the message id * * @return the int */ int addTaskExeCountById(@Param("messageId") Long messageId); /** * Query waiting confirm message key list list. * * @param query the query * * @return the list */ List queryWaitingConfirmMessageKeyList(MessageTaskQueryDto query); /** * Batch delete message int. * * @param deleteKeyList the delete key list * * @return the int */ int batchDeleteMessage(@Param("messageKeyList") List deleteKeyList); /** * Update mq task message status int. * * @param message the message * * @return the int */ int updateMqMessageTaskStatus(TpcMqMessage message); /** * List message for waiting process list. * * @param query the query * * @return the list */ List listMessageForWaitingProcess(MessageTaskQueryDto query); /** * List reliable message vo with page list. * * @param messageQueryDto the message query dto * * @return the list */ List listReliableMessageVoWithPage(MessageQueryDto messageQueryDto); /** * List reliable message vo list. * * @param messageIdList the message id list * * @return the list */ List listReliableMessageVo(@Param("messageIdList") List messageIdList); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqProducerMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqProducerMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.TpcMqProducer; import com.paascloud.provider.model.vo.TpcMqProducerVo; import com.paascloud.provider.model.vo.TpcMqPublishVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Tpc mq producer mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface TpcMqProducerMapper extends MyMapper { /** * 查询生产者集合. * * @param tpcMqProducer the tpc mq producer * * @return the list */ List listTpcMqProducerVoWithPage(TpcMqProducer tpcMqProducer); /** * 查询发布消息集合. * * @param tpcMqProducer the tpc mq producer * * @return the list */ List listTpcMqPublishVoWithPage(TpcMqProducer tpcMqProducer); /** * Delete publish by producer id int. * * @param producerId the producer id * * @return the int */ int deletePublishByProducerId(@Param("producerId") Long producerId); /** * Gets by pid. * * @param producerGroup the producer group * * @return the by pid */ TpcMqProducer getByPid(@Param("pid") String producerGroup); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqSubscribeTagMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqSubscribeTagMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.TpcMqSubscribeTag; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; /** * The interface Tpc mq subscribe tag mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface TpcMqSubscribeTagMapper extends MyMapper { } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqTagMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTagMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.TpcMqTag; import com.paascloud.provider.model.vo.TpcMqTagVo; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Tpc mq tag mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface TpcMqTagMapper extends MyMapper { /** * List tpc mq tag vo with page list. * * @param tpcMqTag the tpc mq tag * * @return the list */ List listTpcMqTagVoWithPage(TpcMqTag tpcMqTag); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mapper/TpcMqTopicMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTopicMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.TpcMqTopic; import com.paascloud.provider.model.vo.TpcMqTopicVo; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Tpc mq topic mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface TpcMqTopicMapper extends MyMapper { /** * List tpc mq topic vo with page list. * * @param tpcMqTopic the tpc mq topic * * @return the list */ List listTpcMqTopicVoWithPage(TpcMqTopic tpcMqTopic); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/constant/.gitkeep ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcJobTask.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcJobTask.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import lombok.Data; import org.apache.ibatis.type.Alias; import javax.persistence.*; import java.io.Serializable; import java.util.Date; /** * The class Tpc job task. * * @author paascloud.net @gmail.com */ @Data @Table(name = "pc_tpc_job_task") @Alias(value = "tpcJobTask") public class TpcJobTask implements Serializable { private static final long serialVersionUID = -7833392442916077253L; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private Integer version; /** * 关联业务单号 */ @Column(name = "ref_no") private String refNo; /** * 业务类型 */ @Column(name = "task_type") private String taskType; /** * 执行次数 */ @Column(name = "task_exe_count") private Integer taskExeCount; /** * 任务数据 */ @Column(name = "task_data") private String taskData; /** * 是否死亡 */ private Integer dead; /** * 状态 */ private Integer status; /** * 执行实例IP */ @Column(name = "exe_instance_ip") private String exeInstanceIp; /** * 创建时间 */ @Column(name = "create_time") private Date createTime; /** * 更新时间 */ @Column(name = "update_time") private Date updateTime; /** * 执行时间 */ @Column(name = "exe_time") private Integer exeTime; /** * 删除标识 */ private Integer yn; /** * Add send times. */ public void addSendTimes() { this.taskExeCount++; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqConfirm.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqConfirm.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import lombok.Data; import lombok.NoArgsConstructor; import org.apache.ibatis.type.Alias; import javax.persistence.*; import java.util.Date; /** * The class Tpc mq confirm. * * @author paascloud.net @gmail.com */ @Data @Alias("tpcMqConfirm") @Table(name = "pc_tpc_mq_confirm") @NoArgsConstructor public class TpcMqConfirm { /** * ID */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 版本号 */ private Integer version; /** * 任务ID */ @Column(name = "message_id") private Long messageId; /** * 消息唯一标识 */ @Column(name = "message_key") private String messageKey; /** * 消费者组编码 */ @Column(name = "consumer_code") private String consumerCode; /** * 消费的数次 */ @Column(name = "consume_count") private Integer consumeCount; /** * 状态, 10 - 未确认 ; 20 - 已确认; 30 已消费 */ private Integer status; /** * 创建时间 */ @Column(name = "created_time") private Date createdTime; /** * 更新时间 */ @Column(name = "update_time") private Date updateTime; /** * Instantiates a new Tpc mq confirm. * * @param id the id * @param messageId the message id * @param messageKey the message key * @param consumerCode the consumer code */ public TpcMqConfirm(final Long id, final Long messageId, final String messageKey, final String consumerCode) { this.id = id; this.messageId = messageId; this.messageKey = messageKey; this.consumerCode = consumerCode; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqConsumer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqConsumer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; /** * The class Tpc mq consumer. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_tpc_mq_consumer") @Alias(value = "tpcMqConsumer") public class TpcMqConsumer extends BaseEntity { private static final long serialVersionUID = 9104188440392558541L; /** * 微服务名称 */ @Column(name = "application_name") private String applicationName; /** * 城市编码 */ @Column(name = "consumer_code") private String consumerCode; /** * 区域编码 */ @Column(name = "consumer_name") private String consumerName; /** * 状态, 0生效,10,失效 */ private Integer status; /** * 备注 */ private String remark; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqMessage.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqMessage.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import lombok.Data; import org.apache.ibatis.type.Alias; import javax.persistence.*; import java.io.Serializable; import java.util.Date; import java.util.List; /** * The class Tpc mq message. * * @author paascloud.net @gmail.com */ @Data @Alias(value = "tpcMqMessage") @Table(name = "pc_tpc_mq_message") public class TpcMqMessage implements Serializable { private static final long serialVersionUID = -5951754367474682967L; /** * ID */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 版本号 */ private Integer version; /** * 消息key */ @Column(name = "message_key") private String messageKey; /** * topic */ @Column(name = "message_topic") private String messageTopic; /** * tag */ @Column(name = "message_tag") private String messageTag; /** * 消息类型: 10 - 生产者 ; 20 - 消费者 */ @Column(name = "message_type") private Integer messageType; /** * 生产者PID */ @Column(name = "producer_group") private String producerGroup; /** * 延时级别 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h */ @Column(name = "delay_level") private Integer delayLevel; /** * 顺序类型 0有序 1无序 */ @Column(name = "order_type") private Integer orderType; /** * 消息状态 */ @Column(name = "message_status") private Integer messageStatus; /** * 消息内容 */ @Column(name = "message_body") private String messageBody; /** * 状态 */ @Column(name = "task_status") private Integer taskStatus; /** * 执行次数 */ @Column(name = "resend_times") private Integer resendTimes; /** * 是否死亡 0 - 活着; 1-死亡 */ private Integer dead; /** * 执行时间 */ @Column(name = "next_exe_time") private Integer nextExeTime; /** * 是否删除 -0 未删除 -1 已删除 */ private Integer yn; /** * 创建时间 */ @Column(name = "created_time") private Date createdTime; /** * 更新时间 */ @Column(name = "update_time") private Date updateTime; @Transient private List preStatusList; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqProducer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqProducer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; /** * The class Tpc mq producer. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_tpc_mq_producer") @Alias(value = "tpcMqProducer") public class TpcMqProducer extends BaseEntity { private static final long serialVersionUID = -4064061704648362318L; /** * 微服务名称 */ @Column(name = "application_name") private String applicationName; /** * PID 生产者组编码 */ @Column(name = "producer_code") private String producerCode; /** * PID 生产者组名称 */ @Column(name = "producer_name") private String producerName; @Column(name = "query_message_url") private String queryMessageUrl; /** * 状态, 0生效,10,失效 */ private Integer status; /** * 备注 */ private String remark; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqSubscribeTag.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqSubscribeTag.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.Table; /** * The class Tpc mq consumer tag. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_tpc_mq_subscribe_tag") @Alias(value = "tpcMqConsumerTag") public class TpcMqSubscribeTag extends BaseEntity { private static final long serialVersionUID = 6227704457895628954L; /** * 消费者ID */ @Id @Column(name = "subscribe_id") private Long subscribeId; /** * TAG_ID */ @Id @Column(name = "tag_id") private Long tagId; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqTag.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTag.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; /** * The class Tpc mq tag. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_tpc_mq_tag") @Alias(value = "tpcMqTag") public class TpcMqTag extends BaseEntity { private static final long serialVersionUID = -1063353649973385058L; /** * 主题ID */ @Column(name = "topic_id") private Long topicId; /** * 城市编码 */ @Column(name = "tag_code") private String tagCode; /** * 区域编码 */ @Column(name = "tag_name") private String tagName; /** * 状态, 0生效,10,失效 */ private Integer status; /** * 备注 */ private String remark; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/domain/TpcMqTopic.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTopic.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; /** * The class Tpc mq topic. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_tpc_mq_topic") @Alias(value = "tpcMqTopic") public class TpcMqTopic extends BaseEntity { private static final long serialVersionUID = 5642946024630652202L; /** * 城市编码 */ @Column(name = "topic_code") private String topicCode; /** * 区域编码 */ @Column(name = "topic_name") private String topicName; /** * MQ类型, 10 rocketmq 20 kafka */ @Column(name = "mq_type") private Integer mqType; /** * 消息类型, 10 无序消息, 20 无序消息 */ @Column(name = "msg_type") private Integer msgType; /** * 状态, 0生效,10,失效 */ private Integer status; /** * 备注 */ private String remarks; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/dto/MessageTaskQueryDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MessageTaskQueryDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import lombok.Data; /** * The class Message task query dto. * * @author paascloud.net @gmail.com */ @Data public class MessageTaskQueryDto { private int yn; private Integer taskStatus; private int messageStatus; private int fetchNum; private int shardingItem; private int shardingTotalCount; private String producerGroup; private String createTimeBefore; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/enums/JobTaskTypeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:JobTaskTypeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Job task type enum. * * @author paascloud.net @gmail.com */ public enum JobTaskTypeEnum { /** * Mq send message job task type enum. */ MQ_SEND_MESSAGE("MQ_SEND_MESSAGE", "发送可靠消息"),; /** * The Type. */ String type; /** * The Value. */ String value; JobTaskTypeEnum(String type, String value) { this.type = type; this.value = value; } public String type() { return type; } public String value() { return value; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/enums/MqConfirmStatusEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqConfirmStatusEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Mq confirm status enum. * * @author paascloud.net @gmail.com */ public enum MqConfirmStatusEnum { /** * 未确认. */ UN_CONFIRMED(10, "未确认"), /** * 已确认. */ CONFIRMED(20, "已确认"), /** * 已消费 */ CONSUMED(30, "已消费"); private int confirmStatus; private String value; MqConfirmStatusEnum(int confirmStatus, String value) { this.confirmStatus = confirmStatus; this.value = value; } /** * Confirm status int. * * @return the int */ public int confirmStatus() { return confirmStatus; } /** * Value string. * * @return the string */ public String value() { return value; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/enums/MqSendStatusEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqSendStatusEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Mq send status enum. * * @author paascloud.net @gmail.com */ public enum MqSendStatusEnum { /** * 未发送. */ WAIT_SEND(10, "未发送"), /** * 已发送. */ SENDING(20, "已发送"), /** * 已完成 */ FINISH(30, "已完成"); private int sendStatus; private String value; MqSendStatusEnum(int sendStatus, String value) { this.sendStatus = sendStatus; this.value = value; } /** * Confirm status int. * * @return the int */ public int sendStatus() { return sendStatus; } /** * Value string. * * @return the string */ public String value() { return value; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/enums/PIDEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PIDEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Pid enum. * * @author paascloud.net @gmail.com */ public enum PIDEnum { /** * Pid uac pid enum. */ PID_UAC, /** * Pid mdc pid enum. */ PID_MDC, /** * Pid opc pid enum. */ PID_OPC,; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMessageVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMessageVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import lombok.Data; import lombok.EqualsAndHashCode; import javax.persistence.Transient; import java.util.List; /** * The class Tpc mq message. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class TpcMessageVo extends BaseVo { private static final long serialVersionUID = 7353473261430862023L; private Integer version; /** * 消息key */ private String messageKey; /** * topic */ private String messageTopic; /** * tag */ private String messageTag; /** * 消息类型: 10 - 生产者 ; 20 - 消费者 */ private Integer messageType; /** * 生产者PID */ private String producerGroup; /** * 延时级别 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h */ private Integer delayLevel; /** * 顺序类型 0有序 1无序 */ private Integer orderType; /** * 消息状态 */ private Integer messageStatus; /** * 消息内容 */ private String messageBody; /** * 状态 */ private Integer taskStatus; /** * 执行次数 */ private Integer resendTimes; /** * 是否死亡 0 - 活着; 1-死亡 */ private Integer dead; /** * 执行时间 */ private Integer nextExeTime; /** * 是否删除 -0 未删除 -1 已删除 */ private Integer yn; @Transient private List mqConfirmVoList; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqConfirmVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqConfirmVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; /** * The class Tpc mq confirm. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @NoArgsConstructor public class TpcMqConfirmVo extends BaseVo { private static final long serialVersionUID = 8497361355200965902L; /** * 任务ID */ private Long messageId; /** * 消息唯一标识 */ private String messageKey; /** * 消费者组编码 */ private String consumerCode; /** * 消费的数次 */ private Integer consumeCount; /** * 状态, 10 - 未确认 ; 20 - 已确认; 30 已消费 */ private Integer status; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqConsumerVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqConsumerVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; /** * The class Mdc mq consumer vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class TpcMqConsumerVo extends TpcMqSubscribeVo { private static final long serialVersionUID = 8833595265432073801L; /** * 订阅Topic集合 */ private List mqTopicVoList; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqProducerVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqProducerVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; /** * The class Mdc mq producer vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class TpcMqProducerVo extends TpcMqPublishVo { private static final long serialVersionUID = -5644698735373761104L; /** * 发布Topic集合 */ private List mqTopicVoList; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqPublishVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqPublishVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Mdc mq producer vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class TpcMqPublishVo extends BaseVo { private static final long serialVersionUID = -5644698735373761104L; /** * 主题编码 */ private String topicCode; /** * 主题名称 */ private String topicName; /** * 微服务名称 */ private String applicationName; /** * 城市编码 */ private String producerCode; /** * 区域编码 */ private String producerName; /** * 状态, 0生效,10,失效 */ private Integer status; /** * 备注 */ private String remark; /** * 预留对账的URL */ private String queryMessageUrl; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqSubscribeVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqSubscribeVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; /** * The class Mdc mq subscribe vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class TpcMqSubscribeVo extends BaseVo { private static final long serialVersionUID = 8833595265432073801L; /** * 主题编码 */ private String topicCode; /** * 主题名称 */ private String topicName; /** * 微服务名称 */ private String applicationName; /** * 城市编码 */ private String consumerCode; /** * 区域编码 */ private String consumerName; /** * 状态, 0生效,10,失效 */ private Integer status; /** * 备注 */ private String remark; /** * 订阅Tag列表 */ private List tagVoList; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqTagVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTagVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Mdc mq tag vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class TpcMqTagVo extends BaseVo { private static final long serialVersionUID = -4176095424582783954L; /** * 主题ID */ private Long topicId; /** * 主题编码 */ private String topicCode; /** * 主题名称 */ private String topicName; /** * 城市编码 */ private String tagCode; /** * 区域编码 */ private String tagName; /** * 状态, 0生效,10,失效 */ private Integer status; /** * 备注 */ private String remark; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/model/vo/TpcMqTopicVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTopicVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; /** * The class Tpc mq topic vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class TpcMqTopicVo extends BaseVo { private static final long serialVersionUID = 3857060544292574468L; /** * 生产者名称 */ private String producerName; /** * 城市编码 */ private String topicCode; /** * 区域编码 */ private String topicName; /** * MQ类型, 10 rocketmq 20 kafka */ private Integer mqType; /** * 消息类型, 10 无序消息, 20 无序消息 */ private Integer msgType; /** * 状态, 0生效,10,失效 */ private Integer status; /** * 备注 */ private String remarks; /** * Tag 列表 */ private List tagVoList; } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/mq/RocketMqProducer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RocketMqProducer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mq; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.mq.MqMessage; import com.paascloud.provider.exceptions.TpcBizException; import com.paascloud.provider.service.MqProducerBeanFactory; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.producer.SendResult; import org.apache.rocketmq.common.message.Message; /** * The class Rocket mq producer. * * @author paascloud.net @gmail.com */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) public class RocketMqProducer { private static final int PRODUCER_RETRY_TIMES = 3; public static SendResult sendSimpleMessage(String body, String topic, String tag, String key, String pid, Integer delayLevel) { if (delayLevel == null) { delayLevel = 0; } Message message = MqMessage.checkMessage(body, topic, tag, key); if (delayLevel < 0 || delayLevel > GlobalConstant.Number.EIGHTEEN_INT) { throw new TpcBizException(ErrorCodeEnum.TPC100500013, topic, key); } message.setDelayTimeLevel(delayLevel); return retrySendMessage(pid, message); } private static SendResult retrySendMessage(String pid, Message msg) { int iniCount = 1; SendResult result; while (true) { try { result = MqProducerBeanFactory.getBean(pid).send(msg); break; } catch (Exception e) { log.error("发送消息失败:", e); if (iniCount++ >= PRODUCER_RETRY_TIMES) { throw new TpcBizException(ErrorCodeEnum.TPC100500014, msg.getTopic(), msg.getKeys()); } } } log.info("<== 发送MQ SendResult={}", result); return result; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/MdcRpcService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcRpcService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.exceptions.TpcBizException; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * The class Mdc rpc service. * * @author paascloud.net @gmail.com */ @Slf4j @Service public class MdcRpcService { @Resource private MdcMqMessageFeignApi mdcMqMessageFeignApi; public Wrapper> queryMessageListWithPage(final MessageQueryDto messageQueryDto) { Wrapper> wrapper = mdcMqMessageFeignApi.queryMessageListWithPage(messageQueryDto); if (wrapper == null) { log.error("查询消息记录. 失败 result is null"); throw new TpcBizException(ErrorCodeEnum.GL99990002); } return wrapper; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/MqProducerBeanFactory.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqProducerBeanFactory.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.google.common.base.Preconditions; import com.paascloud.core.registry.base.ReliableMessageRegisterDto; import com.paascloud.core.support.SpringContextHolder; import org.apache.commons.lang3.StringUtils; import org.apache.rocketmq.client.producer.DefaultMQProducer; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.support.BeanDefinitionBuilder; import java.util.concurrent.ConcurrentHashMap; /** * The class Mq producer bean factory. * * @author paascloud.net @gmail.com */ public class MqProducerBeanFactory { private MqProducerBeanFactory() { } private static final ConcurrentHashMap DEFAULT_MQ_PRODUCER_MAP = new ConcurrentHashMap<>(); private static final ConcurrentHashMap CONSUMER_STATUS_MAP = new ConcurrentHashMap<>(); private static final ConcurrentHashMap PRODUCER_STATUS_MAP = new ConcurrentHashMap<>(); /** * Gets bean. * * @param pid the pid * * @return the bean */ public static DefaultMQProducer getBean(String pid) { Preconditions.checkArgument(StringUtils.isNotEmpty(pid), "getBean() pid is null"); return DEFAULT_MQ_PRODUCER_MAP.get(pid); } /** * Build producer bean. * * @param producerDto the producer dto */ public static void buildProducerBean(ReliableMessageRegisterDto producerDto) { String pid = producerDto.getProducerGroup(); DefaultMQProducer mQProducer = DEFAULT_MQ_PRODUCER_MAP.get(pid); if (mQProducer == null) { String simpleName = producerDto.getProducerGroup(); BeanDefinitionBuilder beanDefinitionBuilder = BeanDefinitionBuilder.rootBeanDefinition(DefaultMQProducer.class); beanDefinitionBuilder.setScope(BeanDefinition.SCOPE_SINGLETON); beanDefinitionBuilder.addPropertyValue("producerGroup", producerDto.getProducerGroup()); beanDefinitionBuilder.addPropertyValue("namesrvAddr", producerDto.getNamesrvAddr()); beanDefinitionBuilder.setInitMethodName("start"); beanDefinitionBuilder.setDestroyMethodName("shutdown"); SpringContextHolder.getDefaultListableBeanFactory().registerBeanDefinition(simpleName, beanDefinitionBuilder.getBeanDefinition()); DEFAULT_MQ_PRODUCER_MAP.put(simpleName, SpringContextHolder.getBean(simpleName)); } } public static void putCid(String cid) { CONSUMER_STATUS_MAP.put(cid, cid); } public static void rmCid(String cid) { CONSUMER_STATUS_MAP.remove(cid); } public static void putPid(final String pid) { PRODUCER_STATUS_MAP.put(pid, pid); } public static void rmPid(String pid) { PRODUCER_STATUS_MAP.remove(pid); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/OmcRpcService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcRpcService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import org.springframework.stereotype.Service; /** * The class Omc rpc service. * * @author paascloud.net @gmail.com */ @Service public class OmcRpcService { } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/OpcRpcService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcRpcService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.exceptions.TpcBizException; import com.paascloud.provider.model.dto.robot.ChatRobotMsgDto; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; /** * The class Opc rpc service. * * @author paascloud.net @gmail.com */ @Slf4j @Component public class OpcRpcService { @Resource private DingtalkFeignApi dingtalkFeignApi; @Resource private OpcOssFeignApi opcOssFeignApi; @Resource private OpcMqMessageFeignApi opcMqMessageFeignApi; /** * Send chat robot msg boolean. * * @param chatRobotMsgDto the chat robot msg dto * * @return the boolean */ public boolean sendChatRobotMsg(ChatRobotMsgDto chatRobotMsgDto) { Wrapper result = dingtalkFeignApi.sendChatRobotMsg(chatRobotMsgDto); return result.getResult(); } /** * Delete expire file. */ public void deleteExpireFile() { opcOssFeignApi.deleteExpireFile(); } public Wrapper> queryMessageListWithPage(final MessageQueryDto messageQueryDto) { Wrapper> wrapper = opcMqMessageFeignApi.queryMessageListWithPage(messageQueryDto); if (wrapper == null) { log.error("查询消息记录 失败 result is null"); throw new TpcBizException(ErrorCodeEnum.GL99990002); } return wrapper; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/TpcMqConsumerService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqConsumerService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.TpcMqConsumer; import com.paascloud.provider.model.vo.TpcMqConsumerVo; import com.paascloud.provider.model.vo.TpcMqSubscribeVo; import java.util.List; /** * The interface Tpc mq consumer service. * * @author paascloud.net @gmail.com */ public interface TpcMqConsumerService extends IService { /** * 查询Mq消费者列表. * * @param tpcMqConsumer the tpc mq consumer * * @return the list */ List listConsumerVoWithPage(TpcMqConsumer tpcMqConsumer); /** * 查询订阅者列表. * * @param tpcMqConsumer the tpc mq consumer * * @return the list */ List listSubscribeVoWithPage(TpcMqConsumer tpcMqConsumer); /** * Delete by tag id. * * @param tagId the tag id * * @return the int */ int deleteSubscribeTagByTagId(Long tagId); /** * 根据消费者ID删除消费者. * * @param id the id * * @return the int */ int deleteConsumerById(Long id); /** * List subscribe vo list. * * @param subscribeIdList the subscribe id list * * @return the list */ List listSubscribeVo(List subscribeIdList); /** * List consumer group by topic list. * * @param topic the topic * * @return the list */ List listConsumerGroupByTopic(String topic); /** * 根据cid更新生产者状态为在线. * * @param consumerGroup the consumer group */ void updateOnLineStatusByCid(String consumerGroup); /** * 根据cid更新生产者状态为离线. * * @param consumerGroup the consumer group */ void updateOffLineStatusByCid(String consumerGroup); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/TpcMqMessageService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqMessageService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.provider.model.domain.TpcMqMessage; import com.paascloud.provider.model.dto.MessageTaskQueryDto; import com.paascloud.provider.model.dto.TpcMqMessageDto; import com.paascloud.provider.model.vo.TpcMessageVo; import com.paascloud.wrapper.Wrapper; import java.util.List; /** * The interface Tpc mq message service. * * @author paascloud.net @gmail.com */ public interface TpcMqMessageService { /** * 预存储消息. * * @param mqMessageDto the mq message dto */ void saveMessageWaitingConfirm(TpcMqMessageDto mqMessageDto); /** * 确认并发送消息. * * @param messageKey the message key */ void confirmAndSendMessage(String messageKey); /** * 存储并发送消息. * * @param mqMessageDto the mq message dto */ void saveAndSendMessage(TpcMqMessageDto mqMessageDto); /** * 直接发送消息. * * @param body the body * @param topic the topic * @param tag the tag * @param key the key * @param pid the pid * @param delayLevel the delay level */ void directSendMessage(String body, String topic, String tag, String key, String pid, Integer delayLevel); /** * 重发消息. * * @param messageId the message id */ void resendMessageByMessageId(Long messageId); /** * 根据messageId重发某条消息. * * @param messageKey the message key */ void resendMessageByMessageKey(String messageKey); /** * 将消息标记为死亡消息. * * @param messageId the message id */ void setMessageToAlreadyDead(Long messageId); /** * 根据消息ID删除消息 * * @param messageKey the message key */ void deleteMessageByMessageKey(String messageKey); /** * 重发某个消息队列中的全部已死亡的消息. * * @param topicName the topic name * @param batchSize the batch size */ void resendAllDeadMessageByTopicName(String topicName, int batchSize); /** * List message for waiting process list. * * @param query the query * * @return the list */ List listMessageForWaitingProcess(MessageTaskQueryDto query); /** * 确认收到消息. * * @param cid the cid * @param messageKey the message key */ void confirmReceiveMessage(String cid, String messageKey); /** * 确认消费消息. * * @param cid the cid * @param messageKey the message key */ void confirmConsumedMessage(String cid, String messageKey); /** * 更新消息确认状态. * * @param cid the cid * @param messageKey the message key * * @return the int */ int updateMqConfirmStatus(String cid, String messageKey); /** * 根据topic创建待确认的消息确认列表. * * @param topic the topic * @param messageId the message id * @param messageKey the message key */ void createMqConfirmListByTopic(String topic, Long messageId, String messageKey); /** * 查询发送中且超时的消息. * * @param query the query * * @return the list */ List queryWaitingConfirmMessageKeyList(MessageTaskQueryDto query); /** * Handle waiting confirm message. * * @param deleteKeyList the delete key list * @param resendKeyList the resend key list */ void handleWaitingConfirmMessage(List deleteKeyList, List resendKeyList); /** * 更新任务状态. * * @param message the message * * @return the int */ int updateMqMessageTaskStatus(TpcMqMessage message); /** * Update mq message status. * * @param update the update * * @return the int */ int updateMqMessageStatus(TpcMqMessage update); /** * Query record list with page page info. * * @param tpcMessageQueryDto the tpc message query dto * * @return the page info */ Wrapper queryRecordListWithPage(MessageQueryDto tpcMessageQueryDto); /** * List reliable message vo list. * * @param tpcMessageQueryDto the tpc message query dto * * @return the list */ List listReliableMessageVo(MessageQueryDto tpcMessageQueryDto); /** * List reliable message vo list. * * @param messageIdList the message id list * * @return the list */ List listReliableMessageVo(List messageIdList); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/TpcMqProducerService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqProducerService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.TpcMqProducer; import com.paascloud.provider.model.vo.TpcMqProducerVo; import com.paascloud.provider.model.vo.TpcMqPublishVo; import java.util.List; /** * The interface Tpc mq producer service. * * @author paascloud.net @gmail.com */ public interface TpcMqProducerService extends IService { /** * List producer vo with page list. * * @param mdcMqProducer the mdc mq producer * * @return the list */ List listProducerVoWithPage(TpcMqProducer mdcMqProducer); /** * 查询发布者列表. * * @param mdcMqProducer the mdc mq producer * * @return the list */ List listPublishVoWithPage(TpcMqProducer mdcMqProducer); /** * 根据生产者ID删除生产者. * * @param id the id * * @return the int */ int deleteProducerById(Long id); /** * 根据pid更新生产者状态为在线. * * @param producerGroup the producer group */ void updateOnLineStatusByPid(String producerGroup); /** * 根据pid更新生产者状态为离线. * * @param producerGroup the producer group */ void updateOffLineStatusByPid(String producerGroup); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/TpcMqTagService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTagService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.TpcMqTag; import com.paascloud.provider.model.vo.TpcMqTagVo; import java.util.List; /** * The interface Tpc mq tag service. * * @author paascloud.net @gmail.com */ public interface TpcMqTagService extends IService { /** * 查询Tag列表. * * @param mdcMqTag the mdc mq tag * * @return the list */ List listWithPage(TpcMqTag mdcMqTag); /** * 根据ID删除TAG. * * @param tagId the tag id * * @return the int */ int deleteTagById(Long tagId); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/TpcMqTopicService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTopicService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.TpcMqTopic; import com.paascloud.provider.model.vo.TpcMqTopicVo; import java.util.List; /** * The interface Tpc mq topic service. * * @author paascloud.net @gmail.com */ public interface TpcMqTopicService extends IService { /** * 查询MQ topic列表. * * @param mdcMqTopic the mdc mq topic * * @return the list */ List listWithPage(TpcMqTopic mdcMqTopic); } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/UacRpcService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRpcService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.exceptions.TpcBizException; import com.paascloud.provider.model.service.UacMqMessageFeignApi; import com.paascloud.provider.model.service.UacUserTokenFeignApi; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.retry.annotation.Backoff; import org.springframework.retry.annotation.Retryable; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /** * The class Uac rpc service. * * @author paascloud.net @gmail.com */ @Service @Slf4j public class UacRpcService { @Resource private UacUserTokenFeignApi uacUserTokenFeignApi; @Resource private UacMqMessageFeignApi uacMqMessageFeignApi; @Retryable(value = Exception.class, backoff = @Backoff(delay = 5000, multiplier = 2)) public void batchUpdateTokenOffLine() { Wrapper wrapper = uacUserTokenFeignApi.updateTokenOffLine(); if (wrapper == null) { log.error("updateTokenOffLine 失败 result is null"); return; } Integer result = wrapper.getResult(); if (result == null || result == 0) { log.error("updateTokenOffLine 失败"); } else { log.error("updateTokenOffLine 成功"); } } public List queryWaitingConfirmMessageKeyList(List messageKeyList) { Wrapper> wrapper = uacMqMessageFeignApi.queryMessageKeyList(messageKeyList); if (wrapper == null) { log.error("queryWaitingConfirmMessageKeyList 失败 result is null"); throw new TpcBizException(ErrorCodeEnum.GL99990002); } return wrapper.getResult(); } public Wrapper> queryMessageListWithPage(MessageQueryDto messageQueryDto) { Wrapper> wrapper = uacMqMessageFeignApi.queryMessageListWithPage(messageQueryDto); if (wrapper == null) { log.error("查询消息记录 失败 result is null"); throw new TpcBizException(ErrorCodeEnum.GL99990002); } return wrapper; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqConsumerServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqConsumerServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.paascloud.PublicUtil; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.TpcMqConsumerMapper; import com.paascloud.provider.model.domain.TpcMqConsumer; import com.paascloud.provider.model.vo.TpcMqConsumerVo; import com.paascloud.provider.model.vo.TpcMqSubscribeVo; import com.paascloud.provider.service.TpcMqConsumerService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * The class Tpc mq consumer service. * * @author paascloud.net @gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class TpcMqConsumerServiceImpl extends BaseService implements TpcMqConsumerService { @Resource private TpcMqConsumerMapper tpcMqConsumerMapper; @Override public List listConsumerVoWithPage(TpcMqConsumer tpcMqConsumer) { return tpcMqConsumerMapper.listTpcMqConsumerVoWithPage(tpcMqConsumer); } @Override public List listSubscribeVoWithPage(TpcMqConsumer tpcMqConsumer) { return tpcMqConsumerMapper.listTpcMqSubscribeVoWithPage(tpcMqConsumer); } @Override public int deleteSubscribeTagByTagId(Long tagId) { return tpcMqConsumerMapper.deleteSubscribeTagByTagId(tagId); } @Override public int deleteConsumerById(Long consumerId) { // 删除消费者 tpcMqConsumerMapper.deleteByPrimaryKey(consumerId); // 删除订阅关系 List subscribeIdList = tpcMqConsumerMapper.listSubscribeIdByConsumerId(consumerId); if (PublicUtil.isNotEmpty(subscribeIdList)) { tpcMqConsumerMapper.deleteSubscribeByConsumerId(consumerId); // 删除订阅tag tpcMqConsumerMapper.deleteSubscribeTagBySubscribeIdList(subscribeIdList); } return 1; } @Override public List listSubscribeVo(List subscribeIdList) { return tpcMqConsumerMapper.listSubscribeVo(subscribeIdList); } @Override public List listConsumerGroupByTopic(final String topic) { return tpcMqConsumerMapper.listConsumerGroupByTopic(topic); } @Override public void updateOnLineStatusByCid(final String consumerGroup) { logger.info("更新消费者cid={}状态为在线", consumerGroup); this.updateStatus(consumerGroup, 10); } @Override public void updateOffLineStatusByCid(final String consumerGroup) { logger.info("更新消费者cid={}状态为离线", consumerGroup); this.updateStatus(consumerGroup, 20); } private void updateStatus(final String consumerGroup, final int status) { TpcMqConsumer tpcMqConsumer = tpcMqConsumerMapper.getByCid(consumerGroup); if (tpcMqConsumer.getStatus() != null && tpcMqConsumer.getStatus() != status) { TpcMqConsumer update = new TpcMqConsumer(); update.setStatus(status); update.setId(tpcMqConsumer.getId()); tpcMqConsumerMapper.updateByPrimaryKeySelective(update); } } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqMessageServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqMessageServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.github.pagehelper.PageInfo; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.paascloud.PublicUtil; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.generator.UniqueIdGenerator; import com.paascloud.core.support.BaseService; import com.paascloud.provider.exceptions.TpcBizException; import com.paascloud.provider.mapper.TpcMqConfirmMapper; import com.paascloud.provider.mapper.TpcMqMessageMapper; import com.paascloud.provider.model.domain.TpcMqConfirm; import com.paascloud.provider.model.domain.TpcMqMessage; import com.paascloud.provider.model.dto.MessageTaskQueryDto; import com.paascloud.provider.model.dto.TpcMqMessageDto; import com.paascloud.provider.model.enums.MqSendStatusEnum; import com.paascloud.provider.model.enums.PIDEnum; import com.paascloud.provider.model.vo.TpcMessageVo; import com.paascloud.provider.mq.RocketMqProducer; import com.paascloud.provider.service.*; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.Date; import java.util.List; /** * The class Tpc mq message service. * * @author paascloud.net @gmail.com */ @Service @Slf4j @Transactional(rollbackFor = Throwable.class) public class TpcMqMessageServiceImpl extends BaseService implements TpcMqMessageService { @Resource private TpcMqMessageMapper tpcMqMessageMapper; @Resource private TpcMqConfirmMapper tpcMqConfirmMapper; @Resource private TpcMqConsumerService tpcMqConsumerService; @Resource private UacRpcService uacRpcService; @Resource private MdcRpcService mdcRpcService; @Resource private OpcRpcService opcRpcService; @Override public void saveMessageWaitingConfirm(TpcMqMessageDto messageDto) { if (StringUtils.isEmpty(messageDto.getMessageTopic())) { throw new TpcBizException(ErrorCodeEnum.TPC10050001); } Date now = new Date(); TpcMqMessage message = new ModelMapper().map(messageDto, TpcMqMessage.class); message.setMessageStatus(MqSendStatusEnum.WAIT_SEND.sendStatus()); message.setUpdateTime(now); message.setCreatedTime(now); tpcMqMessageMapper.insertSelective(message); } @Override public void confirmAndSendMessage(String messageKey) { final TpcMqMessage message = tpcMqMessageMapper.getByMessageKey(messageKey); if (message == null) { throw new TpcBizException(ErrorCodeEnum.TPC10050002); } TpcMqMessage update = new TpcMqMessage(); update.setMessageStatus(MqSendStatusEnum.SENDING.sendStatus()); update.setId(message.getId()); update.setUpdateTime(new Date()); tpcMqMessageMapper.updateByPrimaryKeySelective(update); // 创建消费待确认列表 this.createMqConfirmListByTopic(message.getMessageTopic(), message.getId(), message.getMessageKey()); // 直接发送消息 this.directSendMessage(message.getMessageBody(), message.getMessageTopic(), message.getMessageTag(), message.getMessageKey(), message.getProducerGroup(), message.getDelayLevel()); } @Override public void saveAndSendMessage(TpcMqMessageDto tpcMqMessageDto) { if (StringUtils.isEmpty(tpcMqMessageDto.getMessageTopic())) { throw new TpcBizException(ErrorCodeEnum.TPC10050001); } Date now = new Date(); TpcMqMessage message = new ModelMapper().map(tpcMqMessageDto, TpcMqMessage.class); message.setMessageStatus(MqSendStatusEnum.SENDING.sendStatus()); message.setId(generateId()); message.setUpdateTime(now); message.setCreatedTime(now); tpcMqMessageMapper.insertSelective(message); // 创建消费待确认列表 this.createMqConfirmListByTopic(message.getMessageTopic(), message.getId(), message.getMessageKey()); this.directSendMessage(tpcMqMessageDto.getMessageBody(), tpcMqMessageDto.getMessageTopic(), tpcMqMessageDto.getMessageTag(), tpcMqMessageDto.getMessageKey(), tpcMqMessageDto.getProducerGroup(), tpcMqMessageDto.getDelayLevel()); } @Override public void directSendMessage(String body, String topic, String tag, String key, String pid, Integer delayLevel) { RocketMqProducer.sendSimpleMessage(body, topic, tag, key, pid, delayLevel); } @Override public void resendMessageByMessageId(Long messageId) { final TpcMqMessage message = tpcMqMessageMapper.selectByPrimaryKey(messageId); if (message == null) { throw new TpcBizException(ErrorCodeEnum.TPC10050006); } this.resendMessage(message); } @Override public void resendMessageByMessageKey(String messageKey) { final TpcMqMessage task = tpcMqMessageMapper.getByMessageKey(messageKey); this.resendMessage(task); } @Override public void setMessageToAlreadyDead(Long messageId) { final TpcMqMessage task = tpcMqMessageMapper.selectByPrimaryKey(messageId); if (task == null) { throw new TpcBizException(ErrorCodeEnum.TPC10050006); } tpcMqMessageMapper.updateAlreadyDeadByMessageId(messageId); } @Override public void deleteMessageByMessageKey(String messageKey) { int result = tpcMqMessageMapper.deleteMessageByMessageKey(messageKey); if (result < 1) { throw new TpcBizException(ErrorCodeEnum.TPC10050003, messageKey); } } @Override public void resendAllDeadMessageByTopicName(String topicName, int batchSize) { // 1.查询该topic下所有死亡的消息 // 2.分页 } @Override public List listMessageForWaitingProcess(MessageTaskQueryDto query) { return tpcMqMessageMapper.listMessageForWaitingProcess(query); } @Override public void confirmReceiveMessage(final String cid, final String messageKey) { // 1. 校验cid // 2. 校验messageKey // 3. 校验cid 和 messageKey Long confirmId = tpcMqConfirmMapper.getIdMqConfirm(cid, messageKey); // 3. 更新消费信息的状态 tpcMqConfirmMapper.confirmReceiveMessage(confirmId); } @Override public void confirmConsumedMessage(final String cid, final String messageKey) { Long confirmId = tpcMqConfirmMapper.getIdMqConfirm(cid, messageKey); tpcMqConfirmMapper.confirmConsumedMessage(confirmId); } @Override public int updateMqConfirmStatus(final String cid, final String messageKey) { return 0; } @Override public void createMqConfirmListByTopic(final String topic, final Long messageId, final String messageKey) { List list = Lists.newArrayList(); TpcMqConfirm tpcMqConfirm; List consumerGroupList = tpcMqConsumerService.listConsumerGroupByTopic(topic); if (PublicUtil.isEmpty(consumerGroupList)) { throw new TpcBizException(ErrorCodeEnum.TPC100500010, topic); } for (final String cid : consumerGroupList) { tpcMqConfirm = new TpcMqConfirm(UniqueIdGenerator.generateId(), messageId, messageKey, cid); list.add(tpcMqConfirm); } tpcMqConfirmMapper.batchCreateMqConfirm(list); } @Override public List queryWaitingConfirmMessageKeyList(final MessageTaskQueryDto query) { return tpcMqMessageMapper.queryWaitingConfirmMessageKeyList(query); } @Override public void handleWaitingConfirmMessage(final List deleteKeyList, final List resendKeyList) { tpcMqMessageMapper.batchDeleteMessage(deleteKeyList); for (final String messageKey : resendKeyList) { this.confirmAndSendMessage(messageKey); } } @Override public int updateMqMessageTaskStatus(final TpcMqMessage message) { return tpcMqMessageMapper.updateMqMessageTaskStatus(message); } @Override public int updateMqMessageStatus(final TpcMqMessage update) { return tpcMqMessageMapper.updateByPrimaryKeySelective(update); } @Override public Wrapper queryRecordListWithPage(final MessageQueryDto messageQueryDto) { String producerGroup = messageQueryDto.getProducerGroup(); String messageKey = messageQueryDto.getMessageKey(); Preconditions.checkArgument(StringUtils.isNotEmpty(producerGroup) || StringUtils.isNotEmpty(messageKey), "messageKey 和 pid 必须选择一个"); if (StringUtils.isEmpty(producerGroup)) { List result = Lists.newArrayList(); Wrapper> uacWrapper = uacRpcService.queryMessageListWithPage(messageQueryDto); Wrapper> mdcWrapper = mdcRpcService.queryMessageListWithPage(messageQueryDto); Wrapper> opcWrapper = opcRpcService.queryMessageListWithPage(messageQueryDto); if (uacWrapper != null && uacWrapper.getResult() != null) { List list = uacWrapper.getResult().getList(); result.addAll(list); } if (mdcWrapper != null && mdcWrapper.getResult() != null) { List list = mdcWrapper.getResult().getList(); result.addAll(list); } if (opcWrapper != null && opcWrapper.getResult() != null) { List list = opcWrapper.getResult().getList(); result.addAll(list); } return WrapMapper.ok(new PageInfo<>(result)); } if (StringUtils.equals(PIDEnum.PID_UAC.name(), producerGroup)) { return uacRpcService.queryMessageListWithPage(messageQueryDto); } else if (StringUtils.equals(PIDEnum.PID_MDC.name(), producerGroup)) { return mdcRpcService.queryMessageListWithPage(messageQueryDto); } else if (StringUtils.equals(PIDEnum.PID_OPC.name(), producerGroup)) { return opcRpcService.queryMessageListWithPage(messageQueryDto); } else { log.error("pid没有维护 pid={}", producerGroup); } return null; } @Override public List listReliableMessageVo(final MessageQueryDto messageQueryDto) { return tpcMqMessageMapper.listReliableMessageVoWithPage(messageQueryDto); } @Override public List listReliableMessageVo(final List messageIdList) { return tpcMqMessageMapper.listReliableMessageVo(messageIdList); } private void resendMessage(TpcMqMessage message) { if (message == null) { throw new TpcBizException(ErrorCodeEnum.TPC10050002); } tpcMqMessageMapper.addTaskExeCountById(message.getId()); //TODO 记录重发日志 1.系统自动重发 2.人工重发 this.directSendMessage(message.getMessageBody(), message.getMessageTopic(), message.getMessageTag(), message.getMessageKey(), message.getProducerGroup(), message.getDelayLevel()); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqProducerServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqProducerServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.TpcMqProducerMapper; import com.paascloud.provider.model.domain.TpcMqProducer; import com.paascloud.provider.model.vo.TpcMqProducerVo; import com.paascloud.provider.model.vo.TpcMqPublishVo; import com.paascloud.provider.service.TpcMqProducerService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * The class Tpc mq producer service. * * @author paascloud.net @gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class TpcMqProducerServiceImpl extends BaseService implements TpcMqProducerService { @Resource private TpcMqProducerMapper mdcMqProducerMapper; @Override public List listProducerVoWithPage(TpcMqProducer mdcMqProducer) { return mdcMqProducerMapper.listTpcMqProducerVoWithPage(mdcMqProducer); } @Override public List listPublishVoWithPage(TpcMqProducer mdcMqProducer) { return mdcMqProducerMapper.listTpcMqPublishVoWithPage(mdcMqProducer); } @Override public int deleteProducerById(Long producerId) { // 删除consumer mdcMqProducerMapper.deleteByPrimaryKey(producerId); // 删除发布关系 return mdcMqProducerMapper.deletePublishByProducerId(producerId); } @Override public void updateOnLineStatusByPid(final String producerGroup) { logger.info("更新生产者pid={}状态为在线", producerGroup); this.updateStatus(producerGroup, 10); } @Override public void updateOffLineStatusByPid(final String producerGroup) { logger.info("更新生产者pid={}状态为离线", producerGroup); this.updateStatus(producerGroup, 20); } private void updateStatus(final String producerGroup, final int status) { TpcMqProducer tpcMqProducer = mdcMqProducerMapper.getByPid(producerGroup); if (tpcMqProducer.getStatus() != null && tpcMqProducer.getStatus() != status) { TpcMqProducer update = new TpcMqProducer(); update.setStatus(status); update.setId(tpcMqProducer.getId()); mdcMqProducerMapper.updateByPrimaryKeySelective(update); } } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqTagServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTagServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.TpcMqTagMapper; import com.paascloud.provider.model.domain.TpcMqTag; import com.paascloud.provider.model.vo.TpcMqTagVo; import com.paascloud.provider.service.TpcMqConsumerService; import com.paascloud.provider.service.TpcMqTagService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * The class Tpc mq tag service. * * @author paascloud.net @gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class TpcMqTagServiceImpl extends BaseService implements TpcMqTagService { @Resource private TpcMqTagMapper mdcMqTagMapper; @Resource private TpcMqConsumerService mdcMqConsumerService; @Override public List listWithPage(TpcMqTag mdcMqTag) { return mdcMqTagMapper.listTpcMqTagVoWithPage(mdcMqTag); } @Override public int deleteTagById(Long tagId) { // 删除订阅的tag mdcMqConsumerService.deleteSubscribeTagByTagId(tagId); // 删除tag return mdcMqTagMapper.deleteByPrimaryKey(tagId); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/service/impl/TpcMqTopicServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTopicServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.TpcMqTopicMapper; import com.paascloud.provider.model.domain.TpcMqTopic; import com.paascloud.provider.model.vo.TpcMqTopicVo; import com.paascloud.provider.service.TpcMqTopicService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * The class Tpc mq topic service. * * @author paascloud.net @gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class TpcMqTopicServiceImpl extends BaseService implements TpcMqTopicService { @Resource private TpcMqTopicMapper mdcMqTopicMapper; @Override public List listWithPage(TpcMqTopic mdcMqTopic) { return mdcMqTopicMapper.listTpcMqTopicVoWithPage(mdcMqTopic); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/GlobalExceptionHandler.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GlobalExceptionHandler.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import com.paascloud.provider.model.dto.GlobalExceptionLogDto; import com.paascloud.provider.service.MdcExceptionLogFeignApi; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.bind.annotation.RestControllerAdvice; import javax.annotation.Resource; /** * 全局的的异常拦截器 * * @author paascloud.net @gmail.com */ @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @Resource private TaskExecutor taskExecutor; @Value("${spring.profiles.active}") String profile; @Value("${spring.application.name}") String applicationName; @Resource private MdcExceptionLogFeignApi mdcExceptionLogFeignApi; /** * 参数非法异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper illegalArgumentException(IllegalArgumentException e) { log.error("参数非法异常={}", e.getMessage(), e); return WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage()); } /** * 业务异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(BusinessException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper businessException(BusinessException e) { log.error("业务异常={}", e.getMessage(), e); return WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage()); } /** * 全局异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody public Wrapper exception(Exception e) { log.info("保存全局异常信息 ex={}", e.getMessage(), e); taskExecutor.execute(() -> { GlobalExceptionLogDto globalExceptionLogDto = new GlobalExceptionLogDto().getGlobalExceptionLogDto(e, profile, applicationName); mdcExceptionLogFeignApi.saveAndSendExceptionLog(globalExceptionLogDto); }); return WrapMapper.error(); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/frontend/TpcMessageMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMessageMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.paascloud.PublicUtil; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.vo.TpcMessageVo; import com.paascloud.provider.service.TpcMqMessageService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * 异常管理. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/message", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - TpcMessageMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class TpcMessageMainController extends BaseController { @Resource private TpcMqMessageService tpcMqMessageService; /** * 异常日志列表. * * @param messageQueryDto the message query dto * * @return the wrapper */ @PostMapping(value = "/queryRecordListWithPage") @ApiOperation(httpMethod = "POST", value = "分页查询各中心落地消息记录") public Wrapper queryRecordListWithPage(@ApiParam(name = "tpcMessageQueryDto") @RequestBody MessageQueryDto messageQueryDto) { logger.info("分页查询各中心落地消息记录. messageQueryDto={}", messageQueryDto); return tpcMqMessageService.queryRecordListWithPage(messageQueryDto); } /** * Resend message by id wrapper. * * @param messageId the message id * * @return the wrapper */ @PostMapping(value = "/resendMessageById/{messageId}") @ApiOperation(httpMethod = "POST", value = "重发消息") public Wrapper resendMessageById(@PathVariable Long messageId) { logger.info("重发消息. messageId={}", messageId); tpcMqMessageService.resendMessageByMessageId(messageId); return WrapMapper.ok(); } /** * Query reliable list with page wrapper. * * @param messageQueryDto the message query dto * * @return the wrapper */ @PostMapping(value = "/queryReliableListWithPage") @ApiOperation(httpMethod = "POST", value = "分页查询可靠消息") public Wrapper queryReliableListWithPage(@ApiParam(name = "tpcMessageQueryDto") @RequestBody MessageQueryDto messageQueryDto) { logger.info("分页查询可靠消息. tpcMessageQueryDto={}", messageQueryDto); PageHelper.startPage(messageQueryDto.getPageNum(), messageQueryDto.getPageSize()); messageQueryDto.setOrderBy("update_time desc"); List list = tpcMqMessageService.listReliableMessageVo(messageQueryDto); PageInfo pageInfo = new PageInfo<>(list); if (PublicUtil.isNotEmpty(list)) { Map messageVoMap = this.trans2Map(list); List messageIdList = new ArrayList<>(messageVoMap.keySet()); List mqConfirmVoList = tpcMqMessageService.listReliableMessageVo(messageIdList); for (TpcMessageVo vo : mqConfirmVoList) { Long subscribeId = vo.getId(); if (!messageVoMap.containsKey(subscribeId)) { continue; } TpcMessageVo tpcMessageVo = messageVoMap.get(subscribeId); tpcMessageVo.setMqConfirmVoList(vo.getMqConfirmVoList()); } pageInfo.setList(new ArrayList<>(messageVoMap.values())); } return WrapMapper.ok(pageInfo); } private Map trans2Map(List tpcMessageVoList) { Map resultMap = new TreeMap<>((o1, o2) -> { o1 = o1 == null ? 0 : o1; o2 = o2 == null ? 0 : o2; return o2.compareTo(o1); }); for (TpcMessageVo vo : tpcMessageVoList) { resultMap.put(vo.getId(), vo); } return resultMap; } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/frontend/TpcMqConsumerController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqConsumerController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.paascloud.PublicUtil; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UpdateStatusDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.TpcMqConsumer; import com.paascloud.provider.model.vo.TpcMqConsumerVo; import com.paascloud.provider.model.vo.TpcMqSubscribeVo; import com.paascloud.provider.service.TpcMqConsumerService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.TreeMap; /** * 消费者管理. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/consumer", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - TpcMqConsumerController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class TpcMqConsumerController extends BaseController { @Resource private TpcMqConsumerService tpcMqConsumerService; /** * 查询Mq消费者列表. * * @param tpcMqConsumer the tpc mq consumer * * @return the wrapper */ @PostMapping(value = "/queryConsumerVoListWithPage") @ApiOperation(httpMethod = "POST", value = "查询Mq消费者列表") public Wrapper> queryConsumerVoList(@ApiParam(name = "consumer", value = "Mq消费者") @RequestBody TpcMqConsumer tpcMqConsumer) { logger.info("查询消费者列表tpcMqProducerQuery={}", tpcMqConsumer); List list = tpcMqConsumerService.listConsumerVoWithPage(tpcMqConsumer); return WrapMapper.ok(list); } /** * 查询订阅者列表. * * @param tpcMqConsumer the tpc mq consumer * * @return the wrapper */ @PostMapping(value = "/querySubscribeListWithPage") @ApiOperation(httpMethod = "POST", value = "查询订阅者列表") public Wrapper> querySubscribeListWithPage(@ApiParam(name = "consumer", value = "Mq消费者") @RequestBody TpcMqConsumer tpcMqConsumer) { logger.info("查询Mq订阅列表tpcMqConsumerQuery={}", tpcMqConsumer); PageHelper.startPage(tpcMqConsumer.getPageNum(), tpcMqConsumer.getPageSize()); tpcMqConsumer.setOrderBy("update_time desc"); List list = tpcMqConsumerService.listSubscribeVoWithPage(tpcMqConsumer); PageInfo pageInfo = new PageInfo<>(list); if (PublicUtil.isNotEmpty(list)) { Map tpcMqSubscribeVoMap = this.trans2Map(list); List subscribeIdList = new ArrayList<>(tpcMqSubscribeVoMap.keySet()); List tagVoList = tpcMqConsumerService.listSubscribeVo(subscribeIdList); for (TpcMqSubscribeVo vo : tagVoList) { Long subscribeId = vo.getId(); if (!tpcMqSubscribeVoMap.containsKey(subscribeId)) { continue; } TpcMqSubscribeVo tpcMqSubscribeVo = tpcMqSubscribeVoMap.get(subscribeId); tpcMqSubscribeVo.setTagVoList(vo.getTagVoList()); } pageInfo.setList(new ArrayList<>(tpcMqSubscribeVoMap.values())); } return WrapMapper.ok(pageInfo); } private Map trans2Map(List resultDTOS) { Map resultMap = new TreeMap<>((o1, o2) -> { o1 = o1 == null ? 0 : o1; o2 = o2 == null ? 0 : o2; return o2.compareTo(o1); }); for (TpcMqSubscribeVo resultDTO : resultDTOS) { resultMap.put(resultDTO.getId(), resultDTO); } return resultMap; } /** * 更改消费者状态. * * @param updateStatusDto the update status dto * * @return the wrapper */ @PostMapping(value = "/modifyStatusById") @ApiOperation(httpMethod = "POST", value = "更改消费者状态") @LogAnnotation public Wrapper modifyConsumerStatusById(@ApiParam(value = "更改消费者状态") @RequestBody UpdateStatusDto updateStatusDto) { logger.info("修改consumer状态 updateStatusDto={}", updateStatusDto); Long consumerId = updateStatusDto.getId(); LoginAuthDto loginAuthDto = getLoginAuthDto(); TpcMqConsumer consumer = new TpcMqConsumer(); consumer.setId(consumerId); consumer.setStatus(updateStatusDto.getStatus()); consumer.setUpdateInfo(loginAuthDto); int result = tpcMqConsumerService.update(consumer); return super.handleResult(result); } /** * 根据消费者ID删除消费者. * * @param id the id * * @return the wrapper */ @PostMapping(value = "/deleteById/{id}") @ApiOperation(httpMethod = "POST", value = "根据消费者ID删除消费者") @LogAnnotation public Wrapper deleteConsumerById(@PathVariable Long id) { logger.info("删除consumer id={}", id); int result = tpcMqConsumerService.deleteConsumerById(id); return super.handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/frontend/TpcMqProducerController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqProducerController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UpdateStatusDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.TpcMqProducer; import com.paascloud.provider.model.vo.TpcMqProducerVo; import com.paascloud.provider.model.vo.TpcMqPublishVo; import com.paascloud.provider.service.TpcMqProducerService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * 生产者管理. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/producer", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - TpcMqProducerController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class TpcMqProducerController extends BaseController { @Resource private TpcMqProducerService tpcMqProducerService; /** * 查询生产者列表. * * @param tpcMqProducer the tpc mq producer * * @return the wrapper */ @PostMapping(value = "/queryProducerVoListWithPage") @ApiOperation(httpMethod = "POST", value = "查询生产者列表") public Wrapper> queryProducerList(@ApiParam(name = "producer", value = "Mq生产者") @RequestBody TpcMqProducer tpcMqProducer) { logger.info("查询生产者列表tpcMqTopicQuery={}", tpcMqProducer); List list = tpcMqProducerService.listProducerVoWithPage(tpcMqProducer); return WrapMapper.ok(list); } /** * 查询发布者列表. * * @param tpcMqProducer the tpc mq producer * * @return the wrapper */ @PostMapping(value = "/queryPublishListWithPage") @ApiOperation(httpMethod = "POST", value = "查询发布者列表") public Wrapper> queryPublishListWithPage(@ApiParam(name = "producer", value = "Mq生产者") @RequestBody TpcMqProducer tpcMqProducer) { logger.info("查询Mq发布列表tpcMqTopicQuery={}", tpcMqProducer); PageHelper.startPage(tpcMqProducer.getPageNum(), tpcMqProducer.getPageSize()); tpcMqProducer.setOrderBy("update_time desc"); List list = tpcMqProducerService.listPublishVoWithPage(tpcMqProducer); return WrapMapper.ok(new PageInfo<>(list)); } /** * 修改生产者状态. * * @param updateStatusDto the update status dto * * @return the wrapper */ @PostMapping(value = "/modifyStatusById") @ApiOperation(httpMethod = "POST", value = "修改生产者状态") @LogAnnotation public Wrapper modifyProducerStatusById(@ApiParam(value = "修改producer状态") @RequestBody UpdateStatusDto updateStatusDto) { logger.info("修改producer状态 updateStatusDto={}", updateStatusDto); Long roleId = updateStatusDto.getId(); LoginAuthDto loginAuthDto = getLoginAuthDto(); TpcMqProducer producer = new TpcMqProducer(); producer.setId(roleId); producer.setStatus(updateStatusDto.getStatus()); producer.setUpdateInfo(loginAuthDto); int result = tpcMqProducerService.update(producer); return super.handleResult(result); } /** * 根据生产者ID删除生产者. * * @param id the id * * @return the wrapper */ @PostMapping(value = "/deleteById/{id}") @ApiOperation(httpMethod = "POST", value = "根据生产者ID删除生产者") @LogAnnotation public Wrapper deleteProducerById(@PathVariable Long id) { logger.info("删除producer id={}", id); int result = tpcMqProducerService.deleteProducerById(id); return super.handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/frontend/TpcMqTagController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTagController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UpdateStatusDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.TpcMqTag; import com.paascloud.provider.model.vo.TpcMqTagVo; import com.paascloud.provider.service.TpcMqTagService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * The class Tpc mq tag controller. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/tag", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - TpcMqTagController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class TpcMqTagController extends BaseController { @Resource private TpcMqTagService tpcMqTagService; /** * 查询MQ Tag列表. * * @param tpcMqTag the tpc mq tag * * @return the wrapper */ @PostMapping(value = "/queryTagListWithPage") @ApiOperation(httpMethod = "POST", value = "查询MQ-Tag列表") public Wrapper> queryTagListWithPage(@ApiParam(name = "tag", value = "角色信息") @RequestBody TpcMqTag tpcMqTag) { logger.info("查询角色列表tpcMqTagQuery={}", tpcMqTag); PageHelper.startPage(tpcMqTag.getPageNum(), tpcMqTag.getPageSize()); tpcMqTag.setOrderBy("update_time desc"); List list = tpcMqTagService.listWithPage(tpcMqTag); return WrapMapper.ok(new PageInfo<>(list)); } /** * 修改tag状态. * * @param updateStatusDto the update status dto * * @return the wrapper */ @PostMapping(value = "/modifyStatusById") @ApiOperation(httpMethod = "POST", value = "修改MQ-Tag状态") @LogAnnotation public Wrapper modifyProducerStatusById(@ApiParam(value = "修改tag状态") @RequestBody UpdateStatusDto updateStatusDto) { logger.info("修改tag状态 updateStatusDto={}", updateStatusDto); Long roleId = updateStatusDto.getId(); LoginAuthDto loginAuthDto = getLoginAuthDto(); TpcMqTag tag = new TpcMqTag(); tag.setId(roleId); tag.setStatus(updateStatusDto.getStatus()); tag.setUpdateInfo(loginAuthDto); int result = tpcMqTagService.update(tag); return super.handleResult(result); } /** * 根据Tag ID删除TAG. * * @param id the id * * @return the wrapper */ @PostMapping(value = "/deleteById/{id}") @ApiOperation(httpMethod = "POST", value = "根据ID删除TAG") @LogAnnotation public Wrapper deleteTagById(@ApiParam(value = "Tag ID") @PathVariable Long id) { logger.info("删除tag id={}", id); int result = tpcMqTagService.deleteTagById(id); return super.handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/frontend/TpcMqTopicController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqTopicController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.frontend; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UpdateStatusDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.TpcMqTopic; import com.paascloud.provider.model.vo.TpcMqTopicVo; import com.paascloud.provider.service.TpcMqTopicService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; 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; import javax.annotation.Resource; import java.util.List; /** * The class Tpc mq topic controller. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/topic", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - TpcMqTopicController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class TpcMqTopicController extends BaseController { @Resource private TpcMqTopicService tpcMqTopicService; /** * 查询MQ topic列表. * * @param tpcMqTopic the tpc mq topic * * @return the wrapper */ @PostMapping(value = "/queryTopicListWithPage") @ApiOperation(httpMethod = "POST", value = "查询MQ topic列表") public Wrapper> queryTopicListWithPage(@ApiParam(name = "topic", value = "MQ-Topic") @RequestBody TpcMqTopic tpcMqTopic) { logger.info("查询角色列表tpcMqTopicQuery={}", tpcMqTopic); List list = tpcMqTopicService.listWithPage(tpcMqTopic); return WrapMapper.ok(list); } /** * 修改topic状态. * * @param updateStatusDto the update status dto * * @return the wrapper */ @PostMapping(value = "/modifyStatusById") @ApiOperation(httpMethod = "POST", value = "修改topic状态") @LogAnnotation public Wrapper modifyTopicStatusById(@ApiParam(value = "修改topic状态") @RequestBody UpdateStatusDto updateStatusDto) { logger.info("修改topic状态 updateStatusDto={}", updateStatusDto); Long roleId = updateStatusDto.getId(); LoginAuthDto loginAuthDto = getLoginAuthDto(); TpcMqTopic topic = new TpcMqTopic(); topic.setId(roleId); topic.setStatus(updateStatusDto.getStatus()); topic.setUpdateInfo(loginAuthDto); int result = tpcMqTopicService.update(topic); return super.handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/java/com/paascloud/provider/web/rpc/TpcMqMessageFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqMessageFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.TpcMqMessageDto; import com.paascloud.provider.service.TpcMqMessageFeignApi; import com.paascloud.provider.service.TpcMqMessageService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * The class Tpc mq message feign client. * * @author paascloud.net @gmail.com */ @RestController @Api(value = "API - TpcMqMessageFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class TpcMqMessageFeignClient extends BaseController implements TpcMqMessageFeignApi { @Resource private TpcMqMessageService tpcMqMessageService; @Override @ApiOperation(httpMethod = "POST", value = "预存储消息") public Wrapper saveMessageWaitingConfirm(@RequestBody TpcMqMessageDto mqMessageDto) { logger.info("预存储消息. mqMessageDto={}", mqMessageDto); tpcMqMessageService.saveMessageWaitingConfirm(mqMessageDto); return WrapMapper.ok(); } @Override @ApiOperation(httpMethod = "POST", value = "确认并发送消息") public Wrapper confirmAndSendMessage(@RequestParam("messageKey") String messageKey) { logger.info("确认并发送消息. messageKey={}", messageKey); tpcMqMessageService.confirmAndSendMessage(messageKey); return WrapMapper.ok(); } @Override @ApiOperation(httpMethod = "POST", value = "存储并发送消息") public Wrapper saveAndSendMessage(@RequestBody TpcMqMessageDto message) { logger.info("存储并发送消息. mqMessageDto={}", message); tpcMqMessageService.saveAndSendMessage(message); return WrapMapper.ok(); } @Override @ApiOperation(httpMethod = "POST", value = "直接发送消息") public Wrapper directSendMessage(@RequestBody TpcMqMessageDto messageDto) { logger.info("直接发送消息. mqMessageDto={}", messageDto); tpcMqMessageService.directSendMessage(messageDto.getMessageBody(), messageDto.getMessageTopic(), messageDto.getMessageTag(), messageDto.getMessageKey(), messageDto.getProducerGroup(), messageDto.getDelayLevel()); return WrapMapper.ok(); } @Override @ApiOperation(httpMethod = "POST", value = "根据消息ID删除消息") public Wrapper deleteMessageByMessageKey(@RequestParam("messageKey") String messageKey) { logger.info("根据消息ID删除消息. messageKey={}", messageKey); tpcMqMessageService.deleteMessageByMessageKey(messageKey); return WrapMapper.ok(); } @Override @ApiOperation(httpMethod = "POST", value = "确认收到消息") public Wrapper confirmReceiveMessage(@RequestParam("cid") final String cid, @RequestParam("messageKey") final String messageKey) { logger.info("确认收到消息. cid={}, messageKey={}", cid, messageKey); tpcMqMessageService.confirmReceiveMessage(cid, messageKey); return WrapMapper.ok(); } @Override @ApiOperation(httpMethod = "POST", value = "确认消费消息") public Wrapper confirmConsumedMessage(@RequestParam("cid") final String cid, @RequestParam("messageKey") final String messageKey) { logger.info("确认完成消费消息. cid={}, messageKey={}", cid, messageKey); tpcMqMessageService.confirmConsumedMessage(cid, messageKey); return WrapMapper.ok(); } } ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/META-INF/spring-devtools.properties ================================================ restart.include.mapper=/mapper-[\\w-\\.]+jar restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/ValidationMessages.properties ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/application.yml ================================================ server: port: 8090 spring: profiles: active: dev application: name: @pom.artifactId@ datasource: username: root password: 123456 ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/banner.txt ================================================ ${AnsiColor.BRIGHT_CYAN} .__ .___ __ ___________ _____ ______ ____ | | ____ __ __ __| _/ ____ _____/ |_ \____ \__ \ \__ \ / ___// ___\| | / _ \| | \/ __ | / \_/ __ \ __\ | |_> > __ \_/ __ \_\___ \\ \___| |_( <_> ) | / /_/ | | | \ ___/| | | __(____ (____ /____ >\___ >____/\____/|____/\____ | /\ |___| /\___ >__| |__| \/ \/ \/ \/ Powered by liuzhaoming\/ \/ \/ \/ ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/bootstrap.yml ================================================ spring: cloud: config: fail-fast: true discovery: service-id: paascloud-discovery enabled: true label: ${spring.profiles.active} profile: ${spring.profiles.active} username: admin password: admin eureka: client: serviceUrl: defaultZone: http://root:root@paascloud-eureka:8761/eureka/ instance: instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port} ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/conf/liquibase.properties ================================================ spring.datasource.driver-class-name= com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_mdc?characterEncoding=utf8&useSSL=false spring.datasource.username= root spring.datasource.password= 123456 ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/liquibase/index.xml ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/logback-spring.xml ================================================ DEBUG ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE} ${LOG_FILE}.%d{yyyy-MM-dd}.gz 7 ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE}.json ${LOG_FILE}.json.%d{yyyy-MM-dd}.gz 7 UTC { "severity": "%level", "service": "${springAppName:-}", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "parent": "%X{X-B3-ParentSpanId:-}", "exportable": "%X{X-Span-Export:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" } ${LOG_FILE}.sql.%d{yyyy-MM-dd}.gz 10 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-%msg%n ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcJobTaskMapper.xml ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqConfirmMapper.xml ================================================ insert into pc_tpc_mq_confirm ( id, message_id, message_key, consumer_code) VALUES ( #{item.id,jdbcType=BIGINT}, #{item.messageId,jdbcType=BIGINT}, #{item.messageKey,jdbcType=VARCHAR}, #{item.consumerCode,jdbcType=VARCHAR} ) UPDATE pc_tpc_mq_confirm SET status = 20, consume_count = consume_count + 1 WHERE id = #{cid} AND status = 10 UPDATE pc_tpc_mq_confirm SET status = 30 WHERE id = #{cid} AND status in (10, 20) ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqConsumerMapper.xml ================================================ ${alias}.id, ${alias}.version, ${alias}.aplication_name, ${alias}.consumer_code, ${alias}.consumer_name, ${alias}.status, ${alias}.remark, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time ${alias}.version as topic_version, ${alias}.producer_id, ${alias}.topic_code, ${alias}.topic_name, ${alias}.mq_type, ${alias}.msg_type, ${alias}.status as topic_status, ${alias}.remarks as topic_remarks, ${alias}.creator as topic_creator, ${alias}.creator_id as topic_created_time, ${alias}.created_time as topic_created_time, ${alias}.last_operator as topic_last_operator, ${alias}.last_operator_id as topic_last_operator_id, ${alias}.update_time as topic_update_time ${alias}.id as tag_id, ${alias}.version as tag_version, ${alias}.topic_id, ${alias}.tag_code, ${alias}.tag_name, ${alias}.status as tag_status, ${alias}.remark as tag_remark, ${alias}.creator as tag_creator, ${alias}.creator_id as tag_creator_id, ${alias}.created_time as tag_created_time, ${alias}.last_operator as tag_last_operator, ${alias}.last_operator_id as tag_last_operator_id, ${alias}.update_time as tag_update_time DELETE FROM pc_tpc_mq_subscribe_tag WHERE tag_id = #{tagId} DELETE FROM pc_tpc_mq_subscribe WHERE consumer_id = #{consumerId} DELETE FROM pc_tpc_mq_subscribe_tag WHERE subscribe_id IN #{item} ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqMessageMapper.xml ================================================ ${alias}.id, ${alias}.version, ${alias}.message_key, ${alias}.message_topic, ${alias}.message_tag, ${alias}.message_type, ${alias}.producer_group, ${alias}.delay_level, ${alias}.order_type, ${alias}.message_status, ${alias}.task_status, ${alias}.update_time, ${alias}.resend_times, ${alias}.dead, ${alias}.next_exe_time, ${alias}.yn, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id ${alias}.message_body UPDATE pc_tpc_mq_message SET resend_times = resend_times + 1, update_time = now() WHERE id = #{messageId} UPDATE pc_tpc_mq_message SET dead = 1, update_time = now(), task_status = 4 WHERE id = #{messageId} UPDATE pc_tpc_mq_message SET task_status = #{taskStatus}, update_time = now() WHERE id = #{id} and task_status IN #{item} DELETE FROM pc_tpc_mq_message WHERE message_key = #{messageKey,jdbcType=VARCHAR} delete from pc_tpc_mq_message where message_key IN #{item} ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqProducerMapper.xml ================================================ ${alias}.id, ${alias}.version, ${alias}.aplication_name, ${alias}.producer_code, ${alias}.producer_name, ${alias}.query_message_url, ${alias}.status, ${alias}.remark, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time ${alias}.version as topic_version, ${alias}.producer_id, ${alias}.topic_code, ${alias}.topic_name, ${alias}.mq_type, ${alias}.msg_type, ${alias}.status as topic_status, ${alias}.remarks as topic_remarks, ${alias}.creator as topic_creator, ${alias}.creator_id as topic_created_time, ${alias}.created_time as topic_created_time, ${alias}.last_operator as topic_last_operator, ${alias}.last_operator_id as topic_last_operator_id, ${alias}.update_time as topic_update_time DELETE FROM pc_tpc_mq_publish WHERE producer_id = #{producerId} ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqSubscribeTagMapper.xml ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqTagMapper.xml ================================================ ${alias}.id, ${alias}.version, ${alias}.topic_id, ${alias}.tag_code, ${alias}.tag_name, ${alias}.status, ${alias}.remark, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/main/resources/mapper/TpcMqTopicMapper.xml ================================================ ${alias}.id, ${alias}.version, ${alias}.producer_id, ${alias}.topic_code, ${alias}.topic_name, ${alias}.mq_type, ${alias}.msg_type, ${alias}.status, ${alias}.remarks, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time ${alias}.id as tag_id, ${alias}.version as tag_version, ${alias}.topic_id, ${alias}.tag_code, ${alias}.tag_name, ${alias}.status as tag_status, ${alias}.remark as tag_remark, ${alias}.creator as tag_creator, ${alias}.creator_id as tag_creator_id, ${alias}.created_time as tag_created_time, ${alias}.last_operator as tag_last_operator, ${alias}.last_operator_id as tag_last_operator_id, ${alias}.update_time as tag_update_time ================================================ FILE: paascloud-provider/paascloud-provider-tpc/src/test/java/com/paascloud/provider/PaasCloudMdcApplicationTests.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudMdcApplicationTests.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class PaasCloudMdcApplicationTests { } ================================================ FILE: paascloud-provider/paascloud-provider-uac/pom.xml ================================================ 4.0.0 paascloud-provider-uac jar paascloud-provider-uac 用户认证中心 - User authentication center com.liuzm.paascloud.provider paascloud-provider 1.0 UTF-8 UTF-8 1.8 mysql mysql-connector-java runtime io.jsonwebtoken jjwt joda-time joda-time org.mybatis.spring.boot mybatis-spring-boot-starter tk.mybatis mapper-spring-boot-starter com.github.pagehelper pagehelper-spring-boot-starter com.alibaba druid-spring-boot-starter com.fasterxml.jackson.core jackson-databind com.liuzm.paascloud.provider.api paascloud-provider-uac-api com.liuzm.paascloud.provider.api paascloud-provider-mdc-api com.liuzm.paascloud.provider.api paascloud-provider-omc-api com.liuzm.paascloud.provider.api paascloud-provider-opc-api 1.0 com.liuzm.paascloud.provider.api paascloud-provider-sdk-api org.apache.rocketmq rocketmq-client 4.1.0-incubating de.codecentric spring-boot-admin-starter-client org.springframework.boot spring-boot-starter-freemarker org.springframework.cloud spring-cloud-starter-feign com.github.penggle kaptcha org.springframework.cloud spring-cloud-starter-oauth2 org.springframework.social spring-social-config org.springframework.social spring-social-core org.springframework.social spring-social-security org.springframework.social spring-social-web com.liuzm.paascloud.common paascloud-common-base com.liuzm.paascloud.common paascloud-security-app ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/PaasCloudUacApplication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudUacApplication.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud; import com.paascloud.provider.service.impl.PcSmsCodeSender; import com.paascloud.security.core.validate.code.sms.SmsCodeSender; import liquibase.integration.spring.SpringLiquibase; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.feign.EnableFeignClients; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.context.annotation.Bean; import org.springframework.context.support.ReloadableResourceBundleMessageSource; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; /** * The class Paas cloud uac application. * * @author paascloud.net@gmail.com */ @EnableHystrix @EnableFeignClients @EnableDiscoveryClient @SpringBootApplication @EnableTransactionManagement public class PaasCloudUacApplication { /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { SpringApplication.run(PaasCloudUacApplication.class, args); } @Bean public SpringLiquibase springLiquibase(DataSource dataSource) { SpringLiquibase springLiquibase = new SpringLiquibase(); springLiquibase.setDataSource(dataSource); springLiquibase.setChangeLog("classpath:/liquibase/index.xml"); return springLiquibase; } @Bean public ReloadableResourceBundleMessageSource messageSource() { ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource(); messageSource.setBasename("classpath:org/springframework/security/messages_zh_CN"); return messageSource; } @Bean public SmsCodeSender smsCodeSender() { return new PcSmsCodeSender(); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/config/AliyunMqConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AliyunMqConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.paascloud.PublicUtil; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.config.properties.PaascloudProperties; import com.paascloud.provider.mq.consumer.listener.UacPushMessageListener; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer; import org.apache.rocketmq.client.exception.MQClientException; import org.apache.rocketmq.common.consumer.ConsumeFromWhere; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.TaskExecutor; import javax.annotation.Resource; /** * The class Aliyun mq configuration. * * @author paascloud.net@gmail.com */ @Slf4j @Configuration public class AliyunMqConfiguration { @Resource private UacPushMessageListener uacPushMessageListener; @Resource private PaascloudProperties paascloudProperties; @Resource private TaskExecutor taskExecutor; /** * Default mq push consumer default mq push consumer. * * @return the default mq push consumer * * @throws MQClientException the mq client exception */ @Bean public DefaultMQPushConsumer defaultMQPushConsumer() throws MQClientException { DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(paascloudProperties.getAliyun().getRocketMq().getConsumerGroup()); consumer.setNamesrvAddr(paascloudProperties.getAliyun().getRocketMq().getNamesrvAddr()); consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET); String[] strArray = AliyunMqTopicConstants.ConsumerTopics.UAC.split(GlobalConstant.Symbol.COMMA); for (String aStrArray : strArray) { String[] topicArray = aStrArray.split(GlobalConstant.Symbol.AT); String topic = topicArray[0]; String tags = topicArray[1]; if (PublicUtil.isEmpty(tags)) { tags = "*"; } consumer.subscribe(topic, tags); log.info("RocketMq UacPushConsumer topic = {}, tags={}", topic, tags); } consumer.registerMessageListener(uacPushMessageListener); consumer.setConsumeThreadMax(2); consumer.setConsumeThreadMin(2); taskExecutor.execute(() -> { try { Thread.sleep(5000); consumer.start(); log.info("RocketMq UacPushConsumer OK."); } catch (InterruptedException | MQClientException e) { log.error("RocketMq OpcPushConsumer, 出现异常={}", e.getMessage(), e); } }); return consumer; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/config/CaptchaConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CaptchaConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.google.code.kaptcha.impl.DefaultKaptcha; import com.google.code.kaptcha.util.Config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.Properties; /** * The class Captcha config. * * @author paascloud.net @gmail.com */ @Configuration public class CaptchaConfig { /** * Get kaptcha bean default kaptcha. * * @return the default kaptcha */ @Bean(name = "captchaProducer") public DefaultKaptcha getKaptchaBean() { DefaultKaptcha defaultKaptcha = new DefaultKaptcha(); Properties properties = new Properties(); properties.setProperty("kaptcha.border", "no"); properties.setProperty("kaptcha.border.color", "no"); properties.setProperty("kaptcha.border.color", "220,227,232"); properties.setProperty("kaptcha.textproducer.char.string", "2345689"); properties.setProperty("kaptcha.textproducer.font.color", "black"); properties.setProperty("kaptcha.textproducer.font.size", "16"); properties.setProperty("kaptcha.image.width", "106"); properties.setProperty("kaptcha.image.height", "30"); properties.setProperty("kaptcha.session.key", "kaptchaCode"); properties.setProperty("kaptcha.textproducer.char.length", "4"); properties.setProperty("kaptcha.background.clear.from", "white"); properties.setProperty("kaptcha.background.clear.to", "white"); properties.setProperty("kaptcha.textproducer.char.space", "5"); properties.setProperty("kaptcha.obscurificator.impl", "com.google.code.kaptcha.impl.ShadowGimpy"); properties.setProperty("kaptcha.noise.impl", "com.google.code.kaptcha.impl.NoNoise"); properties.setProperty("kaptcha.textproducer.font.names", "Verdana"); Config config = new Config(properties); defaultKaptcha.setConfig(config); return defaultKaptcha; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/config/RedisInitRunner.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RedisInitRunner.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import lombok.extern.slf4j.Slf4j; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * The class Redis init runner. * * @author paascloud.net @gmail.com */ @Component @Order(value = 1) @Slf4j public class RedisInitRunner implements CommandLineRunner { /** * Run. * * @param args the args */ @Override public void run(String... args) { log.info(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作 11111111 <<<<<<<<<<<<<"); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/config/UacWebMvcConfig.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacWebMvcConfig.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.config; import com.paascloud.core.config.PcObjectMapper; import com.paascloud.core.config.SwaggerConfiguration; import com.paascloud.core.interceptor.TokenInterceptor; import com.paascloud.security.core.properties.SecurityConstants; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import org.springframework.http.converter.HttpMessageConverter; import org.springframework.web.servlet.config.annotation.EnableWebMvc; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; import javax.annotation.Resource; import java.util.List; /** * The class Web mvc config. * * @author paascloud.net @gmail.com */ @Configuration @EnableWebMvc @Import(SwaggerConfiguration.class) public class UacWebMvcConfig extends WebMvcConfigurerAdapter { @Resource private TokenInterceptor vueViewInterceptor; @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/**") .addResourceLocations("classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/"); } @Override public void addInterceptors(InterceptorRegistry registry) { super.addInterceptors(registry); registry.addInterceptor(vueViewInterceptor) .addPathPatterns("/**") .excludePathPatterns("/swagger-resources/**", "*.js", "/**/*.js", "*.css", "/**/*.css", "*.html", "/**/*.html", SecurityConstants.DEFAULT_SOCIAL_USER_INFO_URL); } @Override public void configureMessageConverters(List> converters) { PcObjectMapper.buidMvcMessageConverter(converters); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/manager/UserManager.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UserManager.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.manager; import com.google.common.base.Preconditions; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.annotation.MqProducerStore; import com.paascloud.provider.mapper.UacGroupUserMapper; import com.paascloud.provider.mapper.UacRoleUserMapper; import com.paascloud.provider.mapper.UacUserMapper; import com.paascloud.provider.model.domain.MqMessageData; import com.paascloud.provider.model.domain.UacGroupUser; import com.paascloud.provider.model.domain.UacRoleUser; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.enums.MqSendTypeEnum; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.service.impl.RedisServiceImpl; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; /** * The class User manager. * * @author paascloud.net @gmail.com */ @Slf4j @Component @Transactional(rollbackFor = Exception.class) public class UserManager { @Resource private UacUserMapper uacUserMapper; @Resource private UacRoleUserMapper uacRoleUserMapper; @Resource private UacGroupUserMapper uacGroupUserMapper; @Resource private RedisServiceImpl redisService; @MqProducerStore(sendType = MqSendTypeEnum.SAVE_AND_SEND) public void submitResetPwdEmail(final MqMessageData messageData) { log.info("重置密码发送邮件. messageData={}", messageData); } @MqProducerStore public void register(final MqMessageData mqMessageData, final UacUser uacUser) { log.info("注册用户. mqMessageData={}, user={}", mqMessageData, uacUser); uacUserMapper.insertSelective(uacUser); } @MqProducerStore public void resetLoginPwd(final MqMessageData mqMessageData, final UacUser update) { log.info("重置密码. mqMessageData={}, user={}", mqMessageData, update); int updateResult = uacUserMapper.updateByPrimaryKeySelective(update); if (updateResult < 1) { log.error("用户【 {} 】重置密码失败", update.getLoginName()); } else { log.info("用户【 {} 】重置密码失败", update.getLoginName()); } } @MqProducerStore public void activeUser(final MqMessageData mqMessageData, final UacUser uacUser, final String activeUserKey) { log.info("激活用户. mqMessageData={}, user={}", mqMessageData, uacUser); int result = uacUserMapper.updateByPrimaryKeySelective(uacUser); if (result < 1) { throw new UacBizException(ErrorCodeEnum.UAC10011038, uacUser.getId()); } // 绑定一个访客角色默认值roleId=10000 final Long userId = uacUser.getId(); Preconditions.checkArgument(userId != null, "用戶Id不能爲空"); final Long roleId = 10000L; UacRoleUser roleUser = new UacRoleUser(); roleUser.setUserId(userId); roleUser.setRoleId(roleId); uacRoleUserMapper.insertSelective(roleUser); // 绑定一个组织 UacGroupUser groupUser = new UacGroupUser(); groupUser.setUserId(userId); groupUser.setGroupId(GlobalConstant.Sys.SUPER_MANAGER_GROUP_ID); uacGroupUserMapper.insertSelective(groupUser); // 删除 activeUserToken redisService.deleteKey(activeUserKey); } @MqProducerStore(sendType = MqSendTypeEnum.SAVE_AND_SEND) public void sendSmsCode(final MqMessageData mqMessageData) { log.info("发送短信验证码. mqMessageData={}", mqMessageData); } @MqProducerStore(sendType = MqSendTypeEnum.SAVE_AND_SEND) public void sendEmailCode(final MqMessageData mqMessageData) { log.info("发送邮件验证码. mqMessageData={}", mqMessageData); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacActionMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacActionMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacAction; import com.paascloud.provider.model.domain.UacMenu; import com.paascloud.provider.model.dto.user.Perm; import com.paascloud.provider.model.vo.ActionVo; import com.paascloud.provider.model.vo.MenuVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Uac action mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface UacActionMapper extends MyMapper { /** * Find all perms list. * * @return the list */ List findAllPerms(); /** * Find action code list by user id list. * * @param userId the user id * * @return the list */ List findActionCodeListByUserId(Long userId); /** * Batch delete by id list int. * * @param deleteIdList the delete id list * * @return the int */ int batchDeleteByIdList(@Param("idList") List deleteIdList); /** * Query action list with page list. * * @param uacAction the uac action * * @return the list */ List queryActionListWithPage(UacAction uacAction); /** * Delete by menu id int. * * @param id the id * * @return the int */ int deleteByMenuId(@Param("menuId") Long id); /** * Gets checked action list. * * @param roleId the role id * * @return the checked action list */ List getCheckedActionList(@Param("roleId") Long roleId); /** * Gets own auth list. * * @param userId the user id * * @return the own auth list */ List getOwnAuthList(@Param("userId") Long userId); /** * Gets checked menu list. * * @param roleId the role id * * @return the checked menu list */ List getCheckedMenuList(@Param("roleId") Long roleId); /** * Gets own uac action list by user id. * * @param userId the user id * * @return the own uac action list by user id */ List getOwnUacActionListByUserId(Long userId); /** * 根据角色ID查询权限列表. * * @param roleId the role id * * @return the list */ List listActionListByRoleId(@Param("roleId") Long roleId); /** * List action list list. * * @param menuList the menu list * * @return the list */ List listActionList(@Param("menuList") List menuList); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacGroupMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGroupMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacGroup; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; /** * The interface Uac group mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface UacGroupMapper extends MyMapper { } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacGroupUserMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGroupUserMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacGroup; import com.paascloud.provider.model.domain.UacGroupUser; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Uac group user mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface UacGroupUserMapper extends MyMapper { /** * Query by user id uac group user. * * @param userId the user id * * @return the uac group user */ UacGroupUser getByUserId(Long userId); /** * Update by user id int. * * @param uacGroupUser the uac group user * * @return the int */ int updateByUserId(UacGroupUser uacGroupUser); /** * Select group list by user id list. * * @param userId the user id * * @return the list */ List selectGroupListByUserId(Long userId); /** * List by group id list. * * @param groupId the group id * * @return the list */ List listByGroupId(@Param("groupId") Long groupId); /** * Delete exclude super mng int. * * @param groupId the group id * @param superManagerRoleId the super manager role id * * @return the int */ int deleteExcludeSuperMng(@Param("currentGroupId") Long groupId, @Param("superManagerRoleId") Long superManagerRoleId); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacLogMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacLogMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacLog; import com.paascloud.provider.model.dto.log.UacLogMainDto; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Uac log mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface UacLogMapper extends MyMapper { /** * Select user log list with user id list. * * @param userId the user id * * @return the list */ List selectUserLogListByUserId(@Param("userId") Long userId); /** * Query log list with page list. * * @param uacLogQueryDtoPage the uac log query dto page * * @return the list */ List queryLogListWithPage(UacLogMainDto uacLogQueryDtoPage); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacMenuMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacMenuMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacMenu; import com.paascloud.provider.model.vo.MenuVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; import java.util.Set; /** * The interface Uac menu mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface UacMenuMapper extends MyMapper { /** * Find menu vo list by user id list. * * @param userId the user id * * @return the list */ List findMenuVoListByUserId(Long userId); /** * Find menu code list by user id list. * * @param userId the user id * * @return the list */ List findMenuCodeListByUserId(Long userId); /** * Select menu list list. * * @param uacMenu the uac menu * * @return the list */ List selectMenuList(UacMenu uacMenu); /** * Select menu child count by pid int. * * @param pid the pid * * @return the int */ int selectMenuChildCountByPid(Long pid); /** * Select by url uac menu. * * @param url the url * * @return the uac menu */ UacMenu selectByUrl(String url); /** * Update menu int. * * @param uacMenu the uac menu * * @return the int */ int updateMenu(UacMenu uacMenu); /** * 根据角色ID查询菜单列表. * * @param roleId the role id * * @return the list */ List listMenuListByRoleId(@Param("roleId") Long roleId); /** * List menu list. * * @param menuIdList the menu id list * * @return the list */ List listMenu(@Param("menuIdList") Set menuIdList); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacRoleActionMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleActionMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacRoleAction; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Uac role action mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface UacRoleActionMapper extends MyMapper { /** * Delete by action id int. * * @param actionId the action id * * @return the int */ int deleteByActionId(@Param("actionId") Long actionId); /** * Delete by role id list int. * * @param roleIdList the role id list * * @return the int */ int deleteByRoleIdList(@Param("roleIdList") List roleIdList); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacRoleMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacRole; import com.paascloud.provider.model.dto.role.BindUserDto; import com.paascloud.provider.model.vo.RoleVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Uac role mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface UacRoleMapper extends MyMapper { /** * Find by role code uac role. * * @param roleCode the role code * * @return the uac role */ UacRole findByRoleCode(String roleCode); /** * Query role list with page list. * * @param role the role * * @return the list */ List queryRoleListWithPage(UacRole role); /** * Select all role info by user id list. * * @param userId the user id * * @return the list */ List selectAllRoleInfoByUserId(Long userId); /** * Select role list list. * * @param uacRole the uac role * * @return the list */ List selectRoleList(UacRole uacRole); /** * Batch delete by id list int. * * @param idList the id list * * @return the int */ int batchDeleteByIdList(@Param("idList") List idList); /** * Select all need bind user list. * * @param superManagerRoleId the super manager role id * @param currentUserId the current user id * * @return the list */ List selectAllNeedBindUser(@Param("superManagerRoleId") Long superManagerRoleId, @Param("currentUserId") Long currentUserId); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacRoleMenuMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleMenuMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacRoleMenu; import com.paascloud.provider.model.vo.role.MenuCountVo; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Uac role menu mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface UacRoleMenuMapper extends MyMapper { /** * Count child menu num list. * * @param roleId the role id * * @return the list */ List countChildMenuNum(Long roleId); /** * Add role menu list int. * * @param addUacRoleMenuList the add uac role menu list * * @return the int */ int addRoleMenuList(List addUacRoleMenuList); /** * Delete by role id list int. * * @param roleIdList the role id list * * @return the int */ int deleteByRoleIdList(@Param("roleIdList") List roleIdList); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacRoleUserMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleUserMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacRoleUser; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Uac role user mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface UacRoleUserMapper extends MyMapper { /** * Delete exclude super mng int. * * @param currentRoleId the current role id * @param superRoleId the super role id * * @return the int */ int deleteExcludeSuperMng(@Param("currentRoleId") Long currentRoleId, @Param("superRoleId") Long superRoleId); /** * Gets by user id and role id. * * @param userId the user id * @param roleId the role id * * @return the by user id and role id */ UacRoleUser getByUserIdAndRoleId(@Param("userId") Long userId, @Param("roleId") Long roleId); /** * List by user id list. * * @param userId the user id * * @return the list */ List listByUserId(@Param("userId") Long userId); /** * List by role id list. * * @param roleId the role id * * @return the list */ List listByRoleId(@Param("roleId") Long roleId); /** * List super user list. * * @param roleId the role id * * @return the list */ List listSuperUser(@Param("roleId") Long roleId); /** * List by role id list list. * * @param idList the id list * * @return the list */ List listByRoleIdList(@Param("roleIds") List idList); /** * Delete by role id int. * * @param roleId the role id * * @return the int */ int deleteByRoleId(@Param("roleId") Long roleId); /** * Delete by role id list int. * * @param roleIdList the role id list * * @return the int */ int deleteByRoleIdList(@Param("roleIdList") List roleIdList); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacUserMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.dto.user.BindRoleDto; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; /** * The interface Uac user mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface UacUserMapper extends MyMapper { /** * Find by login name uac user. * * @param loginName the login name * * @return the uac user */ UacUser findByLoginName(String loginName); /** * Find by mobile no uac user. * * @param mobileNo the mobile no * * @return the uac user */ UacUser findByMobileNo(@Param("mobileNo") String mobileNo); /** * Find by login name and login pwd uac user. * * @param loginNamePwdMap the login name pwd map * * @return the uac user */ UacUser findByLoginNameAndLoginPwd(Map loginNamePwdMap); /** * Select user list list. * * @param uacUser the uac user * * @return the list */ List selectUserList(UacUser uacUser); /** * Select user info by user id uac user. * * @param userId the user id * * @return the uac user */ UacUser selectUserInfoByUserId(Long userId); /** * Update uac user int. * * @param user the user * * @return the int */ int updateUacUser(UacUser user); /** * Select all need bind role list. * * @param superManagerRoleId the super manager role id * * @return the list */ List selectAllNeedBindRole(@Param("superManagerRoleId") Long superManagerRoleId); /** * Find user info by login name uac user. * * @param loginName the login name * * @return the uac user */ UacUser findUserInfoByLoginName(@Param("loginName") String loginName); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacUserMenuMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserMenuMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacUserMenu; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; /** * The interface Uac user menu mapper. * * @author paascloud.net@gmail.com */ @Mapper @Component public interface UacUserMenuMapper extends MyMapper { } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mapper/UacUserTokenMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserTokenMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.core.mybatis.MyMapper; import com.paascloud.provider.model.domain.UacUserToken; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Component; import java.util.List; import java.util.Map; /** * The interface Uac user token mapper. * * @author paascloud.net @gmail.com */ @Mapper @Component public interface UacUserTokenMapper extends MyMapper { /** * Select token list list. * * @param userToken the user token * * @return the list */ List selectTokenList(UacUserToken userToken); /** * 超时token更新为离线. * * @param map the map * * @return the int */ int batchUpdateTokenOffLine(Map map); /** * 查询超时token Id 集合. * * @return the list */ List listOffLineTokenId(); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/constant/MenuConstant.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MenuConstant.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.constant; /** * The class Menu constant. * * @author paascloud.net@gmail.com */ public class MenuConstant { /** * 菜单根目录 */ public static final Integer MENU_LEVEL_ROOT = 0; /** * 一级菜单 */ public static final Integer MENU_LEVEL_FIRST = 1; /** * 二级菜单 */ public static final Integer MENU_LEVEL_TWO = 2; /** * 二级菜单 */ public static final Integer MENU_LEVEL_THREE = 3; /** * 菜单是叶子节点 */ public static final Integer MENU_LEAF_YES = 0; /** * 菜单不叶子节点 */ public static final Integer MENU_LEAF_NO = 1; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacAction.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacAction.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; import javax.persistence.Transient; import java.io.Serializable; import java.util.List; /** * The class Uac action. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_uac_action") @Alias(value = "uacAction") public class UacAction extends BaseEntity implements Serializable { private static final long serialVersionUID = 6943147531573339665L; /** * 资源路径 */ private String url; /** * 权限名称 */ @Column(name = "action_name") private String actionName; /** * 权限编码 */ @Column(name = "action_code") private String actionCode; /** * 状态 */ private String status; /** * 备注 */ private String remark; /** * 菜单ID */ @Column(name = "menu_id") private Long menuId; /** * 菜单ID */ @Transient private List menuIdList; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacGroup.java ================================================ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; import javax.persistence.Transient; import java.util.List; /** * The class Uac group. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_uac_group") @Alias(value = "uacGroup") public class UacGroup extends BaseEntity { private static final long serialVersionUID = 1752542793067966068L; /** * 组织编码 */ @Column(name = "group_code") private String groupCode; /** * 组织名称 */ @Column(name = "group_name") private String groupName; /** * 状态 */ private Integer status; /** * 组织类型 1:仓库 2:基地 */ private String type; /** * 父ID */ private Long pid; /** * 层级 */ private Integer level; /** * 是否叶子节点,1不是0是 */ private Integer leaf; /** * 联系人 */ private String contact; /** * 组织地址 */ @Column(name = "group_address") private String groupAddress; /** * 省名称 */ @Column(name = "province_name") private String provinceName; /** * 省编码 */ @Column(name = "province_id") private Long provinceId; /** * 城市名称 */ @Column(name = "city_name") private String cityName; /** * 城市编码 */ @Column(name = "city_id") private Long cityId; /** * 区名称 */ @Column(name = "area_name") private String areaName; /** * 区编码 */ @Column(name = "area_id") private Long areaId; /** * 街道编码 */ @Column(name = "street_id") private Long streetId; /** * 街道名称 */ @Column(name = "street_name") private String streetName; /** * 详细地址 */ @Column(name = "detail_address") private String detailAddress; /** * 联系人手机号 */ @Column(name = "contact_phone") private String contactPhone; /** * 描述 */ private String remark; /** * 预留排序字段 */ private Integer number; /** * 上级组织编码 */ @Transient private String parentGroupCode; /** * 上级组织名称 */ @Transient private String parentGroupName; /** * 四级地址数组 */ @Transient private List addressList; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacGroupUser.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGroupUser.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import lombok.Data; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; import java.io.Serializable; /** * The class Uac group user. * * @author paascloud.net@gmail.com */ @Data @Table(name = "pc_uac_group_user") @Alias(value = "uacGroupUser") public class UacGroupUser implements Serializable { private static final long serialVersionUID = 5167709959453148144L; /** * 角色ID */ @Column(name = "group_id") private Long groupId; /** * 菜单ID */ @Column(name = "user_id") private Long userId; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacLog.java ================================================ package com.paascloud.provider.model.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.paascloud.core.mybatis.BaseEntity; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.Column; import javax.persistence.Table; import java.util.Date; /** * The class Uac log. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_uac_log") @ApiModel("操作日志") @Alias(value = "uacLog") public class UacLog extends BaseEntity { private static final long serialVersionUID = -3326236838689347547L; /** * 组织流水号 */ @Column(name = "group_id") private Long groupId; /** * 组织名称 */ @Column(name = "group_name") private String groupName; /** * 日志类型 */ @Column(name = "log_type") private String logType; /** * 日志类型名称 */ @Column(name = "log_name") private String logName; /** * 权限ID */ @Column(name = "action_id") private Long actionId; /** * 权限编码 */ @Column(name = "action_code") private String actionCode; /** * 权限名称 */ @Column(name = "action_name") private String actionName; /** * 操作系统 */ private String os; /** * 浏览器类型 */ private String browser; /** * IP地址 */ private String ip; /** * 物理地址 */ private String mac; /** * 详细描述 */ private String description; /** * 请求参数 */ @Column(name = "request_data") private String requestData; /** * 请求地址 */ @Column(name = "request_url") private String requestUrl; /** * 响应结果 */ @Column(name = "response_data") private String responseData; /** * 类名 */ @Column(name = "class_name") private String className; /** * 方法名 */ @Column(name = "method_name") private String methodName; /** * 开始时间 */ @Column(name = "start_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; /** * 结束时间 */ @Column(name = "end_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; /** * 耗时,秒 */ @Column(name = "excute_time") private Long excuteTime; /** * 登录位置 */ @Column(name = "location") private String location; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacMenu.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacMenu.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; /** * The class Uac menu. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_uac_menu") @Alias(value = "uacMenu") public class UacMenu extends BaseEntity { private static final long serialVersionUID = 454644589405700059L; /** * 菜单编码 */ @Column(name = "menu_code") private String menuCode; /** * 菜单名称 */ @Column(name = "menu_name") private String menuName; /** * 状态 */ private String status; /** * 菜单URL */ private String url; /** * 图标 */ private String icon; /** * 父ID */ private Long pid; /** * 层级(最多三级1,2,3) */ private Integer level; /** * 是否叶子节点,1不是0是 */ private Integer leaf; /** * 序号 */ private Integer number; /** * 备注 */ private String remark; /** * 系统ID */ @Column(name = "application_id") private Long applicationId; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacRole.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRole.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import org.hibernate.validator.constraints.Length; import javax.persistence.Column; import javax.persistence.Table; import javax.validation.constraints.Pattern; import java.io.Serializable; /** * The class Uac role. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_uac_role") @Alias(value = "uacRole") public class UacRole extends BaseEntity implements Serializable { private static final long serialVersionUID = -6049575043793281879L; /** * 角色编码 */ @Column(name = "role_code") @Pattern(regexp = "^[A-Za-z0-9]+$", message = "{role.roleCode.pattern}") @Length(min = 6, max = 20, message = "{role.roleCode.length}") private String roleCode; /** * 角色名称 */ @Column(name = "role_name") @Pattern(regexp = "^[\\u4e00-\\u9faf]+$", message = "{role.roleName.pattern}") @Length(min = 4, max = 10, message = "{role.roleName.length}") private String roleName; /** * 状态 */ private String status; /** * 备注 */ @Length(max = 150, message = "{role.remark.length}") private String remark; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacRoleAction.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleAction.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import lombok.Data; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.Table; import java.io.Serializable; /** * The class Uac role action. * * @author paascloud.net@gmail.com */ @Data @Table(name = "pc_uac_role_action") @Alias(value = "uacRoleAction") public class UacRoleAction implements Serializable { private static final long serialVersionUID = -4240611881810188284L; @Id @Column(name = "role_id") private Long roleId; @Id @Column(name = "action_id") private Long actionId; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacRoleMenu.java ================================================ package com.paascloud.provider.model.domain; import lombok.Data; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.Table; import java.io.Serializable; /** * The class Uac role menu. * * @author paascloud.net@gmail.com */ @Data @Table(name = "pc_uac_role_menu") @Alias(value = "uacRoleMenu") public class UacRoleMenu implements Serializable { private static final long serialVersionUID = -9052683954152822756L; @Id @Column(name = "role_id") private Long roleId; @Id @Column(name = "menu_id") private Long menuId; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacRoleUser.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleUser.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import lombok.Data; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Id; import javax.persistence.Table; import java.io.Serializable; /** * The class Uac role user. * * @author paascloud.net@gmail.com */ @Data @Table(name = "pc_uac_role_user") @Alias(value = "uacRoleUser") public class UacRoleUser implements Serializable { private static final long serialVersionUID = -4598936929315554832L; @Id @Column(name = "role_id") private Long roleId; @Id @Column(name = "user_id") private Long userId; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacUser.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUser.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.fasterxml.jackson.annotation.JsonFormat; import com.paascloud.core.mybatis.BaseEntity; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import org.springframework.format.annotation.DateTimeFormat; import javax.persistence.Column; import javax.persistence.Table; import javax.persistence.Transient; import java.util.Date; /** * The class Uac user. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Table(name = "pc_uac_user") @Alias(value = "uacUser") public class UacUser extends BaseEntity { private static final long serialVersionUID = 5465775492730080699L; /** * 登录名 */ @Column(name = "login_name") private String loginName; /** * 登录密码 */ @Column(name = "login_pwd") private String loginPwd; /** * 盐,用于shiro加密, 字段停用 */ private String salt; /** * 工号 */ @Column(name = "user_code") private String userCode; /** * 姓名 */ @Column(name = "user_name") private String userName; /** * 手机号 */ @Column(name = "mobile_no") private String mobileNo; /** * 状态 */ private String status; private String email; /** * 用户来源 */ @Column(name = "user_source") private String userSource; /** * 操作员类型(2000伙伴, 3000客户, 1000运营) */ private String type; /** * 最后登录IP地址 */ @Column(name = "last_login_ip") private String lastLoginIp; /** * 最后登录位置 */ @Column(name = "last_login_location") private String lastLoginLocation; /** * 描述 */ private String remark; /** * 最后登录时间 */ @Column(name = "last_login_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date lastLoginTime; /** * 是否更改过密码 */ @Column(name = "is_changed_pwd") private Short isChangedPwd; /** * 连续输错密码次数(连续5次输错就冻结帐号) */ @Column(name = "pwd_error_count") private Short pwdErrorCount; /** * 最后输错密码时间 */ @Column(name = "pwd_error_time") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date pwdErrorTime; /** * 用户所属的组织ID */ @ApiModelProperty(value = "用户所属的组织ID") @Transient private Long groupId; @ApiModelProperty(value = "用户所属的组织名称") @Transient private String groupName; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacUserMenu.java ================================================ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Uac user menu. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class UacUserMenu extends BaseEntity { private static final long serialVersionUID = 71826276587527887L; /** * pc_uac_user_menu.user_id;用户id */ private Long userId; /** * pc_uac_user_menu.menu_id;菜单id */ private Long menuId; /** * pc_uac_user_menu.number;序号 */ private Integer number; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/domain/UacUserToken.java ================================================ package com.paascloud.provider.model.domain; import com.paascloud.core.mybatis.BaseEntity; import lombok.Data; import lombok.EqualsAndHashCode; import org.apache.ibatis.type.Alias; import javax.persistence.Column; import javax.persistence.Table; import javax.persistence.Transient; import java.util.Date; /** * The class Uac user token. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @Alias(value = "uacUserToken") @Table(name = "pc_uac_user_token") public class UacUserToken extends BaseEntity { private static final long serialVersionUID = 4341237600124353997L; /** * 父ID */ private Long pid; /** * 登录名 */ @Column(name = "login_name") private String loginName; /** * 姓名 */ @Column(name = "user_name") private String userName; /** * 用户ID */ @Column(name = "user_id") private Long userId; /** * 登陆人Ip地址 */ @Column(name = "login_ip") private String loginIp; /** * 登录地址 */ @Column(name = "login_location") private String loginLocation; /** * 登录地址 */ @Column(name = "login_time") private Date loginTime; /** * 操作系统 */ private String os; /** * 浏览器类型 */ private String browser; /** * 访问token */ @Column(name = "access_token") private String accessToken; /** * 刷新token */ @Column(name = "refresh_token") private String refreshToken; /** * 访问token的生效时间(秒) */ @Column(name = "access_token_validity") private Integer accessTokenValidity; /** * 刷新token的生效时间(秒) */ @Column(name = "refresh_token_validity") private Integer refreshTokenValidity; /** * 0 在线 10已刷新 20 离线 */ private Integer status; /** * 组织流水号 */ @Column(name = "group_id") private Long groupId; /** * 组织名称 */ @Column(name = "group_name") private String groupName; /** * 失效时间(秒) */ @Transient private Integer expiresIn; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/action/ActionMainQueryDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ActionMainQueryDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.action; import com.paascloud.base.dto.BaseQuery; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.List; /** * The class Action main query dto. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @ApiModel public class ActionMainQueryDto extends BaseQuery { private static final long serialVersionUID = -1755881173841393763L; /** * 资源路径 */ private String url; /** * 权限名称 */ private String actionName; /** * 权限编码 */ private String actionCode; /** * 状态 */ private String status; /** * 菜单ID */ private List menuIdList; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/action/UacActionCheckCodeDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacActionCheckCodeDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.action; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import java.io.Serializable; /** * The class Uac menu check code dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "UacActionCheckCodeDto") public class UacActionCheckCodeDto implements Serializable { private static final long serialVersionUID = 8687848883145768024L; /** * 权限的id */ @ApiModelProperty(value = "权限的id") private Long actionId; /** * 权限的url */ @ApiModelProperty(value = "权限编码") @NotBlank(message = "权限编码不能为空") private String actionCode; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/action/UacActionCheckUrlDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacActionCheckUrlDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.action; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import java.io.Serializable; /** * The class Uac menu check url dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "UacActionCheckUrlDto") public class UacActionCheckUrlDto implements Serializable { private static final long serialVersionUID = 839437721293973234L; /** * 权限的id */ @ApiModelProperty(value = "权限的id") private Long actionId; /** * 权限的url */ @ApiModelProperty(value = "权限地址") @NotBlank(message = "权限地址不能为空") private String url; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/base/ModifyStatusDto.java ================================================ package com.paascloud.provider.model.dto.base; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Modify status dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "更改状态") public class ModifyStatusDto implements Serializable { private static final long serialVersionUID = 1494899235149813850L; /** * 角色ID */ @ApiModelProperty(value = "角色ID") private Long id; /** * 状态 */ @ApiModelProperty(value = "状态") private String status; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/email/SendEmailMessage.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SendEmailMessage.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.email; import lombok.Data; import java.io.Serializable; /** * The class Send email message. * * @author paascloud.net@gmail.com */ @Data public class SendEmailMessage implements Serializable { private static final long serialVersionUID = -8708881656765856624L; /** * 登录名 */ private String loginName; /** * 手机号码 */ private String email; /** * 验证码 */ private String emailCode; /** * 邮件模板Code */ private String emailTemplateCode; /** * Instantiates a new Send email message. */ public SendEmailMessage() { } /** * Instantiates a new Send email message. * * @param email the email */ public SendEmailMessage(String email) { this.email = email; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/group/CheckGroupCodeDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CheckGroupCodeDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.group; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Check group code dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class CheckGroupCodeDto implements Serializable { private static final long serialVersionUID = -7471245927289653237L; @ApiModelProperty(value = "组织ID") private Long groupId; @ApiModelProperty(value = "组织code") private String groupCode; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/group/CheckGroupNameDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CheckGroupNameDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.group; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** * The class Check group name dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class CheckGroupNameDto { @ApiModelProperty(value = "组织ID") private Long groupId; @ApiModelProperty(value = "组织名称") private String groupName; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/group/GroupBindUserDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GroupBindUserDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.group; import com.paascloud.provider.model.dto.role.BindUserDto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.Set; /** * The class Group bind user dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "GroupBindUserDto") public class GroupBindUserDto implements Serializable { private static final long serialVersionUID = 1383005712348886707L; /** * 未绑定的用户集合 */ @ApiModelProperty(value = "所有用户集合") private Set allUserSet; /** * 已经绑定的用户集合 */ @ApiModelProperty(value = "已经绑定的用户集合") private Set alreadyBindUserIdSet; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/group/GroupBindUserReqDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GroupBindUserReqDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.group; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class Group bind user req dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "GroupBindUserReqDto") public class GroupBindUserReqDto implements Serializable { private static final long serialVersionUID = 89217138744995863L; @ApiModelProperty(value = "组织ID") private Long groupId; @ApiModelProperty(value = "用户id") private List userIdList; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/log/UacLogMainDto.java ================================================ package com.paascloud.provider.model.dto.log; import com.fasterxml.jackson.annotation.JsonFormat; import com.paascloud.base.dto.BaseQuery; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; import java.util.List; /** * The class Uac log main dto. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @ApiModel public class UacLogMainDto extends BaseQuery { private static final long serialVersionUID = 3967075132487249652L; /** * 日志类型 */ @ApiModelProperty(value = "日志类型") private String logType; /** * 操作用户名称 */ @ApiModelProperty(value = "操作用户名称") private String creator; /** * 权限名称 */ @ApiModelProperty(value = "权限名称") private String actionName; /** * 权限编码 */ @ApiModelProperty(value = "权限编码") private String actionCode; /** * 菜单ID集合 */ @ApiModelProperty(value = "菜单ID集合") private List menuIdList; /** * 菜单ID集合 */ @ApiModelProperty(value = "菜单ID") private Long menuId; /** * 开始时间 */ @ApiModelProperty(value = "开始时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startQueryTime; /** * 结束时间 */ @ApiModelProperty(value = "结束时间") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endQueryTime; @ApiModelProperty(value = "登录IP") private String ip; @ApiModelProperty(value = "登录位置") private String location; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacEditMenuDto.java ================================================ package com.paascloud.provider.model.dto.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import java.io.Serializable; /** * The class Uac menu add dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "菜单新增Dto") public class UacEditMenuDto implements Serializable { private static final long serialVersionUID = -9219271060355200235L; /** * 菜单的Id */ @ApiModelProperty(value = "菜单的Id", required = true) private Long id; /** * 菜单的父Id */ @ApiModelProperty(value = "菜单的父Id", required = true) @NotBlank(message = "上级菜单不能为空") private Long pid; /** * 菜单编码 */ @ApiModelProperty(value = "菜单编码", required = true) @NotBlank(message = "菜单编码不能为空") private String menuCode; /** * Icon编码 */ @ApiModelProperty(value = "Icon编码") private String icon; /** * 菜单名称 */ @ApiModelProperty(value = "菜单名称", required = true) @NotBlank(message = "菜单名称不能为空") private String menuName; /** * 菜单排序 */ @ApiModelProperty(value = "菜单排序", required = true) private Integer number; /** * 菜单地址 */ @ApiModelProperty(value = "菜单地址", required = true) @NotBlank(message = "菜单地址不能为空") private String url; /** * 备注说明 */ @ApiModelProperty(value = "备注说明") private String remark; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacMenuCheckCodeDto.java ================================================ package com.paascloud.provider.model.dto.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import java.io.Serializable; /** * The class Uac menu check code dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "UacMenuCheckCodeDto") public class UacMenuCheckCodeDto implements Serializable { private static final long serialVersionUID = 8687848883145768024L; /** * 菜单的id */ @ApiModelProperty(value = "菜单的id") private Long menuId; /** * 菜单的url */ @ApiModelProperty(value = "菜单编码") @NotBlank(message = "菜单编码不能为空") private String menuCode; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacMenuCheckNameDto.java ================================================ package com.paascloud.provider.model.dto.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import java.io.Serializable; /** * The class Uac menu check name dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "UacMenuCheckNameDto") public class UacMenuCheckNameDto implements Serializable { private static final long serialVersionUID = -2372025597901225230L; /** * 菜单的id */ @ApiModelProperty(value = "菜单的id") private Long menuId; /** * 菜单的pid */ @ApiModelProperty(value = "上级菜单ID") @NotBlank(message = "上级菜单ID不能为空") private Long pid; /** * 菜单的menuName */ @ApiModelProperty(value = "菜单名称") @NotBlank(message = "菜单名称不能为空") private String menuName; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacMenuCheckUrlDto.java ================================================ package com.paascloud.provider.model.dto.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; import java.io.Serializable; /** * The class Uac menu check url dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "UacMenuCheckUrlDto") public class UacMenuCheckUrlDto implements Serializable { private static final long serialVersionUID = 839437721293973234L; /** * 菜单的id */ @ApiModelProperty(value = "菜单的id") private Long menuId; /** * 菜单的url */ @ApiModelProperty(value = "菜单地址") @NotBlank(message = "菜单地址不能为空") private String url; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacMenuStatusDto.java ================================================ package com.paascloud.provider.model.dto.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Uac menu status dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "UacMenuStatusDto") public class UacMenuStatusDto implements Serializable { private static final long serialVersionUID = 7834606418601316142L; /** * 菜单的Id */ @ApiModelProperty(value = "菜单的Id", required = true) private Long id; /** * 菜单的父Id */ @ApiModelProperty(value = "菜单的状态", required = true) private String status; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UacMenuUrlDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacMenuUrlDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.menu; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Uac menu url dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "根据URL查询菜单Dto") public class UacMenuUrlDto implements Serializable { private static final long serialVersionUID = 456904676277011675L; @ApiModelProperty(value = "系统Id", required = true) private String systemId; @ApiModelProperty(value = "用户ID", required = true) private Long userId; @ApiModelProperty(value = "url", required = true) private String url; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UserMenuChildrenDto.java ================================================ package com.paascloud.provider.model.dto.menu; import com.paascloud.provider.model.vo.MenuVo; import lombok.Data; import java.io.Serializable; /** * The class User menu children dto. * * @author paascloud.net@gmail.com */ @Data public class UserMenuChildrenDto implements Serializable { private static final long serialVersionUID = -6279523061450477189L; /** * 叶子节点菜单名称 */ private String leafMenuName; /** * 是否被选中,true */ private boolean checked; /** * 跳转URL */ private String url; /** * 叶子节点菜单Id */ private Long leafMenuId; /** * Instantiates a new User menu children dto. * * @param menuVo the menu vo */ public UserMenuChildrenDto(MenuVo menuVo) { this.leafMenuName = menuVo.getMenuName(); this.url = menuVo.getUrl(); this.leafMenuId = menuVo.getId(); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/menu/UserMenuDto.java ================================================ package com.paascloud.provider.model.dto.menu; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class User menu dto. * * @author paascloud.net@gmail.com */ @Data public class UserMenuDto implements Serializable { private static final long serialVersionUID = -5220054739321565548L; /** * 一级菜单名称 */ private String fistMenuName; /** * 一级菜单图标 */ private String fistMenuIcon; /** * 一级菜单Id */ private String fistMenuId; /** * 所有的子节点 */ private List children; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/omc/CartListQuery.java ================================================ package com.paascloud.provider.model.dto.omc; import com.paascloud.provider.model.vo.CartProductVo; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class Cart list query. * * @author paascloud.net@gmail.com */ @Data public class CartListQuery implements Serializable { private static final long serialVersionUID = -5968284112162772265L; private List cartProductVoList; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/BindUserDto.java ================================================ package com.paascloud.provider.model.dto.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Bind user dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel(value = "绑定的用户信息") public class BindUserDto implements Serializable { private static final long serialVersionUID = -3385971785265488527L; /** * 用户ID */ @ApiModelProperty(value = "用户ID") private Long userId; /** * 手机号 */ @ApiModelProperty(value = "手机号") private String mobileNo; /** * 用户名 */ @ApiModelProperty(value = "用户名") private String userName; /** * 是否可以操作 */ @ApiModelProperty(value = "是否可以操作") private boolean disabled; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/CheckRoleCodeDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CheckRoleCodeDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.role; import lombok.Data; import java.io.Serializable; /** * The class Check role code dto. * * @author paascloud.net @gmail.com */ @Data public class CheckRoleCodeDto implements Serializable { private static final long serialVersionUID = 6369434659441735160L; private Long roleId; private String roleCode; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/RoleBindActionDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RoleBindActionDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.Set; /** * The class Grant auth role. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class RoleBindActionDto implements Serializable { private static final long serialVersionUID = -8589698204017834593L; /** * 按钮权限 */ @ApiModelProperty(value = "按钮权限") private Set actionIdList; /** * 角色Id */ @ApiModelProperty(value = "角色Id") private Long roleId; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/RoleBindMenuDto.java ================================================ package com.paascloud.provider.model.dto.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.Set; /** * The class Grant auth role. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class RoleBindMenuDto implements Serializable { private static final long serialVersionUID = -8589698204017834593L; /** * 菜单权限 */ @ApiModelProperty(value = "菜单权限") private Set menuIdList; /** * 角色Id */ @ApiModelProperty(value = "角色Id") private Long roleId; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/RoleBindUserDto.java ================================================ package com.paascloud.provider.model.dto.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.Set; /** * The class Role bind user dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "角色绑定用户") public class RoleBindUserDto implements Serializable { private static final long serialVersionUID = -2521583668470612548L; /** * 未绑定的用户集合 */ @ApiModelProperty(value = "所有用户集合") private Set allUserSet; /** * 已经绑定的用户集合 */ @ApiModelProperty(value = "已经绑定的用户集合") private Set alreadyBindUserIdSet; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/role/RoleBindUserReqDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RoleBindUserReqDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.role; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class Role bind user req dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "角色绑定用户") public class RoleBindUserReqDto implements Serializable { private static final long serialVersionUID = 89217138744995863L; @ApiModelProperty(value = "角色ID") private Long roleId; @ApiModelProperty(value = "需要绑定的用户ID集合") private List userIdList; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/sms/SmsMessage.java ================================================ package com.paascloud.provider.model.dto.sms; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; /** * The class Sms message. * * @author paascloud.net@gmail.com */ @Data @NoArgsConstructor public class SmsMessage implements Serializable { private static final long serialVersionUID = -8708881656765856624L; /** * 手机号码 */ private String mobileNo; /** * 加密token */ private String smsToken; /** * 验证码 */ private String smsCode; /** * 短信模板Code */ private String smsTemplateCode; /** * 业务单号(这里使用ip地址) */ private String outId; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/token/RefreshTokenDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RefreshTokenDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.token; import lombok.Data; import org.hibernate.validator.constraints.NotBlank; /** * The class Refresh token dto. * * @author paascloud.net @gmail.com */ @Data public class RefreshTokenDto { @NotBlank private String refreshToken; @NotBlank private String accessToken; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/token/TokenMainQueryDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TokenMainQueryDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.token; import com.paascloud.base.dto.BaseQuery; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Token main query dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel @EqualsAndHashCode(callSuper = true) public class TokenMainQueryDto extends BaseQuery { private static final long serialVersionUID = -4003383211817581110L; private String loginName; private String userName; private Integer status; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/BindRoleDto.java ================================================ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Bind role dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel(value = "绑定的用户信息") public class BindRoleDto implements Serializable { private static final long serialVersionUID = -3385971785265488527L; /** * 用户ID */ @ApiModelProperty(value = "用户ID") private Long roleId; /** * 手机号 */ @ApiModelProperty(value = "角色编码") private String roleCode; /** * 用户名 */ @ApiModelProperty(value = "角色名称") private String roleName; /** * 是否可以操作 */ @ApiModelProperty(value = "是否可以操作") private boolean disabled; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/BindUserMenusDto.java ================================================ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class Bind user menus dto. * * @author paascloud.net@gmail.com */ @Data public class BindUserMenusDto implements Serializable { private static final long serialVersionUID = -5046118305639420777L; /** * 菜单ID */ @ApiModelProperty(value = "菜单ID") private List menuIdList; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/BindUserRolesDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BindUserRolesDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class Bind user roles dto. * * @author paascloud.net@gmail.com */ @ApiModel @Data public class BindUserRolesDto implements Serializable { private static final long serialVersionUID = -9149237379943908522L; @ApiModelProperty(value = "角色ID") private Long userId; @ApiModelProperty(value = "需要绑定的角色ID集合") private List roleIdList; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/CheckEmailDto.java ================================================ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Check user name dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class CheckEmailDto implements Serializable { private static final long serialVersionUID = 3802825234063017559L; /** * 用户ID */ @ApiModelProperty(value = "用户ID") private Long userId; /** * 登录名 */ @ApiModelProperty(value = "邮箱") private String email; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/CheckLoginNameDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CheckLoginNameDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Check user name dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "校验真实姓名唯一性Dto ") public class CheckLoginNameDto implements Serializable { private static final long serialVersionUID = 3802825234063017559L; /** * 用户ID */ @ApiModelProperty(value = "用户ID") private Long userId; /** * 登录名 */ @ApiModelProperty(value = "用户姓名") private String loginName; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/CheckNewPasswordDto.java ================================================ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 校验密码. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "校验新密码是否与原始密码相同Dto ") public class CheckNewPasswordDto implements Serializable { private static final long serialVersionUID = 4630716723912494960L; /** * 登录名 */ @ApiModelProperty(value = "登录名") private String loginName; /** * 手机号 */ @ApiModelProperty(value = "手机号") private String newPassword; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/CheckUserNameDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CheckUserNameDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Check user name dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "校验真实姓名唯一性Dto ") public class CheckUserNameDto implements Serializable { private static final long serialVersionUID = 3802825234063017559L; /** * 用户ID */ @ApiModelProperty(value = "用户ID") private Long userId; /** * 用户姓名 */ @ApiModelProperty(value = "用户姓名") private String userName; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/CheckUserPhoneDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CheckUserPhoneDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Check user phone dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "校验用户电话号码唯一性Dto ") public class CheckUserPhoneDto implements Serializable { private static final long serialVersionUID = 3378874756673320539L; /** * 用户ID */ @ApiModelProperty(value = "用户ID") private Long userId; /** * 手机号 */ @ApiModelProperty(value = "手机号") private String mobileNo; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/LoginRespDto.java ================================================ package com.paascloud.provider.model.dto.user; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.provider.model.vo.MenuVo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class Login resp dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "发送短信参数Dto") public class LoginRespDto implements Serializable { private static final long serialVersionUID = -8992761897550131632L; @ApiModelProperty(value = "登陆信息") private LoginAuthDto loginAuthDto; @ApiModelProperty(value = "菜单集合") private List menuList; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/ModifyUserStatusDto.java ================================================ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Modify user status dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "用户禁用/启用Dto ") public class ModifyUserStatusDto implements Serializable { private static final long serialVersionUID = 1494899235149813850L; /** * 用户ID */ @ApiModelProperty(value = "用户ID") private Long userId; /** * 状态 */ @ApiModelProperty(value = "状态") private String status; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/ResetLoginPwdDto.java ================================================ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Reset login pwd dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel public class ResetLoginPwdDto implements Serializable { private static final long serialVersionUID = -3599630825681985964L; /** * 新密码 */ @ApiModelProperty(value = "密钥") private String resetPwdKey; /** * 新密码 */ @ApiModelProperty(value = "新密码") private String newPassword; /** * 确认密码 */ @ApiModelProperty(value = "确认密码") private String confirmPwd; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/UserModifyPwdDto.java ================================================ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class User modify pwd dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "用户修改密码Dto") public class UserModifyPwdDto implements Serializable { private static final long serialVersionUID = -3933378415083541145L; /** * 登录名 */ @ApiModelProperty(value = "登录名") private String loginName; /** * 原始密码 */ @ApiModelProperty(value = "原始密码") private String oldPassword; /** * 新密码 */ @ApiModelProperty(value = "新密码") private String newPassword; /** * 确认密码 */ @ApiModelProperty(value = "确认密码") private String confirmPwd; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/dto/user/UserResetPwdDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UserResetPwdDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class User reset pwd dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "用户忘记密码Dto") public class UserResetPwdDto implements Serializable { private static final long serialVersionUID = 1036552024852502298L; /** * 手机号 */ @ApiModelProperty(value = "手机号") private String mobileNo; /** * 新密码 */ @ApiModelProperty(value = "新密码") private String newPassword; /** * 确认密码 */ @ApiModelProperty(value = "确认密码") private String confirmPwd; /** * 短信验证码 */ @ApiModelProperty(value = "短信验证码") private String smsCode; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacActionStatusEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacActionStatusEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Uac action status enum. * * @author paascloud.net@gmail.com */ public enum UacActionStatusEnum { /** * 启用 */ ENABLE("ENABLE", "启用"), /** * 禁用 */ DISABLE("DISABLE", "禁用"); /** * The Type. */ String type; /** * The Name. */ String name; UacActionStatusEnum(String type, String name) { this.type = type; this.name = name; } /** * Gets type. * * @return the type */ public String getType() { return type; } /** * Gets name. * * @return the name */ public String getName() { return name; } /** * Gets name. * * @param type the type * * @return the name */ public static String getName(String type) { for (UacActionStatusEnum ele : UacActionStatusEnum.values()) { if (type.equals(ele.getType())) { return ele.getName(); } } return null; } /** * Gets enum. * * @param type the type * * @return the enum */ public static UacActionStatusEnum getEnum(String type) { for (UacActionStatusEnum ele : UacActionStatusEnum.values()) { if (type.equals(ele.getType())) { return ele; } } return UacActionStatusEnum.ENABLE; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacEmailTemplateEnum.java ================================================ package com.paascloud.provider.model.enums; /** * The enum Uac email template enum. * * @author paascloud.net@gmail.com */ public enum UacEmailTemplateEnum { /** * 重置密码-获取验证码 */ RESET_PWD_GET_CODE("RESET_PWD_CODE", "重置密码-获取验证码", "email/sendRestPwdCodeTemplate.ftl"), /** * 忘记密码-等待重置密码. */ RESET_PWD_SEND_MAIL("RESET_PWD_CODE", "忘记密码-等待重置密码", "email/sendRestLoginPwdTemplate.ftl"), /** * 注册用户-等待激活用户. */ ACTIVE_USER("ACTIVE_USER", "注册用户-等待激活用户", "email/activeUserTemplate.ftl"), /** * 注册用户-激活用户成功. */ ACTIVE_USER_SUCCESS("ACTIVE_USER_SUCCESS", "注册用户-激活用户成功", "email/activeUserSuccessTemplate.ftl"), /** * 忘记密码-重置密码 */ RESET_LOGIN_PWD("RESET_LOGIN_PWD", "忘记密码-重置密码", "email/sendRestLoginPwdSuccessTemplate.ftl"), /** * 忘记密码-邮件验证码 */ RESET_USER_EMAIL("RESET_USER_EMAIL", "修改邮箱-邮件验证码", "email/sendRestUserEmailTemplate.ftl"),; /** * The Key. */ String key; /** * The Subject. */ String subject; /** * The Location. */ String location; UacEmailTemplateEnum(String key, String subject, String location) { this.key = key; this.subject = subject; this.location = location; } /** * Gets key. * * @return the key */ public String getKey() { return key; } /** * Gets location. * * @return the location */ public String getLocation() { return location; } /** * Gets subject. * * @return the subject */ public String getSubject() { return subject; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacGroupStatusEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGroupStatusEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; import com.google.common.collect.Lists; import java.util.List; /** * The enum Uac group status enum. * * @author paascloud.net@gmail.com */ public enum UacGroupStatusEnum { /** * 启用 */ ENABLE(0, "启用"), /** * 禁用 */ DISABLE(1, "禁用"); /** * The Status. */ int status; /** * The Value. */ String value; /** * Gets name. * * @param status the status * * @return the name */ public static String getName(int status) { for (UacGroupStatusEnum ele : UacGroupStatusEnum.values()) { if (status == ele.getStatus()) { return ele.getValue(); } } return null; } UacGroupStatusEnum(int status, String value) { this.status = status; this.value = value; } /** * Gets status. * * @return the status */ public int getStatus() { return status; } /** * Gets value. * * @return the value */ public String getValue() { return value; } private static List getStatusList() { List list = Lists.newArrayList(); for (UacGroupStatusEnum ele : UacGroupStatusEnum.values()) { list.add(ele.getStatus()); } return list; } /** * Contains boolean. * * @param status the status * * @return the boolean */ public static boolean contains(Integer status) { List statusList = getStatusList(); return statusList.contains(status); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacMenuStatusEnum.java ================================================ package com.paascloud.provider.model.enums; /** * The enum Uac menu status enum. * * @author paascloud.net@gmail.com */ public enum UacMenuStatusEnum { /** * 启用 */ ENABLE("ENABLE", "启用"), /** * 禁用 */ DISABLE("DISABLE", "禁用"); /** * The Type. */ String type; /** * The Name. */ String name; UacMenuStatusEnum(String type, String name) { this.type = type; this.name = name; } /** * Gets type. * * @return the type */ public String getType() { return type; } /** * Gets name. * * @return the name */ public String getName() { return name; } /** * Gets name. * * @param type the type * * @return the name */ public static String getName(String type) { for (UacMenuStatusEnum ele : UacMenuStatusEnum.values()) { if (type.equals(ele.getType())) { return ele.getName(); } } return null; } /** * Gets enum. * * @param type the type * * @return the enum */ public static UacMenuStatusEnum getEnum(String type) { for (UacMenuStatusEnum ele : UacMenuStatusEnum.values()) { if (type.equals(ele.getType())) { return ele; } } return UacMenuStatusEnum.ENABLE; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacRoleStatusEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleStatusEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Uac role status enum. * * @author paascloud.net@gmail.com */ public enum UacRoleStatusEnum { /** * 启用 */ ENABLE("ENABLE", "启用"), /** * 禁用 */ DISABLE("DISABLE", "禁用"); /** * The Type. */ String type; /** * The Name. */ String name; UacRoleStatusEnum(String type, String name) { this.type = type; this.name = name; } /** * Gets type. * * @return the type */ public String getType() { return type; } /** * Gets name. * * @return the name */ public String getName() { return name; } /** * Gets name. * * @param type the type * * @return the name */ public static String getName(String type) { for (UacRoleStatusEnum ele : UacRoleStatusEnum.values()) { if (type.equals(ele.getType())) { return ele.getName(); } } return null; } /** * Gets enum. * * @param type the type * * @return the enum */ public static UacRoleStatusEnum getEnum(String type) { for (UacRoleStatusEnum ele : UacRoleStatusEnum.values()) { if (type.equals(ele.getType())) { return ele; } } return UacRoleStatusEnum.ENABLE; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacUserSourceEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserSourceEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; import java.util.Arrays; import java.util.List; /** * The enum Uac user source enum. * * @author paascloud.net@gmail.com */ public enum UacUserSourceEnum { /** * 注册 */ REGISTER("REGISTER", "注册"), /** * 后台新增 */ INSERT("INSERT", "后台新增"), /** * 后台导入 */ IMPORT("IMPORT", "后台导入"), /** * 手机 */ APP("APP", "手机"),; /** * The Key. */ String key; /** * The Value. */ String value; UacUserSourceEnum(String key, String value) { this.key = key; this.value = value; } /** * Gets key. * * @return the key */ public String getKey() { return key; } /** * Gets value. * * @return the value */ public String getValue() { return value; } /** * 获取key获取value * * @param key key * * @return value value */ public static String getValue(String key) { for (UacUserSourceEnum ele : UacUserSourceEnum.values()) { if (key.equals(ele.getKey())) { return ele.getValue(); } } return null; } /** * 根据key获取该对象 * * @param key key * * @return this enum */ public static UacUserSourceEnum getEnum(String key) { for (UacUserSourceEnum ele : UacUserSourceEnum.values()) { if (key.equals(ele.getKey())) { return ele; } } return null; } /** * 获取List集合 * * @return List list */ public static List getList() { return Arrays.asList(UacUserSourceEnum.values()); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacUserStatusEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserStatusEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.Arrays; import java.util.List; import java.util.Map; /** * The enum Uac user status enum. * * @author paascloud.net@gmail.com */ public enum UacUserStatusEnum { /** * Enable uac user status enum. */ /* * 启用 */ ENABLE("ENABLE", "启用"), /** * 禁用 */ DISABLE("DISABLE", "禁用"); /** * The Key. */ String key; /** * The Value. */ String value; UacUserStatusEnum(String key, String value) { this.key = key; this.value = value; } /** * Gets key. * * @return the key */ public String getKey() { return key; } /** * Gets value. * * @return the value */ public String getValue() { return value; } /** * 获取key获取value * * @param key key * * @return value value */ public static String getValue(String key) { for (UacUserStatusEnum ele : UacUserStatusEnum.values()) { if (key.equals(ele.getKey())) { return ele.getValue(); } } return null; } /** * 根据key获取该对象 * * @param key key * * @return this enum */ public static UacUserStatusEnum getEnum(String key) { for (UacUserStatusEnum ele : UacUserStatusEnum.values()) { if (key.equals(ele.getKey())) { return ele; } } return null; } /** * 获取List集合 * * @return List list */ public static List getList() { return Arrays.asList(UacUserStatusEnum.values()); } /** * 获取map类型集合 * * @return Map类型List集合 map 2 list */ public static List> getMap2List() { List> list = Lists.newArrayList(); for (UacUserStatusEnum ele : UacUserStatusEnum.values()) { Map map = Maps.newHashMap(); map.put("key", ele.getKey()); map.put("value", ele.getValue()); list.add(map); } return list; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacUserTokenStatusEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserTokenStatusEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; import com.google.common.collect.Lists; import java.util.List; /** * The enum Uac user token status enum. * * @author paascloud.net @gmail.com */ public enum UacUserTokenStatusEnum { /** * 启用 */ ON_LINE(0, "在线"), /** * 已刷新 */ ON_REFRESH(10, "已刷新"), /** * 离线 */ OFF_LINE(20, "离线"); /** * The Status. */ int status; /** * The Value. */ String value; /** * Gets name. * * @param status the status * * @return the name */ public static String getName(int status) { for (UacUserTokenStatusEnum ele : UacUserTokenStatusEnum.values()) { if (status == ele.getStatus()) { return ele.getValue(); } } return null; } UacUserTokenStatusEnum(int status, String value) { this.status = status; this.value = value; } /** * Gets status. * * @return the status */ public int getStatus() { return status; } /** * Gets value. * * @return the value */ public String getValue() { return value; } private static List getStatusList() { List list = Lists.newArrayList(); for (UacUserTokenStatusEnum ele : UacUserTokenStatusEnum.values()) { list.add(ele.getStatus()); } return list; } /** * Contains boolean. * * @param status the status * * @return the boolean */ public static boolean contains(Integer status) { List statusList = getStatusList(); return statusList.contains(status); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/UacUserTypeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserTypeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; import java.util.Arrays; import java.util.List; /** * The enum Uac user type enum. * * @author paascloud.net@gmail.com */ public enum UacUserTypeEnum { /** * 运营 */ OPERATE("1000", "运营"),; /** * The Key. */ String key; /** * The Value. */ String value; UacUserTypeEnum(String key, String value) { this.key = key; this.value = value; } /** * Gets key. * * @return the key */ public String getKey() { return key; } /** * Gets value. * * @return the value */ public String getValue() { return value; } /** * 获取key获取value * * @param key key * * @return value value */ public static String getValue(String key) { for (UacUserTypeEnum ele : UacUserTypeEnum.values()) { if (key.equals(ele.getKey())) { return ele.getValue(); } } return null; } /** * 根据key获取该对象 * * @param key key * * @return this enum */ public static UacUserTypeEnum getEnum(String key) { for (UacUserTypeEnum ele : UacUserTypeEnum.values()) { if (key.equals(ele.getKey())) { return ele; } } return null; } /** * 获取List集合 * * @return List list */ public static List getList() { return Arrays.asList(UacUserTypeEnum.values()); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/enums/ZtreeAuthTypeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ZtreeAuthTypeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Ztree auth type enum. * * @author paascloud.net@gmail.com */ public enum ZtreeAuthTypeEnum { /** * 菜单 */ MENU("MENU", "菜单"), /** * 按钮 */ BUTTON("BUTTON", "按钮"); /** * The Type. */ String type; /** * The Name. */ String name; ZtreeAuthTypeEnum(String type, String name) { this.type = type; this.name = name; } /** * Gets type. * * @return the type */ public String getType() { return type; } /** * Gets name. * * @return the name */ public String getName() { return name; } /** * Gets name. * * @param type the type * * @return the name */ public static String getName(String type) { for (ZtreeAuthTypeEnum ele : ZtreeAuthTypeEnum.values()) { if (type.equals(ele.getType())) { return ele.getName(); } } return null; } /** * Gets enum. * * @param type the type * * @return the enum */ public static ZtreeAuthTypeEnum getEnum(String type) { for (ZtreeAuthTypeEnum ele : ZtreeAuthTypeEnum.values()) { if (type.equals(ele.getType())) { return ele; } } return ZtreeAuthTypeEnum.MENU; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/ActionVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ActionVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Action vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @ApiModel public class ActionVo extends BaseVo { private static final long serialVersionUID = 2019306004446193459L; /** * 资源路径 */ private String url; /** * 权限名称 */ private String actionName; /** * 权限 */ private String actionCode; /** * 状态 */ private String status; /** * 备注 */ private String remark; /** * 菜单ID */ private Long menuId; /** * 菜单名称 */ private String menuName; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/BindAuthVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:BindAuthVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import io.swagger.annotations.ApiModel; import lombok.Data; import java.util.List; /** * The class Bind auth vo. * * @author paascloud.net @gmail.com */ @Data @ApiModel public class BindAuthVo { /** * 包含按钮权限和菜单权限 */ private List authTree; /** * 该角色含有的权限ID */ private List checkedAuthList; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/ElementTreeVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ElementTreeVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class Element tree vo. * * @author paascloud.net@gmail.com */ @Data public class ElementTreeVo implements Serializable { private static final long serialVersionUID = -7266614376023024646L; private String label; private List children; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/GroupZtreeVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GroupZtreeVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Getter; import lombok.Setter; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.util.Date; /** * The class Group z tree vo. * * @author paascloud.net@gmail.com */ @Getter @Setter public class GroupZtreeVo extends ZtreeResponseVo implements Serializable { private static final long serialVersionUID = 8835704500635133372L; /** * 组织类型 */ private String groupType; /** * 组织编码 */ private String groupCode; /** * 组织流水号 */ private String groupSerialNo; /** * 组织名称 */ private String groupName; /** * 详细地址 */ private String groupAddress; /** * 所在城市 */ private String groupCity; /** * 联系人 */ private String contact; /** * 联系人电话 */ private String contactPhone; /** * 创建人 */ private String creator; /** * 图标样式 */ private String iconSkin; /** * 创建时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createdTime; /** * 状态 */ private int status; /** * 层级 */ private Integer level; /** * 是否是节点 */ private Integer leaf; /** * Equals boolean. * * @param o the o * * @return the boolean */ @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } if (!super.equals(o)) { return false; } GroupZtreeVo that = (GroupZtreeVo) o; return this.getId().equals(that.getId()); } @Override public int hashCode() { return super.hashCode(); } /** * To string string. * * @return the string */ @Override public String toString() { return "GroupZTreeVo{" + "groupType='" + groupType + '\'' + ", groupCode='" + groupCode + '\'' + ", groupSerialNo='" + groupSerialNo + '\'' + ", groupName='" + groupName + '\'' + ", groupAddress='" + groupAddress + '\'' + ", groupCity='" + groupCity + '\'' + ", contact='" + contact + '\'' + ", contactPhone='" + contactPhone + '\'' + ", creator='" + creator + '\'' + ", iconSkin='" + iconSkin + '\'' + ", createdTime=" + createdTime + ", status='" + status + '\'' + ", level=" + level + ", leaf=" + leaf + '}'; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/JqTreeResponseVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:JqTreeResponseVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import lombok.Data; import java.util.Date; /** * The class Jq tree response vo. * * @author paascloud.net@gmail.com */ @Data public class JqTreeResponseVo { /** * 菜单ID */ private Long id; /** * 父菜单ID */ private Long pid; /** * 层级(最多三级1,2,3) */ private Integer level; /** * 是否叶子节点,1不是0是 */ private boolean isLeaf; private boolean expanded; /** * 菜单编码 */ private String menuCode; /** * 菜单名称 */ private String menuName; /** * 状态 */ private int status; /** * 菜单URL */ private String url; /** * 序号 */ private String number; /** * 备注(研发中心) */ private String remark; /** * 创建人 */ private String creator; /** * 创建人ID */ private Long creatorId; /** * 创建时间 */ private Date createdTime; /** * 最近操作人 */ private String lastOperator; /** * 最后操作人ID */ private String lastOperatorId; /** * 更新时间 */ private Date updateTime; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/KaptchaVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:KaptchaVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import io.swagger.annotations.Api; import lombok.Data; /** * The class Kaptcha vo. * * @author paascloud.net @gmail.com */ @Data @Api public class KaptchaVo { private String cookieCode; private String base64Code; private String kaptchaCode; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/RoleVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RoleVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Role vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class RoleVo extends BaseVo { private static final long serialVersionUID = 3819529748816533170L; /** * 角色编码 */ private String roleCode; private String roleName; /** * 状态 */ private String status; /** * 备注 */ private String remark; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/UserBindRoleVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UserBindRoleVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.provider.model.dto.user.BindRoleDto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.Set; /** * The class Role bind user dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "角色绑定用户") public class UserBindRoleVo implements Serializable { private static final long serialVersionUID = -2521583668470612548L; /** * 未绑定的用户集合 */ @ApiModelProperty(value = "所有用户集合") private Set allRoleSet; /** * 已经绑定的用户集合 */ @ApiModelProperty(value = "已经绑定的用户集合") private Set alreadyBindRoleIdSet; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/UserTokenVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UserTokenVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import lombok.Data; import lombok.EqualsAndHashCode; import java.util.Date; /** * The class User token vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class UserTokenVo extends BaseVo { private static final long serialVersionUID = -7181619498770168776L; /** * 登录名 */ private String loginName; /** * 姓名 */ private String userName; /** * 用户ID */ private Long userId; /** * 登陆人Ip地址 */ private String loginIp; /** * 登录地址 */ private String loginLocation; /** * 登录地址 */ private Date loginTime; /** * 操作系统 */ private String os; /** * 浏览器类型 */ private String browser; /** * 访问token */ private String accessToken; /** * 刷新token */ private String refreshToken; /** * 访问token的生效时间(秒) */ private Integer accessTokenValidity; /** * 刷新token的生效时间(秒) */ private Integer refreshTokenValidity; /** * 0 在线 10已刷新 20 离线 */ private Integer status; /** * 组织名称 */ private String groupName; /** * 失效时间(秒) */ private Integer expiresIn; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/UserVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UserVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.fasterxml.jackson.annotation.JsonFormat; import com.paascloud.base.dto.BaseVo; import com.paascloud.provider.model.domain.UacRole; import lombok.Data; import lombok.EqualsAndHashCode; import org.springframework.format.annotation.DateTimeFormat; import java.util.Date; import java.util.List; import java.util.Set; /** * The class User vo. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class UserVo extends BaseVo { private static final long serialVersionUID = -5489240986004922469L; /** * 登录名 */ private String loginName; /** * 工号 */ private String userCode; /** * 姓名 */ private String userName; /** * 手机号 */ private String mobileNo; /** * 状态 */ private String status; /** * 用户来源 */ private String userSource; /** * 操作员类型(1:超级管理员, 0:普通操作员) */ private String type; /** * 最后登录IP地址 */ private String lastLoginIp; /** * 最后登录时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date lastLoginTime; /** * 组织名称 */ private String groupName; /** * 用户角色信息 */ private Set roles; /** * 用户拥有的菜单权限和按钮权限 */ private List authTree; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/ViewMenuVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ViewMenuVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import io.swagger.annotations.ApiModel; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; /** * The class Uac menu. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @ApiModel public class ViewMenuVo extends BaseVo implements Serializable { private static final long serialVersionUID = 2713936834061516613L; /** * 菜单编码 */ private String menuCode; /** * 菜单名称 */ private String menuName; /** * 状态 */ private String status; /** * 菜单URL */ private String url; /** * 图标 */ private String icon; /** * 父ID */ private Long pid; /** * 上级菜单名称 */ private String parentMenuName; /** * 层级(最多三级1,2,3) */ private Integer level; /** * 是否叶子节点,1不是0是 */ private Integer leaf; /** * 序号 */ private Integer number; /** * 备注 */ private String remark; /** * 系统ID */ private Long applicationId; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/ZtreeResponseVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ZtreeResponseVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.provider.model.enums.ZtreeAuthTypeEnum; import java.io.Serializable; /** * The class Z tree response vo. * * @author paascloud.net@gmail.com */ public class ZtreeResponseVo implements Serializable { private static final long serialVersionUID = -5567984072691093330L; private Long id; private Long pId; private String name; private boolean open; /** * 菜单选中状态, true选中, false为未选中 */ private boolean checked; private String iconOpen; private String iconClose; /** * {@link ZtreeAuthTypeEnum} */ private String type; /** * Gets id. * * @return the id */ public Long getId() { return id; } /** * Sets id. * * @param id the id */ public void setId(Long id) { this.id = id; } /** * Gets id. * * @return the id */ public Long getpId() { return pId; } /** * Sets id. * * @param pId the p id */ public void setpId(Long pId) { this.pId = pId; } /** * Gets name. * * @return the name */ public String getName() { return name; } /** * Sets name. * * @param name the name */ public void setName(String name) { this.name = name; } /** * Is open boolean. * * @return the boolean */ public boolean isOpen() { return open; } /** * Sets open. * * @param open the open */ public void setOpen(boolean open) { this.open = open; } /** * Gets icon open. * * @return the icon open */ public String getIconOpen() { return iconOpen; } /** * Sets icon open. * * @param iconOpen the icon open */ public void setIconOpen(String iconOpen) { this.iconOpen = iconOpen; } /** * Gets icon close. * * @return the icon close */ public String getIconClose() { return iconClose; } /** * Sets icon close. * * @param iconClose the icon close */ public void setIconClose(String iconClose) { this.iconClose = iconClose; } /** * Gets type. * * @return the type */ public String getType() { return type; } /** * Sets type. * * @param type the type */ public void setType(String type) { this.type = type; } /** * Equals boolean. * * @param o the o * * @return the boolean */ @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } ZtreeResponseVo that = (ZtreeResponseVo) o; return id != null ? id.equals(that.id) : that.id == null; } /** * Hash code int. * * @return the int */ @Override public int hashCode() { return id != null ? id.hashCode() : 0; } /** * Is checked boolean. * * @return the boolean */ public boolean isChecked() { return checked; } /** * Sets checked. * * @param checked the checked */ public void setChecked(boolean checked) { this.checked = checked; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/role/MenuCountVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MenuCountVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo.role; import lombok.Data; /** * 一级菜单下绑定子菜单个数 * * @author paascloud.net @gmail.com */ @Data public class MenuCountVo { /** * 一级菜单id */ private Long id; /** * 一级菜单名称 */ private String menuName; /** * 一级菜单下绑定子菜单个数 */ private int childNum; /** * Equals boolean. * * @param obj the obj * * @return the boolean */ @Override public boolean equals(Object obj) { if (obj == null) { return false; } else { if (obj instanceof MenuCountVo) { MenuCountVo m = (MenuCountVo) obj; if (m.id.equals(this.id)) { return true; } } return false; } } /** * Hash code int. * * @return the int */ @Override public int hashCode() { return id.hashCode(); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/role/RoleZtreeVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RoleZtreeVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo.role; import com.paascloud.provider.model.vo.ZtreeResponseVo; import java.io.Serializable; /** * 角色树 * * @author paascloud.net @gmail.com */ public class RoleZtreeVo extends ZtreeResponseVo implements Serializable { private static final long serialVersionUID = 2094987521303893688L; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/treeview/AdditionalParameters.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AdditionalParameters.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo.treeview; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import lombok.Data; import java.util.Map; /** * The class Additional parameters. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class AdditionalParameters { /** * 子节点列表 */ private Map children; /** * 节点的Id */ private Long id; /** * 是否有选中属性 */ @JsonProperty("item-selected") private boolean itemSelected; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/treeview/Item.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:Item.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo.treeview; import io.swagger.annotations.ApiModel; import lombok.Data; /** * The class Item. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class Item { private Long id; /** * 节点的名字 */ private String text; /** * 节点的类型:"item":文件 "folder":目录 */ private String type; /** * 子节点的信息 */ private AdditionalParameters additionalParameters; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/model/vo/treeview/ItemType.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ItemType.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo.treeview; /** * The class Item type. * * @author paascloud.net@gmail.com */ public interface ItemType { /** * 文件夹 */ String NODE_FOLDER = "folder"; /** * 叶子节点 */ String NODE_ITEM = "item"; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mq/consumer/listener/UacPushMessageListener.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacPushMessageListener.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mq.consumer.listener; import com.paascloud.PublicUtil; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.core.mq.MqMessage; import com.paascloud.provider.annotation.MqConsumerStore; import com.paascloud.provider.service.MqMessageService; import com.paascloud.provider.service.RedisService; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext; import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus; import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently; import org.apache.rocketmq.common.message.MessageExt; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.List; import java.util.concurrent.TimeUnit; /** * The class Uac push message listener. * * @author paascloud.net @gmail.com */ @Slf4j @Component public class UacPushMessageListener implements MessageListenerConcurrently { @Resource private MqMessageService mqMessageService; @Resource private RedisService redisService; /** * Consume message consume concurrently status. * * @param messageExtList the message ext list * @param consumeConcurrentlyContext the consume concurrently context * * @return the consume concurrently status */ @Override @MqConsumerStore public ConsumeConcurrentlyStatus consumeMessage(List messageExtList, ConsumeConcurrentlyContext consumeConcurrentlyContext) { MessageExt msg = messageExtList.get(0); String body = new String(msg.getBody()); String topicName = msg.getTopic(); String tags = msg.getTags(); String keys = msg.getKeys(); try { MqMessage.checkMessage(body, topicName, tags, keys); String mqKV = redisService.getKey(keys); if (PublicUtil.isNotEmpty(mqKV)) { log.error("MQ消费Topic={},tag={},key={}, 重复消费", topicName, tags, keys); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } if (AliyunMqTopicConstants.MqTopicEnum.TPC_TOPIC.getTopic().equals(topicName)) { mqMessageService.deleteMessageTopic(body, tags); } else { log.info("OPC订单信息消 topicName={} 不存在", topicName); } } catch (IllegalArgumentException ex) { log.error("校验MQ message 失败 ex={}", ex.getMessage(), ex); } catch (Exception e) { log.error("处理MQ message 失败 topicName={}, keys={}, ex={}", topicName, keys, e.getMessage(), e); return ConsumeConcurrentlyStatus.RECONSUME_LATER; } redisService.setKey(keys, keys, 10, TimeUnit.DAYS); return ConsumeConcurrentlyStatus.CONSUME_SUCCESS; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mq/producer/EmailProducer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:EmailProducer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mq.producer; import com.alibaba.fastjson.JSON; import com.google.common.base.Preconditions; import com.paascloud.RedisKeyUtil; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.model.domain.MqMessageData; import com.paascloud.provider.model.dto.PcSendEmailRequest; import com.paascloud.provider.model.enums.UacEmailTemplateEnum; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.service.UacFreeMarkerService; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.Map; import java.util.Set; /** * The class Email producer. * * @author paascloud.net@gmail.com */ @Component @Slf4j public class EmailProducer { @Resource private UacFreeMarkerService uacFreeMarkerService; /** * Send email mq. * * @param emailSet the email set * @param emailTemplateEnum the email template enum * @param param the param */ public MqMessageData sendEmailMq(Set emailSet, UacEmailTemplateEnum emailTemplateEnum, AliyunMqTopicConstants.MqTagEnum tagEnum, Map param) { log.info("pcSendEmailRequest - 发送邮件MQ. emailSet={}, param={}", emailSet, param); String msgBody; try { Preconditions.checkArgument(emailTemplateEnum != null, "邮箱模板信息不存在"); PcSendEmailRequest request = new PcSendEmailRequest(); String templateLocation = emailTemplateEnum.getLocation(); String text = uacFreeMarkerService.getTemplate(param, templateLocation); request.setText(text); request.setTo(emailSet); request.setSubject(emailTemplateEnum.getSubject()); msgBody = JSON.toJSONString(request); } catch (Exception e) { log.error("发送邮件验证码 smsMessage转换为json字符串失败", e); throw new UacBizException(ErrorCodeEnum.UAC10011021); } String topic = tagEnum.getTopic(); String tag = tagEnum.getTag(); String key = RedisKeyUtil.createMqKey(topic, tag, emailSet.toString(), msgBody); return new MqMessageData(msgBody, topic, tag, key); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/mq/producer/SmsProducer.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SmsProducer.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mq.producer; import com.alibaba.fastjson.JSON; import com.google.common.collect.Maps; import com.paascloud.RedisKeyUtil; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.base.constant.AliyunSmsConstants; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.model.domain.MqMessageData; import com.paascloud.provider.model.dto.PcSendSmsRequest; import com.paascloud.provider.model.dto.sms.SmsMessage; import com.paascloud.provider.model.exceptions.UacBizException; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import java.util.Map; /** * The class Sms producer. * * @author paascloud.net@gmail.com */ @Slf4j @Component public class SmsProducer { public MqMessageData sendSmsCodeMq(SmsMessage smsMessage, AliyunSmsConstants.SmsTempletEnum templetEnum) { log.info("sendSmsCodeMq - 发送短信验证码. smsMessage={}", smsMessage); String msgBody; try { PcSendSmsRequest request = new PcSendSmsRequest(); Map map = Maps.newHashMap(); // 模板参数 String smsParamName = templetEnum.getSmsParamName(); // 模板编码 String templetCode = templetEnum.getTempletCode(); //替换模板验证码 map.put(smsParamName, smsMessage.getSmsCode()); String param = JSON.toJSONString(map); request.setPhoneNumbers(smsMessage.getMobileNo()); request.setTemplateCode(templetCode); request.setTemplateParam(param); request.setOutId(smsMessage.getOutId()); msgBody = JSON.toJSONString(request); } catch (Exception e) { log.error("发送短信验证码 smsMessage转换为json字符串失败", e); throw new UacBizException(ErrorCodeEnum.UAC10011022); } String topic = AliyunMqTopicConstants.MqTopicEnum.SEND_SMS_TOPIC.getTopic(); String tag = AliyunMqTopicConstants.MqTagEnum.REGISTER_USER_AUTH_CODE.getTag(); String key = RedisKeyUtil.createMqKey(topic, tag, smsMessage.getMobileNo(), msgBody); return new MqMessageData(msgBody, topic, tag, key); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcAuthenticationFailureHandler.java ================================================ package com.paascloud.provider.security; import com.fasterxml.jackson.databind.ObjectMapper; import com.paascloud.wrapper.WrapMapper; import org.springframework.http.HttpStatus; import org.springframework.security.core.AuthenticationException; import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * APP环境下认证失败处理器 * * @author paascloud.net @gmail.com */ @Component("pcAuthenticationFailureHandler") public class PcAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { @Resource private ObjectMapper objectMapper; /** * On authentication failure. * * @param request the request * @param response the response * @param exception the exception * * @throws IOException the io exception * @throws ServletException the servlet exception */ @Override public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { logger.info("登录失败"); // 记录失败次数 和原因 ip等信息 5次登录失败,锁定用户, 不允许在此登录 response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(objectMapper.writeValueAsString(WrapMapper.error(exception.getMessage()))); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcAuthenticationSuccessHandler.java ================================================ package com.paascloud.provider.security; import com.fasterxml.jackson.databind.ObjectMapper; import com.paascloud.core.utils.RequestUtil; import com.paascloud.provider.service.UacUserService; import com.paascloud.security.core.SecurityUser; import com.paascloud.wrapper.WrapMapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections.MapUtils; import org.apache.commons.lang.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException; import org.springframework.security.oauth2.provider.*; import org.springframework.security.oauth2.provider.token.AuthorizationServerTokenServices; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.stereotype.Component; import javax.annotation.Resource; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * APP环境下认证成功处理器. * * @author paascloud.net@gmail.com */ @Component("pcAuthenticationSuccessHandler") @Slf4j public class PcAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { @Resource private ObjectMapper objectMapper; @Resource private ClientDetailsService clientDetailsService; @Resource private UacUserService uacUserService; @Resource private AuthorizationServerTokenServices authorizationServerTokenServices; private static final String BEARER_TOKEN_TYPE = "Basic "; @Override public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { logger.info("登录成功"); String header = request.getHeader(HttpHeaders.AUTHORIZATION); if (header == null || !header.startsWith(BEARER_TOKEN_TYPE)) { throw new UnapprovedClientAuthenticationException("请求头中无client信息"); } String[] tokens = RequestUtil.extractAndDecodeHeader(header); assert tokens.length == 2; String clientId = tokens[0]; String clientSecret = tokens[1]; ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId); if (clientDetails == null) { throw new UnapprovedClientAuthenticationException("clientId对应的配置信息不存在:" + clientId); } else if (!StringUtils.equals(clientDetails.getClientSecret(), clientSecret)) { throw new UnapprovedClientAuthenticationException("clientSecret不匹配:" + clientId); } TokenRequest tokenRequest = new TokenRequest(MapUtils.EMPTY_MAP, clientId, clientDetails.getScope(), "custom"); OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails); OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication); OAuth2AccessToken token = authorizationServerTokenServices.createAccessToken(oAuth2Authentication); SecurityUser principal = (SecurityUser) authentication.getPrincipal(); uacUserService.handlerLoginData(token, principal, request); log.info("用户【 {} 】记录登录日志", principal.getUsername()); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write((objectMapper.writeValueAsString(WrapMapper.ok(token)))); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcAuthorizationServerConfig.java ================================================ package com.paascloud.provider.security; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; import org.springframework.security.oauth2.provider.token.TokenEnhancer; import org.springframework.security.oauth2.provider.token.TokenEnhancerChain; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.JwtAccessTokenConverter; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import javax.annotation.Resource; import java.util.ArrayList; import java.util.List; /** * The class Pc authorization server config. * * @author paascloud.net @gmail.com */ @Configuration @EnableAuthorizationServer public class PcAuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired private TokenStore tokenStore; @Autowired private AuthenticationManager authenticationManager; @Resource private UserDetailsService userDetailsService; @Resource private RestClientDetailsServiceImpl restClientDetailsService; @Autowired(required = false) private JwtAccessTokenConverter jwtAccessTokenConverter; @Autowired(required = false) private TokenEnhancer jwtTokenEnhancer; /** * Configure. * * @param security the security * * @throws Exception the exception */ @Override public void configure(AuthorizationServerSecurityConfigurer security) throws Exception { security.tokenKeyAccess("permitAll()"); security.allowFormAuthenticationForClients(); } /** * Configure. * * @param clients the clients * * @throws Exception the exception */ @Override public void configure(ClientDetailsServiceConfigurer clients) throws Exception { clients.withClientDetails(restClientDetailsService); } /** * Configure. * * @param endpoints the endpoints * * @throws Exception the exception */ @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.tokenStore(tokenStore) .authenticationManager(authenticationManager) .userDetailsService(userDetailsService); if (jwtAccessTokenConverter != null && jwtTokenEnhancer != null) { TokenEnhancerChain enhancerChain = new TokenEnhancerChain(); List enhancers = new ArrayList<>(); enhancers.add(jwtTokenEnhancer); enhancers.add(jwtAccessTokenConverter); enhancerChain.setTokenEnhancers(enhancers); endpoints.tokenEnhancer(enhancerChain).accessTokenConverter(jwtAccessTokenConverter); } } /** * 退出时的处理策略配置 * * @return logout success handler */ @Bean public LogoutSuccessHandler logoutSuccessHandler() { return new PcLogoutSuccessHandler(); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcLogoutSuccessHandler.java ================================================ package com.paascloud.provider.security; import com.fasterxml.jackson.databind.ObjectMapper; import com.paascloud.wrapper.WrapMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.web.authentication.logout.LogoutSuccessHandler; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 默认的退出成功处理器,如果设置了paascloud.security.browser.signOutUrl,则跳到配置的地址上, * 如果没配置,则返回json格式的响应。 * * @author paascloud.net @gmail.com */ @Slf4j public class PcLogoutSuccessHandler implements LogoutSuccessHandler { private ObjectMapper objectMapper = new ObjectMapper(); /** * On logout success. * * @param request the request * @param response the response * @param authentication the authentication * * @throws IOException the io exception */ @Override public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException { log.info("退出成功"); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(objectMapper.writeValueAsString(WrapMapper.ok("退出成功"))); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcPermissionAuthorizeConfigProvider.java ================================================ package com.paascloud.provider.security; import com.paascloud.security.core.authorize.AuthorizeConfigProvider; import org.springframework.core.annotation.Order; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer; import org.springframework.stereotype.Component; /** * The class Pc permission authorize config provider. * * @author paascloud.net @gmail.com */ @Order @Component public class PcPermissionAuthorizeConfigProvider implements AuthorizeConfigProvider { /** * Config boolean. * * @param config the config * * @return the boolean */ @Override public boolean config(ExpressionUrlAuthorizationConfigurer.ExpressionInterceptUrlRegistry config) { config .anyRequest() .access("@permissionService.hasPermission(authentication,request)"); return true; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/PcSecurityExpressionHandler.java ================================================ package com.paascloud.provider.security; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.oauth2.provider.expression.OAuth2WebSecurityExpressionHandler; /** * The class My o auth 2 web security expression handler. * * @author paascloud.net @gmail.com */ @Configuration public class PcSecurityExpressionHandler extends OAuth2WebSecurityExpressionHandler { @Bean public OAuth2WebSecurityExpressionHandler oAuth2WebSecurityExpressionHandler(ApplicationContext applicationContext) { OAuth2WebSecurityExpressionHandler expressionHandler = new OAuth2WebSecurityExpressionHandler(); expressionHandler.setApplicationContext(applicationContext); return expressionHandler; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/RestClientDetailsServiceImpl.java ================================================ package com.paascloud.provider.security; import com.paascloud.security.core.properties.OAuth2ClientProperties; import com.paascloud.security.core.properties.SecurityProperties; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ArrayUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.oauth2.config.annotation.builders.InMemoryClientDetailsServiceBuilder; import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.security.oauth2.provider.ClientRegistrationException; import org.springframework.stereotype.Component; import javax.annotation.PostConstruct; /** * The class Rest client details service. * * @author paascloud.net @gmail.com */ @Slf4j @Component("restClientDetailsService") public class RestClientDetailsServiceImpl implements ClientDetailsService { private ClientDetailsService clientDetailsService; @Autowired private SecurityProperties securityProperties; /** * Init. */ @PostConstruct public void init() { InMemoryClientDetailsServiceBuilder builder = new InMemoryClientDetailsServiceBuilder(); if (ArrayUtils.isNotEmpty(securityProperties.getOauth2().getClients())) { for (OAuth2ClientProperties client : securityProperties.getOauth2().getClients()) { builder.withClient(client.getClientId()) .secret(client.getClientSecret()) .authorizedGrantTypes("refresh_token", "password", "client_credentials") .accessTokenValiditySeconds(client.getAccessTokenValidateSeconds()) .refreshTokenValiditySeconds(client.getRefreshTokenValiditySeconds()) .scopes(client.getScope()); } } try { clientDetailsService = builder.build(); } catch (Exception e) { log.error("init={}", e.getMessage(), e); } } /** * Load client by client id client details. * * @param clientId the client id * * @return the client details * * @throws ClientRegistrationException the client registration exception */ @Override public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException { return clientDetailsService.loadClientByClientId(clientId); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/SecurityUtils.java ================================================ package com.paascloud.provider.security; import com.google.common.collect.Sets; import lombok.AccessLevel; import lombok.NoArgsConstructor; import org.apache.commons.lang3.StringUtils; import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import java.security.Principal; import java.util.Collection; import java.util.Set; /** * The class Security utils. * * @author paascloud.net @gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public final class SecurityUtils { private static final String AUTH_LOGIN_AFTER_URL = "/user/loginAfter/*"; private static final String AUTH_LOGOUT_URL = "/user/logout"; /** * Gets current login name. * * @return the current login name */ public static String getCurrentLoginName() { Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal(); if (principal instanceof UserDetails) { return ((UserDetails) principal).getUsername(); } if (principal instanceof Principal) { return ((Principal) principal).getName(); } return String.valueOf(principal); } public static Set getCurrentAuthorityUrl() { Set path = Sets.newHashSet(); Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Collection authorities = authentication.getAuthorities(); for (final GrantedAuthority authority : authorities) { String url = authority.getAuthority(); if (StringUtils.isNotEmpty(url)) { path.add(url); } } path.add(AUTH_LOGIN_AFTER_URL); path.add(AUTH_LOGOUT_URL); return path; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/security/UacUserDetailsServiceImpl.java ================================================ package com.paascloud.provider.security; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.service.UacUserService; import com.paascloud.security.core.SecurityUser; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Component; import javax.annotation.Resource; import java.util.Collection; /** * The class Uac user details service. * * @author paascloud.net @gmail.com */ @Component public class UacUserDetailsServiceImpl implements UserDetailsService { @Resource private UacUserService uacUserService; /** * Load user by username user details. * * @param username the username * * @return the user details */ @Override public UserDetails loadUserByUsername(String username) { Collection grantedAuthorities; UacUser user = uacUserService.findByLoginName(username); if (user == null) { throw new BadCredentialsException("用户名不存在或者密码错误"); } user = uacUserService.findUserInfoByUserId(user.getId()); grantedAuthorities = uacUserService.loadUserAuthorities(user.getId()); return new SecurityUser(user.getId(), user.getLoginName(), user.getLoginPwd(), user.getUserName(), user.getGroupId(), user.getGroupName(), user.getStatus(), grantedAuthorities); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/EmailService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:EmailService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.email.SendEmailMessage; /** * The interface Email service. * * @author paascloud.net @gmail.com */ public interface EmailService { /** * 重置密码发送邮件. * * @param email the email */ void submitResetPwdEmail(String email); /** * 发送验证码 * * @param sendEmailMessage the send email message * @param loginName the login name */ void sendEmailCode(SendEmailMessage sendEmailMessage, String loginName); /** * 校验验证码 返回 token 用户最后修改密码使用 * * @param sendEmailMessage the send email message * @param loginName the login name */ void checkEmailCode(SendEmailMessage sendEmailMessage, String loginName); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/MdcAddressService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcAddressService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.AddressDTO; /** * The interface Omc order service. * * @author paascloud.net@gmail.com */ public interface MdcAddressService { /** * Gets address by id. * * @param addressId the address id * * @return the address by id */ AddressDTO getAddressById(Long addressId); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/OpcRpcService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcRpcService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; /** * The interface Opc rpc service. * * @author paascloud.net @gmail.com */ public interface OpcRpcService { /** * Gets location by id. * * @param addressId the address id * * @return the location by id */ String getLocationById(String addressId); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/RedisHashService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RedisHashService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import java.util.List; import java.util.Map; import java.util.Set; /** * The interface Redis hash service. * * @author paascloud.net@gmail.com */ public interface RedisHashService { /** * 获取所有给定字段的值 * * @param the type parameter * @param key the key * @param fields the fields * * @return the value by fields */ List getValueByFields(String key, Set fields); /** * 获取所有给定字段的值 * * @param the type parameter * @param key the key * @param field the field * * @return the value by field */ List getValueByField(String key, String field); /** * 同时将多个 field-value (域-值)对设置到哈希表 key 中 * * @param key the key * @param map the map */ void setValueByFields(String key, Map map); /** * 删除一个或多个哈希表字段R * * @param key the key * @param hashKeys the hash keys * * @return the long */ Long removeFields(String key, String... hashKeys); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/RedisService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RedisService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import java.util.concurrent.TimeUnit; /** * The interface Redis service. * * @author paascloud.net@gmail.com */ public interface RedisService { /** * Gets key. * * @param key the key * * @return the key */ String getKey(String key); /** * Delete key. * * @param key the key */ void deleteKey(String key); /** * Sets key. * * @param key the key * @param value the value */ void setKey(String key, String value); /** * Sets key. * * @param key the key * @param value the value * @param timeout the timeout * @param unit the unit */ void setKey(String key, String value, final long timeout, final TimeUnit unit); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/RedisSetService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RedisSetService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import java.util.Set; /** * The interface Redis set service. * * @author paascloud.net@gmail.com */ public interface RedisSetService { /** * 返回集合中的所有成员 * * @param key the key * * @return the all value */ Set getAllValue(String key); /** * 向集合添加一个或多个成员 * * @param key the key * @param value the value * * @return the long */ Long add(String key, String... value); /** * 移除集合中一个或多个成员 * * @param key the key * @param value the value * * @return the long */ Long remove(String key, String... value); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/SmsService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:SmsService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.sms.SmsMessage; import javax.servlet.http.HttpServletResponse; /** * The interface Sms service. * * @author paascloud.net @gmail.com */ public interface SmsService { /** * Send sms code. * * @param smsMessage the sms message * @param ipAddr the ip addr */ void sendSmsCode(SmsMessage smsMessage, String ipAddr); /** * Submit reset pwd phone. * * @param mobile the mobile * @param response the response * * @return the string */ String submitResetPwdPhone(String mobile, HttpServletResponse response); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacActionService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacActionService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.provider.model.domain.UacAction; import com.paascloud.provider.model.domain.UacMenu; import com.paascloud.provider.model.dto.action.ActionMainQueryDto; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.core.support.IService; import java.util.List; /** * The interface Uac action service. * * @author paascloud.net @gmail.com */ public interface UacActionService extends IService { /** * Query action list with page page info. * * @param actionMainQueryDto the action main query dto * * @return the page info */ PageInfo queryActionListWithPage(ActionMainQueryDto actionMainQueryDto); /** * Delete action by id int. * * @param actionId the action id * * @return the int */ int deleteActionById(Long actionId); /** * Batch delete by id list. * * @param deleteIdList the delete id list */ void batchDeleteByIdList(List deleteIdList); /** * Save action. * * @param action the action * @param loginAuthDto the login auth dto */ void saveAction(UacAction action, LoginAuthDto loginAuthDto); /** * Delete by menu id int. * * @param id the id * * @return the int */ int deleteByMenuId(Long id); /** * Gets checked auth list. * * @param roleId the role id * * @return the checked auth list */ List getCheckedActionList(Long roleId); /** * Gets own auth list. * * @param userId the user id * * @return the own auth list */ List getOwnAuthList(Long userId); /** * Gets checked menu list. * * @param roleId the role id * * @return the checked menu list */ List getCheckedMenuList(Long roleId); /** * 根据用户Id查询拥有的按钮权限. * * @param userId the user id * * @return the own uac action list */ List getOwnActionListByUserId(Long userId); /** * 根据角色ID查询权限列表. * * @param roleId the role id * * @return the list */ List listActionListByRoleId(Long roleId); /** * 根据菜单ID List 查询权限列表. * * @param uacMenus the uac menus * * @return the list */ List listActionList(List uacMenus); /** * Matches by url uac action. * * @param requestUrl the request url * * @return the uac action */ UacAction matchesByUrl(String requestUrl); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacFreeMarkerService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacFreeMarkerService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import freemarker.template.TemplateException; import java.io.IOException; import java.util.Map; /** * The interface Uac free marker service. * * @author paascloud.net@gmail.com */ public interface UacFreeMarkerService { /** * Gets template. * * @param map the map * @param templateLocation the template location * * @return the template * * @throws IOException the io exception * @throws TemplateException the template exception */ String getTemplate(Map map, String templateLocation) throws IOException, TemplateException; } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacGroupService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGroupService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.provider.model.domain.UacGroup; import com.paascloud.provider.model.dto.group.GroupBindUserDto; import com.paascloud.provider.model.dto.group.GroupBindUserReqDto; import com.paascloud.provider.model.dto.user.IdStatusDto; import com.paascloud.provider.model.vo.GroupZtreeVo; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.core.support.IService; import java.util.List; /** * The interface Uac group service. * * @author paascloud.net@gmail.com */ public interface UacGroupService extends IService { /** * Update uac group status by id int. * * @param idStatusDto the id status dto * @param loginAuthDto the login auth dto * * @return the int */ int updateUacGroupStatusById(IdStatusDto idStatusDto, LoginAuthDto loginAuthDto); /** * Delete uac group by id int. * * @param id the id * * @return the int */ int deleteUacGroupById(Long id); /** * Query by id uac group. * * @param groupId the group id * * @return the uac group */ UacGroup queryById(Long groupId); /** * Gets group tree. * * @param id the id * * @return the group tree */ List getGroupTree(Long id); /** * Find current user have group info list. * * @param userId the user id * * @return the list */ List getGroupTreeListByUserId(Long userId); /** * Gets group bind user dto. * * @param groupId the group id * @param userId the user id * * @return the group bind user dto */ GroupBindUserDto getGroupBindUserDto(Long groupId, Long userId); /** * Bind uac user 4 group int. * * @param groupBindUserReqDto the group bind user req dto * @param loginAuthDto the login auth dto */ void bindUacUser4Group(GroupBindUserReqDto groupBindUserReqDto, LoginAuthDto loginAuthDto); /** * Save uac group int. * * @param group the group * @param loginAuthDto the login auth dto * * @return the int */ int saveUacGroup(UacGroup group, LoginAuthDto loginAuthDto); /** * Gets by id. * * @param id the id * * @return the by id */ UacGroup getById(Long id); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacGroupUserService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGroupUserService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.domain.UacGroup; import com.paascloud.provider.model.domain.UacGroupUser; import com.paascloud.core.support.IService; import java.util.List; /** * The interface Uac group user service. * * @author paascloud.net@gmail.com */ public interface UacGroupUserService extends IService { /** * 根据userId查询 * * @param userId the user id * * @return the uac group user */ UacGroupUser queryByUserId(Long userId); /** * 根据userId和version修改 * * @param uacGroupUser the uac group user * * @return the int */ int updateByUserId(UacGroupUser uacGroupUser); /** * 通过用户Id获取组织信息 * * @param userId the user id * * @return the group list by user id */ List getGroupListByUserId(Long userId); /** * Save user group. * * @param id the id * @param groupId the group id */ void saveUserGroup(Long id, Long groupId); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacLogService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacLogService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.annotation.OperationLogDto; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.UacLog; import com.paascloud.provider.model.dto.log.UacLogMainDto; import java.util.List; /** * The interface Uac log service. * * @author paascloud.net @gmail.com */ public interface UacLogService extends IService { /** * Save log int. * * @param uacLog the uac log * @param loginAuthDto the login auth dto * * @return the int */ int saveLog(UacLog uacLog, LoginAuthDto loginAuthDto); /** * Query user log list with user id list. * * @param userId the user id * * @return the list */ List selectUserLogListByUserId(Long userId); /** * Save operation log integer. * * @param operationLogDto the operation log dto * * @return the integer */ Integer saveOperationLog(OperationLogDto operationLogDto); /** * Query log list with page wrapper. * * @param uacLogQueryDtoPage the uac log query dto page * * @return the wrapper */ PageInfo queryLogListWithPage(UacLogMainDto uacLogQueryDtoPage); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacLoginService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacLoginService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.user.LoginRespDto; /** * The interface Uac login service. * * @author paascloud.net@gmail.com */ public interface UacLoginService { /** * Login after login resp dto. * * @param applicationId the application id * * @return the login resp dto */ LoginRespDto loginAfter(Long applicationId); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacMenuService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacMenuService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.provider.model.domain.UacMenu; import com.paascloud.provider.model.dto.menu.UacMenuStatusDto; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.model.vo.ViewMenuVo; import com.paascloud.core.support.IService; import java.util.List; import java.util.Set; /** * The interface Uac menu service. * * @author paascloud.net @gmail.com */ public interface UacMenuService extends IService { /** * Gets menu vo list by user id. * * @param userId the user id * @param applicationId the application id * * @return the menu vo list by user id */ List getMenuVoList(Long userId, Long applicationId); /** * Save uac menu int. * * @param uacMenu the uac menu * @param loginAuthDto the login auth dto * * @return the int */ int saveUacMenu(UacMenu uacMenu, LoginAuthDto loginAuthDto); /** * Delete uac menu by id int. * * @param id the id * @param loginAuthDto the login auth dto * * @return the int */ int deleteUacMenuById(Long id, LoginAuthDto loginAuthDto); /** * Enable menu list int. * * @param menuList the menu list * @param loginAuthDto the login auth dto * * @return the int */ int enableMenuList(List menuList, LoginAuthDto loginAuthDto); /** * Gets all parent menu by menu id. * * @param id the id * * @return the all parent menu by menu id */ List getAllParentMenuByMenuId(Long id); /** * Gets all child menu by menu id. * * @param id the id * @param type the type * * @return the all child menu by menu id */ List getAllChildMenuByMenuId(Long id, String type); /** * Disable menu list int. * * @param menuList the menu list * @param loginAuthDto the login auth dto * * @return the int */ int disableMenuList(List menuList, LoginAuthDto loginAuthDto); /** * Select menu list list. * * @param cusUacMenu the cus uac menu * * @return the list */ List selectMenuList(UacMenu cusUacMenu); /** * Find all menu list by auth res dto list. * * @param authResDto the auth res dto * * @return the list */ List findAllMenuListByAuthResDto(LoginAuthDto authResDto); /** * Gets vo by id. * * @param id the id * * @return the vo by id */ ViewMenuVo getViewVoById(Long id); /** * Update uac menu status by id. * * @param uacMenuStatusDto the uac menu status dto * @param loginAuthDto the login auth dto */ void updateUacMenuStatusById(UacMenuStatusDto uacMenuStatusDto, LoginAuthDto loginAuthDto); /** * 判断菜单是否有子菜单. * * @param menuId the menu id * * @return the boolean */ boolean checkMenuHasChildMenu(Long menuId); /** * 根据角色ID查询菜单列表. * * @param roleId the role id * * @return the list */ List listMenuListByRoleId(Long roleId); /** * Gets menu list. * * @param menuIdList the menu id list * * @return the menu list */ List getMenuList(Set menuIdList); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacPermissionService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacPermissionService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import org.springframework.security.core.Authentication; import javax.servlet.http.HttpServletRequest; /** * The interface Uac permission service. * * @author paascloud.net @gmail.com */ public interface UacPermissionService { /** * Has permission boolean. * * @param authentication the authentication * @param request the request * * @return the boolean */ boolean hasPermission(Authentication authentication, HttpServletRequest request); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacRoleActionService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleActionService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.domain.UacRoleAction; import com.paascloud.core.support.IService; import java.util.List; import java.util.Set; /** * The interface Uac role action service. * * @author paascloud.net @gmail.com */ public interface UacRoleActionService extends IService { /** * List by role id list. * * @param roleId the role id * * @return the list */ List listByRoleId(Long roleId); /** * Delete by role id. * * @param roleId the role id */ void deleteByRoleId(Long roleId); /** * Insert. * * @param roleId the role id * @param actionIdList the action id list */ void insert(Long roleId, Set actionIdList); /** * Delete by role id list int. * * @param roleIdList the role id list * * @return the int */ int deleteByRoleIdList(List roleIdList); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacRoleMenuService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleMenuService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.domain.UacRoleMenu; import com.paascloud.core.support.IService; import java.util.List; import java.util.Set; /** * The interface Uac role menu service. * * @author paascloud.net @gmail.com */ public interface UacRoleMenuService extends IService { /** * Del role menu list int. * * @param uacRoleMenus the uac role menus * * @return the int */ int delRoleMenuList(Set uacRoleMenus); /** * Delete by role id. * * @param roleId the role id */ void deleteByRoleId(Long roleId); /** * List by role id list. * * @param roleId the role id * * @return the list */ List listByRoleId(Long roleId); /** * Insert. * * @param roleId the role id * @param menuIdList the menu id list */ void insert(Long roleId, Set menuIdList); /** * Delete by role id list. * * @param roleIdList the role id list */ void deleteByRoleIdList(List roleIdList); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacRoleService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.provider.model.domain.UacRole; import com.paascloud.provider.model.dto.role.RoleBindActionDto; import com.paascloud.provider.model.dto.role.RoleBindMenuDto; import com.paascloud.provider.model.dto.role.RoleBindUserDto; import com.paascloud.provider.model.dto.role.RoleBindUserReqDto; import com.paascloud.provider.model.vo.BindAuthVo; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.model.vo.RoleVo; import com.paascloud.core.support.IService; import java.util.List; /** * The interface Uac role service. * * @author paascloud.net@gmail.com */ public interface UacRoleService extends IService { /** * Find by role code uac role. * * @param roleCode the role code * * @return the uac role */ UacRole findByRoleCode(String roleCode); /** * Query role list with page list. * * @param role the role * * @return the list */ List queryRoleListWithPage(UacRole role); /** * 根据角色删除用户. * * @param id the id * * @return the int */ int deleteRoleById(Long id); /** * 保存用户. * * @param role the role * @param loginAuthDto the login auth dto * * @return the int */ int saveRole(UacRole role, LoginAuthDto loginAuthDto); /** * Gets auth tree no check menu. * * @param roleId the role id * * @return the auth tree no check menu */ List getAuthTreeNoCheckMenu(Long roleId); /** * Grant auth 4 role int. * * @param grantAuthRole the grant auth role */ void bindAction(RoleBindActionDto grantAuthRole); /** * 根据角色Id获取角色信息. * * @param roleId the role id * * @return the role by id */ UacRole getRoleById(Long roleId); /** * 角色绑定用户获取穿梭框信息. * * @param roleId the role id * @param currentUserId the current user id * * @return the role bind user dto by role id */ RoleBindUserDto getRoleBindUserDto(Long roleId, Long currentUserId); /** * 角色绑定用户. * * @param roleBindUserReqDto the role bind user req dto * @param loginAuthDto the login auth dto */ void bindUser4Role(RoleBindUserReqDto roleBindUserReqDto, LoginAuthDto loginAuthDto); /** * Find all role info by user id list. * * @param userId the user id * * @return the list */ List findAllRoleInfoByUserId(Long userId); /** * Gets auth tree by role id. * * @param roleId the role id * * @return the auth tree by role id */ BindAuthVo getActionTreeByRoleId(Long roleId); /** * Batch delete by id list int. * * @param idList the id list */ void batchDeleteByIdList(List idList); /** * Gets own auth tree by role id. * * @param userId the user id * * @return the own auth tree by role id */ List getOwnAuthTree(Long userId); /** * Bind menu. * * @param roleBindMenuDto the role bind menu dto */ void bindMenu(RoleBindMenuDto roleBindMenuDto); /** * Gets menu tree by role id. * * @param roleId the role id * * @return the menu tree by role id */ BindAuthVo getMenuTreeByRoleId(Long roleId); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacRoleUserService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleUserService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.domain.UacRoleUser; import com.paascloud.core.support.IService; import java.util.List; /** * The interface Uac role user service. * * @author paascloud.net@gmail.com */ public interface UacRoleUserService extends IService { /** * 根据用户ID解除用户角色关联. * * @param userId the user id * * @return the int */ int deleteByUserId(Long userId); /** * 根据用户ID查询绑定的角色ID列表. * * @param userId the user id * * @return the list */ List queryByUserId(Long userId); /** * 用户是否绑定该角色. * * @param userId the user id * @param roleId the role id * * @return the by user id and role id */ UacRoleUser getByUserIdAndRoleId(Long userId, Long roleId); /** * 保存用户角色中间表信息. * * @param userId the user id * @param roleId the role id * * @return the int */ int saveRoleUser(Long userId, Long roleId); /** * 根据角色信息查询用户ID集合. * * @param roleId the role id * * @return the list */ List listByRoleId(Long roleId); /** * 根据角色ID列表查询用户ID集合. * * @param idList the id list * * @return the list */ List listByRoleIdList(List idList); /** * List super user list. * * @param superManagerRoleId the super manager role id * * @return the list */ List listSuperUser(Long superManagerRoleId); /** * Delete exclude super mng. * * @param roleId the role id * @param superManagerRoleId the super manager role id */ void deleteExcludeSuperMng(Long roleId, Long superManagerRoleId); /** * 根据用户ID查询集合. * * @param userId the user id * * @return the list */ List listByUserId(Long userId); /** * 根据角色ID集合解除关联关系. * * @param roleIdList the role id list */ void deleteByRoleIdList(List roleIdList); /** * 根据角色ID解除关联关系. * * @param roleId the role id */ void deleteByRoleId(Long roleId); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacUserMenuService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserMenuService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.domain.UacUserMenu; import com.paascloud.core.support.IService; /** * The interface Uac user menu service. * * @author paascloud.net@gmail.com */ public interface UacUserMenuService extends IService { } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacUserService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.UacLog; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.dto.menu.UserMenuDto; import com.paascloud.provider.model.dto.user.*; import com.paascloud.provider.model.vo.UserBindRoleVo; import com.paascloud.security.core.SecurityUser; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.oauth2.common.OAuth2AccessToken; import javax.servlet.http.HttpServletRequest; import java.util.Collection; import java.util.List; /** * The interface Uac user service. * * @author paascloud.net @gmail.com */ public interface UacUserService extends IService { /** * 根据登录名查询用户信息 * * @param loginName the login name * * @return the uac user */ UacUser findByLoginName(String loginName); /** * 根据手机号查询用户信息. * * @param mobileNo the mobile no * * @return the uac user */ UacUser findByMobileNo(String mobileNo); /** * 校验用户是否合法 * * @param loginReqDto the login req dto */ void checkUserIsCorrect(LoginReqDto loginReqDto); /** * 获得项目下所有的资源权限列表, 用于程序启动时的初始化工作 * String[0] = 资源 * String[1] = 权限 * * @return all perms */ List getAllPerms(); /** * 获得用户拥有的权限列表, 在首次验证用户对某个资源是否有权限时, 会调用此方法, 初始化用户权限 * * @param userId the user id * * @return the user perms */ List getUserPerms(Long userId); /** * 更新用户信息 * * @param uacUser the uac user * * @return the int */ int updateUser(UacUser uacUser); /** * Query user list with page list. * * @param uacUser the uac user * * @return the list */ PageInfo queryUserListWithPage(UacUser uacUser); /** * 根据用户ID删除用户. * * @param userId the user id * * @return the int */ int deleteUserById(Long userId); /** * 根据用户ID查询用户信息. * * @param userId the user id * * @return the uac user */ UacUser findUserInfoByUserId(Long userId); /** * 保存用户. * * @param user the user * @param loginAuthDto the login auth dto */ void saveUacUser(UacUser user, LoginAuthDto loginAuthDto); /** * 根据用户ID查询用户日志集合. * * @param userId the user id * * @return the list */ List queryUserLogListWithUserId(Long userId); /** * 根据用户ID修改用户状态. * * @param uacUser the uac user * @param loginAuthDto the login auth dto * * @return the int */ int modifyUserStatusById(UacUser uacUser, LoginAuthDto loginAuthDto); /** * 绑定用户角色信息. * * @param bindUserRolesDto the bind user roles dto * @param loginAuthDto the login auth dto */ void bindUserRoles(BindUserRolesDto bindUserRolesDto, LoginAuthDto loginAuthDto); /** * 查询用户菜单. * * @param loginAuthDto the login auth dto * * @return the list */ List queryUserMenuDtoData(LoginAuthDto loginAuthDto); /** * 用户绑定菜单. * * @param menuIdList the menu id list * @param loginAuthDto the login auth dto * * @return the int */ int bindUserMenus(List menuIdList, LoginAuthDto loginAuthDto); /** * 根据用户ID查询用户信息. * * @param userId the user id * * @return the uac user */ UacUser queryByUserId(Long userId); /** * 用户修改密码 * * @param userModifyPwdDto the user modify pwd dto * @param authResDto the auth res dto * * @return the int */ int userModifyPwd(UserModifyPwdDto userModifyPwdDto, LoginAuthDto authResDto); /** * 用户忘记密码 * * @param userResetPwdDto the user reset pwd dto * * @return the int */ int userResetPwd(UserResetPwdDto userResetPwdDto); /** * 注册用户. * * @param registerDto the register dto */ void register(UserRegisterDto registerDto); /** * 校验登录名是否存在. * * @param loginName the login name * * @return the boolean */ boolean checkLoginName(String loginName); /** * 校验邮箱是否存在. * * @param loginName the login name * * @return the boolean */ boolean checkEmail(String loginName); /** * 校验手机号是否存在. * * @param validValue the valid value * * @return the boolean */ boolean checkMobileNo(String validValue); /** * 根据邮箱和登录名查询用户数量. * * @param loginName the login name * @param email the email * * @return the int */ int countUserByLoginNameAndEmail(String loginName, String email); /** * 重置密码. * * @param forgetResetPasswordDto 忘记密码实体 * * @return the int */ int userEmailResetPwd(ForgetResetPasswordDto forgetResetPasswordDto); /** * 修改用户邮箱. * * @param email the email * @param emailCode the email code * @param loginAuthDto the login auth dto */ void modifyUserEmail(String email, String emailCode, LoginAuthDto loginAuthDto); /** * 重置登录密码. * * @param userId the user id * @param loginAuthDto the login auth dto */ void resetLoginPwd(Long userId, LoginAuthDto loginAuthDto); /** * 重置登录密码. * * @param resetLoginPwdDto the reset login pwd dto */ void resetLoginPwd(ResetLoginPwdDto resetLoginPwdDto); /** * 获取绑定的角色信息. * * @param userId the user id * * @return the user bind role dto */ UserBindRoleVo getUserBindRoleDto(Long userId); /** * 激活用户. * * @param activeUserToken the active user token */ void activeUser(String activeUserToken); /** * 获取用户拥有的所有权限编码. * * @param userId the user id * * @return the collection */ Collection loadUserAuthorities(Long userId); /** * Handler login data. * * @param token the token * @param principal the principal * @param request the request */ void handlerLoginData(OAuth2AccessToken token, final SecurityUser principal, final HttpServletRequest request); /** * Find user info by login name uac user. * * @param loginName the login name * * @return the uac user */ UacUser findUserInfoByLoginName(String loginName); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/UacUserTokenService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserTokenService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.arronlong.httpclientutil.exception.HttpProcessException; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UserTokenDto; import com.paascloud.core.support.IService; import com.paascloud.provider.model.domain.UacUserToken; import com.paascloud.provider.model.dto.token.TokenMainQueryDto; import javax.servlet.http.HttpServletRequest; /** * 登录jwt token 管理. * * @author paascloud.net @gmail.com */ public interface UacUserTokenService extends IService { /** * 保存token. * * @param accessToken the access token * @param refreshToken the refresh token * @param loginAuthDto the login auth dto * @param request the request */ void saveUserToken(String accessToken, String refreshToken, LoginAuthDto loginAuthDto, HttpServletRequest request); /** * 获取token. * * @param accessToken the access token * * @return the by access token */ UserTokenDto getByAccessToken(String accessToken); /** * 更新token. * * @param tokenDto the token dto * @param loginAuthDto the login auth dto */ void updateUacUserToken(UserTokenDto tokenDto, LoginAuthDto loginAuthDto); /** * 分页查询token列表. * * @param token the token * * @return the page info */ PageInfo listTokenWithPage(TokenMainQueryDto token); /** * 刷新token. * * @param accessToken the access token * @param refreshToken the refresh token * @param request the request * * @return the string * * @throws HttpProcessException the http process exception */ String refreshToken(String accessToken, String refreshToken, HttpServletRequest request) throws HttpProcessException; /** * 更新token离线状态. * * @return the int */ int batchUpdateTokenOffLine(); } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/EmailServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.paascloud.HttpAesUtil; import com.paascloud.PubUtils; import com.paascloud.RandomUtil; import com.paascloud.RedisKeyUtil; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.generator.UniqueIdGenerator; import com.paascloud.provider.manager.UserManager; import com.paascloud.provider.model.domain.MqMessageData; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.dto.email.SendEmailMessage; import com.paascloud.provider.model.enums.UacEmailTemplateEnum; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.mq.producer.EmailProducer; import com.paascloud.provider.service.EmailService; import com.paascloud.provider.service.RedisService; import com.paascloud.provider.service.UacUserService; import com.xiaoleilu.hutool.date.DateUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; import java.util.Date; import java.util.Map; import java.util.Set; import java.util.concurrent.TimeUnit; /** * The class Email service. * * @author paascloud.net@gmail.com */ @Service @Slf4j public class EmailServiceImpl implements EmailService { @Resource private EmailProducer emailProducer; @Resource private UacUserService uacUserService; @Value("${paascloud.auth.rest-pwd-url}") private String resetPwdUrl; @Resource private RedisTemplate redisTemplate; @Resource private UserManager userManager; @Resource private RedisService redisService; private static final String KEY_STR = "om8q6fq#A0Yl@qJy"; private static final String IV_STR = "0#86gzOcsv1bXyIx"; @Override public void submitResetPwdEmail(String email) { Preconditions.checkArgument(StringUtils.isNotEmpty(email), ErrorCodeEnum.UAC10011018.msg()); // 获取用户名 UacUser uacUser = new UacUser(); uacUser.setEmail(email); uacUser = uacUserService.selectOne(uacUser); if (uacUser == null) { throw new UacBizException(ErrorCodeEnum.UAC10011004, email); } String resetPwdKey = PubUtils.uuid() + UniqueIdGenerator.generateId(); redisTemplate.opsForValue().set(RedisKeyUtil.getResetPwdTokenKey(resetPwdKey), uacUser, 7 * 24, TimeUnit.HOURS); Map param = Maps.newHashMap(); param.put("loginName", uacUser.getLoginName()); param.put("email", email); param.put("resetPwdUrl", resetPwdUrl + resetPwdKey); param.put("dateTime", DateUtil.formatDateTime(new Date())); Set to = Sets.newHashSet(); to.add(email); MqMessageData messageData = emailProducer.sendEmailMq(to, UacEmailTemplateEnum.RESET_PWD_SEND_MAIL, AliyunMqTopicConstants.MqTagEnum.FORGOT_PASSWORD_AUTH_CODE, param); userManager.submitResetPwdEmail(messageData); } @Override public void sendEmailCode(SendEmailMessage sendEmailMessage, String loginName) { Preconditions.checkArgument(StringUtils.isNotEmpty(loginName), "用户名不能为空"); String email = sendEmailMessage.getEmail(); Preconditions.checkArgument(StringUtils.isNotEmpty(email), ErrorCodeEnum.UAC10011018.msg()); Preconditions.checkArgument(StringUtils.isNotEmpty(loginName), ErrorCodeEnum.UAC10011007.msg()); // 解密 email = decryptEmail(loginName, email); Example example = new Example(UacUser.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("email", email); criteria.andNotEqualTo("loginName", loginName); int result = uacUserService.selectCountByExample(example); if (result > 0) { throw new UacBizException(ErrorCodeEnum.UAC10011019); } String emailCode = RandomUtil.createNumberCode(6); String key = RedisKeyUtil.getSendEmailCodeKey(loginName, email); // 在redis中绑定验证码 redisService.setKey(key, emailCode, 7 * 24, TimeUnit.HOURS); // 先写死 类型多了再抽方法 Map param = Maps.newHashMap(); param.put("loginName", loginName); param.put("email", email); param.put("emailCode", emailCode); param.put("dateTime", DateUtil.formatDateTime(new Date())); Set to = Sets.newHashSet(); to.add(email); MqMessageData mqMessageData = emailProducer.sendEmailMq(to, UacEmailTemplateEnum.RESET_USER_EMAIL, AliyunMqTopicConstants.MqTagEnum.RESET_LOGIN_PWD, param); userManager.sendEmailCode(mqMessageData); } @Override public void checkEmailCode(SendEmailMessage sendEmailMessage, String loginName) { String email = sendEmailMessage.getEmail(); String emailCode = sendEmailMessage.getEmailCode(); Preconditions.checkArgument(StringUtils.isNotEmpty(email), ErrorCodeEnum.UAC10011018.msg()); Preconditions.checkArgument(StringUtils.isNotEmpty(emailCode), "验证码不能为空"); // 解密用户名密码 email = decryptEmail(loginName, email); String key = RedisKeyUtil.getSendEmailCodeKey(loginName, email); String emailCodeRedis = redisService.getKey(key); Preconditions.checkArgument(StringUtils.isNotEmpty(emailCodeRedis), "验证码已过期"); Preconditions.checkArgument(StringUtils.equals(emailCode, emailCodeRedis), "验证码错误"); } private String decryptEmail(final String loginName, String email) { try { email = HttpAesUtil.decrypt(email, KEY_STR, false, IV_STR); log.info("发送短信 解密loginName={}", loginName); log.info("发送短信 解密email={}", email); } catch (Exception ex) { log.info("发送短信 解密手机号码失败 密文loginName={}, email={}", loginName, email); throw new UacBizException(ErrorCodeEnum.UAC10011031); } return email; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/MdcAddressServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.exceptions.MdcBizException; import com.paascloud.provider.model.dto.AddressDTO; import com.paascloud.provider.service.MdcAddressQueryFeignApi; import com.paascloud.provider.service.MdcAddressService; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; /** * The class Mdc address service. * * @author paascloud.net @gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class MdcAddressServiceImpl implements MdcAddressService { @Resource private MdcAddressQueryFeignApi mdcAddressQueryFeignApi; @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public AddressDTO getAddressById(Long addressId) { Preconditions.checkArgument(addressId != null, "地址ID不能为空"); Wrapper wrapper = mdcAddressQueryFeignApi.getById(addressId); if (wrapper == null) { throw new MdcBizException(ErrorCodeEnum.GL99990002); } if (wrapper.error()) { throw new MdcBizException(ErrorCodeEnum.MDC10021002); } return wrapper.getResult(); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/OpcRpcServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcRpcServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.exceptions.MdcBizException; import com.paascloud.provider.model.dto.gaode.GaodeLocation; import com.paascloud.provider.service.OpcGaodeFeignApi; import com.paascloud.provider.service.OpcRpcService; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * The class Opc rpc service. * * @author paascloud.net @gmail.com */ @Slf4j @Service public class OpcRpcServiceImpl implements OpcRpcService { @Resource private OpcGaodeFeignApi opcGaodeFeignApi; @Override public String getLocationById(String addressId) { try { Wrapper wrapper = opcGaodeFeignApi.getLocationByIpAddr(addressId); if (wrapper == null) { throw new MdcBizException(ErrorCodeEnum.GL99990002); } if (wrapper.error()) { throw new MdcBizException(ErrorCodeEnum.MDC10021002); } GaodeLocation result = wrapper.getResult(); assert result != null; return result.getProvince().contains("市") ? result.getCity() : result.getProvince() + GlobalConstant.Symbol.SHORT_LINE + result.getCity(); } catch (Exception e) { log.error("getLocationById={}", e.getMessage(), e); } return null; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/PcSmsCodeSender.java ================================================ package com.paascloud.provider.service.impl; import com.paascloud.base.constant.AliyunSmsConstants; import com.paascloud.provider.model.dto.sms.SmsMessage; import com.paascloud.provider.service.SmsService; import com.paascloud.security.core.validate.code.sms.SmsCodeSender; import lombok.extern.slf4j.Slf4j; import javax.annotation.Resource; /** * 默认的短信验证码发送器 * * @author paascloud.net @gmail.com */ @Slf4j public class PcSmsCodeSender implements SmsCodeSender { @Resource private SmsService smsService; @Override public void send(String mobile, String code, String ip) { log.info("ip地址:{}向手机: {}发送短信验证码:{}", ip, mobile, code); SmsMessage smsMessage = new SmsMessage(); smsMessage.setMobileNo(mobile); smsMessage.setSmsCode(code); smsMessage.setSmsTemplateCode(AliyunSmsConstants.SmsTempletEnum.UAC_PC_GLOBAL_TEMPLATE.getTempletCode()); smsService.sendSmsCode(smsMessage, ip); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/RedisHashServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RedisHashServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.collect.Lists; import com.paascloud.PublicUtil; import com.paascloud.provider.service.RedisHashService; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Set; /** * The class Redis hash service. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class RedisHashServiceImpl implements RedisHashService { @Resource private StringRedisTemplate rt; @Override public List getValueByFields(String key, Set fields) { HashOperations hash = rt.opsForHash(); if (!rt.hasKey(key)) { return Collections.emptyList(); } List values = hash.multiGet(key, fields); if (PublicUtil.isEmpty(values)) { return Collections.emptyList(); } log.info("getValueByFields - 根据key获取所有给定字段的值. [OK] key={}, fields={}, values={}", key, fields, values); return values; } @Override public List getValueByField(String key, String field) { HashOperations hash = rt.opsForHash(); if (!rt.hasKey(key)) { return Collections.emptyList(); } T value = hash.get(key, field); if (PublicUtil.isEmpty(value)) { return Collections.emptyList(); } List values = Lists.newArrayList(); values.add(value); log.info("getValueByField - 根据key获取给定字段的值. [OK] key={}, field={}, values={}", key, field, values); return values; } @Override public void setValueByFields(String key, Map map) { HashOperations hash = rt.opsForHash(); hash.putAll(key, map); log.info("setValueByFields - 同时将多个 field-value (域-值)对设置到哈希表 key 中. [ok] key={}, map={}", key, map); } @Override public Long removeFields(String key, String... hashKeys) { HashOperations hash = rt.opsForHash(); Long result = hash.delete(key, (Object) hashKeys); log.info("removeFields- 删除一个或多个哈希表字段. [OK] key={}, hashKeys={}, result={}", key, hashKeys, result); return result; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/RedisServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.provider.service.RedisService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.concurrent.TimeUnit; /** * The class Redis service. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class RedisServiceImpl implements RedisService { @Resource private StringRedisTemplate rt; @Override public String getKey(String key) { String value = null; ValueOperations ops = rt.opsForValue(); if (rt.hasKey(key)) { value = ops.get(key); } log.info("getKey. [OK] key={}, value={}", key, value); return value; } @Override public void deleteKey(String key) { rt.delete(key); log.info("deleteKey. [OK] key={}", key); } @Override public void setKey(String key, String value) { Preconditions.checkArgument(StringUtils.isNotEmpty(key), "Redis key is not null"); ValueOperations ops = rt.opsForValue(); ops.set(key, value); rt.expire(key, GlobalConstant.Sys.REDIS_DEFAULT_EXPIRE, TimeUnit.MINUTES); log.info("setKey. [OK] key={}, value={}, expire=默认超时时间", key, value); } @Override public void setKey(String key, String value, long timeout, TimeUnit unit) { Preconditions.checkArgument(StringUtils.isNotEmpty(key), "Redis key is not null"); Preconditions.checkArgument(unit != null, "TimeUnit is not null"); ValueOperations ops = rt.opsForValue(); ops.set(key, value); rt.expire(key, timeout, unit); log.info("setKey. [OK] key={}, value={}, timeout={}, unit={}", key, value, timeout, unit); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/RedisSetServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RedisSetServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.paascloud.provider.service.RedisSetService; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.SetOperations; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.Set; /** * The class Redis set service. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class RedisSetServiceImpl implements RedisSetService { @Resource private StringRedisTemplate rt; @Override public Set getAllValue(String key) { Set result; SetOperations setOps = rt.opsForSet(); result = setOps.members(key); log.info("getAllValue - 根据key获取元素. [OK] key={}, value={}", key, result); return result; } @Override public Long add(String key, String... value) { SetOperations setOps = rt.opsForSet(); Long result = setOps.add(key, value); log.info("add - 向key里面添加元素, key={}, value={}, result={}", key, value, result); return result; } @Override public Long remove(String key, String... value) { SetOperations setOps = rt.opsForSet(); Long result = setOps.remove(key, (Object) value); log.info("remove - 根据key移除元素, key={}, value={}, result={}", key, value, result); return result; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/SmsServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.paascloud.PubUtils; import com.paascloud.RedisKeyUtil; import com.paascloud.base.constant.AliyunSmsConstants; import com.paascloud.core.generator.UniqueIdGenerator; import com.paascloud.provider.manager.UserManager; import com.paascloud.provider.model.domain.MqMessageData; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.dto.sms.SmsMessage; import com.paascloud.provider.mq.producer.SmsProducer; import com.paascloud.provider.service.SmsService; import com.paascloud.provider.service.UacUserService; import com.paascloud.security.core.validate.code.CookieUtil; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.util.concurrent.TimeUnit; /** * The class Sms service. * * @author paascloud.net@gmail.com */ @Slf4j @Service public class SmsServiceImpl implements SmsService { @Resource private SmsProducer smsProducer; @Resource private UacUserService uacUserService; @Resource private RedisTemplate redisTemplate; @Resource private UserManager userManager; @Override public void sendSmsCode(SmsMessage smsMessage, String ipAddr) { Preconditions.checkArgument(smsMessage != null, "短信参数不能为空"); Preconditions.checkArgument(StringUtils.isNotEmpty(ipAddr), "非法的IP地址"); String mobileNo = smsMessage.getMobileNo(); Preconditions.checkArgument(StringUtils.isNotEmpty(mobileNo), "手机号码不能为空"); String smsTemplateCode = smsMessage.getSmsTemplateCode(); Preconditions.checkArgument(AliyunSmsConstants.SmsTempletEnum.isSmsTemplate(smsTemplateCode), "短信模板没有维护"); smsMessage.setMobileNo(mobileNo); smsMessage.setOutId(ipAddr); AliyunSmsConstants.SmsTempletEnum templetEnum = AliyunSmsConstants.SmsTempletEnum.getEnum(smsTemplateCode); MqMessageData mqMessageData = smsProducer.sendSmsCodeMq(smsMessage, templetEnum); userManager.sendSmsCode(mqMessageData); } @Override public String submitResetPwdPhone(String mobile, HttpServletResponse response) { Preconditions.checkArgument(StringUtils.isNotEmpty(mobile), "手机号码不能为空"); Preconditions.checkArgument(PubUtils.isMobileNumber(mobile), "手机号码格式不正确"); String resetPwdKey = PubUtils.uuid() + UniqueIdGenerator.generateId(); UacUser user = uacUserService.findByMobileNo(mobile); redisTemplate.opsForValue().set(RedisKeyUtil.getResetPwdTokenKey(resetPwdKey), user, 10, TimeUnit.MINUTES); CookieUtil.setCookie("PASSCLOUD_PAAS_resetPwdKey", resetPwdKey, 10 * 60, response); return resetPwdKey; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacActionServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.paascloud.PublicUtil; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.UacActionMapper; import com.paascloud.provider.mapper.UacRoleActionMapper; import com.paascloud.provider.model.domain.UacAction; import com.paascloud.provider.model.domain.UacMenu; import com.paascloud.provider.model.dto.action.ActionMainQueryDto; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.model.vo.ActionVo; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.service.UacActionService; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.AntPathMatcher; import javax.annotation.Resource; import java.util.List; import java.util.Objects; /** * The class Uac action service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacActionServiceImpl extends BaseService implements UacActionService { @Resource private UacActionMapper uacActionMapper; @Resource private UacRoleActionMapper uacRoleActionMapper; private AntPathMatcher antPathMatcher = new AntPathMatcher(); @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public PageInfo queryActionListWithPage(ActionMainQueryDto actionMainQueryDto) { List menuIdList = actionMainQueryDto.getMenuIdList(); Long menuId = null; if (PublicUtil.isNotEmpty(menuIdList)) { menuId = menuIdList.get(menuIdList.size() - 1); } UacAction uacAction = new UacAction(); uacAction.setMenuId(menuId); BeanUtils.copyProperties(actionMainQueryDto, uacAction); uacAction.setOrderBy("update_time desc"); PageHelper.startPage(actionMainQueryDto.getPageNum(), actionMainQueryDto.getPageSize()); List actionList = uacActionMapper.queryActionListWithPage(uacAction); return new PageInfo<>(actionList); } @Override public int deleteActionById(Long actionId) { //查询该角色下是否有用户绑定, 有的话提醒不能删除 if (null == actionId) { throw new IllegalArgumentException("权限ID不能为空"); } UacAction uacAction = uacActionMapper.selectByPrimaryKey(actionId); if (uacAction == null) { logger.error("找不到权限信息 actionId={}", actionId); throw new UacBizException(ErrorCodeEnum.UAC10014001, actionId); } // 删除角色权限表数据 不查询了 直接删除了 uacRoleActionMapper.deleteByActionId(actionId); return uacActionMapper.deleteByPrimaryKey(actionId); } @Override public void batchDeleteByIdList(List deleteIdList) { logger.info("批量删除角色. deleteIdList={}", deleteIdList); Preconditions.checkArgument(PublicUtil.isNotEmpty(deleteIdList), "删除权限ID不能为空"); int result = uacActionMapper.batchDeleteByIdList(deleteIdList); if (result < deleteIdList.size()) { throw new UacBizException(ErrorCodeEnum.UAC10014002, Joiner.on(GlobalConstant.Symbol.COMMA).join(deleteIdList)); } } @Override public void saveAction(UacAction action, LoginAuthDto loginAuthDto) { List menuIdList = action.getMenuIdList(); Long menuId; Preconditions.checkArgument(PublicUtil.isNotEmpty(menuIdList), "菜单名称不能为空"); menuId = menuIdList.get(menuIdList.size() - 1); action.setMenuId(menuId); action.setUpdateInfo(loginAuthDto); if (action.isNew()) { Long actionId = super.generateId(); action.setId(actionId); uacActionMapper.insertSelective(action); } else { int result = uacActionMapper.updateByPrimaryKeySelective(action); if (result < 1) { throw new UacBizException(ErrorCodeEnum.UAC10014003); } } } @Override public int deleteByMenuId(Long id) { Preconditions.checkArgument(id != null, "菜单ID不能为空"); return uacActionMapper.deleteByMenuId(id); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getCheckedActionList(Long roleId) { if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } return uacActionMapper.getCheckedActionList(roleId); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getOwnAuthList(Long userId) { return uacActionMapper.getOwnAuthList(userId); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getCheckedMenuList(Long roleId) { if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } return uacActionMapper.getCheckedMenuList(roleId); } @Override public List getOwnActionListByUserId(Long userId) { if (userId == null) { throw new UacBizException(ErrorCodeEnum.UAC10011001); } List uacActionList; if (Objects.equals(userId, GlobalConstant.Sys.SUPER_MANAGER_USER_ID)) { // 获取全部权限信息 uacActionList = uacActionMapper.selectAll(); } else { uacActionList = uacActionMapper.getOwnUacActionListByUserId(userId); } return uacActionList; } @Override public List listActionListByRoleId(Long roleId) { return uacActionMapper.listActionListByRoleId(roleId); } @Override public List listActionList(List uacMenus) { return uacActionMapper.listActionList(uacMenus); } @Override public UacAction matchesByUrl(String requestUrl) { List uacActionList = uacActionMapper.selectAll(); for (UacAction uacAction : uacActionList) { String url = uacAction.getUrl(); if (StringUtils.isEmpty(url)) { continue; } if (antPathMatcher.match(url, requestUrl)) { return uacAction; } } return null; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacFreeMarkerServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.paascloud.provider.service.UacFreeMarkerService; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Service; import org.springframework.ui.freemarker.FreeMarkerTemplateUtils; import javax.annotation.Resource; import java.io.IOException; import java.util.Map; /** * The class Uac free marker service. * * @author paascloud.net@gmail.com */ @Service public class UacFreeMarkerServiceImpl implements UacFreeMarkerService { @Resource private Configuration configuration; @Override public String getTemplate(Map map, String templateLocation) throws IOException, TemplateException { Preconditions.checkArgument(StringUtils.isNotEmpty(templateLocation), "模板不能为空"); Template t = configuration.getTemplate(templateLocation, "UTF-8"); return FreeMarkerTemplateUtils.processTemplateIntoString(t, map); // return VelocityEngineUtils.mergeTemplateIntoString(velocityEngine, templateLocation, "UTF-8", map); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacGroupServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.paascloud.Collections3; import com.paascloud.PublicUtil; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.UacGroupMapper; import com.paascloud.provider.mapper.UacGroupUserMapper; import com.paascloud.provider.mapper.UacRoleMapper; import com.paascloud.provider.mapper.UacRoleUserMapper; import com.paascloud.provider.model.domain.UacGroup; import com.paascloud.provider.model.domain.UacGroupUser; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.dto.group.GroupBindUserDto; import com.paascloud.provider.model.dto.group.GroupBindUserReqDto; import com.paascloud.provider.model.dto.role.BindUserDto; import com.paascloud.provider.model.dto.user.IdStatusDto; import com.paascloud.provider.model.enums.UacGroupStatusEnum; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.model.vo.GroupZtreeVo; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.service.MdcAddressService; import com.paascloud.provider.service.UacGroupService; import com.paascloud.provider.service.UacUserService; import com.paascloud.provider.utils.TreeUtil; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; import java.util.*; /** * The class Uac group service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacGroupServiceImpl extends BaseService implements UacGroupService { @Resource private UacGroupMapper uacGroupMapper; @Resource private UacGroupUserMapper uacGroupUserMapper; @Resource private UacRoleUserMapper uacRoleUserMapper; @Resource private UacRoleMapper uacRoleMapper; @Resource private UacUserService uacUserService; @Resource private MdcAddressService mdcAddressService; private int addUacGroup(UacGroup group) { if (StringUtils.isEmpty(group.getStatus())) { group.setStatus(UacGroupStatusEnum.ENABLE.getStatus()); } return uacGroupMapper.insertSelective(group); } private int editUacGroup(UacGroup group) { return uacGroupMapper.updateByPrimaryKeySelective(group); } @Override public int updateUacGroupStatusById(IdStatusDto idStatusDto, LoginAuthDto loginAuthDto) { Long groupId = idStatusDto.getId(); Integer status = idStatusDto.getStatus(); UacGroup uacGroup = new UacGroup(); uacGroup.setId(groupId); uacGroup.setStatus(status); UacGroup group = uacGroupMapper.selectByPrimaryKey(groupId); if (PublicUtil.isEmpty(group)) { throw new UacBizException(ErrorCodeEnum.UAC10015001, groupId); } if (!UacGroupStatusEnum.contains(status)) { throw new UacBizException(ErrorCodeEnum.UAC10015002); } //查询所有的组织 List totalGroupList = uacGroupMapper.selectAll(); List totalList = Lists.newArrayList(); GroupZtreeVo zTreeVo; for (UacGroup vo : totalGroupList) { zTreeVo = new GroupZtreeVo(); zTreeVo.setId(vo.getId()); totalList.add(zTreeVo); } UacGroupUser uacGroupUser = new UacGroupUser(); uacGroupUser.setUserId(loginAuthDto.getUserId()); UacGroupUser groupUser = uacGroupUserMapper.selectOne(uacGroupUser); // 查询当前登陆人所在的组织信息 UacGroup currentUserUacGroup = uacGroupMapper.selectByPrimaryKey(groupUser.getGroupId()); // 查询当前登陆人能禁用的所有子节点 List childGroupList = this.getGroupTree(currentUserUacGroup.getId()); // 计算不能禁用的组织= 所有的组织 - 禁用的所有子节点 totalList.removeAll(childGroupList); // 判断所选的组织是否在不能禁用的列表里 GroupZtreeVo zTreeVo1 = new GroupZtreeVo(); zTreeVo1.setId(group.getId()); if (totalList.contains(zTreeVo1)) { throw new UacBizException(ErrorCodeEnum.UAC10011023); } if (groupUser.getGroupId().equals(uacGroup.getId()) && UacGroupStatusEnum.ENABLE.getStatus() == group.getStatus()) { throw new UacBizException(ErrorCodeEnum.UAC10011023); } uacGroup.setGroupName(group.getGroupName()); uacGroup.setGroupCode(group.getGroupCode()); uacGroup.setVersion(group.getVersion() + 1); int result = uacGroupMapper.updateByPrimaryKeySelective(uacGroup); // 获取当前所选组织的所有子节点 List childUacGroupList = this.getGroupTree(uacGroup.getId()); // 批量修改组织状态 if (PublicUtil.isNotEmpty(childUacGroupList)) { UacGroup childGroup; for (GroupZtreeVo uacGroup1 : childUacGroupList) { if (UacGroupStatusEnum.ENABLE.getStatus() == status) { UacGroup parentGroup = uacGroupMapper.selectByPrimaryKey(uacGroup1.getpId()); if (parentGroup.getStatus() == UacGroupStatusEnum.DISABLE.getStatus()) { throw new UacBizException(ErrorCodeEnum.UAC10015003); } } childGroup = new UacGroup(); childGroup.setStatus(uacGroup.getStatus()); childGroup.setId(uacGroup1.getId()); result = uacGroupMapper.updateByPrimaryKeySelective(childGroup); if (result < 1) { throw new UacBizException(ErrorCodeEnum.UAC10015006, uacGroup1.getId()); } } } return result; } @Override public int deleteUacGroupById(Long id) { Preconditions.checkArgument(id != null, "组织id为空"); Preconditions.checkArgument(!Objects.equals(id, GlobalConstant.Sys.SUPER_MANAGER_GROUP_ID), "该组织不能删除"); // 根据前台传入的组织参数校验该组织是否存在 UacGroup uacGroup = uacGroupMapper.selectByPrimaryKey(id); if (PublicUtil.isEmpty(uacGroup)) { throw new UacBizException(ErrorCodeEnum.UAC10015004, id); } //判断该组织下是否存在子节点 UacGroup childGroup = new UacGroup(); childGroup.setPid(id); List childGroupList = uacGroupMapper.select(childGroup); if (PublicUtil.isNotEmpty(childGroupList)) { throw new UacBizException(ErrorCodeEnum.UAC10015007, id); } //判断该组织下是否存在用户 UacGroupUser uacGroupUser = new UacGroupUser(); uacGroupUser.setGroupId(id); List uacGroupUserList = uacGroupUserMapper.select(uacGroupUser); if (PublicUtil.isNotEmpty(uacGroupUserList)) { throw new UacBizException(ErrorCodeEnum.UAC10015008, id); } return mapper.deleteByPrimaryKey(id); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public UacGroup queryById(Long groupId) { Preconditions.checkArgument(PublicUtil.isNotEmpty(groupId), "组织Id不能为空"); UacGroup query = new UacGroup(); query.setId(groupId); return uacGroupMapper.selectOne(query); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getGroupTree(Long groupId) { // 1. 如果是仓库则 直接把仓库信息封装成ztreeVo返回 List tree = Lists.newArrayList(); UacGroup uacGroup = uacGroupMapper.selectByPrimaryKey(groupId); GroupZtreeVo zTreeMenuVo = buildGroupZTreeVoByGroup(uacGroup); if (0L == uacGroup.getPid()) { zTreeMenuVo.setOpen(true); } tree.add(zTreeMenuVo); // 2.如果是组织id则遍历组织+仓库的树结构 // 如果是组织 则查询父id为 UacGroup uacGroupQuery = new UacGroup(); uacGroupQuery.setPid(groupId); List groupList = uacGroupMapper.select(uacGroupQuery); if (PublicUtil.isNotEmpty(groupList)) { tree = buildNode(groupList, tree); } return tree; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getGroupTreeListByUserId(Long userId) { UacGroupUser groupUser = uacGroupUserMapper.getByUserId(userId); Long groupId = groupUser.getGroupId(); //查询当前登陆人所在的组织信息 UacGroup currentUserUacGroup = uacGroupMapper.selectByPrimaryKey(groupId); //获取当前所选组织的所有子节点 List childUacGroupList = this.getGroupTree(currentUserUacGroup.getId()); return this.buildGroupTree(childUacGroupList, groupId); } private List buildGroupTree(List childUacGroupList, Long currentGroupId) { List listVo = Lists.newArrayList(); MenuVo menuVo; for (GroupZtreeVo group : childUacGroupList) { menuVo = new MenuVo(); menuVo.setId(group.getId()); if (currentGroupId.equals(group.getId())) { menuVo.setPid(0L); } else { menuVo.setPid(group.getpId()); } menuVo.setMenuCode(group.getGroupCode()); menuVo.setMenuName(group.getGroupName()); listVo.add(menuVo); } return TreeUtil.getChildMenuVos(listVo, 0L); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public GroupBindUserDto getGroupBindUserDto(Long groupId, Long currentUserId) { GroupBindUserDto groupBindUserDto = new GroupBindUserDto(); Set alreadyBindUserIdSet = Sets.newHashSet(); UacGroup uacGroup = uacGroupMapper.selectByPrimaryKey(groupId); if (PublicUtil.isEmpty(uacGroup)) { logger.error("找不到uacGroup={}, 的组织", uacGroup); throw new UacBizException(ErrorCodeEnum.UAC10015001, groupId); } // 查询所有用户包括已禁用的用户 List bindUserDtoList = uacRoleMapper.selectAllNeedBindUser(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID, currentUserId); // 该组织已经绑定的用户 List setAlreadyBindUserSet = uacGroupUserMapper.listByGroupId(groupId); Set allUserSet = new HashSet<>(bindUserDtoList); for (UacGroupUser uacGroupUser : setAlreadyBindUserSet) { alreadyBindUserIdSet.add(uacGroupUser.getUserId()); } groupBindUserDto.setAllUserSet(allUserSet); groupBindUserDto.setAlreadyBindUserIdSet(alreadyBindUserIdSet); return groupBindUserDto; } /** * Bind uac user 4 group int. * * @param groupBindUserReqDto the group bind user req dto * @param authResDto the auth res dto */ @Override public void bindUacUser4Group(GroupBindUserReqDto groupBindUserReqDto, LoginAuthDto authResDto) { if (groupBindUserReqDto == null) { logger.error("参数不能为空"); throw new IllegalArgumentException("参数不能为空"); } Long groupId = groupBindUserReqDto.getGroupId(); Long loginUserId = authResDto.getUserId(); List userIdList = groupBindUserReqDto.getUserIdList(); if (null == groupId) { throw new IllegalArgumentException("組織ID不能为空"); } UacGroup group = uacGroupMapper.selectByPrimaryKey(groupId); if (group == null) { logger.error("找不到角色信息 groupId={}", groupId); throw new UacBizException(ErrorCodeEnum.UAC10015001, groupId); } if (PublicUtil.isNotEmpty(userIdList) && userIdList.contains(loginUserId)) { logger.error("不能操作当前登录用户 userId={}", loginUserId); throw new UacBizException(ErrorCodeEnum.UAC10011023); } // 查询超级管理员用户Id集合 List superUserList = uacRoleUserMapper.listSuperUser(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID); List unionList = Collections3.intersection(userIdList, superUserList); if (PublicUtil.isNotEmpty(userIdList) && PublicUtil.isNotEmpty(unionList)) { logger.error("不能操作超级管理员用户 超级用户={}", unionList); throw new UacBizException(ErrorCodeEnum.UAC10011023); } // 1. 先取消对该角色的用户绑定(不包含超级管理员用户) List groupUsers = uacGroupUserMapper.listByGroupId(groupId); if (PublicUtil.isNotEmpty(groupUsers)) { uacGroupUserMapper.deleteExcludeSuperMng(groupId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID); } if (PublicUtil.isEmpty(userIdList)) { // 取消该角色的所有用户的绑定 logger.info("取消绑定所有非超级管理员用户成功"); return; } // 绑定所选用户 for (Long userId : userIdList) { UacUser uacUser = uacUserService.queryByUserId(userId); if (PublicUtil.isEmpty(uacUser)) { logger.error("找不到绑定的用户 userId={}", userId); throw new UacBizException(ErrorCodeEnum.UAC10011024, userId); } UacGroupUser uacGroupUser = new UacGroupUser(); uacGroupUser.setUserId(userId); uacGroupUser.setGroupId(groupId); uacGroupUserMapper.insertSelective(uacGroupUser); } } @Override public int saveUacGroup(UacGroup group, LoginAuthDto loginAuthDto) { int result; Preconditions.checkArgument(!StringUtils.isEmpty(group.getPid()), "上级节点不能为空"); UacGroup parenGroup = uacGroupMapper.selectByPrimaryKey(group.getPid()); if (PublicUtil.isEmpty(parenGroup)) { throw new UacBizException(ErrorCodeEnum.UAC10015009, group.getPid()); } setGroupAddress(group); group.setUpdateInfo(loginAuthDto); if (group.isNew()) { Long groupId = super.generateId(); group.setId(groupId); group.setLevel(parenGroup.getLevel() + 1); result = this.addUacGroup(group); } else { result = this.editUacGroup(group); } return result; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public UacGroup getById(Long id) { UacGroup uacGroup = uacGroupMapper.selectByPrimaryKey(id); if (PublicUtil.isEmpty(uacGroup)) { throw new UacBizException(ErrorCodeEnum.UAC10015001, id); } UacGroup parentGroup = uacGroupMapper.selectByPrimaryKey(uacGroup.getPid()); if (parentGroup != null) { uacGroup.setParentGroupCode(parentGroup.getGroupCode()); uacGroup.setParentGroupName(parentGroup.getGroupName()); } // 处理饿了吗级联菜单回显地址 Long provinceId = uacGroup.getProvinceId(); Long cityId = uacGroup.getCityId(); Long areaId = uacGroup.getAreaId(); Long streetId = uacGroup.getStreetId(); List addressList = Lists.newArrayList(); if (provinceId != null) { addressList.add(provinceId); } if (cityId != null) { addressList.add(cityId); } if (areaId != null) { addressList.add(areaId); } if (streetId != null) { addressList.add(streetId); } uacGroup.setAddressList(addressList); return uacGroup; } private void setGroupAddress(UacGroup uacGroup) { List addressList = uacGroup.getAddressList(); Preconditions.checkArgument(!PublicUtil.isEmpty(addressList), "地址不能为空"); Preconditions.checkArgument(addressList.size() >= GlobalConstant.TWO_INT, "地址至少选两级"); StringBuilder groupAddress = new StringBuilder(); int level = 0; for (Long addressId : addressList) { // 根据地址ID获取地址名称 String addressName = mdcAddressService.getAddressById(addressId).getName(); if (level == 0) { uacGroup.setProvinceId(addressId); uacGroup.setProvinceName(addressName); } else if (level == 1) { uacGroup.setCityId(addressId); uacGroup.setCityName(addressName); } else if (level == 2) { uacGroup.setAreaId(addressId); uacGroup.setAreaName(addressName); } else { uacGroup.setStreetId(addressId); uacGroup.setStreetName(addressName); } groupAddress.append(addressName); level++; } uacGroup.setGroupAddress(groupAddress.toString()); } private GroupZtreeVo buildGroupZTreeVoByGroup(UacGroup group) { GroupZtreeVo vo = new GroupZtreeVo(); vo.setId(group.getId()); vo.setpId(group.getPid()); vo.setName(group.getGroupName()); vo.setType(group.getType()); vo.setStatus(group.getStatus()); vo.setLeaf(group.getLevel()); vo.setLevel(group.getLevel()); vo.setGroupCode(group.getGroupCode()); vo.setContact(group.getContact()); vo.setContactPhone(group.getContactPhone()); vo.setCreatedTime(group.getCreatedTime() == null ? new Date() : group.getCreatedTime()); vo.setCreator(group.getCreator()); vo.setGroupAddress(group.getGroupAddress()); vo.setGroupName(group.getGroupName()); return vo; } private List buildNode(List groupList, List tree) { for (UacGroup group : groupList) { GroupZtreeVo groupZTreeVo = buildGroupZTreeVoByGroup(group); if (0L == group.getPid()) { groupZTreeVo.setOpen(true); } // 设置根节点 tree.add(groupZTreeVo); UacGroup query = new UacGroup(); query.setPid(group.getId()); List groupChildrenList = uacGroupMapper.select(query); // 有子节点 递归查询 if (PublicUtil.isNotEmpty(groupChildrenList)) { buildNode(groupChildrenList, tree); } } return tree; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacGroupUserServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.UacGroupUserMapper; import com.paascloud.provider.model.domain.UacGroup; import com.paascloud.provider.model.domain.UacGroupUser; import com.paascloud.provider.service.UacGroupUserService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.util.List; /** * The class Uac group user service. * * @author paascloud.net@gmail.com */ @Service public class UacGroupUserServiceImpl extends BaseService implements UacGroupUserService { @Resource private UacGroupUserMapper uacGroupUserMapper; @Override public UacGroupUser queryByUserId(Long userId) { return uacGroupUserMapper.getByUserId(userId); } @Override public int updateByUserId(UacGroupUser uacGroupUser) { return uacGroupUserMapper.updateByUserId(uacGroupUser); } @Override public List getGroupListByUserId(Long userId) { return uacGroupUserMapper.selectGroupListByUserId(userId); } @Override public void saveUserGroup(Long userId, Long groupId) { UacGroupUser groupUser = new UacGroupUser(); groupUser.setUserId(userId); groupUser.setGroupId(groupId); uacGroupUserMapper.insertSelective(groupUser); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacLogServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.paascloud.PublicUtil; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.annotation.OperationLogDto; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.UacLogMapper; import com.paascloud.provider.model.domain.UacAction; import com.paascloud.provider.model.domain.UacLog; import com.paascloud.provider.model.dto.log.UacLogMainDto; import com.paascloud.provider.service.OpcRpcService; import com.paascloud.provider.service.UacActionService; import com.paascloud.provider.service.UacLogService; import org.modelmapper.ModelMapper; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * The class Uac log service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacLogServiceImpl extends BaseService implements UacLogService { @Resource private UacLogMapper uacLogMapper; @Resource private OpcRpcService opcRpcService; @Resource private UacActionService uacActionService; @Override public int saveLog(UacLog uacLog, LoginAuthDto loginAuthDto) { // 根据uri 查询url对应的权限 UacAction uacAction = uacActionService.matchesByUrl(uacLog.getRequestUrl()); if (uacAction != null) { uacLog.setActionId(uacAction.getId()); uacLog.setActionCode(uacAction.getActionCode()); uacLog.setActionName(uacAction.getActionName()); } uacLog.setUpdateInfo(loginAuthDto); uacLog.setId(this.generateId()); return uacLogMapper.insertSelective(uacLog); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List selectUserLogListByUserId(Long userId) { return uacLogMapper.selectUserLogListByUserId(userId); } @Override public Integer saveOperationLog(OperationLogDto operationLogDto) { // 根据uri 查询url对应的权限 UacAction uacAction = uacActionService.matchesByUrl(operationLogDto.getRequestUrl()); if (uacAction != null) { operationLogDto.setActionCode(uacAction.getActionCode()); operationLogDto.setActionName(uacAction.getActionName()); operationLogDto.setActionId(uacAction.getId()); } ModelMapper modelMapper = new ModelMapper(); UacLog uacLog = modelMapper.map(operationLogDto, UacLog.class); uacLog.setId(generateId()); // 获取操作位置 String locationById = opcRpcService.getLocationById(operationLogDto.getIp()); uacLog.setLocation(locationById); return uacLogMapper.insertSelective(uacLog); } @Override public PageInfo queryLogListWithPage(UacLogMainDto uacLogQueryDtoPage) { List menuIdList = uacLogQueryDtoPage.getMenuIdList(); Long actionId = null; if (PublicUtil.isNotEmpty(menuIdList)) { actionId = menuIdList.get(menuIdList.size() - 1); } uacLogQueryDtoPage.setMenuId(actionId); PageHelper.startPage(uacLogQueryDtoPage.getPageNum(), uacLogQueryDtoPage.getPageSize()); List actionList = uacLogMapper.queryLogListWithPage(uacLogQueryDtoPage); return new PageInfo<>(actionList); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacLoginServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacLoginServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.paascloud.PublicUtil; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.model.constant.UacConstant; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.dto.user.LoginRespDto; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.security.SecurityUtils; import com.paascloud.provider.service.UacLoginService; import com.paascloud.provider.service.UacMenuService; import com.paascloud.provider.service.UacUserService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * The class Uac login service. * * @author paascloud.net@gmail.com */ @Slf4j @Service @Transactional(rollbackFor = Exception.class) public class UacLoginServiceImpl implements UacLoginService { @Resource private UacUserService uacUserService; @Resource private UacMenuService uacMenuService; @Override public LoginRespDto loginAfter(Long applicationId) { LoginRespDto loginRespDto = new LoginRespDto(); String loginName = SecurityUtils.getCurrentLoginName(); if (StringUtils.isEmpty(loginName)) { log.error("操作超时, 请重新登录 loginName={}", loginName); Preconditions.checkArgument(StringUtils.isNotEmpty(loginName), "操作超时, 请重新登录"); } UacUser uacUser = uacUserService.findByLoginName(loginName); if (PublicUtil.isEmpty(uacUser)) { log.info("找不到用户信息 loginName={}", loginName); throw new UacBizException(ErrorCodeEnum.UAC10011002, loginName); } LoginAuthDto loginAuthDto = this.getLoginAuthDto(uacUser); List menuVoList = uacMenuService.getMenuVoList(uacUser.getId(), applicationId); if (PublicUtil.isNotEmpty(menuVoList) && UacConstant.MENU_ROOT.equals(menuVoList.get(0).getMenuCode())) { menuVoList = menuVoList.get(0).getSubMenu(); } loginRespDto.setLoginAuthDto(loginAuthDto); loginRespDto.setMenuList(menuVoList); return loginRespDto; } private LoginAuthDto getLoginAuthDto(UacUser uacUser) { LoginAuthDto loginAuthDto = new LoginAuthDto(); loginAuthDto.setUserId(uacUser.getId()); loginAuthDto.setUserName(uacUser.getUserName()); loginAuthDto.setLoginName(uacUser.getLoginName()); return loginAuthDto; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacMenuServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacMenuServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.paascloud.PublicUtil; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.UacMenuMapper; import com.paascloud.provider.model.constant.MenuConstant; import com.paascloud.provider.model.domain.UacMenu; import com.paascloud.provider.model.domain.UacRoleMenu; import com.paascloud.provider.model.dto.menu.UacMenuStatusDto; import com.paascloud.provider.model.enums.UacMenuStatusEnum; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.model.vo.ViewMenuVo; import com.paascloud.provider.service.UacActionService; import com.paascloud.provider.service.UacMenuService; import com.paascloud.provider.service.UacRoleMenuService; import com.paascloud.provider.utils.TreeUtil; import org.apache.commons.lang3.StringUtils; import org.modelmapper.ModelMapper; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; /** * The class Uac menu service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacMenuServiceImpl extends BaseService implements UacMenuService { @Resource private UacMenuMapper uacMenuMapper; @Resource private UacRoleMenuService uacRoleMenuService; @Resource private UacActionService uacActionService; @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getMenuVoList(Long userId, Long applicationId) { // 1.查询该用户下所有的菜单列表 List menuVoList = Lists.newArrayList(); List menuList; Set menuSet = Sets.newHashSet(); // 如果是admin则返回所有的菜单 if (userId == 1L) { // 1.1 查询该用户下所有的菜单列表 UacMenu uacMenuQuery = new UacMenu(); uacMenuQuery.setStatus(UacMenuStatusEnum.ENABLE.getType()); uacMenuQuery.setApplicationId(applicationId); uacMenuQuery.setOrderBy(" level asc,number asc"); menuList = uacMenuMapper.selectMenuList(uacMenuQuery); } else { // 1.2查询该用户下所有的菜单列表 menuVoList = uacMenuMapper.findMenuVoListByUserId(userId); if (PublicUtil.isEmpty(menuVoList)) { return null; } Set ids = Sets.newHashSet(); for (final MenuVo menuVo : menuVoList) { ids.add(menuVo.getId()); } List ownMenuList = this.getMenuList(ids); // 查出所有含有菜单的菜单信息 UacMenu uacMenu = new UacMenu(); uacMenu.setStatus(UacMenuStatusEnum.ENABLE.getType()); List allMenuList = this.selectMenuList(uacMenu); Map map = Maps.newHashMap(); for (final UacMenu menu : allMenuList) { map.put(menu.getId(), menu); } for (final UacMenu menu : ownMenuList) { getPid(menuSet, menu, map); } menuList = new ArrayList<>(menuSet); } List list = getMenuVo(menuList); if (PublicUtil.isNotEmpty(menuVoList)) { list.addAll(menuVoList); } // 2.递归成树 return TreeUtil.getChildMenuVos(list, 0L); } private void getPid(Set menuSet, UacMenu menu, Map map) { UacMenu parent = map.get(menu.getPid()); if (parent != null && parent.getId() != 0L) { menuSet.add(parent); getPid(menuSet, parent, map); } } private List getMenuVo(List list) { List menuVoList = Lists.newArrayList(); for (UacMenu uacMenu : list) { MenuVo menuVo = new MenuVo(); BeanUtils.copyProperties(uacMenu, menuVo); menuVo.setUrl(uacMenu.getUrl()); menuVo.setMenuName(uacMenu.getMenuName()); menuVoList.add(menuVo); } return menuVoList; } @Override public int saveUacMenu(UacMenu menu, LoginAuthDto loginAuthDto) { Long pid = menu.getPid(); menu.setUpdateInfo(loginAuthDto); UacMenu parentMenu = mapper.selectByPrimaryKey(pid); if (PublicUtil.isEmpty(parentMenu)) { throw new UacBizException(ErrorCodeEnum.UAC10013001, pid); } if (menu.isNew()) { UacMenu updateMenu = new UacMenu(); menu.setLevel(parentMenu.getLevel() + 1); updateMenu.setLeaf(MenuConstant.MENU_LEAF_NO); updateMenu.setId(pid); Long menuId = super.generateId(); menu.setId(menuId); int result = mapper.updateByPrimaryKeySelective(updateMenu); if (result < 1) { throw new UacBizException(ErrorCodeEnum.UAC10013002, menuId); } menu.setStatus(UacMenuStatusEnum.ENABLE.getType()); menu.setCreatorId(loginAuthDto.getUserId()); menu.setCreator(loginAuthDto.getUserName()); menu.setLastOperatorId(loginAuthDto.getUserId()); menu.setLastOperator(loginAuthDto.getUserName()); // 新增的菜单是叶子节点 menu.setLeaf(MenuConstant.MENU_LEAF_YES); return uacMenuMapper.insertSelective(menu); } else { return uacMenuMapper.updateByPrimaryKeySelective(menu); } } @Override public int deleteUacMenuById(Long id, LoginAuthDto loginAuthDto) { Preconditions.checkArgument(id != null, "菜单id不能为空"); int result; // 获取当前菜单信息 UacMenu uacMenuQuery = new UacMenu(); uacMenuQuery.setId(id); uacMenuQuery = mapper.selectOne(uacMenuQuery); if (PublicUtil.isEmpty(uacMenuQuery)) { throw new UacBizException(ErrorCodeEnum.UAC10013003, id); } // 删除菜单与角色的关联关系 UacRoleMenu uacRoleMenu = new UacRoleMenu(); uacRoleMenu.setMenuId(id); uacRoleMenuService.delete(uacRoleMenu); // 删除菜单 result = uacMenuMapper.deleteByPrimaryKey(id); if (result < 1) { logger.error("删除菜单失败 menuId={}", id); throw new UacBizException(ErrorCodeEnum.UAC10013008, id); } // 删除权限 // TODO 应该先查询再删除 uacActionService.deleteByMenuId(id); // 修改当前删除菜单的父菜单是否是叶子节点 UacMenu updateParentUacMenu = new UacMenu(); updateParentUacMenu.setId(uacMenuQuery.getPid()); updateParentUacMenu.setLeaf(MenuConstant.MENU_LEAF_YES); // 是二三级 if (Objects.equals(MenuConstant.MENU_LEVEL_TWO, uacMenuQuery.getLevel()) || Objects.equals(MenuConstant.MENU_LEVEL_THREE, uacMenuQuery.getLevel())) { // 查询是否是叶子节点 int count = uacMenuMapper.selectMenuChildCountByPid(uacMenuQuery.getPid()); if (count == 0) { uacMenuMapper.updateByPrimaryKeySelective(updateParentUacMenu); } } return result; } @Override public int enableMenuList(List menuList, LoginAuthDto loginAuthDto) { UacMenu uacMenuUpdate = new UacMenu(); int sum = 0; for (UacMenu menu : menuList) { uacMenuUpdate.setId(menu.getId()); uacMenuUpdate.setVersion(menu.getVersion() + 1); uacMenuUpdate.setStatus(UacMenuStatusEnum.ENABLE.getType()); uacMenuUpdate.setLastOperator(loginAuthDto.getLoginName()); uacMenuUpdate.setLastOperatorId(loginAuthDto.getUserId()); uacMenuUpdate.setUpdateTime(new Date()); int result = mapper.updateByPrimaryKeySelective(uacMenuUpdate); if (result > 0) { sum += 1; } else { throw new UacBizException(ErrorCodeEnum.UAC10013004, menu.getId()); } } return sum; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getAllParentMenuByMenuId(Long menuId) { UacMenu uacMenuQuery = new UacMenu(); uacMenuQuery.setId(menuId); uacMenuQuery = mapper.selectOne(uacMenuQuery); List uacMenuList = Lists.newArrayList(); uacMenuList = buildParentNote(uacMenuList, uacMenuQuery); return uacMenuList; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getAllChildMenuByMenuId(Long menuId, String menuStatus) { UacMenu uacMenuQuery = new UacMenu(); uacMenuQuery.setId(menuId); uacMenuQuery = mapper.selectOne(uacMenuQuery); List uacMenuList = Lists.newArrayList(); uacMenuList = buildNode(uacMenuList, uacMenuQuery, menuStatus); return uacMenuList; } @Override public int disableMenuList(List menuList, LoginAuthDto loginAuthDto) { UacMenu uacMenuUpdate = new UacMenu(); int sum = 0; for (UacMenu menu : menuList) { uacMenuUpdate.setId(menu.getId()); uacMenuUpdate.setVersion(menu.getVersion() + 1); uacMenuUpdate.setStatus(UacMenuStatusEnum.DISABLE.getType()); uacMenuUpdate.setLastOperator(loginAuthDto.getLoginName()); uacMenuUpdate.setLastOperatorId(loginAuthDto.getUserId()); uacMenuUpdate.setUpdateTime(new Date()); int result = mapper.updateByPrimaryKeySelective(uacMenuUpdate); if (result > 0) { sum += 1; } else { throw new UacBizException(ErrorCodeEnum.UAC10013005, menu.getId()); } } return sum; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List selectMenuList(UacMenu uacMenu) { return uacMenuMapper.selectMenuList(uacMenu); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List findAllMenuListByAuthResDto(LoginAuthDto authResDto) { List voList = Lists.newArrayList(); Preconditions.checkArgument(authResDto != null, "无权访问"); if (!GlobalConstant.Sys.SUPER_MANAGER_LOGIN_NAME.equals(authResDto.getLoginName())) { voList = uacMenuMapper.findMenuVoListByUserId(authResDto.getUserId()); } else { UacMenu uacMenuQuery = new UacMenu(); // 查询启用的菜单 uacMenuQuery.setStatus(UacMenuStatusEnum.ENABLE.getType()); uacMenuQuery.setOrderBy(" level asc,number asc"); List list = uacMenuMapper.select(uacMenuQuery); for (UacMenu uacMenu : list) { MenuVo menuVo = new MenuVo(); BeanUtils.copyProperties(uacMenu, menuVo); voList.add(menuVo); } } return voList; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public ViewMenuVo getViewVoById(Long id) { Preconditions.checkArgument(id != null, "菜单ID不能为空"); UacMenu menu = uacMenuMapper.selectByPrimaryKey(id); if (menu == null) { logger.error("找不到菜单信息id={}", id); throw new UacBizException(ErrorCodeEnum.UAC10013003, id); } // 获取父级菜单信息 UacMenu parentMenu = uacMenuMapper.selectByPrimaryKey(menu.getPid()); ModelMapper modelMapper = new ModelMapper(); ViewMenuVo menuVo = modelMapper.map(menu, ViewMenuVo.class); if (parentMenu != null) { menuVo.setParentMenuName(parentMenu.getMenuName()); } return menuVo; } @Override public void updateUacMenuStatusById(UacMenuStatusDto uacMenuStatusDto, LoginAuthDto loginAuthDto) { Long id = uacMenuStatusDto.getId(); String status = uacMenuStatusDto.getStatus(); Preconditions.checkArgument(id != null, "菜单ID不能为空"); Preconditions.checkArgument(StringUtils.isNotEmpty(status), "菜单状态不能为空"); UacMenu uacMenuQuery = this.selectByKey(id); if (MenuConstant.MENU_LEVEL_ROOT.equals(uacMenuQuery.getLevel())) { throw new UacBizException(ErrorCodeEnum.UAC10013007); } // 要处理的菜单集合 List menuList = Lists.newArrayList(); int result; if (status.equals(UacMenuStatusEnum.DISABLE.getType())) { // 获取菜单以及子菜单 menuList = this.getAllChildMenuByMenuId(id, UacMenuStatusEnum.ENABLE.getType()); // 禁用菜单以及子菜单 result = this.disableMenuList(menuList, loginAuthDto); } else { // 获取菜单、其子菜单以及父菜单 UacMenu uacMenu = new UacMenu(); uacMenu.setPid(id); result = this.selectCount(uacMenu); // 此菜单含有子菜单 if (result > 0) { menuList = this.getAllChildMenuByMenuId(id, UacMenuStatusEnum.DISABLE.getType()); } List menuListTemp = this.getAllParentMenuByMenuId(id); for (UacMenu menu : menuListTemp) { if (!menuList.contains(menu)) { menuList.add(menu); } } // 启用菜单、其子菜单以及父菜单 result = this.enableMenuList(menuList, loginAuthDto); } if (result < 1) { throw new UacBizException(ErrorCodeEnum.UAC10013006, id); } } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public boolean checkMenuHasChildMenu(Long pid) { Preconditions.checkArgument(pid != null, "菜单pid不能为空"); UacMenu uacMenu = new UacMenu(); uacMenu.setStatus(UacMenuStatusEnum.ENABLE.getType()); uacMenu.setPid(pid); return mapper.selectCount(uacMenu) > 0; } @Override public List listMenuListByRoleId(Long roleId) { List menuList = uacMenuMapper.listMenuListByRoleId(roleId); List addMenuList = Lists.newArrayList(); if (PublicUtil.isNotEmpty(menuList)) { for (UacMenu uacMenu : menuList) { getMenuList(addMenuList, uacMenu.getPid()); } } menuList.addAll(addMenuList); return new ArrayList<>(new HashSet<>(menuList)); } @Override public List getMenuList(final Set menuIdList) { return uacMenuMapper.listMenu(menuIdList); } private List getMenuList(List uacMenuList, Long menuId) { UacMenu uacMenu = uacMenuMapper.selectByPrimaryKey(menuId); if (uacMenu != null) { Long pid = uacMenu.getPid(); if (pid != null) { uacMenuList.add(uacMenu); getMenuList(uacMenuList, pid); } } return uacMenuList; } /** * 递归获取菜单的子菜单 */ private List buildNode(List uacMenuList, UacMenu uacMenu, String menuStatus) { List uacMenuQueryList = mapper.select(uacMenu); UacMenu uacMenuQuery; for (UacMenu menu : uacMenuQueryList) { // 启用状态 if (menuStatus.equals(menu.getStatus()) && !MenuConstant.MENU_LEVEL_ROOT.equals(menu.getLevel())) { uacMenuList.add(menu); } uacMenuQuery = new UacMenu(); uacMenuQuery.setPid(menu.getId()); buildNode(uacMenuList, uacMenuQuery, menuStatus); } return uacMenuList; } /** * 递归获取菜单的父菜单 */ private List buildParentNote(List uacMenuList, UacMenu uacMenu) { List uacMenuQueryList = mapper.select(uacMenu); UacMenu uacMenuQuery; for (UacMenu menu : uacMenuQueryList) { if (UacMenuStatusEnum.DISABLE.getType().equals(menu.getStatus()) && !MenuConstant.MENU_LEVEL_ROOT.equals(menu.getLevel())) { // 禁用状态 uacMenuList.add(menu); } uacMenuQuery = new UacMenu(); uacMenuQuery.setId(menu.getPid()); buildParentNote(uacMenuList, uacMenuQuery); } return uacMenuList; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacPermissionServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.google.common.base.Joiner; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.provider.security.SecurityUtils; import com.paascloud.provider.service.UacPermissionService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.security.core.Authentication; import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.stereotype.Component; import org.springframework.util.AntPathMatcher; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.Set; /** * The class Uac permission service. * * @author paascloud.net @gmail.com */ @Slf4j @Component("permissionService") public class UacPermissionServiceImpl implements UacPermissionService { private AntPathMatcher antPathMatcher = new AntPathMatcher(); private static final String OAUTH2_CLIENT_PREFIX = "paascloud-client-"; @Resource private ClientDetailsService clientDetailsService; @Override public boolean hasPermission(Authentication authentication, HttpServletRequest request) { String currentLoginName = SecurityUtils.getCurrentLoginName(); Set currentAuthorityUrl = SecurityUtils.getCurrentAuthorityUrl(); String requestURI = request.getRequestURI(); log.info("验证权限loginName={}, requestURI={}, hasAuthorityUrl={}", currentLoginName, requestURI, Joiner.on(GlobalConstant.Symbol.COMMA).join(currentAuthorityUrl)); // 超级管理员 全部都可以访问 if (StringUtils.equals(currentLoginName, GlobalConstant.Sys.SUPER_MANAGER_LOGIN_NAME)) { return true; } // DEMO项目Feign客户端具有所有权限, 如果需要则在角色权限中控制 if (currentLoginName.contains(OAUTH2_CLIENT_PREFIX)) { ClientDetails clientDetails = clientDetailsService.loadClientByClientId(currentLoginName); return clientDetails != null; } for (final String authority : currentAuthorityUrl) { // DEMO项目放过查询权限 if (requestURI.contains("query") || requestURI.contains("get") || requestURI.contains("check") || requestURI.contains("select")) { return true; } if (antPathMatcher.match(authority, requestURI)) { return true; } } return false; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacRoleActionServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.UacRoleActionMapper; import com.paascloud.provider.model.domain.UacRoleAction; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.service.UacRoleActionService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; import java.util.Set; /** * The class Uac role action service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacRoleActionServiceImpl extends BaseService implements UacRoleActionService { @Resource private UacRoleActionMapper uacRoleActionMapper; @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List listByRoleId(Long roleId) { if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } UacRoleAction roleMenu = new UacRoleAction(); roleMenu.setRoleId(roleId); return uacRoleActionMapper.select(roleMenu); } @Override public void deleteByRoleId(Long roleId) { if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } UacRoleAction roleMenu = new UacRoleAction(); roleMenu.setRoleId(roleId); uacRoleActionMapper.delete(roleMenu); } @Override public void insert(Long roleId, Set actionIdList) { if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } UacRoleAction uacRoleAction = new UacRoleAction(); uacRoleAction.setRoleId(roleId); for (Long actionId : actionIdList) { uacRoleAction.setActionId(actionId); uacRoleActionMapper.insert(uacRoleAction); } } @Override public int deleteByRoleIdList(final List roleIdList) { return uacRoleActionMapper.deleteByRoleIdList(roleIdList); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacRoleMenuServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.UacRoleMenuMapper; import com.paascloud.provider.model.domain.UacRoleMenu; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.service.UacRoleMenuService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; import java.util.Set; /** * The class Uac role menu service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacRoleMenuServiceImpl extends BaseService implements UacRoleMenuService { @Resource private UacRoleMenuMapper uacRoleMenuMapper; @Override public int delRoleMenuList(Set uacRoleMenus) { int result = 0; for (UacRoleMenu uacRoleMenu : uacRoleMenus) { result += uacRoleMenuMapper.delete(uacRoleMenu); } return result; } @Override public void deleteByRoleId(Long roleId) { if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } UacRoleMenu roleMenu = new UacRoleMenu(); roleMenu.setRoleId(roleId); uacRoleMenuMapper.delete(roleMenu); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List listByRoleId(Long roleId) { if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } UacRoleMenu roleMenu = new UacRoleMenu(); roleMenu.setRoleId(roleId); return uacRoleMenuMapper.select(roleMenu); } @Override public void insert(Long roleId, Set menuIdList) { if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } UacRoleMenu uacRoleMenu = new UacRoleMenu(); uacRoleMenu.setRoleId(roleId); for (Long menuId : menuIdList) { uacRoleMenu.setMenuId(menuId); uacRoleMenuMapper.insertSelective(uacRoleMenu); } } @Override public void deleteByRoleIdList(final List roleIdList) { uacRoleMenuMapper.deleteByRoleIdList(roleIdList); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacRoleServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.paascloud.Collections3; import com.paascloud.PublicUtil; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.UacRoleMapper; import com.paascloud.provider.mapper.UacRoleMenuMapper; import com.paascloud.provider.model.domain.*; import com.paascloud.provider.model.dto.role.*; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.model.vo.BindAuthVo; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.model.vo.RoleVo; import com.paascloud.provider.model.vo.role.MenuCountVo; import com.paascloud.provider.service.*; import com.paascloud.provider.utils.TreeUtil; import org.springframework.beans.BeanUtils; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.*; /** * The class Uac role service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacRoleServiceImpl extends BaseService implements UacRoleService { @Resource private UacRoleMapper uacRoleMapper; @Resource private UacRoleUserService uacRoleUserService; @Resource private UacRoleMenuMapper uacRoleMenuMapper; @Resource private UacUserService uacUserService; @Resource private UacRoleMenuService uacRoleMenuService; @Resource private UacMenuService uacMenuService; @Resource private UacActionService uacActionService; @Resource private UacRoleActionService uacRoleActionService; @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public UacRole findByRoleCode(String roleCode) { return uacRoleMapper.findByRoleCode(roleCode); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List queryRoleListWithPage(UacRole role) { return uacRoleMapper.queryRoleListWithPage(role); } @Override public int deleteRoleById(Long roleId) { //查询该角色下是否有用户绑定, 有的话提醒不能删除 if (null == roleId) { throw new IllegalArgumentException(ErrorCodeEnum.UAC10012001.msg()); } // 超级管理员不能删除 if (Objects.equals(roleId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID)) { throw new UacBizException(ErrorCodeEnum.UAC10012003); } List uruList = uacRoleUserService.listByRoleId(roleId); if (!uruList.isEmpty()) { uacRoleUserService.deleteByRoleId(roleId); } uacRoleActionService.deleteByRoleId(roleId); uacRoleMenuService.deleteByRoleId(roleId); return uacRoleMapper.deleteByPrimaryKey(roleId); } @Override public int saveRole(UacRole role, LoginAuthDto loginAuthDto) { int result = 0; role.setUpdateInfo(loginAuthDto); if (role.isNew()) { role.setId(super.generateId()); uacRoleMapper.insertSelective(role); } else { result = uacRoleMapper.updateByPrimaryKeySelective(role); } return result; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getAuthTreeNoCheckMenu(Long roleId) { //查询某个角色下一级菜单下的二级菜单个数, 去掉二级菜单个数为0的一级菜单选中状态 List menuCountVos = uacRoleMenuMapper.countChildMenuNum(roleId); List noCheckedMenu = Lists.newArrayList(); for (MenuCountVo vo : menuCountVos) { noCheckedMenu.add(vo.getId()); } return noCheckedMenu; } @Override public void bindAction(RoleBindActionDto grantAuthRole) { Long roleId = grantAuthRole.getRoleId(); Set actionIdList = grantAuthRole.getActionIdList(); if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } if (Objects.equals(roleId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID)) { logger.error("越权操作, 超级管理员用户不允许操作"); throw new UacBizException(ErrorCodeEnum.UAC10011023); } UacRole uacRole = uacRoleMapper.selectByPrimaryKey(roleId); if (uacRole == null) { logger.error("找不到角色信息. roleId={}", roleId); throw new UacBizException(ErrorCodeEnum.UAC10012005, roleId); } // TODO 校验参数的合法性(这里不写了 累得慌 也就是校验菜单和权限是否存在) List uacRoleActionList = uacRoleActionService.listByRoleId(roleId); if (PublicUtil.isNotEmpty(uacRoleActionList)) { uacRoleActionService.deleteByRoleId(roleId); } if (PublicUtil.isEmpty(actionIdList)) { logger.error("传入按钮权限Id为空, 取消所有按钮权限"); } else { // 绑定权限 uacRoleActionService.insert(roleId, actionIdList); } } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public UacRole getRoleById(Long roleId) { return uacRoleMapper.selectByPrimaryKey(roleId); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public RoleBindUserDto getRoleBindUserDto(Long roleId, Long currentUserId) { RoleBindUserDto roleBindUserDto = new RoleBindUserDto(); Set alreadyBindUserIdSet = Sets.newHashSet(); UacRole uacRole = uacRoleMapper.selectByPrimaryKey(roleId); if (PublicUtil.isEmpty(uacRole)) { logger.error("找不到roleId={}, 的角色", roleId); throw new UacBizException(ErrorCodeEnum.UAC10012005, roleId); } // 查询所有用户包括已禁用的用户 List bindUserDtoList = uacRoleMapper.selectAllNeedBindUser(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID, currentUserId); // 该角色已经绑定的用户 List setAlreadyBindUserSet = uacRoleUserService.listByRoleId(roleId); Set allUserSet = new HashSet<>(bindUserDtoList); for (UacRoleUser uacRoleUser : setAlreadyBindUserSet) { alreadyBindUserIdSet.add(uacRoleUser.getUserId()); } roleBindUserDto.setAllUserSet(allUserSet); roleBindUserDto.setAlreadyBindUserIdSet(alreadyBindUserIdSet); return roleBindUserDto; } @Override public void bindUser4Role(RoleBindUserReqDto roleBindUserReqDto, LoginAuthDto authResDto) { if (roleBindUserReqDto == null) { logger.error("参数不能为空"); throw new IllegalArgumentException("参数不能为空"); } Long roleId = roleBindUserReqDto.getRoleId(); Long loginUserId = authResDto.getUserId(); List userIdList = roleBindUserReqDto.getUserIdList(); if (null == roleId) { throw new IllegalArgumentException(ErrorCodeEnum.UAC10012001.msg()); } UacRole role = this.getRoleById(roleId); if (role == null) { logger.error("找不到角色信息 roleId={}", roleId); throw new UacBizException(ErrorCodeEnum.UAC10012005, roleId); } if (PublicUtil.isNotEmpty(userIdList) && userIdList.contains(loginUserId)) { logger.error("不能操作当前登录用户 userId={}", loginUserId); throw new UacBizException(ErrorCodeEnum.UAC10011023); } // 查询超级管理员用户Id集合 List superUserList = uacRoleUserService.listSuperUser(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID); List unionList = Collections3.intersection(userIdList, superUserList); if (PublicUtil.isNotEmpty(userIdList) && PublicUtil.isNotEmpty(unionList)) { logger.error("不能操作超级管理员用户 超级用户={}", unionList); throw new UacBizException(ErrorCodeEnum.UAC10011023); } // 1. 先取消对该角色的用户绑定(不包含超级管理员用户) List userRoles = uacRoleUserService.listByRoleId(roleId); if (PublicUtil.isNotEmpty(userRoles)) { uacRoleUserService.deleteExcludeSuperMng(roleId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID); } if (PublicUtil.isEmpty(userIdList)) { // 取消该角色的所有用户的绑定 logger.info("取消绑定所有非超级管理员用户成功"); return; } // 绑定所选用户 for (Long userId : userIdList) { UacUser uacUser = uacUserService.queryByUserId(userId); if (PublicUtil.isEmpty(uacUser)) { logger.error("找不到绑定的用户 userId={}", userId); throw new UacBizException(ErrorCodeEnum.UAC10011024, userId); } uacRoleUserService.saveRoleUser(userId, roleId); } } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List findAllRoleInfoByUserId(Long userId) { return uacRoleMapper.selectAllRoleInfoByUserId(userId); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public BindAuthVo getActionTreeByRoleId(Long roleId) { BindAuthVo bindAuthVo = new BindAuthVo(); if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } UacRole roleById = this.getRoleById(roleId); if (roleById == null) { logger.error("找不到角色信息 roleId={}", roleId); throw new UacBizException(ErrorCodeEnum.UAC10012005, roleId); } List uacMenus = uacMenuService.listMenuListByRoleId(roleId); if (PublicUtil.isEmpty(uacMenus)) { throw new UacBizException(ErrorCodeEnum.UAC10013009); } // 查询所有的权限信息 List uacActions = uacActionService.listActionList(uacMenus); // 合并菜单和按钮权限 递归生成树结构 List menuVoList = this.getAuthList(uacMenus, uacActions); List tree = TreeUtil.getChildMenuVos(menuVoList, 0L); // 获取所有绑定的菜单和按钮权限Id集合 List checkedAuthList = uacActionService.getCheckedActionList(roleId); bindAuthVo.setAuthTree(tree); bindAuthVo.setCheckedAuthList(checkedAuthList); return bindAuthVo; } private List getAuthList(List uacMenus, List uacActions) { List menuVoList = Lists.newArrayList(); MenuVo menuVo; for (UacMenu uacMenu : uacMenus) { menuVo = new MenuVo(); BeanUtils.copyProperties(uacMenu, menuVo); menuVo.setRemark("menu"); menuVoList.add(menuVo); } if (PublicUtil.isNotEmpty(uacActions)) { for (UacAction uacAction : uacActions) { menuVo = new MenuVo(); menuVo.setId(uacAction.getId()); menuVo.setMenuName(uacAction.getActionName()); menuVo.setMenuCode(uacAction.getActionCode()); menuVo.setPid(uacAction.getMenuId()); menuVo.setUrl(uacAction.getUrl()); menuVo.setRemark("action"); menuVoList.add(menuVo); } } return menuVoList; } @Override public void batchDeleteByIdList(List roleIdList) { logger.info("批量删除角色. idList={}", roleIdList); Preconditions.checkArgument(PublicUtil.isNotEmpty(roleIdList), "删除角色ID不存在"); List uruList = uacRoleUserService.listByRoleIdList(roleIdList); if (!uruList.isEmpty()) { uacRoleUserService.deleteByRoleIdList(roleIdList); } uacRoleMenuService.deleteByRoleIdList(roleIdList); uacRoleActionService.deleteByRoleIdList(roleIdList); int result = uacRoleMapper.batchDeleteByIdList(roleIdList); if (result < roleIdList.size()) { throw new UacBizException(ErrorCodeEnum.UAC10012006, Joiner.on(GlobalConstant.Symbol.COMMA).join(roleIdList)); } } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getOwnAuthTree(Long userId) { if (userId == null) { throw new UacBizException(ErrorCodeEnum.UAC10011001); } return uacMenuService.getMenuVoList(userId, GlobalConstant.Sys.OPER_APPLICATION_ID); } @Override public void bindMenu(RoleBindMenuDto roleBindMenuDto) { Long roleId = roleBindMenuDto.getRoleId(); Set menuIdList = roleBindMenuDto.getMenuIdList(); if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } if (Objects.equals(roleId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID)) { logger.error("越权操作, 超级管理员用户不允许操作"); throw new UacBizException(ErrorCodeEnum.UAC10011023); } UacRole uacRole = uacRoleMapper.selectByPrimaryKey(roleId); if (uacRole == null) { logger.error("找不到角色信息. roleId={}", roleId); throw new UacBizException(ErrorCodeEnum.UAC10012005, roleId); } // TODO 校验参数的合法性(这里不写了 累得慌 也就是校验菜单和权限是否存在) List uacRoleMenuList = uacRoleMenuService.listByRoleId(roleId); if (PublicUtil.isNotEmpty(uacRoleMenuList)) { uacRoleMenuService.deleteByRoleId(roleId); } // menuSet actionIdList 如果为空则 取消该角色所有权限 if (PublicUtil.isEmpty(menuIdList)) { logger.error("传入菜单权限Id为空, 取消菜单权限"); } else { // 绑定菜单 uacRoleMenuService.insert(roleId, menuIdList); } } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public BindAuthVo getMenuTreeByRoleId(Long roleId) { BindAuthVo bindAuthVo = new BindAuthVo(); Preconditions.checkArgument(roleId != null, ErrorCodeEnum.UAC10012001.msg()); UacRole roleById = this.getRoleById(roleId); if (roleById == null) { logger.error("找不到角色信息 roleId={}", roleId); throw new UacBizException(ErrorCodeEnum.UAC10012005, roleId); } // 查询所有的菜单信息 List uacMenus = uacMenuService.selectAll(); // 合并菜单和按钮权限 递归生成树结构 List menuVoList = this.getAuthList(uacMenus, null); List tree = TreeUtil.getChildMenuVos(menuVoList, 0L); // 获取所有绑定的菜单和按钮权限Id集合 List checkedAuthList = uacActionService.getCheckedMenuList(roleId); bindAuthVo.setAuthTree(tree); bindAuthVo.setCheckedAuthList(checkedAuthList); return bindAuthVo; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacRoleUserServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.google.common.base.Joiner; import com.google.common.base.Preconditions; import com.paascloud.PublicUtil; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.provider.mapper.UacRoleUserMapper; import com.paascloud.provider.model.domain.UacRoleUser; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.service.UacRoleUserService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; import java.util.Objects; /** * The class Uac role user service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacRoleUserServiceImpl extends BaseService implements UacRoleUserService { @Resource private UacRoleUserMapper uacRoleUserMapper; @Override public int deleteByUserId(Long userId) { if (null == userId) { throw new UacBizException(ErrorCodeEnum.UAC10011001); } UacRoleUser param = new UacRoleUser(); param.setUserId(userId); return uacRoleUserMapper.delete(param); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List queryByUserId(Long userId) { if (null == userId) { throw new UacBizException(ErrorCodeEnum.UAC10011001); } return uacRoleUserMapper.listByUserId(userId); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public UacRoleUser getByUserIdAndRoleId(Long userId, Long roleId) { if (null == userId) { throw new UacBizException(ErrorCodeEnum.UAC10011001); } if (null == roleId) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } return uacRoleUserMapper.getByUserIdAndRoleId(userId, roleId); } @Override public int saveRoleUser(Long userId, Long roleId) { if (userId == null) { throw new UacBizException(ErrorCodeEnum.UAC10011001); } if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } UacRoleUser roleUser = new UacRoleUser(); roleUser.setUserId(userId); roleUser.setRoleId(roleId); return uacRoleUserMapper.insertSelective(roleUser); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List listByRoleId(Long roleId) { if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } return uacRoleUserMapper.listByRoleId(roleId); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List listByRoleIdList(List idList) { if (PublicUtil.isEmpty(idList)) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } return uacRoleUserMapper.listByRoleIdList(idList); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List listSuperUser(Long superManagerRoleId) { if (superManagerRoleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } return uacRoleUserMapper.listSuperUser(superManagerRoleId); } @Override public void deleteExcludeSuperMng(Long roleId, Long superManagerRoleId) { if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } if (superManagerRoleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012004); } uacRoleUserMapper.deleteExcludeSuperMng(roleId, superManagerRoleId); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List listByUserId(Long userId) { if (userId == null) { throw new UacBizException(ErrorCodeEnum.UAC10011001); } return uacRoleUserMapper.listByUserId(userId); } @Override public void deleteByRoleIdList(List roleIdList) { Preconditions.checkArgument(PublicUtil.isNotEmpty(roleIdList), ErrorCodeEnum.UAC10012001.msg()); Preconditions.checkArgument(!roleIdList.contains(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID), "超级管理员角色不能删除"); int result = uacRoleUserMapper.deleteByRoleIdList(roleIdList); if (result < roleIdList.size()) { throw new UacBizException(ErrorCodeEnum.UAC10012007, Joiner.on(GlobalConstant.Symbol.COMMA).join(roleIdList)); } } @Override public void deleteByRoleId(Long roleId) { Preconditions.checkArgument(roleId != null, ErrorCodeEnum.UAC10012001.msg()); Preconditions.checkArgument(!Objects.equals(roleId, GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID), "超级管理员角色不能删除"); int result = uacRoleUserMapper.deleteByRoleId(roleId); if (result < 1) { throw new UacBizException(ErrorCodeEnum.UAC10012006, roleId); } } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacUserMenuServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.paascloud.core.support.BaseService; import com.paascloud.provider.model.domain.UacUserMenu; import com.paascloud.provider.service.UacUserMenuService; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; /** * The class Uac user menu service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacUserMenuServiceImpl extends BaseService implements UacUserMenuService { } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacUserServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.base.Preconditions; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import com.paascloud.*; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.enums.LogTypeEnum; import com.paascloud.core.support.BaseService; import com.paascloud.core.utils.RequestUtil; import com.paascloud.provider.manager.UserManager; import com.paascloud.provider.mapper.UacActionMapper; import com.paascloud.provider.mapper.UacMenuMapper; import com.paascloud.provider.mapper.UacUserMapper; import com.paascloud.provider.mapper.UacUserMenuMapper; import com.paascloud.provider.model.domain.*; import com.paascloud.provider.model.dto.menu.UserMenuChildrenDto; import com.paascloud.provider.model.dto.menu.UserMenuDto; import com.paascloud.provider.model.dto.user.*; import com.paascloud.provider.model.enums.UacEmailTemplateEnum; import com.paascloud.provider.model.enums.UacUserSourceEnum; import com.paascloud.provider.model.enums.UacUserStatusEnum; import com.paascloud.provider.model.enums.UacUserTypeEnum; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.model.vo.UserBindRoleVo; import com.paascloud.provider.mq.producer.EmailProducer; import com.paascloud.provider.service.*; import com.paascloud.provider.utils.Md5Util; import com.paascloud.security.core.SecurityUser; import com.xiaoleilu.hutool.date.DateUtil; import eu.bitwalker.useragentutils.UserAgent; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.task.TaskExecutor; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.oauth2.common.OAuth2AccessToken; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.concurrent.TimeUnit; /** * The class Uac user service. * * @author paascloud.net@gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacUserServiceImpl extends BaseService implements UacUserService { @Resource private UacUserMapper uacUserMapper; @Resource private UacMenuService uacMenuService; @Resource private UacActionMapper uacActionMapper; @Resource private UacMenuMapper uacMenuMapper; @Resource private UacGroupUserService uacGroupUserService; @Resource private UacLogService uacLogService; @Resource private UacRoleService uacRoleService; @Resource private UacRoleUserService uacRoleUserService; @Resource private UacUserMenuMapper uacUserMenuMapper; @Resource private UacUserMenuService uacUserMenuService; @Resource private RedisService redisService; @Resource private EmailProducer emailProducer; @Value("${paascloud.auth.active-user-url}") private String activeUserUrl; @Resource private UacActionService uacActionService; @Resource private RedisTemplate redisTemplate; @Resource private TaskExecutor taskExecutor; @Resource private UacUserTokenService uacUserTokenService; @Resource private OpcRpcService opcRpcService; @Resource private UserManager userManager; @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public UacUser findByLoginName(String loginName) { logger.info("findByLoginName - 根据用户名查询用户信息. loginName={}", loginName); return uacUserMapper.findByLoginName(loginName); } @Override public UacUser findByMobileNo(String mobileNo) { return uacUserMapper.findByMobileNo(mobileNo); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public void checkUserIsCorrect(LoginReqDto loginReqDto) { logger.info("用户【" + loginReqDto.getLoginName() + "】进行密码认证......"); Map loginNamePwdMap = Maps.newHashMap(); loginNamePwdMap.put("loginName", loginReqDto.getLoginName()); loginNamePwdMap.put("loginPwd", loginReqDto.getLoginPwd()); UacUser uacUser = uacUserMapper.findByLoginNameAndLoginPwd(loginNamePwdMap); if (PublicUtil.isEmpty(uacUser)) { logger.info("用户【" + loginReqDto.getLoginName() + "】密码认证失败"); throw new UacBizException(ErrorCodeEnum.UAC10011002, loginReqDto.getLoginName()); } logger.info("用户【" + loginReqDto.getLoginName() + "】密码认证成功"); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getAllPerms() { logger.info("获取全部的权限..."); return uacActionMapper.findAllPerms(); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List getUserPerms(Long userId) { logger.info("获取用户权限列表userId={}", userId); //1.获取所有菜单权限 List menuPermList = uacMenuMapper.findMenuCodeListByUserId(userId); //2.获取所有的按钮权限 List buttonPermList = uacActionMapper.findActionCodeListByUserId(userId); //3.将菜单权限和按钮权限汇总去重返回 Set set = Sets.newHashSet(); set.addAll(menuPermList); set.addAll(buttonPermList); return new ArrayList<>(set); } @Override public int updateUser(UacUser uacUser) { logger.info("更新用户信息 uacUser={}", uacUser); int updateResult = uacUserMapper.updateByPrimaryKeySelective(uacUser); if (updateResult < 1) { logger.info("用户【 {} 】修改用户信息失败", uacUser.getId()); } else { logger.info("用户【 {} 】修改用户信息成功", uacUser.getId()); } return updateResult; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public PageInfo queryUserListWithPage(UacUser uacUser) { PageHelper.startPage(uacUser.getPageNum(), uacUser.getPageSize()); uacUser.setOrderBy("u.update_time desc"); List uacUserList = uacUserMapper.selectUserList(uacUser); return new PageInfo<>(uacUserList); } @Override public int deleteUserById(Long userId) { return 0; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public UacUser findUserInfoByUserId(Long userId) { return uacUserMapper.selectUserInfoByUserId(userId); } @Override public void saveUacUser(UacUser user, LoginAuthDto loginAuthDto) { String loginName = user.getLoginName(); Preconditions.checkArgument(!StringUtils.isEmpty(loginName), "用户名不能为空"); Preconditions.checkArgument(user.getGroupId() != null, "组织不能为空"); user.setUpdateInfo(loginAuthDto); if (user.isNew()) { String loginPwd = user.getLoginPwd(); Preconditions.checkArgument(!StringUtils.isEmpty(loginPwd), ErrorCodeEnum.UAC10011014.msg()); user.setLoginPwd(Md5Util.encrypt(loginPwd)); // 验证用户名是否存在 UacUser query = new UacUser(); query.setLoginName(loginName); int count = uacUserMapper.selectCount(query); if (count > 0) { throw new UacBizException(ErrorCodeEnum.UAC10011025, loginName); } Long userId = super.generateId(); // 1.保存用户信息 user.setId(userId); user.setLoginName(loginName); user.setType(UacUserTypeEnum.OPERATE.getKey()); user.setUserSource(UacUserSourceEnum.INSERT.getKey()); // TODO 校验状态是否合法 uacUserMapper.insertSelective(user); // 2.添加组织关联 UacGroupUser groupUser = new UacGroupUser(); groupUser.setGroupId(user.getGroupId()); groupUser.setUserId(userId); uacGroupUserService.save(groupUser); } else { UacUser uacUser = uacUserMapper.selectByPrimaryKey(user.getId()); Preconditions.checkArgument(uacUser != null, "用户不存在"); // 1.更新用户信息 int updateInt = uacUserMapper.updateUacUser(user); if (updateInt < 1) { throw new UacBizException(ErrorCodeEnum.UAC10011026, user.getId()); } // 2.绑定组织信息 UacGroupUser uacGroupUser = uacGroupUserService.queryByUserId(user.getId()); if (uacGroupUser == null) { // 添加组织关联 UacGroupUser groupUser = new UacGroupUser(); groupUser.setGroupId(user.getGroupId()); groupUser.setUserId(user.getId()); uacGroupUserService.save(groupUser); } else { //修改组织 UacGroupUser groupUser = new UacGroupUser(); groupUser.setUserId(user.getId()); groupUser.setGroupId(user.getGroupId()); uacGroupUserService.updateByUserId(groupUser); } } } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List queryUserLogListWithUserId(Long userId) { if (PublicUtil.isEmpty(userId)) { throw new UacBizException(ErrorCodeEnum.UAC10011001); } return uacLogService.selectUserLogListByUserId(userId); } @Override public int modifyUserStatusById(UacUser uacUser, LoginAuthDto authResDto) { Long loginUserId = authResDto.getUserId(); Long userId = uacUser.getId(); if (loginUserId.equals(userId)) { throw new UacBizException(ErrorCodeEnum.UAC10011023); } UacUser u = uacUserMapper.selectByPrimaryKey(userId); if (u == null) { throw new UacBizException(ErrorCodeEnum.UAC10011011, userId); } // 更新用户最后修改人与修改时间 uacUser.setVersion(u.getVersion() + 1); uacUser.setUpdateInfo(authResDto); return uacUserMapper.updateByPrimaryKeySelective(uacUser); } @Override public void bindUserRoles(BindUserRolesDto bindUserRolesDto, LoginAuthDto authResDto) { if (bindUserRolesDto == null) { logger.error("参数不能为空"); throw new IllegalArgumentException("参数不能为空"); } Long operUserId = bindUserRolesDto.getUserId(); Long loginUserId = authResDto.getUserId(); List roleIdList = bindUserRolesDto.getRoleIdList(); if (null == operUserId) { throw new UacBizException(ErrorCodeEnum.UAC10011001); } // 任何用户不能操作admin用户 if (Objects.equals(operUserId, GlobalConstant.Sys.SUPER_MANAGER_USER_ID)) { throw new UacBizException(ErrorCodeEnum.UAC10011034); } UacUser user = this.queryByUserId(operUserId); if (user == null) { logger.error("找不到用户信息 operUserId={}", operUserId); throw new UacBizException(ErrorCodeEnum.UAC10011003, operUserId); } if (PublicUtil.isNotEmpty(roleIdList) && roleIdList.contains(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID)) { logger.error("操作超级管理员角色 userId={}", loginUserId); throw new UacBizException(ErrorCodeEnum.UAC10011023); } // 1. 先取消对该角色的用户绑定(不包含超级管理员用户) List userRoles = uacRoleUserService.listByUserId(operUserId); if (PublicUtil.isNotEmpty(userRoles)) { uacRoleUserService.deleteByUserId(operUserId); } // 更新用户的操作时间 final UacUser updateUser = new UacUser(); updateUser.setId(operUserId); updateUser.setUpdateInfo(authResDto); uacUserMapper.updateUacUser(updateUser); if (PublicUtil.isEmpty(roleIdList)) { // 取消该角色的所有用户的绑定 logger.info("绑定角色成功"); return; } // 绑定所选用户 for (Long roleId : roleIdList) { UacRole uacRole = uacRoleService.getRoleById(roleId); if (uacRole == null) { logger.error("找不到绑定的角色. roleId={}", roleId); throw new UacBizException(ErrorCodeEnum.UAC10012008, roleId); } uacRoleUserService.saveRoleUser(operUserId, roleId); } } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public List queryUserMenuDtoData(LoginAuthDto authResDto) { // 返回的结果集 List list = Lists.newArrayList(); List menuList; // 该用户下所有的菜单集合 Long userId = authResDto.getUserId(); List ownerMenuIdList = Lists.newArrayList(); Preconditions.checkArgument(!PubUtils.isNull(authResDto, userId), "无访问权限"); // 查询该用户下所有的菜单Id集合 UacUserMenu query = new UacUserMenu(); query.setUserId(userId); List userMenus = uacUserMenuMapper.select(query); for (UacUserMenu userMenu : userMenus) { if (PublicUtil.isEmpty(userMenu.getUserId())) { continue; } ownerMenuIdList.add(userMenu.getMenuId()); } //判断是否为admin用户 如果是则返回所有菜单, 如果不是走下面流程 menuList = uacMenuService.getMenuVoList(userId, 1L); for (MenuVo menuVo : menuList) { // 一级菜单 UserMenuDto userMenuDto = new UserMenuDto(); userMenuDto.setFistMenuIcon(menuVo.getIcon()); userMenuDto.setFistMenuName(menuVo.getMenuName()); List sub2Menu = menuVo.getSubMenu(); List children = Lists.newArrayList(); for (MenuVo vo2 : sub2Menu) { // 二级菜单 如果没有子节直接放入 if (!vo2.isHasMenu()) { UserMenuChildrenDto userMenuChildrenDto = new UserMenuChildrenDto(vo2); //判断是否含有该菜单, 含有为true, 不含有为false if (ownerMenuIdList.contains(vo2.getId())) { userMenuChildrenDto.setChecked(true); } children.add(userMenuChildrenDto); continue; } // 如果二级节点有子节继续循环三级菜单 List sub3Menu = vo2.getSubMenu(); for (MenuVo vo3 : sub3Menu) { UserMenuChildrenDto dto = new UserMenuChildrenDto(vo3); //判断是否含有该菜单, 含有为true, 不含有为false if (ownerMenuIdList.contains(vo3.getId())) { dto.setChecked(true); } children.add(dto); } } userMenuDto.setChildren(children); list.add(userMenuDto); } return list; } @Override public int bindUserMenus(List menuIdList, LoginAuthDto authResDto) { // 1.1 如果menuIdList is null 则清空中间表 // 1.2 判断越权操作(是否为该用户所属角色的菜单) // 1.3 判断该记录是否为子节点,如果不是子节点则不允许操作 // 2 操作数据,先删除再插入, 这里主要考虑避免角色授权和用户修改角色要操作用户菜单中间表,在显示上做过滤,然后再操作中物理删除中间表信息,坐到数据一致性 Long userId = authResDto.getUserId(); List uacUserMenuList = Lists.newArrayList(); UacUserMenu uacUserMenu = new UacUserMenu(); uacUserMenu.setUserId(userId); if (PublicUtil.isEmpty(menuIdList)) { return deleteUserMenuList(uacUserMenu); } // 校验数据 this.checkUserMenuList(menuIdList, authResDto, uacUserMenuList); // 操作数据库 return handleUserMenuList(uacUserMenuList, uacUserMenu); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public UacUser queryByUserId(Long userId) { logger.info("queryByUserId - 根据用户查询用户信息接口. userId={}", userId); UacUser uacUser = uacUserMapper.selectByPrimaryKey(userId); if (PublicUtil.isNotEmpty(uacUser)) { uacUser.setLoginPwd(""); } return uacUser; } @Override public int userModifyPwd(UserModifyPwdDto userModifyPwdDto, LoginAuthDto authResDto) { String loginName = userModifyPwdDto.getLoginName(); String oldPassword = userModifyPwdDto.getOldPassword(); String newPassword = userModifyPwdDto.getNewPassword(); String confirmPwd = userModifyPwdDto.getConfirmPwd(); Preconditions.checkArgument(!PublicUtil.isEmpty(loginName), ErrorCodeEnum.UAC10011007.msg()); Preconditions.checkArgument(!PublicUtil.isEmpty(oldPassword), "原始密码不能为空"); Preconditions.checkArgument(!PublicUtil.isEmpty(newPassword), "新密码不能为空"); Preconditions.checkArgument(!PublicUtil.isEmpty(confirmPwd), ErrorCodeEnum.UAC10011009.msg()); Preconditions.checkArgument(newPassword.equals(confirmPwd), "两次密码不一致, 请重新输入!"); UacUser user = uacUserMapper.findByLoginName(loginName); if (PublicUtil.isEmpty(user)) { throw new UacBizException(ErrorCodeEnum.UAC10011002, loginName); } String oldPwd = user.getLoginPwd(); String newEncrypt = Md5Util.encrypt(newPassword); if (!Md5Util.matches(oldPassword, oldPwd)) { throw new UacBizException(ErrorCodeEnum.UAC10011035); } UacUser uacUser = new UacUser(); if (Md5Util.matches(newPassword, oldPwd)) { throw new UacBizException(ErrorCodeEnum.UAC10011036); } uacUser.setLoginPwd(Md5Util.encrypt(newPassword)); uacUser.setId(user.getId()); uacUser.setLoginPwd(newEncrypt); // 该用户已经修改过密码 uacUser.setIsChangedPwd(Short.valueOf("1")); uacUser.setUpdateInfo(authResDto); return uacUserMapper.updateByPrimaryKeySelective(uacUser); // TODO 发送重置密码成功的邮件 } @Override public int userResetPwd(UserResetPwdDto userResetPwdDto) { String mobileNo = userResetPwdDto.getMobileNo(); String newPassword = userResetPwdDto.getNewPassword(); String confirmPwd = userResetPwdDto.getConfirmPwd(); Preconditions.checkArgument(!StringUtils.isEmpty(mobileNo), "手机号码不能为空"); Preconditions.checkArgument(!StringUtils.isEmpty(newPassword), "新密码不能为空"); Preconditions.checkArgument(!StringUtils.isEmpty(confirmPwd), ErrorCodeEnum.UAC10011009.msg()); Preconditions.checkArgument(newPassword.equals(confirmPwd), "两次密码不一致"); UacUser query = new UacUser(); query.setMobileNo(mobileNo); UacUser user = uacUserMapper.selectOne(query); if (user == null) { throw new UacBizException(ErrorCodeEnum.UAC10011027, mobileNo); } UacUser uacUser = new UacUser(); uacUser.setLoginPwd(Md5Util.encrypt(newPassword)); uacUser.setId(user.getId()); // 更新用户最后修改人与修改时间 uacUser.setVersion(user.getVersion() + 1); uacUser.setLastOperator(user.getLoginName()); uacUser.setLastOperatorId(user.getId()); uacUser.setUpdateTime(new Date()); return uacUserMapper.updateByPrimaryKeySelective(uacUser); } @Override public void register(UserRegisterDto registerDto) { // 校验注册信息 validateRegisterInfo(registerDto); String mobileNo = registerDto.getMobileNo(); String email = registerDto.getEmail(); Date row = new Date(); String salt = String.valueOf(generateId()); // 封装注册信息 long id = generateId(); UacUser uacUser = new UacUser(); uacUser.setLoginName(registerDto.getLoginName()); uacUser.setSalt(salt); uacUser.setLoginPwd(Md5Util.encrypt(registerDto.getLoginPwd())); uacUser.setMobileNo(mobileNo); uacUser.setStatus(UacUserStatusEnum.DISABLE.getKey()); uacUser.setUserSource(UacUserSourceEnum.REGISTER.getKey()); uacUser.setCreatedTime(row); uacUser.setUpdateTime(row); uacUser.setEmail(email); uacUser.setId(id); uacUser.setCreatorId(id); uacUser.setCreator(registerDto.getLoginName()); uacUser.setLastOperatorId(id); uacUser.setUserName(registerDto.getLoginName()); uacUser.setLastOperator(registerDto.getLoginName()); // 发送激活邮件 String activeToken = PubUtils.uuid() + super.generateId(); redisService.setKey(RedisKeyUtil.getActiveUserKey(activeToken), email, 1, TimeUnit.DAYS); Map param = Maps.newHashMap(); param.put("loginName", registerDto.getLoginName()); param.put("email", registerDto.getEmail()); param.put("activeUserUrl", activeUserUrl + activeToken); param.put("dateTime", DateUtil.formatDateTime(new Date())); Set to = Sets.newHashSet(); to.add(registerDto.getEmail()); MqMessageData mqMessageData = emailProducer.sendEmailMq(to, UacEmailTemplateEnum.ACTIVE_USER, AliyunMqTopicConstants.MqTagEnum.ACTIVE_USER, param); userManager.register(mqMessageData, uacUser); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public boolean checkLoginName(String loginName) { Preconditions.checkArgument(!StringUtils.isEmpty(loginName), ErrorCodeEnum.UAC10011007.msg()); UacUser uacUser = new UacUser(); uacUser.setLoginName(loginName); int result = 1; try { result = uacUserMapper.selectCount(uacUser); } catch (Exception e) { logger.error(" 验证用户名是否存在,出现异常={}", e.getMessage(), e); } return result < 1; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public boolean checkEmail(String email) { Preconditions.checkArgument(!StringUtils.isEmpty(email), "email不能为空"); UacUser uacUser = new UacUser(); uacUser.setEmail(email); int result = 1; try { result = uacUserMapper.selectCount(uacUser); } catch (Exception e) { logger.error(" 验证email是否存在,出现异常={}", e.getMessage(), e); } return result < 1; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public boolean checkMobileNo(String mobileNo) { Preconditions.checkArgument(!StringUtils.isEmpty(mobileNo), "手机号码不能为空"); UacUser uacUser = new UacUser(); uacUser.setMobileNo(mobileNo); int result = 1; try { result = uacUserMapper.selectCount(uacUser); } catch (Exception e) { logger.error(" 验证email是否存在,出现异常={}", e.getMessage(), e); } return result < 1; } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public int countUserByLoginNameAndEmail(String loginName, String email) { Preconditions.checkArgument(!StringUtils.isEmpty(loginName), ErrorCodeEnum.UAC10011007.msg()); Preconditions.checkArgument(!StringUtils.isEmpty(email), ErrorCodeEnum.UAC10011018.msg()); UacUser uacUser = new UacUser(); uacUser.setLoginName(loginName); uacUser.setEmail(email); return uacUserMapper.selectCount(uacUser); } @Override public int userEmailResetPwd(ForgetResetPasswordDto forgetResetPasswordDto) { this.validateEmailResetPwd(forgetResetPasswordDto); String loginName = forgetResetPasswordDto.getLoginName(); UacUser user = this.findByLoginName(loginName); UacUser uacUser = new UacUser(); uacUser.setLoginPwd(Md5Util.encrypt(forgetResetPasswordDto.getLoginPwd())); uacUser.setId(user.getId()); LoginAuthDto authUser = new LoginAuthDto(); authUser.setLoginName(loginName); authUser.setUserId(user.getId()); authUser.setUserName(user.getUserName()); uacUser.setUpdateInfo(authUser); return uacUserMapper.updateByPrimaryKeySelective(uacUser); } @Override public void modifyUserEmail(String email, String emailCode, LoginAuthDto loginAuthDto) { // 校验用户信息 Preconditions.checkArgument(!StringUtils.isEmpty(email), ErrorCodeEnum.UAC10011018.msg()); Preconditions.checkArgument(PubUtils.isEmail(email), "邮箱格式不正确"); UacUser uacUser = new UacUser(); uacUser.setId(loginAuthDto.getUserId()); uacUser.setEmail(email); uacUser.setUpdateInfo(loginAuthDto); int result = this.updateUser(uacUser); if (result < 1) { throw new UacBizException(ErrorCodeEnum.UAC10011037, loginAuthDto.getUserId()); } } @Override public void resetLoginPwd(Long userId, LoginAuthDto loginAuthDto) { if (userId == null) { throw new UacBizException(ErrorCodeEnum.UAC10011001); } UacUser uacUser = this.queryByUserId(userId); if (uacUser == null) { logger.error("找不到用户. userId={}", userId); throw new UacBizException(ErrorCodeEnum.UAC10011003, userId); } Preconditions.checkArgument(!StringUtils.isEmpty(uacUser.getEmail()), "邮箱地址不能为空"); String newLoginPwd = RandomUtil.createComplexCode(8); UacUser update = new UacUser(); update.setId(uacUser.getId()); update.setLoginPwd(Md5Util.encrypt(newLoginPwd)); short isChangedPwd = 0; update.setIsChangedPwd(isChangedPwd); Map param = Maps.newHashMap(); param.put("loginName", uacUser.getLoginName()); param.put("newLoginPwd", newLoginPwd); param.put("dateTime", DateUtil.formatDateTime(new Date())); Set to = Sets.newHashSet(); to.add(uacUser.getEmail()); final MqMessageData mqMessageData = emailProducer.sendEmailMq(to, UacEmailTemplateEnum.RESET_LOGIN_PWD, AliyunMqTopicConstants.MqTagEnum.RESET_LOGIN_PWD, param); userManager.resetLoginPwd(mqMessageData, update); } @Override public void resetLoginPwd(ResetLoginPwdDto resetLoginPwdDto) { String confirmPwd = resetLoginPwdDto.getConfirmPwd(); String newPassword = resetLoginPwdDto.getNewPassword(); String resetPwdKey = resetLoginPwdDto.getResetPwdKey(); Preconditions.checkArgument(!StringUtils.isEmpty(newPassword), ErrorCodeEnum.UAC10011014.msg()); Preconditions.checkArgument(!StringUtils.isEmpty(confirmPwd), ErrorCodeEnum.UAC10011009.msg()); Preconditions.checkArgument(!StringUtils.isEmpty(resetPwdKey), "链接已失效"); Preconditions.checkArgument(newPassword.equals(confirmPwd), "两次输入密码不一致"); String resetPwdTokenKey = RedisKeyUtil.getResetPwdTokenKey(resetPwdKey); UacUser uacUser = (UacUser) redisTemplate.opsForValue().get(resetPwdTokenKey); if (StringUtils.isEmpty(uacUser)) { throw new UacBizException(ErrorCodeEnum.UAC10011028); } LoginAuthDto loginAuthDto = new LoginAuthDto(); loginAuthDto.setUserName(uacUser.getUserName()); loginAuthDto.setLoginName(uacUser.getLoginName()); loginAuthDto.setUserId(uacUser.getId()); UacUser update = new UacUser(); String salt = generateId() + ""; update.setLoginPwd(Md5Util.encrypt(newPassword)); update.setSalt(salt); update.setId(uacUser.getId()); // 该用户已经修改过密码 update.setIsChangedPwd((Short.valueOf("1"))); update.setUpdateInfo(loginAuthDto); int result = uacUserMapper.updateByPrimaryKeySelective(update); if (result < 1) { throw new UacBizException(ErrorCodeEnum.UAC10011029); } redisTemplate.delete(resetPwdTokenKey); } @Override @Transactional(readOnly = true, rollbackFor = Exception.class) public UserBindRoleVo getUserBindRoleDto(Long userId) { UserBindRoleVo userBindRoleVo = new UserBindRoleVo(); Set alreadyBindRoleIdSet = Sets.newHashSet(); UacUser uacUser = this.queryByUserId(userId); if (uacUser == null) { logger.error("找不到userId={}, 的用户", userId); throw new UacBizException(ErrorCodeEnum.UAC10011003, userId); } // 查询所有角色包括该用户拥有的角色 List bindRoleDtoList = uacUserMapper.selectAllNeedBindRole(GlobalConstant.Sys.SUPER_MANAGER_ROLE_ID); // 该角色已经绑定的用户 List setAlreadyBindRoleSet = uacRoleUserService.listByUserId(userId); Set allUserSet = new HashSet<>(bindRoleDtoList); for (UacRoleUser uacRoleUser : setAlreadyBindRoleSet) { alreadyBindRoleIdSet.add(uacRoleUser.getRoleId()); } userBindRoleVo.setAllRoleSet(allUserSet); userBindRoleVo.setAlreadyBindRoleIdSet(alreadyBindRoleIdSet); return userBindRoleVo; } @Override public void activeUser(String activeUserToken) { Preconditions.checkArgument(!StringUtils.isEmpty(activeUserToken), "激活用户失败"); String activeUserKey = RedisKeyUtil.getActiveUserKey(activeUserToken); String email = redisService.getKey(activeUserKey); if (StringUtils.isEmpty(email)) { throw new UacBizException(ErrorCodeEnum.UAC10011030); } // 修改用户状态, 绑定访客角色 UacUser uacUser = new UacUser(); uacUser.setEmail(email); uacUser = uacUserMapper.selectOne(uacUser); if (uacUser == null) { logger.error("找不到用户信息. email={}", email); throw new UacBizException(ErrorCodeEnum.UAC10011004, email); } UacUser update = new UacUser(); update.setId(uacUser.getId()); update.setStatus(UacUserStatusEnum.ENABLE.getKey()); LoginAuthDto loginAuthDto = new LoginAuthDto(); loginAuthDto.setUserId(uacUser.getId()); loginAuthDto.setUserName(uacUser.getLoginName()); loginAuthDto.setLoginName(uacUser.getLoginName()); update.setUpdateInfo(loginAuthDto); UacUser user = this.queryByUserId(uacUser.getId()); Map param = Maps.newHashMap(); param.put("loginName", user.getLoginName()); param.put("dateTime", DateUtil.formatDateTime(new Date())); Set to = Sets.newHashSet(); to.add(user.getEmail()); MqMessageData mqMessageData = emailProducer.sendEmailMq(to, UacEmailTemplateEnum.ACTIVE_USER_SUCCESS, AliyunMqTopicConstants.MqTagEnum.ACTIVE_USER_SUCCESS, param); userManager.activeUser(mqMessageData, update, activeUserKey); } @Override public Collection loadUserAuthorities(Long userId) { List ownAuthList = uacActionService.getOwnActionListByUserId(userId); List authList = Lists.newArrayList(); for (UacAction action : ownAuthList) { GrantedAuthority grantedAuthority = new SimpleGrantedAuthority(action.getUrl()); authList.add(grantedAuthority); } return authList; } @Override public void handlerLoginData(OAuth2AccessToken token, final SecurityUser principal, HttpServletRequest request) { final UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); //获取客户端操作系统 final String os = userAgent.getOperatingSystem().getName(); //获取客户端浏览器 final String browser = userAgent.getBrowser().getName(); final String remoteAddr = RequestUtil.getRemoteAddr(request); // 根据IP获取位置信息 final String remoteLocation = opcRpcService.getLocationById(remoteAddr); final String requestURI = request.getRequestURI(); UacUser uacUser = new UacUser(); Long userId = principal.getUserId(); uacUser.setLastLoginIp(remoteAddr); uacUser.setId(userId); uacUser.setLastLoginTime(new Date()); uacUser.setLastLoginLocation(remoteLocation); LoginAuthDto loginAuthDto = new LoginAuthDto(userId, principal.getLoginName(), principal.getNickName(), principal.getGroupId(), principal.getGroupName()); // 记录token日志 String accessToken = token.getValue(); String refreshToken = token.getRefreshToken().getValue(); uacUserTokenService.saveUserToken(accessToken, refreshToken, loginAuthDto, request); // 记录最后登录信息 taskExecutor.execute(() -> this.updateUser(uacUser)); // 记录操作日志 UacLog log = new UacLog(); log.setGroupId(principal.getGroupId()); log.setGroupName(principal.getGroupName()); log.setIp(remoteAddr); log.setLocation(remoteLocation); log.setOs(os); log.setBrowser(browser); log.setRequestUrl(requestURI); log.setLogType(LogTypeEnum.LOGIN_LOG.getType()); log.setLogName(LogTypeEnum.LOGIN_LOG.getName()); taskExecutor.execute(() -> uacLogService.saveLog(log, loginAuthDto)); } @Override public UacUser findUserInfoByLoginName(final String loginName) { return uacUserMapper.findUserInfoByLoginName(loginName); } private void validateEmailResetPwd(ForgetResetPasswordDto forgetResetPasswordDto) { //校验注册信息 String forgetToken = forgetResetPasswordDto.getForgetToken(); String loginPwd = forgetResetPasswordDto.getLoginPwd(); String loginName = forgetResetPasswordDto.getLoginName(); String email = forgetResetPasswordDto.getEmail(); String emailCode = forgetResetPasswordDto.getEmailCode(); Preconditions.checkArgument(!StringUtils.isEmpty(loginName), ErrorCodeEnum.UAC10011007.msg()); Preconditions.checkArgument(!StringUtils.isEmpty(email), ErrorCodeEnum.UAC10011018.msg()); Preconditions.checkArgument(!StringUtils.isEmpty(loginPwd), ErrorCodeEnum.UAC10011014.msg()); Preconditions.checkArgument(!StringUtils.isEmpty(forgetToken), "非法操作"); Preconditions.checkArgument(!StringUtils.isEmpty(emailCode), "验证码不能为空"); // 验证token String key = RedisKeyUtil.getResetPwdTokenKey(email); String forgetKey = redisService.getKey(key); try { HttpAesUtil.decrypt(forgetToken, forgetKey, false, forgetKey); } catch (Exception e) { throw new UacBizException(ErrorCodeEnum.UAC10011031); } int count = this.countUserByLoginNameAndEmail(loginName, email); // 校验token if (count < 1) { throw new UacBizException(ErrorCodeEnum.UAC10011032, loginName, email); } } /** * 删除用户菜单表 */ private int deleteUserMenuList(UacUserMenu uacUserMenu) { int selCount = uacUserMenuMapper.selectCount(uacUserMenu); // 如果查询结果为空, 默认认为已删除成功 if (selCount < 1) { return 1; } int delCount = uacUserMenuMapper.delete(uacUserMenu); if (delCount < selCount) { logger.error("清空该用户常用菜单失败 delCount = {} selCount = {}", delCount, selCount); throw new UacBizException(ErrorCodeEnum.UAC10011033); } return delCount; } /** * 校验数据是否合法 * * @param menuIdList 需要操作的菜单Id集合 * @param authResDto 登录用户 * @param uacUserMenuList 需要插入的记录 */ private void checkUserMenuList(List menuIdList, LoginAuthDto authResDto, List uacUserMenuList) { List currentUserMenuVoList = uacMenuService.findAllMenuListByAuthResDto(authResDto); List currentUserMenuIdList = Lists.newArrayList(); for (MenuVo menuVo : currentUserMenuVoList) { Long menuId = menuVo.getId(); if (PublicUtil.isEmpty(menuId)) { continue; } currentUserMenuIdList.add(menuId); } Preconditions.checkArgument(currentUserMenuIdList.containsAll(menuIdList), "参数异常"); // TODO 预留一个过滤已失效菜单的接口 for (Long menuId : menuIdList) { if (uacMenuService.checkMenuHasChildMenu(menuId)) { logger.error(" 选择菜单不是根目录 menuId= {}", menuId); throw new UacBizException(ErrorCodeEnum.UAC10013010, menuId); } UacUserMenu uacUserMenu = new UacUserMenu(); uacUserMenu.setUserId(authResDto.getUserId()); uacUserMenu.setMenuId(menuId); uacUserMenuList.add(uacUserMenu); } } private int handleUserMenuList(List uacUserMenuList, UacUserMenu uacUserMenu) { // 如果存在记录则清空数据表 deleteUserMenuList(uacUserMenu); return uacUserMenuService.batchSave(uacUserMenuList); } private void validateRegisterInfo(UserRegisterDto registerDto) { String mobileNo = registerDto.getMobileNo(); Preconditions.checkArgument(!StringUtils.isEmpty(registerDto.getLoginName()), ErrorCodeEnum.UAC10011007.msg()); Preconditions.checkArgument(!StringUtils.isEmpty(registerDto.getEmail()), ErrorCodeEnum.UAC10011018.msg()); Preconditions.checkArgument(!StringUtils.isEmpty(mobileNo), "手机号不能为空"); Preconditions.checkArgument(!StringUtils.isEmpty(registerDto.getLoginPwd()), ErrorCodeEnum.UAC10011014.msg()); Preconditions.checkArgument(!StringUtils.isEmpty(registerDto.getConfirmPwd()), ErrorCodeEnum.UAC10011009.msg()); Preconditions.checkArgument(!StringUtils.isEmpty(registerDto.getRegisterSource()), "验证类型错误"); Preconditions.checkArgument(registerDto.getLoginPwd().equals(registerDto.getConfirmPwd()), "两次密码不一致"); UacUser uacUser = new UacUser(); uacUser.setLoginName(registerDto.getLoginName()); int count = uacUserMapper.selectCount(uacUser); if (count > 0) { throw new UacBizException(ErrorCodeEnum.UAC10011012); } uacUser = new UacUser(); uacUser.setMobileNo(registerDto.getMobileNo()); count = uacUserMapper.selectCount(uacUser); if (count > 0) { throw new UacBizException(ErrorCodeEnum.UAC10011013); } uacUser = new UacUser(); uacUser.setEmail(registerDto.getEmail()); count = uacUserMapper.selectCount(uacUser); if (count > 0) { throw new UacBizException(ErrorCodeEnum.UAC10011019); } } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/service/impl/UacUserTokenServiceImpl.java ================================================ package com.paascloud.provider.service.impl; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.arronlong.httpclientutil.HttpClientUtil; import com.arronlong.httpclientutil.common.HttpConfig; import com.arronlong.httpclientutil.common.HttpHeader; import com.arronlong.httpclientutil.exception.HttpProcessException; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Maps; import com.paascloud.PublicUtil; import com.paascloud.RedisKeyUtil; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.dto.UserTokenDto; import com.paascloud.core.support.BaseService; import com.paascloud.core.utils.RequestUtil; import com.paascloud.provider.mapper.UacUserTokenMapper; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.domain.UacUserToken; import com.paascloud.provider.model.dto.token.TokenMainQueryDto; import com.paascloud.provider.model.enums.UacUserTokenStatusEnum; import com.paascloud.provider.service.OpcRpcService; import com.paascloud.provider.service.UacUserService; import com.paascloud.provider.service.UacUserTokenService; import com.paascloud.security.core.properties.OAuth2ClientProperties; import com.paascloud.security.core.properties.SecurityProperties; import eu.bitwalker.useragentutils.UserAgent; import org.apache.commons.lang3.StringUtils; import org.apache.http.Header; import org.modelmapper.ModelMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; /** * The class Uac user token service. * * @author paascloud.net @gmail.com */ @Service @Transactional(rollbackFor = Exception.class) public class UacUserTokenServiceImpl extends BaseService implements UacUserTokenService { @Resource private UacUserTokenMapper uacUserTokenMapper; @Resource private UacUserService uacUserService; @Autowired private SecurityProperties securityProperties; @Resource private RedisTemplate redisTemplate; @Resource private OpcRpcService opcRpcService; @Value("${paascloud.auth.refresh-token-url}") private String refreshTokenUrl; @Override public void saveUserToken(String accessToken, String refreshToken, LoginAuthDto loginAuthDto, HttpServletRequest request) { // 获取登录时间 Long userId = loginAuthDto.getUserId(); UacUser uacUser = uacUserService.selectByKey(userId); final UserAgent userAgent = UserAgent.parseUserAgentString(request.getHeader("User-Agent")); //获取客户端操作系统 final String os = userAgent.getOperatingSystem().getName(); //获取客户端浏览器 final String browser = userAgent.getBrowser().getName(); final String remoteAddr = RequestUtil.getRemoteAddr(request); // 根据IP获取位置信息 final String remoteLocation = opcRpcService.getLocationById(remoteAddr); // 存入mysql数据库 UacUserToken uacUserToken = new UacUserToken(); OAuth2ClientProperties[] clients = securityProperties.getOauth2().getClients(); int accessTokenValidateSeconds = clients[0].getAccessTokenValidateSeconds(); int refreshTokenValiditySeconds = clients[0].getRefreshTokenValiditySeconds(); uacUserToken.setOs(os); uacUserToken.setBrowser(browser); uacUserToken.setAccessToken(accessToken); uacUserToken.setAccessTokenValidity(accessTokenValidateSeconds); uacUserToken.setLoginIp(remoteAddr); uacUserToken.setLoginLocation(remoteLocation); uacUserToken.setLoginTime(uacUser.getLastLoginTime()); uacUserToken.setLoginName(loginAuthDto.getLoginName()); uacUserToken.setRefreshToken(refreshToken); uacUserToken.setRefreshTokenValidity(refreshTokenValiditySeconds); uacUserToken.setStatus(UacUserTokenStatusEnum.ON_LINE.getStatus()); uacUserToken.setUserId(userId); uacUserToken.setUserName(loginAuthDto.getUserName()); uacUserToken.setUpdateInfo(loginAuthDto); uacUserToken.setGroupId(loginAuthDto.getGroupId()); uacUserToken.setGroupName(loginAuthDto.getGroupName()); uacUserToken.setId(generateId()); uacUserTokenMapper.insertSelective(uacUserToken); UserTokenDto userTokenDto = new ModelMapper().map(uacUserToken, UserTokenDto.class); // 存入redis数据库 updateRedisUserToken(accessToken, accessTokenValidateSeconds, userTokenDto); } private void updateRedisUserToken(String accessToken, int accessTokenValidateSeconds, UserTokenDto userTokenDto) { redisTemplate.opsForValue().set(RedisKeyUtil.getAccessTokenKey(accessToken), userTokenDto, accessTokenValidateSeconds, TimeUnit.SECONDS); } @Override public UserTokenDto getByAccessToken(String accessToken) { UserTokenDto userTokenDto = (UserTokenDto) redisTemplate.opsForValue().get(RedisKeyUtil.getAccessTokenKey(accessToken)); if (userTokenDto == null) { UacUserToken uacUserToken = new UacUserToken(); uacUserToken.setAccessToken(accessToken); uacUserToken = uacUserTokenMapper.selectOne(uacUserToken); userTokenDto = new ModelMapper().map(uacUserToken, UserTokenDto.class); } return userTokenDto; } @Override public void updateUacUserToken(UserTokenDto tokenDto, LoginAuthDto loginAuthDto) { UacUserToken uacUserToken = new ModelMapper().map(tokenDto, UacUserToken.class); uacUserToken.setUpdateInfo(loginAuthDto); uacUserTokenMapper.updateByPrimaryKeySelective(uacUserToken); OAuth2ClientProperties[] clients = securityProperties.getOauth2().getClients(); int accessTokenValidateSeconds = clients[0].getAccessTokenValidateSeconds(); updateRedisUserToken(uacUserToken.getAccessToken(), accessTokenValidateSeconds, tokenDto); } @Override public PageInfo listTokenWithPage(TokenMainQueryDto token) { PageHelper.startPage(token.getPageNum(), token.getPageSize()); UacUserToken userToken = new UacUserToken(); userToken.setStatus(token.getStatus()); if (token.getStatus() != null) { userToken.setStatus(token.getStatus()); } if (StringUtils.isNotBlank(token.getLoginName())) { userToken.setLoginName(token.getLoginName()); } if (StringUtils.isNotBlank(token.getUserName())) { userToken.setUserName(token.getUserName()); } List userTokenList = uacUserTokenMapper.selectTokenList(userToken); return new PageInfo<>(userTokenList); } @Override public String refreshToken(String accessToken, String refreshToken, HttpServletRequest request) throws HttpProcessException { String token; Map map = new HashMap<>(2); map.put("grant_type", "refresh_token"); map.put("refresh_token", refreshToken); //插件式配置请求参数(网址、请求参数、编码、client) Header[] headers = HttpHeader.custom().contentType(HttpHeader.Headers.APP_FORM_URLENCODED).authorization(request.getHeader(HttpHeaders.AUTHORIZATION)).build(); HttpConfig config = HttpConfig.custom().headers(headers).url(refreshTokenUrl).map(map); token = HttpClientUtil.post(config); JSONObject jsonObj = JSON.parseObject(token); String accessTokenNew = (String) jsonObj.get("access_token"); String refreshTokenNew = (String) jsonObj.get("refresh_token"); String loginName = (String) jsonObj.get("loginName"); // 更新本次token数据 UserTokenDto tokenDto = this.getByAccessToken(accessToken); tokenDto.setStatus(UacUserTokenStatusEnum.ON_REFRESH.getStatus()); UacUser uacUser = uacUserService.findUserInfoByLoginName(loginName); LoginAuthDto loginAuthDto = new LoginAuthDto(uacUser.getId(), uacUser.getLoginName(), uacUser.getUserName(), uacUser.getGroupId(), uacUser.getGroupName()); this.updateUacUserToken(tokenDto, loginAuthDto); // 创建刷新token this.saveUserToken(accessTokenNew, refreshTokenNew, loginAuthDto, request); return token; } @Override public int batchUpdateTokenOffLine() { List idList = uacUserTokenMapper.listOffLineTokenId(); if (PublicUtil.isEmpty(idList)) { return 1; } Map map = Maps.newHashMap(); map.put("status", 20); map.put("tokenIdList", idList); return uacUserTokenMapper.batchUpdateTokenOffLine(map); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/utils/Md5Util.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:Md5Util.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.utils; import lombok.AccessLevel; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; /** * The class Md 5 util. * * @author paascloud.net @gmail.com */ @Slf4j @NoArgsConstructor(access = AccessLevel.PRIVATE) public class Md5Util { /** * Encrypt string. * * @param password 密码 * * @return the string */ public static String encrypt(String password) { return new BCryptPasswordEncoder().encode(password); } /** * 密码是否匹配. * * @param rawPassword 明文 * @param encodedPassword 密文 * * @return the boolean */ public static boolean matches(CharSequence rawPassword, String encodedPassword) { return new BCryptPasswordEncoder().matches(rawPassword, encodedPassword); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/utils/TreeUtil.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TreeUtil.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.utils; import com.google.common.collect.Lists; import com.paascloud.PublicUtil; import com.paascloud.provider.model.vo.MenuVo; import lombok.AccessLevel; import lombok.NoArgsConstructor; import java.util.List; import java.util.Objects; /** * The class Tree util. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class TreeUtil { /** * 根据父节点的ID获取所有子节点 * * @param list 具有树形结构特点的集合 * @param parentId 父节点ID * * @return 树形结构集合 child menu vos */ public static List getChildMenuVos(List list, Long parentId) { List returnList = Lists.newArrayList(); for (MenuVo menuVo : list) { if (menuVo.getPid() == null) { continue; } if (Objects.equals(menuVo.getPid(), parentId)) { recursionFn(list, menuVo); returnList.add(menuVo); } } return returnList; } /** * 递归列表 */ private static void recursionFn(List list, MenuVo t) { // 得到子节点列表 List childList = getChildList(list, t); t.setSubMenu(childList); if (PublicUtil.isNotEmpty(childList)) { t.setHasMenu(true); } for (MenuVo tChild : childList) { // 判断是否有子节点 if (hasChild(list, tChild)) { for (MenuVo n : childList) { recursionFn(list, n); } tChild.setHasMenu(true); } } } /** * 得到子节点列表 */ private static List getChildList(List list, MenuVo t) { List tList = Lists.newArrayList(); for (MenuVo menuVo : list) { if (PublicUtil.isEmpty(menuVo.getPid())) { continue; } if (Objects.equals(menuVo.getPid(), t.getId())) { tList.add(menuVo); } } return tList; } /** * 判断是否有子节点 */ private static boolean hasChild(List list, MenuVo t) { return !getChildList(list, t).isEmpty(); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/GlobalExceptionHandler.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GlobalExceptionHandler.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import com.paascloud.provider.model.dto.GlobalExceptionLogDto; import com.paascloud.provider.service.MdcExceptionLogFeignApi; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.task.TaskExecutor; import org.springframework.http.HttpStatus; import org.springframework.security.access.AccessDeniedException; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * 全局的的异常拦截器 * * @author paascloud.net @gmail.com */ @Slf4j @RestControllerAdvice public class GlobalExceptionHandler { @Resource private TaskExecutor taskExecutor; @Value("${spring.profiles.active}") String profile; @Value("${spring.application.name}") String applicationName; @Resource private MdcExceptionLogFeignApi mdcExceptionLogFeignApi; /** * 参数非法异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(IllegalArgumentException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper illegalArgumentException(IllegalArgumentException e) { log.error("参数非法异常={}", e.getMessage(), e); return WrapMapper.wrap(ErrorCodeEnum.GL99990100.code(), e.getMessage()); } /** * 业务异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(BusinessException.class) @ResponseStatus(HttpStatus.OK) @ResponseBody public Wrapper businessException(BusinessException e) { log.error("业务异常={}", e.getMessage(), e); return WrapMapper.wrap(e.getCode() == 0 ? Wrapper.ERROR_CODE : e.getCode(), e.getMessage()); } /** * 无权限访问. * * @param e the e * * @return the wrapper */ @ExceptionHandler(AccessDeniedException.class) @ResponseStatus(HttpStatus.UNAUTHORIZED) @ResponseBody public Wrapper unAuthorizedException(AccessDeniedException e) { log.error("业务异常={}", e.getMessage(), e); return WrapMapper.wrap(ErrorCodeEnum.GL99990401.code(), ErrorCodeEnum.GL99990401.msg()); } /** * 全局异常. * * @param e the e * * @return the wrapper */ @ExceptionHandler(Exception.class) @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) @ResponseBody public Wrapper exception(Exception e) { log.info("保存全局异常信息 ex={}", e.getMessage(), e); taskExecutor.execute(() -> { GlobalExceptionLogDto globalExceptionLogDto = new GlobalExceptionLogDto().getGlobalExceptionLogDto(e, profile, applicationName); mdcExceptionLogFeignApi.saveAndSendExceptionLog(globalExceptionLogDto); }); return WrapMapper.error(); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/AuthRestController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AuthRestController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.google.common.base.Preconditions; import com.paascloud.base.dto.CheckValidDto; import com.paascloud.core.annotation.OperationLogDto; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.constant.UacApiConstant; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.dto.user.ResetLoginPwdDto; import com.paascloud.provider.model.dto.user.UserRegisterDto; import com.paascloud.provider.model.enums.UacUserStatusEnum; import com.paascloud.provider.service.EmailService; import com.paascloud.provider.service.SmsService; import com.paascloud.provider.service.UacLogService; import com.paascloud.provider.service.UacUserService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.StringUtils; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 不认证的URL请求. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/auth") @Api(value = "Web-AuthRestController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class AuthRestController extends BaseController { @Resource private UacUserService uacUserService; @Resource private SmsService smsService; @Resource private EmailService emailService; @Resource private UacLogService uacLogService; /** * 校验手机号码. * * @param mobileNo the mobile no * * @return the wrapper */ @PostMapping(value = "/checkPhoneActive/{mobileNo}") @ApiOperation(httpMethod = "POST", value = "校验手机号码") public Wrapper checkPhoneActive(@PathVariable String mobileNo) { UacUser uacUser = new UacUser(); uacUser.setStatus(UacUserStatusEnum.ENABLE.getKey()); uacUser.setMobileNo(mobileNo); int count = uacUserService.selectCount(uacUser); return WrapMapper.ok(count > 0); } /** * 校验邮箱. * * @param email the email * * @return the wrapper */ @PostMapping(value = "/checkEmailActive/{email:.+}") @ApiOperation(httpMethod = "POST", value = "校验邮箱") public Wrapper checkEmailActive(@PathVariable("email") String email) { UacUser uacUser = new UacUser(); uacUser.setStatus(UacUserStatusEnum.ENABLE.getKey()); uacUser.setEmail(email); int count = uacUserService.selectCount(uacUser); return WrapMapper.ok(count > 0); } /** * 校验数据. * * @param checkValidDto the check valid dto * * @return the wrapper */ @PostMapping(value = "/checkValid") @ApiOperation(httpMethod = "POST", value = "校验数据") public Wrapper checkValid(@RequestBody CheckValidDto checkValidDto) { String type = checkValidDto.getType(); String validValue = checkValidDto.getValidValue(); Preconditions.checkArgument(StringUtils.isNotEmpty(validValue), "参数错误"); String message = null; boolean result = false; //开始校验 if (UacApiConstant.Valid.LOGIN_NAME.equals(type)) { result = uacUserService.checkLoginName(validValue); if (!result) { message = "用户名已存在"; } } if (UacApiConstant.Valid.EMAIL.equals(type)) { result = uacUserService.checkEmail(validValue); if (!result) { message = "邮箱已存在"; } } if (UacApiConstant.Valid.MOBILE_NO.equals(type)) { result = uacUserService.checkMobileNo(validValue); if (!result) { message = "手机号码已存在"; } } return WrapMapper.wrap(Wrapper.SUCCESS_CODE, message, result); } /** * 重置密码-邮箱-提交. * * @param email the email * * @return the wrapper */ @PostMapping(value = "/submitResetPwdEmail") @ApiOperation(httpMethod = "POST", value = "重置密码-邮箱-提交") public Wrapper submitResetPwdEmail(@RequestParam("email") String email) { logger.info("重置密码-邮箱-提交, email={}", email); emailService.submitResetPwdEmail(email); return WrapMapper.ok(); } /** * 重置密码-手机-提交. * * @param mobile the mobile * @param response the response * * @return the wrapper */ @PostMapping(value = "/submitResetPwdPhone") @ApiOperation(httpMethod = "POST", value = "重置密码-手机-提交") public Wrapper submitResetPwdPhone(@RequestParam("mobile") String mobile, HttpServletResponse response) { logger.info("重置密码-手机-提交, mobile={}", mobile); String token = smsService.submitResetPwdPhone(mobile, response); return WrapMapper.ok(token); } /** * 重置密码-最终提交. * * @param resetLoginPwdDto the reset login pwd dto * * @return the wrapper */ @PostMapping(value = "/resetLoginPwd") @ApiOperation(httpMethod = "POST", value = "重置密码-最终提交") public Wrapper checkResetSmsCode(ResetLoginPwdDto resetLoginPwdDto) { uacUserService.resetLoginPwd(resetLoginPwdDto); return WrapMapper.ok(); } /** * 注册用户. * * @param user the user * * @return the wrapper */ @PostMapping(value = "/register") @ApiOperation(httpMethod = "POST", value = "注册用户") public Wrapper registerUser(UserRegisterDto user) { uacUserService.register(user); return WrapMapper.ok(); } /** * 激活用户. * * @param activeUserToken the active user token * * @return the wrapper */ @GetMapping(value = "/activeUser/{activeUserToken}") @ApiOperation(httpMethod = "POST", value = "激活用户") public Wrapper activeUser(@PathVariable String activeUserToken) { uacUserService.activeUser(activeUserToken); return WrapMapper.ok("激活成功"); } /** * 查询日志. * * @param operationLogDto the operation log dto * * @return the integer */ @PostMapping(value = "/saveLog") @ApiOperation(httpMethod = "POST", value = "查询日志") public Integer saveLog(@RequestBody OperationLogDto operationLogDto) { logger.info("saveLog - 保存操作日志. operationLogDto={}", operationLogDto); return uacLogService.saveOperationLog(operationLogDto); } @PostMapping(value = "/callback/qq") public void callbackQQ(HttpServletRequest request) { logger.info("callback - callback qq. request={}", request); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacActionCommonController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacActionCommonController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.paascloud.provider.model.domain.UacAction; import com.paascloud.provider.model.dto.action.UacActionCheckCodeDto; import com.paascloud.provider.model.dto.action.UacActionCheckUrlDto; import com.paascloud.provider.service.UacActionService; import com.paascloud.core.support.BaseController; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; 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; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; /** * The class Uac action common controller. * * @author paascloud.net@gmail.com */ @RestController @RequestMapping(value = "/action", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacActionCommonController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacActionCommonController extends BaseController { @Resource private UacActionService uacActionService; /** * 检测权限编码是否已存在 * * @param uacActionCheckCodeDto the uac action check code dto * * @return the wrapper */ @PostMapping(value = "/checkActionCode") @ApiOperation(httpMethod = "POST", value = "检测权限编码是否已存在") public Wrapper checkActionCode(@ApiParam(name = "uacActionCheckCodeDto", value = "id与url") @RequestBody UacActionCheckCodeDto uacActionCheckCodeDto) { logger.info("校验权限编码唯一性 uacActionCheckCodeDto={}", uacActionCheckCodeDto); Long id = uacActionCheckCodeDto.getActionId(); String actionCode = uacActionCheckCodeDto.getActionCode(); Example example = new Example(UacAction.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("actionCode", actionCode); int result = uacActionService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 检测权限URL唯一性 * * @param uacActionCheckUrlDto the uac action check url dto * * @return the wrapper */ @PostMapping(value = "/checkUrl") @ApiOperation(httpMethod = "POST", value = "检测权限URL唯一性") public Wrapper checkActionUrl(@ApiParam(name = "uacActionCheckUrlDto", value = "id与url") @RequestBody UacActionCheckUrlDto uacActionCheckUrlDto) { logger.info("检测权限URL唯一性 uacActionCheckUrlDto={}", uacActionCheckUrlDto); Long id = uacActionCheckUrlDto.getActionId(); String url = uacActionCheckUrlDto.getUrl(); Example example = new Example(UacAction.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("url", url); int result = uacActionService.selectCountByExample(example); return WrapMapper.ok(result < 1); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacActionMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacActionMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.github.pagehelper.PageInfo; import com.google.common.base.Preconditions; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.annotation.ValidateAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.core.utils.RequestUtil; import com.paascloud.provider.model.domain.UacAction; import com.paascloud.provider.model.dto.action.ActionMainQueryDto; import com.paascloud.provider.model.dto.base.ModifyStatusDto; import com.paascloud.provider.service.UacActionService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * The class Uac action main controller. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/action", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacActionMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacActionMainController extends BaseController { @Resource private UacActionService uacActionService; /** * 分页查询角色信息. * * @param action the action * * @return the wrapper */ @PostMapping(value = "/queryListWithPage") @ApiOperation(httpMethod = "POST", value = "查询角色列表") public Wrapper queryUacActionListWithPage(@ApiParam(name = "action", value = "角色信息") @RequestBody ActionMainQueryDto action) { logger.info("查询角色列表actionQuery={}", action); PageInfo pageInfo = uacActionService.queryActionListWithPage(action); return WrapMapper.ok(pageInfo); } /** * 删除角色信息. * * @param id the id * * @return the wrapper */ @PostMapping(value = "/deleteActionById/{id}") @ApiOperation(httpMethod = "POST", value = "删除角色") @LogAnnotation public Wrapper deleteUacActionById(@ApiParam(name = "id", value = "角色id") @PathVariable Long id) { int result = uacActionService.deleteActionById(id); return super.handleResult(result); } /** * 批量删除角色. * * @param deleteIdList the delete id list * * @return the wrapper */ @PostMapping(value = "/batchDeleteByIdList") @ApiOperation(httpMethod = "POST", value = "批量删除角色") @LogAnnotation public Wrapper batchDeleteByIdList(@ApiParam(name = "deleteIdList", value = "角色Id") @RequestBody List deleteIdList) { logger.info("批量删除角色 idList={}", deleteIdList); uacActionService.batchDeleteByIdList(deleteIdList); return WrapMapper.ok(); } /** * 保存权限信息. * * @param action the action * * @return the wrapper */ @PostMapping(value = "/save") @ApiOperation(httpMethod = "POST", value = "新增角色") @ValidateAnnotation @LogAnnotation public Wrapper save(@ApiParam(name = "action", value = "角色信息") @RequestBody UacAction action) { LoginAuthDto loginAuthDto = RequestUtil.getLoginUser(); uacActionService.saveAction(action, loginAuthDto); return WrapMapper.ok(); } /** * 根据权限Id修改角色状态. * * @param modifyStatusDto the modify status dto * * @return the wrapper */ @PostMapping(value = "/modifyStatus") @ApiOperation(httpMethod = "POST", value = "根据权限Id修改角色状态") @LogAnnotation public Wrapper modifyActionStatus(@ApiParam(name = "modifyActionStatus", value = "修改权限状态") @RequestBody ModifyStatusDto modifyStatusDto) { logger.info("根据角色Id修改权限状态 modifyStatusDto={}", modifyStatusDto); Long actionId = modifyStatusDto.getId(); Preconditions.checkArgument(actionId != null, "权限ID不能为空"); UacAction uacRole = new UacAction(); uacRole.setId(actionId); uacRole.setStatus(modifyStatusDto.getStatus()); uacRole.setUpdateInfo(getLoginAuthDto()); int result = uacActionService.update(uacRole); return super.handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacGrantAuth4RoleController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGrantAuth4RoleController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.role.RoleBindActionDto; import com.paascloud.provider.model.dto.role.RoleBindMenuDto; import com.paascloud.provider.service.UacRoleService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; 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; import javax.annotation.Resource; /** * 角色授权. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/role", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacGrantAuth4RoleController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacGrantAuth4RoleController extends BaseController { @Resource private UacRoleService uacRoleService; /** * 角色分配权限. * * @param roleBindActionDto the role bind action dto * * @return the wrapper */ @PostMapping(value = "/bindAction") @ApiOperation(httpMethod = "POST", value = "角色分配权限") @LogAnnotation public Wrapper bindAction(@ApiParam(name = "bindAuth", value = "权限信息") @RequestBody RoleBindActionDto roleBindActionDto) { logger.info("角色分配权限. roleBindActionDto= {}", roleBindActionDto); uacRoleService.bindAction(roleBindActionDto); return WrapMapper.ok(); } /** * 角色分配权限. * * @param roleBindMenuDto the role bind menu dto * * @return the wrapper */ @PostMapping(value = "/bindMenu") @ApiOperation(httpMethod = "POST", value = "角色分配权限") @LogAnnotation public Wrapper bindMenu(@ApiParam(name = "bindAuth", value = "权限信息") @RequestBody RoleBindMenuDto roleBindMenuDto) { logger.info("角色分配权限. roleBindMenuDto= {}", roleBindMenuDto); uacRoleService.bindMenu(roleBindMenuDto); return WrapMapper.ok(); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacGroupBindUserController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGroupBindUserController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.group.GroupBindUserDto; import com.paascloud.provider.model.dto.group.GroupBindUserReqDto; import com.paascloud.provider.service.UacGroupService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * 组织绑定用户. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/group", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacGroupBindUserController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacGroupBindUserController extends BaseController { @Resource private UacGroupService uacGroupService; /** * 组织绑定用户 * * @param groupBindUserReqDto the group bind user req dto * * @return the wrapper */ @PostMapping(value = "/bindUser") @LogAnnotation @ApiOperation(httpMethod = "POST", value = "组织绑定用户") public Wrapper bindUser4Role(@ApiParam(name = "uacGroupBindUserReqDto", value = "组织绑定用户") @RequestBody GroupBindUserReqDto groupBindUserReqDto) { logger.info("组织绑定用户... groupBindUserReqDto={}", groupBindUserReqDto); LoginAuthDto loginAuthDto = super.getLoginAuthDto(); uacGroupService.bindUacUser4Group(groupBindUserReqDto, loginAuthDto); return WrapMapper.ok(); } /** * 组织绑定用户页面数据 * * @param groupId the group id * * @return the group bind user page info */ @PostMapping(value = "/getBindUser/{groupId}") @ApiOperation(httpMethod = "POST", value = "获取组织绑定用户页面数据") public Wrapper getGroupBindUserPageInfo(@ApiParam(name = "groupId", value = "组织id") @PathVariable Long groupId) { logger.info("查询组织绑定用户页面数据 groupId={}", groupId); LoginAuthDto loginAuthDto = super.getLoginAuthDto(); Long currentUserId = loginAuthDto.getUserId(); GroupBindUserDto bindUserDto = uacGroupService.getGroupBindUserDto(groupId, currentUserId); return WrapMapper.ok(bindUserDto); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacGroupCommonController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGroupCommonController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.UacGroup; import com.paascloud.provider.model.dto.group.CheckGroupCodeDto; import com.paascloud.provider.model.dto.group.CheckGroupNameDto; import com.paascloud.provider.model.enums.UacGroupTypeEnum; import com.paascloud.provider.model.vo.GroupZtreeVo; import com.paascloud.provider.service.UacGroupService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; import java.util.List; import java.util.Map; /** * 组织相关公用接口 * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/group", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacGroupCommonController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacGroupCommonController extends BaseController { @Resource private UacGroupService uacGroupService; /** * 根据当前登录人查询组织列表 * * @return the group tree by id */ @PostMapping(value = "/getGroupTree") @ApiOperation(httpMethod = "POST", value = "根据当前登录人查询组织列表") public Wrapper> getGroupTreeById() { logger.info("根据当前登录人查询组织列表"); LoginAuthDto loginAuthDto = super.getLoginAuthDto(); Long groupId = loginAuthDto.getGroupId(); UacGroup uacGroup = uacGroupService.queryById(groupId); List tree = uacGroupService.getGroupTree(uacGroup.getId()); return WrapMapper.wrap(Wrapper.SUCCESS_CODE, "操作成功", tree); } /** * 通过组织ID查询组织树 * * @param groupId the group id * * @return the group tree by id */ @PostMapping(value = "/getGroupTree/{groupId}") @ApiOperation(httpMethod = "POST", value = "通过组织ID查询组织列表") public Wrapper> getGroupTreeById(@ApiParam(name = "groupId", value = "通过组织ID查询组织列表") @PathVariable Long groupId) { logger.info("通过组织ID查询组织列表 groupId={}", groupId); List tree = uacGroupService.getGroupTree(groupId); return WrapMapper.wrap(Wrapper.SUCCESS_CODE, "操作成功", tree); } /** * Check group name with edit wrapper. * * @param checkGroupNameDto the check group name dto * * @return the wrapper */ @PostMapping(value = "/checkGroupName") @ApiOperation(httpMethod = "POST", value = "编辑校验组织名唯一性") public Wrapper checkGroupName(@ApiParam(name = "checkGroupName", value = "组织名称") @RequestBody CheckGroupNameDto checkGroupNameDto) { logger.info("校验组织名称唯一性 checkGroupNameDto={}", checkGroupNameDto); Long id = checkGroupNameDto.getGroupId(); String groupName = checkGroupNameDto.getGroupName(); Example example = new Example(UacGroup.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("groupName", groupName); int result = uacGroupService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 修改时验证组织编码 * * @param checkGroupCodeDto the check group code dto * * @return the wrapper */ @PostMapping(value = "/checkGroupCode") @ApiOperation(httpMethod = "POST", value = "修改校验组织编码唯一性") public Wrapper checkGroupCode(@ApiParam(name = "checkGroupCode", value = "组织相关信息") @RequestBody CheckGroupCodeDto checkGroupCodeDto) { logger.info("校验组织编码唯一性 checkGroupCodeDto={}", checkGroupCodeDto); Long id = checkGroupCodeDto.getGroupId(); String groupCode = checkGroupCodeDto.getGroupCode(); Example example = new Example(UacGroup.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("groupCode", groupCode); int result = uacGroupService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 查询组织类型 * * @return the wrapper */ @PostMapping(value = "queryGroupType") @ApiOperation(httpMethod = "POST", value = "查询组织类型") public Wrapper>> queryGroupType() { List> groupTypeList = UacGroupTypeEnum.getMap2List(); return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, groupTypeList); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacGroupMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGroupMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.provider.model.domain.UacGroup; import com.paascloud.provider.model.dto.user.IdStatusDto; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.service.UacGroupService; import com.paascloud.core.support.BaseController; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * 组织管理主页面 * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/group", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacGroupMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacGroupMainController extends BaseController { @Resource private UacGroupService uacGroupService; /** * 根据id删除组织 * * @param id the id * * @return the wrapper */ @PostMapping(value = "/deleteById/{id}") @LogAnnotation @ApiOperation(httpMethod = "POST", value = "根据id删除组织") public Wrapper deleteGroupById(@ApiParam(name = "id", value = "组织id") @PathVariable Long id) { logger.info(" 根据id删除组织 id={}", id); int result = uacGroupService.deleteUacGroupById(id); if (result < 1) { return WrapMapper.wrap(Wrapper.ERROR_CODE, "操作失败"); } else { return WrapMapper.wrap(Wrapper.SUCCESS_CODE, "操作成功"); } } /** * 根据id修改组织状态 * * @param idStatusDto the id status dto * * @return the wrapper */ @PostMapping(value = "/modifyStatus") @LogAnnotation @ApiOperation(httpMethod = "POST", value = "根据id修改组织状态") public Wrapper modifyGroupStatus(@ApiParam(name = "modifyGroupStatus", value = "修改状态") @RequestBody IdStatusDto idStatusDto) { logger.info("根据id修改组织状态 idStatusDto={}", idStatusDto); UacGroup uacGroup = new UacGroup(); uacGroup.setId(idStatusDto.getId()); LoginAuthDto loginAuthDto = super.getLoginAuthDto(); Integer status = idStatusDto.getStatus(); uacGroup.setStatus(status); int result = uacGroupService.updateUacGroupStatusById(idStatusDto, loginAuthDto); if (result < 1) { return WrapMapper.wrap(Wrapper.ERROR_CODE, "操作失败"); } else { return WrapMapper.wrap(Wrapper.SUCCESS_CODE, "操作成功"); } } /** * 获取主页面数据 * * @return the wrapper */ @PostMapping(value = "/getTree") @ApiOperation(httpMethod = "POST", value = "获取菜单树") public Wrapper> getTree() { Long userId = super.getLoginAuthDto().getUserId(); List tree = uacGroupService.getGroupTreeListByUserId(userId); return WrapMapper.ok(tree); } /** * 编辑组织 * * @param group the group * * @return the wrapper */ @PostMapping(value = "/save") @LogAnnotation @ApiOperation(httpMethod = "POST", value = "修改组织信息") public Wrapper editGroup(@ApiParam(name = "group", value = "组织信息") @RequestBody UacGroup group) { LoginAuthDto loginAuthDto = super.getLoginAuthDto(); uacGroupService.saveUacGroup(group, loginAuthDto); return WrapMapper.ok(); } /** * 获取编辑页面数据 * * @param id the id * * @return the edit group page info */ @PostMapping(value = "/queryById/{id}") @ApiOperation(httpMethod = "POST", value = "获取编辑页面数据") public Wrapper getEditGroupPageInfo(@ApiParam(name = "id", value = "组织id") @PathVariable Long id) { UacGroup uacGroup = uacGroupService.getById(id); return WrapMapper.ok(uacGroup); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacLogMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacLogMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.github.pagehelper.PageInfo; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.log.UacLogMainDto; import com.paascloud.provider.service.UacLogService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; 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; import javax.annotation.Resource; /** * 日志管理. * * @author paascloud.net@gmail.com */ @RestController @RequestMapping(value = "/log", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacLogMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacLogMainController extends BaseController { @Resource private UacLogService uacLogService; /** * 查询日志列表. * * @param uacLogQueryDtoPage the uac log query dto page * * @return the wrapper */ @PostMapping(value = "/queryListWithPage") @ApiOperation(httpMethod = "POST", value = "查询日志列表") public Wrapper queryLogListWithPage(@ApiParam(name = "uacLogQueryDtoPage", value = "日志查询条件") @RequestBody UacLogMainDto uacLogQueryDtoPage) { logger.info("查询日志处理列表 uacLogQueryDtoPage={}", uacLogQueryDtoPage); PageInfo pageInfo = uacLogService.queryLogListWithPage(uacLogQueryDtoPage); return WrapMapper.ok(pageInfo); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacMenuCommonController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacMenuCommonController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.paascloud.provider.model.domain.UacMenu; import com.paascloud.provider.model.dto.menu.UacMenuCheckCodeDto; import com.paascloud.provider.model.dto.menu.UacMenuCheckNameDto; import com.paascloud.provider.model.dto.menu.UacMenuCheckUrlDto; import com.paascloud.provider.service.UacMenuService; import com.paascloud.core.support.BaseController; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; 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; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; /** * 菜单. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/menu", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacMenuCommonController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacMenuCommonController extends BaseController { @Resource private UacMenuService uacMenuService; /** * 检测菜单编码是否已存在 * * @param uacMenuCheckCodeDto the uac menu check code dto * * @return the wrapper */ @PostMapping(value = "/checkMenuCode") @ApiOperation(httpMethod = "POST", value = "检测菜单编码是否已存在") public Wrapper checkUacMenuActionCode(@ApiParam(name = "uacMenuCheckCodeDto", value = "id与url") @RequestBody UacMenuCheckCodeDto uacMenuCheckCodeDto) { logger.info("校验菜单编码唯一性 uacMenuCheckCodeDto={}", uacMenuCheckCodeDto); Long id = uacMenuCheckCodeDto.getMenuId(); String menuCode = uacMenuCheckCodeDto.getMenuCode(); Example example = new Example(UacMenu.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("menuCode", menuCode); int result = uacMenuService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 检测菜单名称唯一性 * * @param uacMenuCheckNameDto the uac menu check name dto * * @return the wrapper */ @PostMapping(value = "/checkMenuName") @ApiOperation(httpMethod = "POST", value = "检测菜单名称唯一性") public Wrapper checkUacMenuName(@ApiParam(name = "uacMenuCheckNameDto", value = "id与name") @RequestBody UacMenuCheckNameDto uacMenuCheckNameDto) { logger.info("校验菜单名称唯一性 uacMenuCheckNameDto={}", uacMenuCheckNameDto); Long id = uacMenuCheckNameDto.getMenuId(); Long pid = uacMenuCheckNameDto.getPid(); String menuName = uacMenuCheckNameDto.getMenuName(); Example example = new Example(UacMenu.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("menuName", menuName); criteria.andEqualTo("pid", pid); int result = uacMenuService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 检测菜单URL唯一性 * * @param uacMenuCheckUrlDto the uac menu check url dto * * @return the wrapper */ @PostMapping(value = "/checkMenuUrl") @ApiOperation(httpMethod = "POST", value = "检测菜单URL唯一性") public Wrapper checkUacMenuUrl(@ApiParam(name = "uacMenuCheckUrlDto", value = "id与url") @RequestBody UacMenuCheckUrlDto uacMenuCheckUrlDto) { logger.info("检测菜单URL唯一性 uacMenuCheckUrlDto={}", uacMenuCheckUrlDto); Long id = uacMenuCheckUrlDto.getMenuId(); String url = uacMenuCheckUrlDto.getUrl(); Example example = new Example(UacMenu.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("url", url); int result = uacMenuService.selectCountByExample(example); return WrapMapper.ok(result < 1); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacMenuMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacMenuMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.google.common.base.Preconditions; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.UacMenu; import com.paascloud.provider.model.dto.menu.UacEditMenuDto; import com.paascloud.provider.model.dto.menu.UacMenuStatusDto; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.model.vo.ViewMenuVo; import com.paascloud.provider.service.UacMenuService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.BeanUtils; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * 菜单主页面. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/menu", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacMenuMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacMenuMainController extends BaseController { @Resource private UacMenuService uacMenuService; /** * 获取菜单列表数据 * * @return the wrapper */ @PostMapping(value = "/getTree") @ApiOperation(httpMethod = "POST", value = "获取菜单树") public Wrapper> queryMenuTreeList() { List menuVoList = uacMenuService.getMenuVoList(getLoginAuthDto().getUserId(), null); return WrapMapper.ok(menuVoList); } /** * 编辑菜单. * * @param id the id * * @return the wrapper */ @PostMapping(value = "/queryById/{id}") @ApiOperation(httpMethod = "POST", value = "编辑菜单") public Wrapper queryMenuVoById(@ApiParam(name = "id", value = "菜单id") @PathVariable Long id) { ViewMenuVo menuVo = uacMenuService.getViewVoById(id); return WrapMapper.ok(menuVo); } /** * 根据id修改菜单的禁用状态 * * @param uacMenuStatusDto the uac menu status dto * * @return the wrapper */ @PostMapping(value = "/modifyStatus") @ApiOperation(httpMethod = "POST", value = "修改菜单状态") @LogAnnotation public Wrapper updateUacMenuStatusById(@ApiParam(name = "uacMenuStatusDto", value = "修改菜单状态Dto") @RequestBody UacMenuStatusDto uacMenuStatusDto) { logger.info("根据id修改菜单的禁用状态 uacMenuStatusDto={}", uacMenuStatusDto); LoginAuthDto loginAuthDto = getLoginAuthDto(); uacMenuService.updateUacMenuStatusById(uacMenuStatusDto, loginAuthDto); return WrapMapper.ok(); } /** * 新增菜单. * * @param uacMenuAddDto the uac menu add dto * * @return the wrapper */ @PostMapping(value = "/save") @ApiOperation(httpMethod = "POST", value = "新增菜单") @LogAnnotation public Wrapper saveMenu(@ApiParam(name = "saveMenu", value = "保存菜单") @RequestBody UacEditMenuDto uacMenuAddDto) { UacMenu uacMenu = new UacMenu(); LoginAuthDto loginAuthDto = getLoginAuthDto(); BeanUtils.copyProperties(uacMenuAddDto, uacMenu); uacMenuService.saveUacMenu(uacMenu, loginAuthDto); return WrapMapper.ok(); } /** * 根据id删除菜单 * * @param id the id * * @return the wrapper */ @PostMapping(value = "/deleteById/{id}") @ApiOperation(httpMethod = "POST", value = "删除菜单") @LogAnnotation public Wrapper deleteUacMenuById(@ApiParam(name = "id", value = "菜单id") @PathVariable Long id) { logger.info(" 根据id删除菜单 id={}", id); LoginAuthDto loginAuthDto = getLoginAuthDto(); Preconditions.checkArgument(id != null, "菜单ID不能为空"); // 判断此菜单是否有子节点 boolean hasChild = uacMenuService.checkMenuHasChildMenu(id); if (hasChild) { return WrapMapper.wrap(Wrapper.ERROR_CODE, "此菜单含有子菜单, 请先删除子菜单"); } int result = uacMenuService.deleteUacMenuById(id, loginAuthDto); return super.handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacRoleBindUserController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleBindUserController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.role.RoleBindUserDto; import com.paascloud.provider.model.dto.role.RoleBindUserReqDto; import com.paascloud.provider.service.UacRoleService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * 角色绑定用户. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/role", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacRoleBindUserController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacRoleBindUserController extends BaseController { @Resource private UacRoleService uacRoleService; /** * 角色绑定用户. * * @param roleBindUserReqDto the role bind user req dto * * @return the wrapper */ @LogAnnotation @PostMapping(value = "/bindUser") @ApiOperation(httpMethod = "POST", value = "角色绑定用户") public Wrapper bindUser(@ApiParam(name = "uacRoleBindUserReqDto", value = "角色绑定用户") @RequestBody RoleBindUserReqDto roleBindUserReqDto) { logger.info("roleBindUser={}", roleBindUserReqDto); LoginAuthDto loginAuthDto = getLoginAuthDto(); uacRoleService.bindUser4Role(roleBindUserReqDto, loginAuthDto); return WrapMapper.ok(); } /** * 获取角色绑定用户页面数据. * * @param roleId the role id * * @return the wrapper */ @PostMapping(value = "/getBindUser/{roleId}") @ApiOperation(httpMethod = "POST", value = "获取角色绑定用户页面数据") public Wrapper getBindUser(@ApiParam(name = "roleId", value = "角色id") @PathVariable Long roleId) { logger.info("获取角色绑定用户页面数据. roleId={}", roleId); LoginAuthDto loginAuthDto = super.getLoginAuthDto(); Long currentUserId = loginAuthDto.getUserId(); RoleBindUserDto bindUserDto = uacRoleService.getRoleBindUserDto(roleId, currentUserId); return WrapMapper.ok(bindUserDto); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacRoleCommonController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleCommonController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.UacRole; import com.paascloud.provider.model.dto.role.CheckRoleCodeDto; import com.paascloud.provider.model.vo.BindAuthVo; import com.paascloud.provider.service.UacRoleService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; /** * 角色管理-公共方法. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/role", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacRoleCommonController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacRoleCommonController extends BaseController { @Resource private UacRoleService uacRoleService; /** * 查看角色信息. * * @param id the id * * @return the wrapper */ @PostMapping(value = "/queryRoleInfoById/{id}") @ApiOperation(httpMethod = "POST", value = "查看角色信息") public Wrapper queryRoleInfo(@PathVariable Long id) { UacRole role = uacRoleService.selectByKey(id); return WrapMapper.wrap(Wrapper.SUCCESS_CODE, Wrapper.SUCCESS_MESSAGE, role); } /** * 验证角色编码是否存在. * * @param checkRoleCodeDto the check role code dto * * @return the wrapper */ @PostMapping(value = "/checkRoleCode") @ApiOperation(httpMethod = "POST", value = "验证角色编码是否存在") public Wrapper checkUacRoleCode(@ApiParam(name = "roleCode", value = "角色编码") @RequestBody CheckRoleCodeDto checkRoleCodeDto) { logger.info("校验角色编码唯一性 checkRoleCodeDto={}", checkRoleCodeDto); Long id = checkRoleCodeDto.getRoleId(); String roleCode = checkRoleCodeDto.getRoleCode(); Example example = new Example(UacRole.class); Example.Criteria criteria = example.createCriteria(); if (id != null) { criteria.andNotEqualTo("id", id); } criteria.andEqualTo("roleCode", roleCode); int result = uacRoleService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 获取权限树 * * @param roleId the role id * * @return the auth tree by role id */ @PostMapping(value = "/getActionTreeByRoleId/{roleId}") @ApiOperation(httpMethod = "POST", value = "获取权限树") public Wrapper getActionTreeByRoleId(@ApiParam(name = "roleId", value = "角色id") @PathVariable Long roleId) { logger.info("roleId={}", roleId); BindAuthVo bindAuthVo = uacRoleService.getActionTreeByRoleId(roleId); return WrapMapper.ok(bindAuthVo); } /** * 获取菜单树. * * @param roleId the role id * * @return the menu tree by role id */ @PostMapping(value = "/getMenuTreeByRoleId/{roleId}") @ApiOperation(httpMethod = "POST", value = "获取菜单树") public Wrapper getMenuTreeByRoleId(@ApiParam(name = "roleId", value = "角色id") @PathVariable Long roleId) { logger.info("roleId={}", roleId); BindAuthVo bindAuthVo = uacRoleService.getMenuTreeByRoleId(roleId); return WrapMapper.ok(bindAuthVo); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacRoleMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacRoleMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.annotation.ValidateAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.core.utils.RequestUtil; import com.paascloud.provider.model.domain.UacRole; import com.paascloud.provider.model.domain.UacRoleUser; import com.paascloud.provider.model.dto.base.ModifyStatusDto; import com.paascloud.provider.model.enums.UacRoleStatusEnum; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.model.vo.RoleVo; import com.paascloud.provider.service.UacRoleService; import com.paascloud.provider.service.UacRoleUserService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * 角色管理主页面. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/role", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacRoleMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacRoleMainController extends BaseController { @Resource private UacRoleService uacRoleService; @Resource private UacRoleUserService uacRoleUserService; /** * 分页查询角色信息. * * @param role the role * * @return the wrapper */ @PostMapping(value = "/queryRoleListWithPage") @ApiOperation(httpMethod = "POST", value = "查询角色列表") public Wrapper> queryUacRoleListWithPage(@ApiParam(name = "role", value = "角色信息") @RequestBody UacRole role) { logger.info("查询角色列表roleQuery={}", role); PageHelper.startPage(role.getPageNum(), role.getPageSize()); role.setOrderBy("update_time desc"); List roleVoList = uacRoleService.queryRoleListWithPage(role); return WrapMapper.ok(new PageInfo<>(roleVoList)); } /** * 删除角色信息. * * @param id the id * * @return the wrapper */ @LogAnnotation @PostMapping(value = "/deleteRoleById/{id}") @ApiOperation(httpMethod = "POST", value = "删除角色") public Wrapper deleteUacRoleById(@ApiParam(name = "id", value = "角色id") @PathVariable Long id) { int result = uacRoleService.deleteRoleById(id); return super.handleResult(result); } /** * 批量删除角色. * * @param deleteIdList the delete id list * * @return the wrapper */ @LogAnnotation @PostMapping(value = "/batchDeleteByIdList") @ApiOperation(httpMethod = "POST", value = "批量删除角色") public Wrapper batchDeleteByIdList(@ApiParam(name = "deleteIdList", value = "角色Id") @RequestBody List deleteIdList) { logger.info("批量删除角色 idList={}", deleteIdList); uacRoleService.batchDeleteByIdList(deleteIdList); return WrapMapper.ok(); } /** * 修改角色状态. * * @param modifyStatusDto the modify status dto * * @return the wrapper */ @LogAnnotation @PostMapping(value = "/modifyRoleStatusById") @ApiOperation(httpMethod = "POST", value = "根据角色Id修改角色状态") public Wrapper modifyUacRoleStatusById(@ApiParam(name = "modifyRoleStatusDto", value = "修改角色状态数据") @RequestBody ModifyStatusDto modifyStatusDto) { logger.info("根据角色Id修改角色状态 modifyStatusDto={}", modifyStatusDto); Long roleId = modifyStatusDto.getId(); if (roleId == null) { throw new UacBizException(ErrorCodeEnum.UAC10012001); } LoginAuthDto loginAuthDto = getLoginAuthDto(); Long userId = loginAuthDto.getUserId(); UacRoleUser ru = uacRoleUserService.getByUserIdAndRoleId(userId, roleId); if (ru != null && UacRoleStatusEnum.DISABLE.getType().equals(modifyStatusDto.getStatus())) { throw new UacBizException(ErrorCodeEnum.UAC10012002); } UacRole uacRole = new UacRole(); uacRole.setId(roleId); uacRole.setStatus(modifyStatusDto.getStatus()); uacRole.setUpdateInfo(loginAuthDto); int result = uacRoleService.update(uacRole); return super.handleResult(result); } /** * 保存用户. * * @param role the role * * @return the wrapper */ @PostMapping(value = "/save") @ApiOperation(httpMethod = "POST", value = "新增角色") @ValidateAnnotation @LogAnnotation public Wrapper save(@ApiParam(name = "role", value = "角色信息") @RequestBody UacRole role) { LoginAuthDto loginAuthDto = RequestUtil.getLoginUser(); uacRoleService.saveRole(role, loginAuthDto); return WrapMapper.ok(); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacTokenMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacTokenMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.github.pagehelper.PageInfo; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.token.TokenMainQueryDto; import com.paascloud.provider.service.UacUserTokenService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; 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; import javax.annotation.Resource; /** * token主页面. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/token", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacTokenMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacTokenMainController extends BaseController { @Resource private UacUserTokenService uacUserTokenService; /** * 分页查询角色信息. * * @param token the token * * @return the wrapper */ @PostMapping(value = "/queryListWithPage") @ApiOperation(httpMethod = "POST", value = "查询在线用户列表") public Wrapper queryUacActionListWithPage(@ApiParam(name = "token") @RequestBody TokenMainQueryDto token) { logger.info("查询在线用户列表. token={}", token); PageInfo pageInfo = uacUserTokenService.listTokenWithPage(token); return WrapMapper.ok(pageInfo); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacUserCommonController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserCommonController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.paascloud.PublicUtil; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.UacRole; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.dto.user.*; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.model.vo.UserVo; import com.paascloud.provider.service.UacRoleService; import com.paascloud.provider.service.UacUserService; import com.paascloud.provider.utils.Md5Util; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.beans.BeanUtils; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import tk.mybatis.mapper.entity.Example; import javax.annotation.Resource; import java.util.HashSet; import java.util.List; /** * 用户管理-公共方法. * * @author paascloud.net@gmail.com */ @RestController @RequestMapping(value = "/user", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacUserCommonController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacUserCommonController extends BaseController { @Resource private UacUserService uacUserService; @Resource private UacRoleService uacRoleService; /** * 根据userId查询用户详细信息(连表查询). * * @return the wrapper */ @PostMapping(value = "/queryUserInfo/{loginName}") @ApiOperation(httpMethod = "POST", value = "根据userId查询用户详细信息") public Wrapper queryUserInfo(@PathVariable String loginName) { logger.info("根据userId查询用户详细信息"); UserVo userVo = new UserVo(); UacUser uacUser = uacUserService.findByLoginName(loginName); uacUser = uacUserService.findUserInfoByUserId(uacUser.getId()); List roleList = uacRoleService.findAllRoleInfoByUserId(uacUser.getId()); List authTree = uacRoleService.getOwnAuthTree(uacUser.getId()); BeanUtils.copyProperties(uacUser, userVo); if (PublicUtil.isNotEmpty(roleList)) { userVo.setRoles(new HashSet<>(roleList)); } userVo.setAuthTree(authTree); return WrapMapper.ok(userVo); } /** * 校验登录名唯一性. * * @param checkLoginNameDto the check login name dto * * @return the wrapper */ @PostMapping(value = "/checkLoginName") @ApiOperation(httpMethod = "POST", value = "校验登录名唯一性") public Wrapper checkLoginName(@ApiParam(name = "loginName", value = "登录名") @RequestBody CheckLoginNameDto checkLoginNameDto) { logger.info("校验登录名唯一性 checkLoginNameDto={}", checkLoginNameDto); Long id = checkLoginNameDto.getUserId(); String loginName = checkLoginNameDto.getLoginName(); Example example = new Example(UacUser.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("loginName", loginName); if (id != null) { criteria.andNotEqualTo("id", id); } int result = uacUserService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 校验登录名唯一性. * * @param checkEmailDto the check email dto * * @return the wrapper */ @PostMapping(value = "/checkEmail") @ApiOperation(httpMethod = "POST", value = "校验登录名唯一性") public Wrapper checkEmail(@RequestBody CheckEmailDto checkEmailDto) { logger.info("校验邮箱唯一性 checkEmailDto={}", checkEmailDto); Long id = checkEmailDto.getUserId(); String email = checkEmailDto.getEmail(); Example example = new Example(UacUser.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("email", email); if (id != null) { criteria.andNotEqualTo("id", id); } int result = uacUserService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 校验真实姓名唯一性. * * @param checkUserNameDto the check user name dto * * @return the wrapper */ @PostMapping(value = "/checkUserName") @ApiOperation(httpMethod = "POST", value = "校验真实姓名唯一性") public Wrapper checkUserName(@ApiParam(name = "checkUserNameDto", value = "校验真实姓名唯一性Dto") @RequestBody CheckUserNameDto checkUserNameDto) { logger.info(" 校验真实姓名唯一性 checkUserNameDto={}", checkUserNameDto); Long id = checkUserNameDto.getUserId(); String name = checkUserNameDto.getUserName(); Example example = new Example(UacUser.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("userName", name); if (id != null) { criteria.andNotEqualTo("id", id); } int result = uacUserService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 校验用户电话号码唯一性. * * @param checkUserPhoneDto the check user phone dto * * @return the wrapper */ @PostMapping(value = "/checkUserPhone") @ApiOperation(httpMethod = "POST", value = "校验用户电话号码唯一性") public Wrapper checkUserPhone(@ApiParam(name = "checkUserPhoneDto", value = "校验用户电话号码唯一性Dto") @RequestBody CheckUserPhoneDto checkUserPhoneDto) { logger.info(" 校验用户电话号码唯一性 checkUserPhoneDto={}", checkUserPhoneDto); Long id = checkUserPhoneDto.getUserId(); String mobileNo = checkUserPhoneDto.getMobileNo(); Example example = new Example(UacUser.class); Example.Criteria criteria = example.createCriteria(); criteria.andEqualTo("mobileNo", mobileNo); if (id != null) { criteria.andNotEqualTo("id", id); } int result = uacUserService.selectCountByExample(example); return WrapMapper.ok(result < 1); } /** * 校验新密码是否与原始密码相同. * * @param checkNewPasswordDto 修改密码实体 * * @return the wrapper */ @PostMapping(value = "/checkNewPassword") @ApiOperation(httpMethod = "POST", value = "校验新密码是否与原始密码相同") public Wrapper checkNewPassword(@ApiParam(name = "checkNewPasswordDto", value = "校验新密码是否与原始密码相同Dto") @RequestBody CheckNewPasswordDto checkNewPasswordDto) { logger.info(" 校验新密码是否与原始密码相同 checkNewPasswordDto={}", checkNewPasswordDto); String loginName = checkNewPasswordDto.getLoginName(); String newPassword = checkNewPasswordDto.getNewPassword(); UacUser uacUser = new UacUser(); uacUser.setLoginName(loginName); int result = 0; UacUser user = uacUserService.findByLoginName(loginName); if (user == null) { logger.error("找不到用户. loginName={}", loginName); } else { uacUser.setLoginPwd(Md5Util.encrypt(newPassword)); result = uacUserService.selectCount(uacUser); } return WrapMapper.ok(result < 1); } /** * 修改用户邮箱 * * @param email the email * @param emailCode the email code * * @return the wrapper */ @LogAnnotation @PostMapping(value = "/modifyUserEmail/{email}/{emailCode}") @ApiOperation(httpMethod = "POST", value = "修改用户信息") public Wrapper modifyUserEmail(@PathVariable String email, @PathVariable String emailCode) { logger.info(" 修改用户信息 email={}, emailCode={}", email, emailCode); LoginAuthDto loginAuthDto = getLoginAuthDto(); uacUserService.modifyUserEmail(email, emailCode, loginAuthDto); return WrapMapper.ok(); } /** * 获取已有权限树 * * @return the auth tree by role id */ @PostMapping(value = "/getOwnAuthTree") @ApiOperation(httpMethod = "POST", value = "获取权限树") public Wrapper> getOwnAuthTree() { List tree = uacRoleService.getOwnAuthTree(getLoginAuthDto().getUserId()); return WrapMapper.ok(tree); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacUserLoginController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserLoginController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.google.common.base.Preconditions; import com.paascloud.base.dto.UserTokenDto; import com.paascloud.core.support.BaseController; import com.paascloud.core.utils.RequestUtil; import com.paascloud.provider.model.dto.user.LoginRespDto; import com.paascloud.provider.model.enums.UacUserTokenStatusEnum; import com.paascloud.provider.service.UacLoginService; import com.paascloud.provider.service.UacUserTokenService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang.StringUtils; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException; import org.springframework.security.oauth2.provider.ClientDetails; import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; /** * 登录相关. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacUserLoginController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacUserLoginController extends BaseController { @Resource private UacLoginService uacLoginService; @Resource private UacUserTokenService uacUserTokenService; @Resource private ClientDetailsService clientDetailsService; private static final String BEARER_TOKEN_TYPE = "Basic "; /** * 登录成功获取菜单信息和用户信息. * * @param applicationId the application id * * @return the wrapper */ @PostMapping(value = "/user/loginAfter/{applicationId}") @ApiOperation(httpMethod = "POST", value = "登录成功获取用户菜单") public Wrapper loginAfter(@PathVariable Long applicationId) { logger.info("登录成功获取用户菜单. applicationId={}", applicationId); LoginRespDto result = uacLoginService.loginAfter(applicationId); return WrapMapper.ok(result); } /** * 登出. * * @param accessToken the access token * * @return the wrapper */ @PostMapping(value = "/user/logout") @ApiOperation(httpMethod = "POST", value = "登出") public Wrapper loginAfter(String accessToken) { if (!StringUtils.isEmpty(accessToken)) { // 修改用户在线状态 UserTokenDto userTokenDto = uacUserTokenService.getByAccessToken(accessToken); userTokenDto.setStatus(UacUserTokenStatusEnum.OFF_LINE.getStatus()); uacUserTokenService.updateUacUserToken(userTokenDto, getLoginAuthDto()); } return WrapMapper.ok(); } /** * 刷新token. * * @param request the request * @param refreshToken the refresh token * @param accessToken the access token * * @return the wrapper */ @GetMapping(value = "/auth/user/refreshToken") @ApiOperation(httpMethod = "POST", value = "刷新token") public Wrapper refreshToken(HttpServletRequest request, @RequestParam(value = "refreshToken") String refreshToken, @RequestParam(value = "accessToken") String accessToken) { String token; try { Preconditions.checkArgument(org.apache.commons.lang3.StringUtils.isNotEmpty(accessToken), "accessToken is null"); Preconditions.checkArgument(org.apache.commons.lang3.StringUtils.isNotEmpty(refreshToken), "refreshToken is null"); String header = request.getHeader(HttpHeaders.AUTHORIZATION); if (header == null || !header.startsWith(BEARER_TOKEN_TYPE)) { throw new UnapprovedClientAuthenticationException("请求头中无client信息"); } String[] tokens = RequestUtil.extractAndDecodeHeader(header); assert tokens.length == 2; String clientId = tokens[0]; String clientSecret = tokens[1]; ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId); if (clientDetails == null) { throw new UnapprovedClientAuthenticationException("clientId对应的配置信息不存在:" + clientId); } else if (!StringUtils.equals(clientDetails.getClientSecret(), clientSecret)) { throw new UnapprovedClientAuthenticationException("clientSecret不匹配:" + clientId); } token = uacUserTokenService.refreshToken(accessToken, refreshToken, request); } catch (Exception e) { logger.error("refreshToken={}", e.getMessage(), e); return WrapMapper.error(); } return WrapMapper.ok(token); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacUserMainController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserMainController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.UacLog; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.dto.menu.UserMenuDto; import com.paascloud.provider.model.dto.user.BindUserMenusDto; import com.paascloud.provider.model.dto.user.BindUserRolesDto; import com.paascloud.provider.model.dto.user.ModifyUserStatusDto; import com.paascloud.provider.model.exceptions.UacBizException; import com.paascloud.provider.model.vo.UserBindRoleVo; import com.paascloud.provider.security.SecurityUtils; import com.paascloud.provider.service.UacUserService; import com.paascloud.security.core.SecurityUser; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; import java.util.Objects; /** * 用户管理主页面. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/user", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "Web - UacUserMainController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacUserMainController extends BaseController { @Resource private UacUserService uacUserService; /** * 查询角色列表. * * @param uacUser the uac user * * @return the wrapper */ @PostMapping(value = "/queryListWithPage") @ApiOperation(httpMethod = "POST", value = "查询角色列表") public Wrapper queryUserListWithPage(@ApiParam(name = "role", value = "角色信息") @RequestBody UacUser uacUser) { logger.info("查询用户列表uacUser={}", uacUser); PageInfo pageInfo = uacUserService.queryUserListWithPage(uacUser); return WrapMapper.ok(pageInfo); } /** * 新增用户 * * @param user the user * * @return the wrapper */ @LogAnnotation @PostMapping(value = "/save") @ApiOperation(httpMethod = "POST", value = "新增用户") public Wrapper addUacUser(@ApiParam(name = "user", value = "新增用户Dto") @RequestBody UacUser user) { logger.info(" 新增用户 user={}", user); LoginAuthDto loginAuthDto = getLoginAuthDto(); uacUserService.saveUacUser(user, loginAuthDto); return WrapMapper.ok(); } /** * 分页查询用户操作日志列表. * * @param log the log * * @return the wrapper */ @PostMapping(value = "/queryUserLogListWithPage") @ApiOperation(httpMethod = "POST", value = "分页查询用户操作日志列表") public Wrapper> queryUserLogListWithPage(@ApiParam(name = "user", value = "用户信息") @RequestBody UacLog log) { logger.info("分页查询用户操作日志列表"); PageHelper.startPage(log.getPageNum(), log.getPageSize()); List list = uacUserService.queryUserLogListWithUserId(getLoginAuthDto().getUserId()); PageInfo pageInfo = new PageInfo<>(list); return WrapMapper.ok(pageInfo); } /** * 根据Id修改用户状态. * * @param modifyUserStatusDto the modify user status dto * * @return the wrapper */ @PostMapping(value = "/modifyUserStatusById") @LogAnnotation @ApiOperation(httpMethod = "POST", value = "根据Id修改用户状态") public Wrapper modifyUserStatusById(@ApiParam(name = "modifyUserStatusDto", value = "用户禁用/启用Dto") @RequestBody ModifyUserStatusDto modifyUserStatusDto) { logger.info(" 根据Id修改用户状态 modifyUserStatusDto={}", modifyUserStatusDto); LoginAuthDto loginAuthDto = getLoginAuthDto(); UacUser uacUser = new UacUser(); uacUser.setId(modifyUserStatusDto.getUserId()); uacUser.setStatus(modifyUserStatusDto.getStatus()); int result = uacUserService.modifyUserStatusById(uacUser, loginAuthDto); return handleResult(result); } /** * 通过Id删除用户. * * @param userId the user id * * @return the wrapper */ @LogAnnotation @PostMapping(value = "/deleteUserById/{userId}") @ApiOperation(httpMethod = "POST", value = "通过Id删除用户") public Wrapper deleteUserById(@ApiParam(name = "userId", value = "用户ID") @PathVariable Long userId) { logger.info(" 通过Id删除用户 userId={}", userId); int result = uacUserService.deleteUserById(userId); return handleResult(result); } /** * 获取用户绑定角色页面数据. * * @param userId the user id * * @return the bind role */ @PostMapping(value = "/getBindRole/{userId}") @ApiOperation(httpMethod = "POST", value = "获取用户绑定角色页面数据") public Wrapper getBindRole(@ApiParam(name = "userId", value = "角色id") @PathVariable Long userId) { logger.info("获取用户绑定角色页面数据. userId={}", userId); LoginAuthDto loginAuthDto = super.getLoginAuthDto(); Long currentUserId = loginAuthDto.getUserId(); if (Objects.equals(userId, currentUserId)) { throw new UacBizException(ErrorCodeEnum.UAC10011023); } UserBindRoleVo bindUserDto = uacUserService.getUserBindRoleDto(userId); return WrapMapper.ok(bindUserDto); } /** * 用户绑定角色. * * @param bindUserRolesDto the bind user roles dto * * @return the wrapper */ @PostMapping(value = "/bindRole") @LogAnnotation @ApiOperation(httpMethod = "POST", value = "用户绑定角色") public Wrapper bindUserRoles(@ApiParam(name = "bindUserRolesDto", value = "用户绑定角色Dto") @RequestBody BindUserRolesDto bindUserRolesDto) { logger.info("用户绑定角色 bindUserRolesDto={}", bindUserRolesDto); LoginAuthDto loginAuthDto = getLoginAuthDto(); uacUserService.bindUserRoles(bindUserRolesDto, loginAuthDto); return WrapMapper.ok(); } /** * 查询用户常用功能数据. * * @return the wrapper */ @PostMapping(value = "/queryUserMenuDtoData") @ApiOperation(httpMethod = "POST", value = "查询用户常用功能数据") public Wrapper> queryUserMenuDtoData() { logger.info("查询用户常用功能数据"); LoginAuthDto loginAuthDto = getLoginAuthDto(); List userMenuDtoList = uacUserService.queryUserMenuDtoData(loginAuthDto); return WrapMapper.ok(userMenuDtoList); } /** * 绑定用户常用菜单. * * @param bindUserMenusDto the bind user menus dto * * @return the wrapper */ @LogAnnotation @PostMapping(value = "/bindUserMenus") @ApiOperation(httpMethod = "POST", value = "绑定用户常用菜单") public Wrapper bindUserMenus(@ApiParam(name = "bindUserMenusDto", value = "绑定用户常用菜单Dto") @RequestBody BindUserMenusDto bindUserMenusDto) { logger.info("绑定用户常用菜单"); List menuIdList = bindUserMenusDto.getMenuIdList(); logger.info("menuIdList = {}", menuIdList); int result = uacUserService.bindUserMenus(menuIdList, getLoginAuthDto()); return handleResult(result); } /** * 根据用户Id查询用户信息. * * @param userId the user id * * @return the uac user by id */ @PostMapping(value = "/getUacUserById/{userId}") @ApiOperation(httpMethod = "POST", value = "根据用户Id查询用户信息") public Wrapper getUacUserById(@ApiParam(name = "userId", value = "用户ID") @PathVariable Long userId) { logger.info("getUacUserById - 根据用户Id查询用户信息. userId={}", userId); UacUser uacUser = uacUserService.queryByUserId(userId); logger.info("getUacUserById - 根据用户Id查询用户信息. [OK] uacUser={}", uacUser); return WrapMapper.ok(uacUser); } /** * 根据用户Id重置密码. * * @param userId the user id * * @return the wrapper */ @LogAnnotation @PostMapping(value = "/resetLoginPwd/{userId}") @ApiOperation(httpMethod = "POST", value = "根据用户Id重置密码") public Wrapper resetLoginPwd(@ApiParam(name = "userId", value = "用户ID") @PathVariable Long userId) { logger.info("resetLoginPwd - 根据用户Id重置密码. userId={}", userId); uacUserService.resetLoginPwd(userId, getLoginAuthDto()); return WrapMapper.ok(); } /** * User security user. * * @return the security user */ @GetMapping("/user") public SecurityUser user() { String loginName = SecurityUtils.getCurrentLoginName(); logger.info("{}", loginName); UacUser user = uacUserService.findByLoginName(loginName); return user == null ? null : new SecurityUser(user.getId(), user.getLoginName(), user.getLoginPwd(), user.getUserName(), user.getGroupId(), user.getGroupName()); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/admin/UacUserPasswordController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserPasswordController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.admin; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.annotation.LogAnnotation; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.user.UserModifyPwdDto; import com.paascloud.provider.model.dto.user.UserRegisterDto; import com.paascloud.provider.service.UacUserService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; 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; import javax.annotation.Resource; /** * 用户密码. * * @author paascloud.net@gmail.com */ @RestController @RequestMapping(value = "/user", produces = {"application/json;charset=UTF-8"}) @Api(value = "Web - UacUserPasswordController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacUserPasswordController extends BaseController { @Resource private UacUserService uacUserService; /** * 用户修改密码 * * @param userModifyPwdDto the user modify pwd dto * * @return the wrapper */ @PostMapping(value = "/modifyUserPwd") @LogAnnotation @ApiOperation(httpMethod = "POST", value = "用户修改密码") public Wrapper modifyUserPwd(@ApiParam(name = "userModifyPwdDto", value = "用户修改密码Dto") @RequestBody UserModifyPwdDto userModifyPwdDto) { logger.info("==》vue用户修改密码, userModifyPwdDto={}", userModifyPwdDto); logger.info("旧密码 oldPassword = {}", userModifyPwdDto.getOldPassword()); logger.info("新密码 newPassword = {}", userModifyPwdDto.getNewPassword()); logger.info("登录名 loginName = {}", userModifyPwdDto.getLoginName()); LoginAuthDto loginAuthDto = getLoginAuthDto(); int result = uacUserService.userModifyPwd(userModifyPwdDto, loginAuthDto); return handleResult(result); } /** * 注册 * * @param registerDto the register dto * * @return the wrapper */ @PostMapping(value = "/registerUser") @ApiOperation(httpMethod = "POST", value = "注册新用户") public Wrapper registerUser(@ApiParam(name = "registerDto", value = "用户注册Dto") @RequestBody UserRegisterDto registerDto) { logger.info("vue注册开始。注册参数:{}", registerDto); uacUserService.register(registerDto); return WrapMapper.ok("注册成功"); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/mall/EmailController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:EmailController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.mall; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.email.SendEmailMessage; import com.paascloud.provider.service.EmailService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; import org.springframework.http.MediaType; 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; import javax.annotation.Resource; /** * The class Email controller. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/email", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - EmailController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class EmailController extends BaseController { @Resource private EmailService emailService; /** * 发送短信验证码. * * @param sendEmailMessage the send email message * * @return the wrapper */ @PostMapping(value = "/sendRestEmailCode") @ApiOperation(httpMethod = "POST", value = "发送注册短信验证码") public Wrapper sendRestEmailCode(@RequestBody SendEmailMessage sendEmailMessage) { LoginAuthDto loginAuthDto = this.getLoginAuthDto(); emailService.sendEmailCode(sendEmailMessage, loginAuthDto.getLoginName()); return WrapMapper.ok(); } /** * 校验短信验证码. * * @param sendEmailMessage the send email message * * @return the wrapper */ @PostMapping(value = "/checkRestEmailCode") @ApiOperation(httpMethod = "POST", value = "校验充值密码邮件验证码") public Wrapper checkRestEmailCode(@ApiParam(value = "验证信息") @RequestBody SendEmailMessage sendEmailMessage) { logger.info("校验短信验证码, checkRestEmailCode={}", sendEmailMessage); LoginAuthDto loginAuthDto = this.getLoginAuthDto(); emailService.checkEmailCode(sendEmailMessage, loginAuthDto.getLoginName()); return WrapMapper.ok(); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/mall/MallAuthRestController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MallAuthRestController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.mall; import com.github.pagehelper.PageInfo; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.dto.ProductCategoryDto; import com.paascloud.provider.model.dto.ProductReqDto; import com.paascloud.provider.model.vo.ProductDetailVo; import com.paascloud.provider.service.MdcProductCategoryQueryFeignApi; import com.paascloud.provider.service.MdcProductQueryFeignApi; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * The class Mall auth rest controller. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/auth", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - MallAuthRestController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MallAuthRestController extends BaseController { @Resource private MdcProductQueryFeignApi mdcProductQueryFeignApi; @Resource private MdcProductCategoryQueryFeignApi mdcProductCategoryQueryFeignApi; /** * 查询商品列表. * * @param productReqDto the product req dto * * @return the product category dto by pid */ @PostMapping(value = "/product/queryProductList") @ApiOperation(httpMethod = "POST", value = "查询商品列表") public Wrapper queryProductList(@RequestBody ProductReqDto productReqDto) { logger.info("getProductCategoryDtoByPid - 查询分类信息 productReqDto={}", productReqDto); return mdcProductCategoryQueryFeignApi.getProductList(productReqDto); } /** * 查询商品详情信息. * * @param productId the product id * * @return the wrapper */ @GetMapping(value = "/product/queryProductDetail/{productId}") @ApiOperation(httpMethod = "POST", value = "查询商品详情信息") public Wrapper queryProductDetail(@PathVariable Long productId) { logger.info("getProductCategoryDtoByPid - 查询商品详情信息 productId={}", productId); return mdcProductQueryFeignApi.getProductDetail(productId); } /** * 查询分类信息. * * @param pid the pid * * @return the product category dto by pid */ @GetMapping(value = "/category/getProductCategoryDtoByPid/{pid}") public Wrapper> getProductCategoryDtoByPid(@PathVariable Long pid) { logger.info("getProductCategoryDtoByPid - 查询分类信息 pid={}", pid); Wrapper> productCategoryData = mdcProductCategoryQueryFeignApi.getProductCategoryData(pid); logger.info("productCategoryData={}", productCategoryData); return productCategoryData; } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/mall/MallCartController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MallCartController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.mall; import com.paascloud.PublicUtil; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.constant.OmcApiConstant; import com.paascloud.provider.model.dto.omc.CartListQuery; import com.paascloud.provider.model.vo.CartProductVo; import com.paascloud.provider.model.vo.CartVo; import com.paascloud.provider.service.OmcCartFeignApi; import com.paascloud.provider.service.OmcCartQueryFeignApi; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.util.List; /** * 购物车管理. * * @author paascloud.net @gmail.com */ @RestController @RequestMapping(value = "/cart", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - MallCartController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MallCartController extends BaseController { @Resource private OmcCartQueryFeignApi mallCartQueryFeignApi; @Resource private OmcCartFeignApi mallCartFeignApi; /** * 登录成功合并购物车. * * @param cartListQuery the cart list query * * @return the wrapper */ @PostMapping(value = "mergeUserCart") @ApiOperation(httpMethod = "POST", value = "登录成功合并购物车") public Wrapper mergeUserCart(@RequestBody CartListQuery cartListQuery) { List cartProductVoList = cartListQuery.getCartProductVoList(); LoginAuthDto loginAuthDto = getLoginAuthDto(); // 1.更新购物车数据 if (PublicUtil.isNotEmpty(cartProductVoList)) { for (CartProductVo cartProductVo : cartProductVoList) { cartProductVo.setUserId(loginAuthDto.getUserId()); } mallCartFeignApi.updateCartList(cartProductVoList); } return mallCartQueryFeignApi.getCartVo(loginAuthDto.getUserId()); } /** * 购物车添加商品. * * @param productId the product id * @param count the count * * @return the wrapper */ @PostMapping("addProduct/{productId}/{count}") @ApiOperation(httpMethod = "POST", value = "购物车添加商品") public Wrapper addProduct(@PathVariable Long productId, @PathVariable Integer count) { LoginAuthDto loginAuthDto = getLoginAuthDto(); Long userId = loginAuthDto.getUserId(); return mallCartFeignApi.addProduct(userId, productId, count); } /** * 购物车更新商品. * * @param productId the product id * @param count the count * * @return the wrapper */ @ApiOperation(httpMethod = "POST", value = "购物车更新商品") @PostMapping("updateProduct/{productId}/{count}") public Wrapper updateProduct(@PathVariable Long productId, @PathVariable Integer count) { LoginAuthDto loginAuthDto = getLoginAuthDto(); Long userId = loginAuthDto.getUserId(); return mallCartFeignApi.updateProduct(userId, productId, count); } /** * 购物车删除商品. * * @param productIds the product ids * * @return the wrapper */ @ApiOperation(httpMethod = "POST", value = "购物车删除商品") @PostMapping("deleteProduct/{productIds}") public Wrapper deleteProduct(@PathVariable String productIds) { LoginAuthDto loginAuthDto = getLoginAuthDto(); Long userId = loginAuthDto.getUserId(); return mallCartFeignApi.deleteProduct(userId, productIds); } /** * 购物车全选商品. * * @return the wrapper */ @PostMapping("selectAllProduct") @ApiOperation(httpMethod = "POST", value = "购物车全选商品") public Wrapper selectAll() { LoginAuthDto loginAuthDto = getLoginAuthDto(); Long userId = loginAuthDto.getUserId(); return mallCartFeignApi.selectOrUnSelect(userId, null, OmcApiConstant.Cart.CHECKED); } /** * 购物车反选全部商品. * * @return the wrapper */ @PostMapping("unSelectAllProduct") @ApiOperation(httpMethod = "POST", value = "购物车反选全部商品") public Wrapper unSelectAll() { LoginAuthDto loginAuthDto = getLoginAuthDto(); Long userId = loginAuthDto.getUserId(); return mallCartFeignApi.selectOrUnSelect(userId, null, OmcApiConstant.Cart.UN_CHECKED); } /** * 选中商品. * * @param productId the product id * * @return the wrapper */ @PostMapping("selectProduct/{productId}") @ApiOperation(httpMethod = "POST", value = "选中商品") public Wrapper select(@PathVariable Long productId) { LoginAuthDto loginAuthDto = getLoginAuthDto(); Long userId = loginAuthDto.getUserId(); return mallCartFeignApi.selectOrUnSelect(userId, productId, OmcApiConstant.Cart.CHECKED); } /** * 反选商品. * * @param productId the product id * * @return the wrapper */ @PostMapping("unSelectProduct/{productId}") @ApiOperation(httpMethod = "POST", value = "反选商品") public Wrapper unSelect(@PathVariable Long productId) { LoginAuthDto loginAuthDto = getLoginAuthDto(); Long userId = loginAuthDto.getUserId(); return mallCartFeignApi.selectOrUnSelect(userId, productId, OmcApiConstant.Cart.UN_CHECKED); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/mall/MallUserController.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MallUserController.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.mall; import com.paascloud.base.dto.LoginAuthDto; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.model.dto.user.UserInfoDto; import com.paascloud.provider.service.UacUserService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.modelmapper.ModelMapper; import org.springframework.beans.BeanUtils; import org.springframework.http.MediaType; 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; import javax.annotation.Resource; /** * The class Mall user controller. * * @author paascloud.net@gmail.com */ @RestController @RequestMapping(value = "/user", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) @Api(value = "WEB - MallUserController", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class MallUserController extends BaseController { @Resource private UacUserService uacUserService; /** * 更新用户信息. * * @param userInfoDto the user info dto * * @return the wrapper */ @PostMapping(value = "/updateInformation") @ApiOperation(httpMethod = "POST", value = "更新用户信息") public Wrapper updateInformation(@RequestBody UserInfoDto userInfoDto) { logger.info("updateInformation - 更新用户基本信息 userInfoDto={}", userInfoDto); UacUser uacUser = new ModelMapper().map(userInfoDto, UacUser.class); uacUserService.updateUser(uacUser); return WrapMapper.ok(); } /** * 获取用户信息. * * @return the information */ @PostMapping(value = "/getInformation") @ApiOperation(httpMethod = "POST", value = "获取用户信息") public Wrapper getInformation() { LoginAuthDto loginAuthDto = getLoginAuthDto(); Long userId = loginAuthDto.getUserId(); logger.info("queryUserInfo - 查询用户基本信息 userId={}", userId); UacUser uacUser = uacUserService.queryByUserId(userId); if (uacUser == null) { return WrapMapper.error("找不到当前用户"); } UserInfoDto userInfoDto = new UserInfoDto(); BeanUtils.copyProperties(uacUser, userInfoDto); return WrapMapper.ok(userInfoDto); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/rpc/UacMqMessageFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacMqMessageFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.service.UacMqMessageFeignApi; import com.paascloud.provider.service.MqMessageService; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; /** * Mq 消息. * * @author paascloud.net @gmail.com */ @RestController @Api(value = "API - UacMqMessageFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacMqMessageFeignClient extends BaseController implements UacMqMessageFeignApi { @Resource private MqMessageService mqMessageService; @Override @ApiOperation(httpMethod = "POST", value = "查询含有的messageKey") public Wrapper> queryMessageKeyList(@RequestParam("messageKeyList") List messageKeyList) { logger.info("查询消息KEY. messageKeyList={}", messageKeyList); return WrapMapper.ok(mqMessageService.queryMessageKeyList(messageKeyList)); } @Override public Wrapper> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto) { return mqMessageService.queryMessageListWithPage(messageQueryDto); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/java/com/paascloud/provider/web/rpc/UacUserTokenFeignClient.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserTokenFeignClient.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.web.rpc; import com.paascloud.core.support.BaseController; import com.paascloud.provider.model.service.UacUserTokenFeignApi; import com.paascloud.provider.service.UacUserTokenService; import com.paascloud.wrapper.Wrapper; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * 用户token. * * @author paascloud.net @gmail.com */ @RestController @Api(value = "API - UacUserTokenFeignClient", produces = MediaType.APPLICATION_JSON_UTF8_VALUE) public class UacUserTokenFeignClient extends BaseController implements UacUserTokenFeignApi { @Resource private UacUserTokenService uacUserTokenService; @Override @ApiOperation(httpMethod = "POST", value = "更新token离线状态") public Wrapper updateTokenOffLine() { int result = uacUserTokenService.batchUpdateTokenOffLine(); return handleResult(result); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/META-INF/spring-devtools.properties ================================================ restart.include.mapper=/mapper-[\\w-\\.]+jar restart.include.pagehelper=/pagehelper-[\\w-\\.]+jar ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/ValidationMessages.properties ================================================ role.roleCode.length=\u89D2\u8272\u7F16\u7801\u957F\u5EA6\u4E0D\u6B63\u786E role.roleCode.pattern=\u89D2\u8272\u7F16\u7801\u53EA\u80FD\u8F93\u5165\u6570\u5B57\u548C\u5B57\u6BCD role.roleName.length=\u89D2\u8272\u540D\u79F0\u957F\u5EA6\u4E0D\u6B63\u786E role.roleName.pattern=\u89D2\u8272\u540D\u79F0\u53EA\u80FD\u8F93\u5165\u6C49\u5B57 role.remark.length=\u89D2\u8272\u8BF4\u660E\u957F\u5EA6\u4E0D\u80FD\u5927\u4E8E150 ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/application.yml ================================================ server: port: 8000 spring: application: name: @pom.artifactId@ datasource: username: root password: 123456 ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/banner.txt ================================================ ${AnsiColor.BRIGHT_CYAN} .__ .___ __ ___________ _____ ______ ____ | | ____ __ __ __| _/ ____ _____/ |_ \____ \__ \ \__ \ / ___// ___\| | / _ \| | \/ __ | / \_/ __ \ __\ | |_> > __ \_/ __ \_\___ \\ \___| |_( <_> ) | / /_/ | | | \ ___/| | | __(____ (____ /____ >\___ >____/\____/|____/\____ | /\ |___| /\___ >__| |__| \/ \/ \/ \/ Powered by liuzhaoming\/ \/ \/ \/ ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/bootstrap.yml ================================================ spring: profiles: active: dev cloud: config: fail-fast: true discovery: service-id: paascloud-discovery enabled: true label: ${spring.profiles.active} profile: ${spring.profiles.active} username: admin password: admin eureka: client: serviceUrl: defaultZone: http://root:root@paascloud-eureka:8761/eureka/ instance: instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/conf/liquibase.properties ================================================ spring.datasource.driver-class-name= com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://paascloud-db-mysql:3306/paascloud_uac?characterEncoding=utf8&useSSL=false spring.datasource.username= root spring.datasource.password= 123456 ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/liquibase/change_log/2017-06-10-init-schema.xml ================================================ init schema ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/liquibase/index.xml ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/logback-spring.xml ================================================ INFO ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE} ${LOG_FILE}.%d{yyyy-MM-dd}.gz 7 ${CONSOLE_LOG_PATTERN} utf8 ${LOG_FILE}.json ${LOG_FILE}.json.%d{yyyy-MM-dd}.gz 7 UTC { "severity": "%level", "service": "${springAppName:-}", "trace": "%X{X-B3-TraceId:-}", "span": "%X{X-B3-SpanId:-}", "parent": "%X{X-B3-ParentSpanId:-}", "exportable": "%X{X-Span-Export:-}", "pid": "${PID:-}", "thread": "%thread", "class": "%logger{40}", "rest": "%message" } ${LOG_FILE}.sql.%d{yyyy-MM-dd}.gz 10 %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36}-%msg%n ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacActionMapper.xml ================================================ ${alias}.id, ${alias}.version, ${alias}.url, ${alias}.action_name, ${alias}.action_code, ${alias}.status, ${alias}.remark, ${alias}.menu_id, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time AND ${alias}.id = #{id,jdbcType=BIGINT} AND ${alias}.version = #{version,jdbcType=INTEGER} AND ${alias}.url = #{url,jdbcType=VARCHAR} AND ${alias}.action_name = #{actionName,jdbcType=VARCHAR} AND ${alias}.action_code = #{actionCode,jdbcType=VARCHAR} AND ${alias}.status = #{status,jdbcType=VARCHAR} AND ${alias}.remark = #{remark,jdbcType=VARCHAR} AND ${alias}.menu_id = #{menuId,jdbcType=BIGINT} AND ${alias}.creator = #{creator,jdbcType=VARCHAR} AND ${alias}.creator_id = #{creatorId,jdbcType=BIGINT} AND ${alias}.created_time = #{createdTime,jdbcType=TIMESTAMP} AND ${alias}.last_operator = #{lastOperator,jdbcType=VARCHAR} AND ${alias}.last_operator_id = #{lastOperatorId,jdbcType=BIGINT} AND ${alias}.update_time = #{updateTime,jdbcType=TIMESTAMP} ORDER BY ${orderBy} version = #{version,jdbcType=INTEGER}, url = #{url,jdbcType=VARCHAR}, action_name = #{actionName,jdbcType=VARCHAR}, action_code = #{actionCode,jdbcType=VARCHAR}, status = #{status,jdbcType=VARCHAR}, remark = #{remark,jdbcType=VARCHAR}, menu_id = #{menuId,jdbcType=BIGINT}, creator = #{creator,jdbcType=VARCHAR}, creator_id = #{creatorId,jdbcType=BIGINT}, created_time = #{createdTime,jdbcType=TIMESTAMP}, last_operator = #{lastOperator,jdbcType=VARCHAR}, last_operator_id = #{lastOperatorId,jdbcType=BIGINT}, update_time = #{updateTime,jdbcType=TIMESTAMP}, delete from pc_uac_action where id in #{item} delete from pc_uac_action where menu_id = #{menuId} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacGroupMapper.xml ================================================ ORDER BY ${orderBy} g.id AS id , g.version AS version , g.group_code AS group_code , g.group_name AS group_name , g.status AS status , g.type AS type , g.pid AS pid , g.level AS level , g.leaf AS leaf , g.contact AS contact , g.group_address AS group_address , g.province_name AS province_name , g.province_id AS provinceId , g.city_name AS city_name , g.city_id AS cityId , g.area_name AS areaName , g.area_id AS areaId , g.street_name AS street_name , g.detail_address AS detailDddress , g.street_id AS streetId , g.contact_phone AS contactPhone , g.remark AS remark , g.creator AS creator , g.creator_id AS creatorId , g.created_time AS createdTime , g.last_operator AS lastOperator , g.last_operator_id AS lastOperatorId , g.update_time number AS updateTime number , AND id = #{id,jdbcType=BIGINT} AND version = #{version,jdbcType=INTEGER} AND group_code = #{groupCode,jdbcType=VARCHAR} AND group_name = #{groupName,jdbcType=VARCHAR} AND status = #{status,jdbcType=TINYINT} AND type = #{type,jdbcType=VARCHAR} AND pid = #{pid,jdbcType=BIGINT} AND level = #{level,jdbcType=INTEGER} AND leaf = #{leaf,jdbcType=INTEGER} AND contact = #{contact,jdbcType=VARCHAR} AND group_address = #{groupAddress,jdbcType=VARCHAR} AND province_name = #{provinceName,jdbcType=VARCHAR} AND province_id = #{provinceId,jdbcType=BIGINT} AND city_name = #{cityName,jdbcType=VARCHAR} AND city_id = #{cityId,jdbcType=BIGINT} AND area_name = #{areaName,jdbcType=VARCHAR} AND area_id = #{areaId,jdbcType=BIGINT} AND street_name = #{streetName,jdbcType=VARCHAR} AND detail_address = #{detailAddress,jdbcType=VARCHAR} AND street_id = #{streetId,jdbcType=BIGINT} AND contact_phone = #{contactPhone,jdbcType=VARCHAR} AND remark = #{remark,jdbcType=VARCHAR} AND creator = #{creator,jdbcType=VARCHAR} AND creator_id = #{creatorId,jdbcType=BIGINT} AND created_time = #{createdTime,jdbcType=TIMESTAMP} AND last_operator = #{lastOperator,jdbcType=VARCHAR} AND last_operator_id = #{lastOperatorId,jdbcType=BIGINT} AND update_time = #{updateTime,jdbcType=TIMESTAMP} AND number = #{number,jdbcType=INTEGER} version = #{version,jdbcType=INTEGER}, group_code = #{groupCode,jdbcType=VARCHAR}, group_name = #{groupName,jdbcType=VARCHAR}, status = #{status,jdbcType=TINYINT}, type = #{type,jdbcType=VARCHAR}, pid = #{pid,jdbcType=BIGINT}, level = #{level,jdbcType=INTEGER}, leaf = #{leaf,jdbcType=INTEGER}, contact = #{contact,jdbcType=VARCHAR}, group_address = #{groupAddress,jdbcType=VARCHAR}, province_name = #{provinceName,jdbcType=VARCHAR}, province_id = #{provinceId,jdbcType=BIGINT}, city_name = #{cityName,jdbcType=VARCHAR}, city_id = #{cityId,jdbcType=BIGINT}, area_name = #{areaName,jdbcType=VARCHAR}, area_id = #{areaId,jdbcType=BIGINT}, street_name = #{streetName,jdbcType=VARCHAR}, detail_address = #{detailAddress,jdbcType=VARCHAR}, street_id = #{streetId,jdbcType=BIGINT}, contact_phone = #{contactPhone,jdbcType=VARCHAR}, remark = #{remark,jdbcType=VARCHAR}, creator = #{creator,jdbcType=VARCHAR}, creator_id = #{creatorId,jdbcType=BIGINT}, created_time = #{createdTime,jdbcType=TIMESTAMP}, last_operator = #{lastOperator,jdbcType=VARCHAR}, last_operator_id = #{lastOperatorId,jdbcType=BIGINT}, update_time = #{updateTime,jdbcType=TIMESTAMP}, number = #{number,jdbcType=INTEGER}, ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacGroupUserMapper.xml ================================================ gu.group_id, gu.user_id update pc_uac_group_user set group_id=#{groupId} where user_id=#{userId} DELETE FROM pc_uac_group_user WHERE user_id IN ( SELECT temp.user_id FROM ( SELECT gu.user_id FROM `pc_uac_group_user` gu LEFT JOIN pc_uac_user u ON gu.user_id = u.id WHERE gu.group_id = #{currentGroupId} AND gu.user_id NOT IN ( SELECT ru.user_id FROM `pc_uac_role_user` ru LEFT JOIN pc_uac_user u ON ru.user_id = u.id WHERE ru.role_id = #{superManagerRoleId} ) ) temp ) ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacLogMapper.xml ================================================ ORDER BY ${orderBy} log.id AS id , log.group_id AS groupId , log.group_name AS groupName , log.log_type AS logType , log.log_name AS logName , log.action_id AS actionId , log.action_code AS actionCode , log.action_name AS actionName , log.os AS os , log.browser AS browser , log.ip AS ip , log.location AS location , log.mac AS mac , log.description AS description , log.request_data AS requestData , log.request_url AS requestUrl , log.response_data AS responseData , log.class_name AS className , log.method_name AS methodName , log.start_time AS startTime , log.end_time AS endTime , log.excute_time AS excuteTime , log.creator AS creator , log.creator_id AS creatorId , log.created_time AS createdTime , log.last_operator AS lastOperator , log.last_operator_id AS lastOperatorId , log.update_time AS updateTime AND id = #{id,jdbcType=BIGINT} AND group_id = #{groupId,jdbcType=BIGINT} AND action_id = #{actionId,jdbcType=BIGINT} AND group_name = #{groupName,jdbcType=VARCHAR} AND log_type = #{logType,jdbcType=VARCHAR} AND log_name = #{logName,jdbcType=VARCHAR} AND action_code = #{actionCode,jdbcType=VARCHAR} AND action_name = #{actionName,jdbcType=VARCHAR} AND os = #{os,jdbcType=VARCHAR} AND browser = #{browser,jdbcType=VARCHAR} AND ip = #{ip,jdbcType=VARCHAR} AND mac = #{mac,jdbcType=VARCHAR} AND description = #{description,jdbcType=VARCHAR} AND request_data = #{requestData,jdbcType=VARCHAR} AND request_url = #{requestUrl,jdbcType=VARCHAR} AND response_data = #{responseData,jdbcType=VARCHAR} AND class_name = #{className,jdbcType=VARCHAR} AND method_name = #{methodName,jdbcType=VARCHAR} AND start_time = #{startTime,jdbcType=TIMESTAMP} AND end_time = #{endTime,jdbcType=TIMESTAMP} AND excute_time = #{excuteTime,jdbcType=INTEGER} AND creator = #{creator,jdbcType=VARCHAR} AND creator_id = #{creatorId,jdbcType=BIGINT} AND created_time = #{createdTime,jdbcType=TIMESTAMP} AND last_operator = #{lastOperator,jdbcType=VARCHAR} AND last_operator_id = #{lastOperatorId,jdbcType=BIGINT} AND update_time = #{updateTime,jdbcType=TIMESTAMP} group_id = #{groupId,jdbcType=BIGINT}, action_id = #{actionId,jdbcType=BIGINT}, group_name = #{groupName,jdbcType=VARCHAR}, log_type = #{logType,jdbcType=VARCHAR}, log_name = #{logName,jdbcType=VARCHAR}, action_code = #{actionCode,jdbcType=VARCHAR}, action_name = #{actionName,jdbcType=VARCHAR}, os = #{os,jdbcType=VARCHAR}, browser = #{browser,jdbcType=VARCHAR}, ip = #{ip,jdbcType=VARCHAR}, mac = #{mac,jdbcType=VARCHAR}, description = #{description,jdbcType=VARCHAR}, request_data = #{requestData,jdbcType=VARCHAR}, request_url = #{requestUrl,jdbcType=VARCHAR}, response_data = #{responseData,jdbcType=VARCHAR}, class_name = #{className,jdbcType=VARCHAR}, method_name = #{methodName,jdbcType=VARCHAR}, start_time = #{startTime,jdbcType=TIMESTAMP}, end_time = #{endTime,jdbcType=TIMESTAMP}, excute_time = #{excuteTime,jdbcType=INTEGER}, creator = #{creator,jdbcType=VARCHAR}, creator_id = #{creatorId,jdbcType=BIGINT}, created_time = #{createdTime,jdbcType=TIMESTAMP}, last_operator = #{lastOperator,jdbcType=VARCHAR}, last_operator_id = #{lastOperatorId,jdbcType=BIGINT}, update_time = #{updateTime,jdbcType=TIMESTAMP}, ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacMenuMapper.xml ================================================ ORDER BY ${orderBy} m.id as id, m.version as version, m.menu_code as menuCode, m.menu_name as menuName, m.status as status, m.url as url, m.icon as icon, m.pid as pid, m.application_id as applicationId, m.level as level, m.leaf as leaf, m.number as number, m.remark as remark, m.creator as creator, m.creator_id as creatorId, m.created_time as createdTime, m.last_operator as lastOperator, m.last_operator_id as lastOpetator, m.update_time as updateTime AND id = #{id,jdbcType=BIGINT} AND version = #{version,jdbcType=INTEGER} AND menu_code = #{menuCode,jdbcType=VARCHAR} AND menu_name = #{menuName,jdbcType=VARCHAR} AND status = #{status,jdbcType=VARCHAR} AND url = #{url,jdbcType=VARCHAR} AND icon = #{icon,jdbcType=VARCHAR} AND pid = #{pid,jdbcType=BIGINT} AND application_id = #{applicationId,jdbcType=BIGINT} AND level = #{level,jdbcType=INTEGER} AND leaf = #{leaf,jdbcType=INTEGER} AND number = #{number,jdbcType=INTEGER} AND remark = #{remark,jdbcType=VARCHAR} AND creator = #{creator,jdbcType=VARCHAR} AND creator_id = #{creatorId,jdbcType=BIGINT} AND created_time = #{createdTime,jdbcType=TIMESTAMP} AND last_operator = #{lastOperator,jdbcType=VARCHAR} AND last_operator_id = #{lastOperatorId,jdbcType=BIGINT} AND update_time = #{updateTime,jdbcType=TIMESTAMP} version = version + 1, menu_code = #{menuCode,jdbcType=VARCHAR}, menu_name = #{menuName,jdbcType=VARCHAR}, status = #{status,jdbcType=VARCHAR}, url = #{url,jdbcType=VARCHAR}, icon = #{icon,jdbcType=VARCHAR}, pid = #{pid,jdbcType=BIGINT}, application_id = #{applicationId,jdbcType=BIGINT}, level = #{level,jdbcType=INTEGER}, leaf = #{leaf,jdbcType=INTEGER}, number = #{number,jdbcType=INTEGER}, remark = #{remark,jdbcType=VARCHAR}, creator = #{creator,jdbcType=VARCHAR}, creator_id = #{creatorId,jdbcType=BIGINT}, created_time = #{createdTime,jdbcType=TIMESTAMP}, last_operator = #{lastOperator,jdbcType=VARCHAR}, last_operator_id = #{lastOperatorId,jdbcType=BIGINT}, update_time = #{updateTime,jdbcType=TIMESTAMP}, update pc_uac_menu where 1 =1 ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacRoleActionMapper.xml ================================================ delete from pc_uac_role_action where action_id = #{actionId} delete from pc_uac_role_action where role_id in #{item} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacRoleMapper.xml ================================================ r.id AS id, r.version as version, r.role_code as roleCode, r.role_name as roleName, r.status as status, r.remark as remark, r.creator as creator, r.creator_id as creatorId, r.created_time as createdTime, r.last_operator as lastOperator, r.last_operator_id as lastOperatorId, r.update_time as updateTime AND id = #{id,jdbcType=BIGINT} AND version = #{version,jdbcType=INTEGER} AND role_code = #{roleCode,jdbcType=VARCHAR} AND role_name = #{roleName,jdbcType=VARCHAR} AND status = #{status,jdbcType=VARCHAR} AND remark = #{remark,jdbcType=VARCHAR} AND creator = #{creator,jdbcType=VARCHAR} AND creator_id = #{creatorId,jdbcType=BIGINT} AND created_time = #{createdTime,jdbcType=TIMESTAMP} AND last_operator = #{lastOperator,jdbcType=VARCHAR} AND last_operator_id = #{lastOperatorId,jdbcType=BIGINT} AND update_time = #{updateTime,jdbcType=TIMESTAMP} ORDER BY ${orderBy} version = version + 1, role_code = #{roleCode,jdbcType=VARCHAR}, role_name = #{roleName,jdbcType=VARCHAR}, status = #{status,jdbcType=VARCHAR}, remark = #{remark,jdbcType=VARCHAR}, creator = #{creator,jdbcType=VARCHAR}, creator_id = #{creatorId,jdbcType=BIGINT}, created_time = #{createdTime,jdbcType=TIMESTAMP}, last_operator = #{lastOperator,jdbcType=VARCHAR}, last_operator_id = #{lastOperatorId,jdbcType=BIGINT}, update_time = #{updateTime,jdbcType=TIMESTAMP}, delete from pc_uac_role where id in #{item} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacRoleMenuMapper.xml ================================================ INSERT INTO pc_uac_role_menu(role_id,menu_id) VALUES (#{rolemenu.roleId},#{rolemenu.menuId}) delete from pc_uac_role_menu where role_id in #{item} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacRoleUserMapper.xml ================================================ role_id, user_id DELETE FROM pc_uac_role_user WHERE user_id IN (SELECT temp.user_id FROM ( SELECT ru.user_id FROM `pc_uac_role_user` ru LEFT JOIN pc_uac_user u ON ru.user_id = u.id WHERE ru.role_id = #{currentRoleId} AND ru.user_id NOT IN ( SELECT ru.user_id FROM `pc_uac_role_user` ru LEFT JOIN pc_uac_user u ON ru.user_id = u.id WHERE ru.role_id = #{superRoleId} )) temp ) delete from pc_uac_role_user where role_id=#{roleId} delete from pc_uac_role_user where role_id in #{item} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacUserMapper.xml ================================================ ORDER BY ${orderBy} u.id as id, u.version as version, u.login_name as loginName, u.login_pwd as loginPwd, u.salt as salt, u.user_code as userCode, u.user_name as userName, u.mobile_no as mobileNo, u.email as email, u.status as status, u.user_source as userSource, u.type as type, u.last_login_ip as lastLoginIp, u.remark as remark, u.last_login_time as lastLoginTime, u.is_changed_pwd as isChangedPwd, u.pwd_error_count as pwdErrorCount, u.pwd_error_time as pwdErrorTime, u.creator as creator, u.creator_id as creatorId, u.created_time as createdTime, u.last_operator as lastOperator, u.last_operator_id as lastOperatorId, u.update_time as updateTime, u.last_login_location as lastLoginLocation version = version + 1, login_name = #{loginName,jdbcType=VARCHAR}, login_pwd = #{loginPwd,jdbcType=VARCHAR}, salt = #{salt,jdbcType=VARCHAR}, user_code = #{userCode,jdbcType=VARCHAR}, user_name = #{userName,jdbcType=VARCHAR}, mobile_no = #{mobileNo,jdbcType=VARCHAR}, email = #{email,jdbcType=VARCHAR}, status = #{status,jdbcType=VARCHAR}, user_source = #{userSource,jdbcType=VARCHAR}, type = #{type,jdbcType=VARCHAR}, last_login_ip = #{lastLoginIp,jdbcType=VARCHAR}, last_login_location = #{lastLoginLocation,jdbcType=VARCHAR}, remark = #{remark,jdbcType=VARCHAR}, last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP}, is_changed_pwd = #{isChangedPwd,jdbcType=SMALLINT}, pwd_error_count = #{pwdErrorCount,jdbcType=SMALLINT}, pwd_error_time = #{pwdErrorTime,jdbcType=TIMESTAMP}, creator = #{creator,jdbcType=VARCHAR}, creator_id = #{creatorId,jdbcType=BIGINT}, created_time = #{createdTime,jdbcType=TIMESTAMP}, last_operator = #{lastOperator,jdbcType=VARCHAR}, last_operator_id = #{lastOperatorId,jdbcType=BIGINT}, update_time = #{updateTime,jdbcType=TIMESTAMP}, AND ${alias}.id = #{id,jdbcType=BIGINT} AND ${alias}.version = #{version,jdbcType=INTEGER} AND ${alias}.login_name = #{loginName,jdbcType=VARCHAR} AND ${alias}.login_pwd = #{loginPwd,jdbcType=VARCHAR} AND ${alias}.salt = #{salt,jdbcType=VARCHAR} AND ${alias}.user_code = #{userCode,jdbcType=VARCHAR} AND ${alias}.user_name = #{userName,jdbcType=VARCHAR} AND ${alias}.mobile_no = #{mobileNo,jdbcType=VARCHAR} AND ${alias}.email = #{email,jdbcType=VARCHAR} AND ${alias}.status = #{status,jdbcType=VARCHAR} AND ${alias}.user_source = #{userSource,jdbcType=VARCHAR} AND ${alias}.type = #{type,jdbcType=VARCHAR} AND ${alias}.last_login_ip = #{lastLoginIp,jdbcType=VARCHAR} AND ${alias}.last_login_location = #{lastLoginLocation,jdbcType=VARCHAR} AND ${alias}.remark = #{remark,jdbcType=VARCHAR} AND ${alias}.last_login_time = #{lastLoginTime,jdbcType=TIMESTAMP} AND ${alias}.is_changed_pwd = #{isChangedPwd,jdbcType=SMALLINT} AND ${alias}.pwd_error_count = #{pwdErrorCount,jdbcType=SMALLINT} AND ${alias}.pwd_error_time = #{pwdErrorTime,jdbcType=TIMESTAMP} AND ${alias}.creator = #{creator,jdbcType=VARCHAR} AND ${alias}.creator_id = #{creatorId,jdbcType=BIGINT} AND ${alias}.created_time = #{createdTime,jdbcType=TIMESTAMP} AND ${alias}.last_operator = #{lastOperator,jdbcType=VARCHAR} AND ${alias}.last_operator_id = #{lastOperatorId,jdbcType=BIGINT} AND ${alias}.update_time = #{updateTime,jdbcType=TIMESTAMP} update pc_uac_user where id = #{id,jdbcType=BIGINT} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacUserMenuMapper.xml ================================================ ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/mapper/UacUserTokenMapper.xml ================================================ id, version, pid, login_name, user_name, user_id, login_ip, login_location, access_token, refresh_token, access_token_validity, refresh_token_validity, status, creator, creator_id, created_time, last_operator, last_operator_id, update_time, os, browser, login_time, group_id, group_name UPDATE pc_uac_user_token SET `status` = #{status} WHERE id IN #{item} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/org/springframework/security/messages_zh_CN.properties ================================================ AbstractAccessDecisionManager.accessDenied=\u4E0D\u5141\u8BB8\u8BBF\u95EE AbstractLdapAuthenticationProvider.emptyPassword=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A AbstractSecurityInterceptor.authenticationNotFound=\u672A\u5728SecurityContext\u4E2D\u67E5\u627E\u5230\u8BA4\u8BC1\u5BF9\u8C61 AbstractUserDetailsAuthenticationProvider.badCredentials=\u7528\u6237\u540D\u4E0D\u5B58\u5728\u6216\u8005\u5BC6\u7801\u9519\u8BEF AbstractUserDetailsAuthenticationProvider.credentialsExpired=\u7528\u6237\u51ED\u8BC1\u5DF2\u8FC7\u671F AbstractUserDetailsAuthenticationProvider.disabled=\u7528\u6237\u672A\u6FC0\u6D3B AbstractUserDetailsAuthenticationProvider.expired=\u7528\u6237\u5E10\u53F7\u5DF2\u8FC7\u671F AbstractUserDetailsAuthenticationProvider.locked=\u7528\u6237\u5E10\u53F7\u5DF2\u88AB\u9501\u5B9A AbstractUserDetailsAuthenticationProvider.onlySupports=\u4EC5\u4EC5\u652F\u6301UsernamePasswordAuthenticationToken AccountStatusUserDetailsChecker.credentialsExpired=\u7528\u6237\u51ED\u8BC1\u5DF2\u8FC7\u671F AccountStatusUserDetailsChecker.disabled=\u7528\u6237\u672A\u6FC0\u6D3B AccountStatusUserDetailsChecker.expired=\u7528\u6237\u5E10\u53F7\u5DF2\u8FC7\u671F AccountStatusUserDetailsChecker.locked=\u7528\u6237\u5E10\u53F7\u5DF2\u88AB\u9501\u5B9A AclEntryAfterInvocationProvider.noPermission=\u7ED9\u5B9A\u7684Authentication\u5BF9\u8C61({0})\u6839\u672C\u65E0\u6743\u64CD\u63A7\u9886\u57DF\u5BF9\u8C61({1}) AnonymousAuthenticationProvider.incorrectKey=\u5C55\u793A\u7684AnonymousAuthenticationToken\u4E0D\u542B\u6709\u9884\u671F\u7684key BindAuthenticator.badCredentials=\u574F\u7684\u51ED\u8BC1 BindAuthenticator.emptyPassword=\u5BC6\u7801\u4E0D\u80FD\u4E3A\u7A7A CasAuthenticationProvider.incorrectKey=\u5C55\u793A\u7684CasAuthenticationToken\u4E0D\u542B\u6709\u9884\u671F\u7684key CasAuthenticationProvider.noServiceTicket=\u672A\u80FD\u591F\u6B63\u786E\u63D0\u4F9B\u5F85\u9A8C\u8BC1\u7684CAS\u670D\u52A1\u7968\u6839 ConcurrentSessionControlAuthenticationStrategy.exceededAllowed=\u5DF2\u7ECF\u8D85\u8FC7\u4E86\u5F53\u524D\u4E3B\u4F53({0})\u88AB\u5141\u8BB8\u7684\u6700\u5927\u4F1A\u8BDD\u6570\u91CF DigestAuthenticationFilter.incorrectRealm=\u54CD\u5E94\u7ED3\u679C\u4E2D\u7684Realm\u540D\u5B57({0})\u540C\u7CFB\u7EDF\u6307\u5B9A\u7684Realm\u540D\u5B57({1})\u4E0D\u543B\u5408 DigestAuthenticationFilter.incorrectResponse=\u9519\u8BEF\u7684\u54CD\u5E94\u7ED3\u679C DigestAuthenticationFilter.missingAuth=\u9057\u6F0F\u4E86\u9488\u5BF9'auth' QOP\u7684\u3001\u5FC5\u987B\u7ED9\u5B9A\u7684\u6458\u8981\u53D6\u503C; \u63A5\u6536\u5230\u7684\u5934\u4FE1\u606F\u4E3A{0} DigestAuthenticationFilter.missingMandatory=\u9057\u6F0F\u4E86\u5FC5\u987B\u7ED9\u5B9A\u7684\u6458\u8981\u53D6\u503C; \u63A5\u6536\u5230\u7684\u5934\u4FE1\u606F\u4E3A{0} DigestAuthenticationFilter.nonceCompromised=Nonce\u4EE4\u724C\u5DF2\u7ECF\u5B58\u5728\u95EE\u9898\u4E86\uFF0C{0} DigestAuthenticationFilter.nonceEncoding=Nonce\u672A\u7ECF\u8FC7Base64\u7F16\u7801; \u76F8\u5E94\u7684nonce\u53D6\u503C\u4E3A {0} DigestAuthenticationFilter.nonceExpired=Nonce\u5DF2\u7ECF\u8FC7\u671F/\u8D85\u65F6 DigestAuthenticationFilter.nonceNotNumeric=Nonce\u4EE4\u724C\u7684\u7B2C1\u90E8\u5206\u5E94\u8BE5\u662F\u6570\u5B57\uFF0C\u4F46\u7ED3\u679C\u5374\u662F{0} DigestAuthenticationFilter.nonceNotTwoTokens=Nonce\u5E94\u8BE5\u7531\u4E24\u90E8\u5206\u53D6\u503C\u6784\u6210\uFF0C\u4F46\u7ED3\u679C\u5374\u662F{0} DigestAuthenticationFilter.usernameNotFound=\u7528\u6237\u540D{0}\u672A\u627E\u5230 JdbcDaoImpl.noAuthority=\u6CA1\u6709\u4E3A\u7528\u6237{0}\u6307\u5B9A\u89D2\u8272 JdbcDaoImpl.notFound=\u672A\u627E\u5230\u7528\u6237{0} LdapAuthenticationProvider.badCredentials=\u574F\u7684\u51ED\u8BC1 LdapAuthenticationProvider.credentialsExpired=\u7528\u6237\u51ED\u8BC1\u5DF2\u8FC7\u671F LdapAuthenticationProvider.disabled=\u7528\u6237\u672A\u6FC0\u6D3B LdapAuthenticationProvider.expired=\u7528\u6237\u5E10\u53F7\u5DF2\u8FC7\u671F LdapAuthenticationProvider.locked=\u7528\u6237\u5E10\u53F7\u5DF2\u88AB\u9501\u5B9A LdapAuthenticationProvider.emptyUsername=\u7528\u6237\u540D\u4E0D\u5141\u8BB8\u4E3A\u7A7A LdapAuthenticationProvider.onlySupports=\u4EC5\u4EC5\u652F\u6301UsernamePasswordAuthenticationToken PasswordComparisonAuthenticator.badCredentials=\u574F\u7684\u51ED\u8BC1 #PersistentTokenBasedRememberMeServices.cookieStolen=Invalid remember-me token (Series/token) mismatch. Implies previous cookie theft attack. ProviderManager.providerNotFound=\u672A\u67E5\u627E\u5230\u9488\u5BF9{0}\u7684AuthenticationProvider RememberMeAuthenticationProvider.incorrectKey=\u5C55\u793ARememberMeAuthenticationToken\u4E0D\u542B\u6709\u9884\u671F\u7684key RunAsImplAuthenticationProvider.incorrectKey=\u5C55\u793A\u7684RunAsUserToken\u4E0D\u542B\u6709\u9884\u671F\u7684key SubjectDnX509PrincipalExtractor.noMatching=\u672A\u5728subjectDN\: {0}\u4E2D\u627E\u5230\u5339\u914D\u7684\u6A21\u5F0F SwitchUserFilter.noCurrentUser=\u4E0D\u5B58\u5728\u5F53\u524D\u7528\u6237 SwitchUserFilter.noOriginalAuthentication=\u4E0D\u80FD\u591F\u67E5\u627E\u5230\u539F\u5148\u7684\u5DF2\u8BA4\u8BC1\u5BF9\u8C61 ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/static/index.html ================================================ SSO Client1

SSO Demo Client1

访问Browser ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/activeUserSuccessTemplate.ftl ================================================

尊敬的, ${loginName}, 您好!

欢迎加入快乐学习网! 您在快乐学习网注册用户已激活成功。 欢迎您使用paascloud快乐学习网, 祝您生活愉快. 如果您有任何问题或建议, 请发送邮件到:paascloud.net@gmail.com paascloud.net ${dateTime} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/activeUserTemplate.ftl ================================================

尊敬的, ${loginName}, 您好!

感谢您注册快乐学习网,点击下面按钮以验证你的电子邮箱 验证电子邮箱 如果你无法通过上面按钮验证电子邮箱,请点击下面的链接或者把它复制到浏览器地址栏。 ${activeUserUrl} 欢迎您使用paascloud快乐学习网, 祝您生活愉快. 如果您有任何问题或建议, 请发送邮件到:paascloud.net@gmail.com paascloud.net ${dateTime} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/sendRestLoginPwdSuccessTemplate.ftl ================================================

尊敬的, ${loginName}, 您好!

重置密码成功新密码是${newLoginPwd}。 欢迎您使用paascloud快乐学习网, 祝您生活愉快。 如果您有任何问题或建议, 请发送邮件到:paascloud.net@gmail.com paascloud.net ${dateTime} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/sendRestLoginPwdTemplate.ftl ================================================

尊敬的, ${loginName}, 您好!

点击下面按钮以验证你的电子邮箱 重置密码 如果你无法通过上面按钮验证电子邮箱,请点击下面的链接或者把它复制到浏览器地址栏。 ${resetPwdUrl} 如果你没有请求重置密码,请忽略这封邮件. 在你点击上面链接修改密码之前,你的密码将会保持不变. 欢迎您使用paascloud快乐学习网, 祝您生活愉快. 如果您有任何问题或建议, 请发送邮件到:paascloud.net@gmail.com paascloud.net ${dateTime} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/sendRestPwdCodeTemplate.ftl ================================================

尊敬的, ${loginName}, 您好!

您正在利用邮箱 ${email} 进行用户认证。此操作的验证码是${emailCode}, 请将该验证码回填到验证页面, 完成身份验证, 10分钟内有效。 欢迎您使用paascloud快乐学习网, 祝您生活愉快。 如果您有任何问题或建议, 请发送邮件到:paascloud.net@gmail.com paascloud.net ${dateTime} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/main/resources/templates/email/sendRestUserEmailTemplate.ftl ================================================

尊敬的, ${loginName}, 您好!

您正在利用邮箱 ${email} 进行修改用户信息操作。此操作的验证码是${emailCode},请将该验证码回填到验证页面,完成身份验证, 10分钟内有效。 欢迎您使用paascloud快乐学习网,祝您生活愉快。 如果您有任何问题或建议,请发送邮件到:paascloud.net@gmail.com paascloud.net ${dateTime} ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/MD5Test.java ================================================ package com.paascloud.provider; import com.paascloud.provider.utils.Md5Util; import lombok.extern.slf4j.Slf4j; import org.springframework.security.authentication.encoding.Md5PasswordEncoder; import org.springframework.security.authentication.encoding.ShaPasswordEncoder; import org.springframework.security.crypto.keygen.KeyGenerators; /** * The class Md 5 test. * @author paascloud.net@gmail.com */ @Slf4j public class MD5Test { /** * Md 5. */ private static void md5() { Md5PasswordEncoder md5 = new Md5PasswordEncoder(); // false 表示:生成32位的Hex版, 这也是encodeHashAsBase64的, Acegi 默认配置; true 表示:生成24位的Base64版 md5.setEncodeHashAsBase64(false); String pwd = md5.encodePassword("123456", null); log.info("MD5: " + pwd + " len=" + pwd.length()); } /** * Sha 256. * */ private static void sha_256() { ShaPasswordEncoder sha = new ShaPasswordEncoder(256); sha.setEncodeHashAsBase64(true); String pwd = sha.encodePassword("123456", null); log.info("哈希算法 256: " + pwd + " len=" + pwd.length()); } /** * Sha sha 256. */ private static void sha_SHA_256() { ShaPasswordEncoder sha = new ShaPasswordEncoder(); sha.setEncodeHashAsBase64(false); String pwd = sha.encodePassword("123456", null); log.info("哈希算法 SHA-256: " + pwd + " len=" + pwd.length()); } /** * Md 5 system wide salt source. */ private static void md5_SystemWideSaltSource() { Md5PasswordEncoder md5 = new Md5PasswordEncoder(); md5.setEncodeHashAsBase64(false); // 使用动态加密盐的只需要在注册用户的时候将第二个参数换成用户名即可 String pwd = md5.encodePassword("123456", "acegisalt"); log.info("MD5 SystemWideSaltSource: " + pwd + " len=" + pwd.length()); } /** * The entry point of application. * * @param args the input arguments * */ public static void main(String[] args) { md5(); // 使用简单的MD5加密方式 sha_256(); // 使用256的哈希算法(SHA)加密 sha_SHA_256(); // 使用SHA-256的哈希算法(SHA)加密 md5_SystemWideSaltSource(); // 使用MD5再加全局加密盐加密的方式加密 String salt = KeyGenerators.string().generateKey(); log.info(salt); log.info("salt.length={}", salt.length()); String encrypt = Md5Util.encrypt("123456"); log.info(encrypt); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/MybatisGenerator.java ================================================ package com.paascloud.provider; import com.sun.tools.corba.se.idl.Generator; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; import java.util.ArrayList; import java.util.List; /** * The class Mybatis generator. * @author paascloud.net@gmail.com */ public class MybatisGenerator { /** * The entry point of application. * * @param args the input arguments * * @throws Exception the exception */ public static void main(String[] args) throws Exception { List warnings = new ArrayList<>(); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration( Generator.class.getResourceAsStream("/generator/generatorConfig.xml")); DefaultShellCallback callback = new DefaultShellCallback(true); MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/PaasCloudUacApplicationTests.java ================================================ package com.paascloud.provider; import org.junit.Test; import org.junit.runner.RunWith; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; @RunWith(SpringRunner.class) @SpringBootTest public class PaasCloudUacApplicationTests { protected final Logger logger = LoggerFactory.getLogger(this.getClass()); @Test public void contextLoads() { } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/UacMenuServiceTest.java ================================================ package com.paascloud.provider; import com.paascloud.provider.model.vo.MenuVo; import com.paascloud.provider.service.UacMenuService; import org.junit.Test; import javax.annotation.Resource; import java.util.List; public class UacMenuServiceTest extends PaasCloudUacApplicationTests { @Resource private UacMenuService uacMenuService; @Test public void findMenuListByUserIdTest() { List menuVoListByUserId = uacMenuService.getMenuVoList(1L, 1L); logger.info("findByLoginNameTest = {}", menuVoListByUserId); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/UacRoleServiceTest.java ================================================ package com.paascloud.provider; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.provider.model.domain.UacRole; import com.paascloud.provider.service.UacRoleService; import org.junit.Test; import javax.annotation.Resource; /** * The class Uac role service test. * @author paascloud.net@gmail.com */ public class UacRoleServiceTest extends PaasCloudUacApplicationTests { @Resource private UacRoleService uacRoleService; /** * Find by login name test. */ @Test public void findByLoginNameTest() { UacRole admin = uacRoleService.findByRoleCode(GlobalConstant.Sys.SUPER_MANAGER_LOGIN_NAME); logger.info("findByLoginNameTest = {}", admin); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/test/java/com/paascloud/provider/UacUserServiceTest.java ================================================ package com.paascloud.provider; import com.github.pagehelper.PageInfo; import com.paascloud.provider.model.domain.UacUser; import com.paascloud.provider.service.UacUserService; import org.junit.Test; import javax.annotation.Resource; import java.util.List; /** * The class Uac user service test. * @author paascloud.net@gmail.com */ public class UacUserServiceTest extends PaasCloudUacApplicationTests { @Resource private UacUserService uacUserService; /** * Find by login name test. */ @Test public void findByLoginNameTest() { List uacUsers = uacUserService.selectAll(); logger.info("findByLoginNameTest = {}", uacUsers); } /** * Query user list with page test. */ @Test public void queryUserListWithPageTest() { PageInfo pageInfo = uacUserService.queryUserListWithPage(new UacUser()); logger.info("queryUserListWithPage = {}", pageInfo); } } ================================================ FILE: paascloud-provider/paascloud-provider-uac/src/test/resources/.gitkeep ================================================ ================================================ FILE: paascloud-provider/pom.xml ================================================ com.liuzm.paascloud paascloud-master 1.0 4.0.0 pom com.liuzm.paascloud.provider paascloud-provider paascloud-provider User authentication center UTF-8 paascloud-provider-uac paascloud-provider-mdc paascloud-provider-omc paascloud-provider-opc paascloud-provider-tpc org.springframework.cloud spring-cloud-starter-config org.springframework.cloud spring-cloud-starter-sleuth org.springframework.cloud spring-cloud-sleuth-zipkin com.liuzm.paascloud.common paascloud-common-util com.liuzm.paascloud.common paascloud-common-core org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-starter-hystrix org.springframework.boot spring-boot-starter-web net.logstash.logback logstash-logback-encoder com.google.guava guava org.springframework.boot spring-boot-starter-validation io.springfox springfox-swagger-ui io.springfox springfox-swagger2 commons-codec commons-codec org.springframework.boot spring-boot-starter-test test com.alibaba druid org.mybatis.generator mybatis-generator-core test org.springframework.boot spring-boot-configuration-processor true org.springframework.boot spring-boot-devtools true org.springframework.boot spring-boot-starter-aop org.modelmapper modelmapper org.jolokia jolokia-core org.springframework.security spring-security-jwt org.liquibase liquibase-core 3.5.3 org.springframework.cloud spring-cloud-starter-zipkin org.springframework.amqp spring-rabbit dev dev true pro pro ${project.artifactId} org.springframework.boot spring-boot-maven-plugin -Dfile.encoding=UTF-8 build-info org.springframework springloaded 1.2.5.RELEASE com.spotify docker-maven-plugin 0.4.13 ${project.artifactId}:${project.version} java ["java", "-jar", "/${project.build.finalName}.jar"] / ${project.build.directory} ${project.build.finalName}.jar ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/.gitignore ================================================ target/ !.mvn/wrapper/maven-wrapper.jar ### STS ### .apt_generated .classpath .factorypath .project .settings .springBeans ### IntelliJ IDEA ### .idea *.iws *.iml *.ipr ### NetBeans ### nbproject/private/ build/ nbbuild/ dist/ nbdist/ .nb-gradle/ ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/pom.xml ================================================ 4.0.0 paascloud-provider-mdc-api 1.0 jar paascloud-provider-mdc-api Demo project for Spring Boot com.liuzm.paascloud.provider.api paascloud-provider-api 1.0 UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-starter-hystrix org.springframework.boot spring-boot-starter-web com.liuzm.paascloud.common paascloud-common-util com.github.pagehelper pagehelper 5.0.3 ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/exceptions/MdcBizException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcBizException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.exceptions; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import lombok.extern.slf4j.Slf4j; /** * The class Mdc biz exception. * * @author paascloud.net @gmail.com */ @Slf4j public class MdcBizException extends BusinessException { private static final long serialVersionUID = -6552248511084911254L; /** * Instantiates a new Uac rpc exception. */ public MdcBizException() { } /** * Instantiates a new Uac rpc exception. * * @param code the code * @param msgFormat the msg format * @param args the args */ public MdcBizException(int code, String msgFormat, Object... args) { super(code, msgFormat, args); log.info("<== MdcRpcException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Uac rpc exception. * * @param code the code * @param msg the msg */ public MdcBizException(int code, String msg) { super(code, msg); log.info("<== MdcRpcException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Mdc rpc exception. * * @param codeEnum the code enum */ public MdcBizException(ErrorCodeEnum codeEnum) { super(codeEnum.code(), codeEnum.msg()); log.info("<== MdcRpcException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Mdc rpc exception. * * @param codeEnum the code enum * @param args the args */ public MdcBizException(ErrorCodeEnum codeEnum, Object... args) { super(codeEnum, args); log.info("<== MdcRpcException, code:{}, message:{}", this.code, super.getMessage()); } } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/constant/MdcApiConstant.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcApiConstant.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; /** * The class Mdc api constant. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class MdcApiConstant { /** * The enum Product status enum. * * @author paascloud.net@gmail.com */ public enum ProductStatusEnum { /** * On sale product status enum. */ ON_SALE(1, "在线"), /** * Off sale product status enum. */ OFF_SALE(2, "下架"), /** * Delete product status enum. */ DELETE(3, "删除"); private String value; private int code; ProductStatusEnum(int code, String value) { this.code = code; this.value = value; } /** * Gets value. * * @return the value */ public String getValue() { return value; } /** * Gets code. * * @return the code */ public int getCode() { return code; } } } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/dto/AddressDTO.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AddressDTO.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.codehaus.jackson.map.annotate.JsonSerialize; import java.io.Serializable; /** * The class Address dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class AddressDTO implements Serializable { private static final long serialVersionUID = -154171216711236047L; /** * ID */ @ApiModelProperty(value = "ID") private Long id; /** * 地址名称 */ @ApiModelProperty(value = "地址名称") private String name; /** * 父ID */ @ApiModelProperty(value = "父ID") private Long pid; /** * 城市编码 */ @ApiModelProperty(value = "城市编码") private String cityCode; /** * 级别(省市区县) */ @ApiModelProperty(value = "级别(省市区县)") private Integer level; /** * 区域编码 */ @ApiModelProperty(value = "区域编码") private String adCode; /** * 行政区边界坐标点 */ @ApiModelProperty(value = "行政区边界坐标点") private String polyline; /** * 城市中心点 */ @ApiModelProperty(value = "城市中心点") private String center; } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/dto/GlobalExceptionLogDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GlobalExceptionLogDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import com.fasterxml.jackson.annotation.JsonFormat; import com.paascloud.ThreadLocalMap; import com.paascloud.base.constant.GlobalConstant; import com.paascloud.base.dto.LoginAuthDto; import lombok.Data; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.format.annotation.DateTimeFormat; import java.util.Arrays; import java.util.Date; /** * The class Global exception log dto. * * @author paascloud.net @gmail.com */ @Data @NoArgsConstructor @Slf4j public class GlobalExceptionLogDto { /** * 运行环境 */ private String profile; /** * 应用名称 */ private String applicationName; /** * 异常信息(通过exception.getMessage()获取到的内容) */ private String exceptionMessage; /** * 异常原因(通过exception.getCause()获取到的内容) */ private String exceptionCause; /** * 异常类型 */ private String exceptionSimpleName; /** * 异常堆栈信息 */ private String exceptionStack; /** * 创建人 */ private String creator; /** * 创建人ID */ private Long creatorId; /** * 创建时间 */ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createdTime; /** * Gets global exception log dto. * * @param ex the ex * * @return the global exception log dto */ public GlobalExceptionLogDto getGlobalExceptionLogDto(Exception ex, String profile, String applicationName) { String message = ex.getMessage(); if (StringUtils.isNotBlank(message) && message.length() > GlobalConstant.EXCEPTION_MESSAGE_MAX_LENGTH) { this.exceptionMessage = StringUtils.substring(message, 0, GlobalConstant.EXCEPTION_MESSAGE_MAX_LENGTH) + "..."; } this.exceptionSimpleName = ex.getClass().getSimpleName(); String cause = ex.getCause() == null ? null : ex.getCause().toString(); if (StringUtils.isNotBlank(cause) && cause.length() > GlobalConstant.EXCEPTION_CAUSE_MAX_LENGTH) { this.exceptionCause = StringUtils.substring(cause, 0, GlobalConstant.EXCEPTION_CAUSE_MAX_LENGTH) + "..."; } this.exceptionStack = Arrays.toString(ex.getStackTrace()); this.profile = profile; LoginAuthDto loginAuthDto = null; try { loginAuthDto = (LoginAuthDto) ThreadLocalMap.get(GlobalConstant.Sys.TOKEN_AUTH_DTO); } catch (Exception e) { log.error("获取登陆人信息, 出现异常={}", e.getMessage(), e); } if (loginAuthDto == null) { loginAuthDto = new LoginAuthDto(-1L, "SYSTEM_TASK", "系统任务"); } this.creatorId = loginAuthDto.getUserId(); this.creator = loginAuthDto.getUserName(); this.applicationName = applicationName; return this; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/dto/ProductCategoryDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ProductCategoryDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import org.codehaus.jackson.map.annotate.JsonSerialize; import java.io.Serializable; import java.util.List; /** * The class Product category dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL) public class ProductCategoryDto implements Serializable { private static final long serialVersionUID = -5217129132596232253L; @ApiModelProperty(value = "类别ID") private Long categoryId; @ApiModelProperty(value = "类别名称") private String categoryName; @ApiModelProperty(value = "首图URL") private String imgUrl; private List categoryList; } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/dto/ProductDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ProductDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; /** * The class Product dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class ProductDto implements Serializable { private static final long serialVersionUID = 6932649538854879183L; @ApiModelProperty("货品ID") private Long id; @ApiModelProperty("分类ID") private Long categoryId; private String name; @ApiModelProperty("子标题") private String subtitle; @ApiModelProperty("首图") private String mainImage; @ApiModelProperty("价格") private BigDecimal price; @ApiModelProperty("状态") private Integer status; @ApiModelProperty("图片服务器前缀") private String imageHost; @ApiModelProperty("库存数量") private Integer stock; @ApiModelProperty("商品序列号") private String productCode; @ApiModelProperty("变化的库存数量") private Integer changeStock; } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/dto/ProductReqDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ProductReqDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import com.paascloud.base.dto.BaseQuery; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Product req dto. * * @author paascloud.net@gmail.com */ @EqualsAndHashCode(callSuper = true) @Data @ApiModel public class ProductReqDto extends BaseQuery { private static final long serialVersionUID = -9070173642901418263L; @ApiModelProperty(value = "分类ID") private Long categoryId; @ApiModelProperty(value = "关键词") private String keyword; } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/model/vo/ProductDetailVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ProductDetailVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import io.swagger.annotations.ApiModel; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; /** * The class Product detail vo. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class ProductDetailVo implements Serializable { private static final long serialVersionUID = 4852861985938951261L; private Long id; private String name; private String subtitle; private String mainImage; private String subImages; private String detail; private BigDecimal price; private Integer stock; private Integer status; private String imageHost; private Long pid; } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcAddressQueryFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcAddressQueryFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.AddressDTO; import com.paascloud.provider.service.hystrix.MdcAddressQueryFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; /** * The interface Mdc product query feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-mdc", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcAddressQueryFeignHystrix.class) public interface MdcAddressQueryFeignApi { /** * Select by id wrapper. * * @param addressId the address id * * @return the wrapper */ @PostMapping(value = "/api/address/getById/{addressId}") Wrapper getById(@PathVariable("addressId") Long addressId); } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcExceptionLogFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcExceptionLogFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.GlobalExceptionLogDto; import com.paascloud.provider.service.hystrix.MdcExceptionLogFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; /** * The interface Mdc product feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-mdc", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcExceptionLogFeignHystrix.class) public interface MdcExceptionLogFeignApi { /** * Update product stock by id int. * * @param exceptionLogDto the exception log dto * * @return the int */ @PostMapping(value = "/api/exception/saveAndSendExceptionLog") Wrapper saveAndSendExceptionLog(@RequestBody GlobalExceptionLogDto exceptionLogDto); } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcMqMessageFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcMqMessageFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.provider.service.hystrix.MdcMqMessageApiHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; /** * The interface Mdc mq message feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-mdc", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcMqMessageApiHystrix.class) public interface MdcMqMessageFeignApi { /** * Query waiting confirm message list wrapper. * * @param messageKeyList the message key list * * @return the wrapper */ @PostMapping(value = "/api/mdc/message/queryMessageKeyList") Wrapper> queryMessageKeyList(@RequestParam("messageKeyList") List messageKeyList); /** * Query message list with page wrapper. * * @param messageQueryDto the message query dto * * @return the wrapper */ @PostMapping(value = "/api/mdc/message/queryMessageListWithPage") Wrapper> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto); } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcProductCategoryFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategoryFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.service.hystrix.MdcProductCategoryFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import org.springframework.cloud.netflix.feign.FeignClient; /** * The interface Mdc product category feign api. * * @author paascloud.net@gmail.com */ @FeignClient(value = "paascloud-provider-mdc", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcProductCategoryFeignHystrix.class) public interface MdcProductCategoryFeignApi { } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcProductCategoryQueryFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategoryQueryFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.annotation.NoNeedAccessAuthentication; import com.paascloud.provider.model.dto.ProductCategoryDto; import com.paascloud.provider.model.dto.ProductReqDto; import com.paascloud.provider.service.hystrix.MdcProductCategoryQueryFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import java.util.List; /** * The interface Mdc product category query feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-mdc", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcProductCategoryQueryFeignHystrix.class) public interface MdcProductCategoryQueryFeignApi { /** * 查询分类信息. * * @param pid the pid * * @return the product category data */ @PostMapping(value = "/api/productCategory/getProductCategoryDtoByPid/{pid}") @NoNeedAccessAuthentication Wrapper> getProductCategoryData(@PathVariable("pid") Long pid); /** * 查询商品列表. * * @param productReqDto the product req dto * * @return the product list */ @PostMapping(value = "/api/product/getProductList") @NoNeedAccessAuthentication Wrapper getProductList(@RequestBody ProductReqDto productReqDto); } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcProductFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.service.hystrix.MdcProductFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; /** * The interface Mdc product feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-mdc", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcProductFeignHystrix.class) public interface MdcProductFeignApi { /** * Update product stock by id int. * * @param productDto the product dto * * @return the int */ @PostMapping(value = "/api/product/updateProductStockById") Wrapper updateProductStockById(@RequestBody ProductDto productDto); /** * Gets main image. * * @param productId the product * id * * @return the main image */ @PostMapping(value = "/api/product/getMainImage") Wrapper getMainImage(@RequestParam("productId") Long productId); } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/MdcProductQueryFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductQueryFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.annotation.NoNeedAccessAuthentication; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.vo.ProductDetailVo; import com.paascloud.provider.service.hystrix.MdcProductQueryFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; /** * The interface Mdc product query feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-mdc", configuration = OAuth2FeignAutoConfiguration.class, fallback = MdcProductQueryFeignHystrix.class) public interface MdcProductQueryFeignApi { /** * 查询商品详情信息. * * @param productId the product id * * @return the product detail */ @PostMapping(value = "/api/product/getProductDetail/{productId}") @NoNeedAccessAuthentication Wrapper getProductDetail(@PathVariable("productId") Long productId); /** * Select by id wrapper. * * @param productId the product id * * @return the wrapper */ @PostMapping(value = "/api/product/selectById/{productId}") @NoNeedAccessAuthentication Wrapper selectById(@PathVariable("productId") Long productId); } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcAddressQueryFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcAddressQueryFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.AddressDTO; import com.paascloud.provider.service.MdcAddressQueryFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; /** * The class Mdc product query feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class MdcAddressQueryFeignHystrix implements MdcAddressQueryFeignApi { @Override public Wrapper getById(final Long addressId) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcExceptionLogFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcExceptionLogFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.GlobalExceptionLogDto; import com.paascloud.provider.service.MdcExceptionLogFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; /** * The class Mdc exception log feign hystrix. * * @author paascloud.net @gmail.com */ @Component public class MdcExceptionLogFeignHystrix implements MdcExceptionLogFeignApi { @Override public Wrapper saveAndSendExceptionLog(final GlobalExceptionLogDto exceptionLogDto) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcMqMessageApiHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcMqMessageApiHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.provider.service.MdcMqMessageFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; import java.util.List; /** * The class Mdc mq message api hystrix. * * @author paascloud.net @gmail.com */ @Component public class MdcMqMessageApiHystrix implements MdcMqMessageFeignApi { @Override public Wrapper> queryMessageKeyList(final List messageKeyList) { return null; } @Override public Wrapper> queryMessageListWithPage(final MessageQueryDto messageQueryDto) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcProductCategoryFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategoryFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.service.MdcProductCategoryFeignApi; import org.springframework.stereotype.Component; /** * The class Mdc product category feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class MdcProductCategoryFeignHystrix implements MdcProductCategoryFeignApi { } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcProductCategoryQueryFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductCategoryQueryFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.github.pagehelper.PageInfo; import com.paascloud.provider.model.dto.ProductCategoryDto; import com.paascloud.provider.model.dto.ProductReqDto; import com.paascloud.provider.service.MdcProductCategoryQueryFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; import java.util.List; /** * The class Mdc product category query feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class MdcProductCategoryQueryFeignHystrix implements MdcProductCategoryQueryFeignApi { @Override public Wrapper> getProductCategoryData(final Long pid) { return null; } @Override public Wrapper getProductList(final ProductReqDto productReqDto) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcProductFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.service.MdcProductFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; /** * The class Mdc product feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class MdcProductFeignHystrix implements MdcProductFeignApi { @Override public Wrapper updateProductStockById(final ProductDto productDto) { return null; } @Override public Wrapper getMainImage(final Long productId) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-mdc-api/src/main/java/com/paascloud/provider/service/hystrix/MdcProductQueryFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MdcProductQueryFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.ProductDto; import com.paascloud.provider.model.vo.ProductDetailVo; import com.paascloud.provider.service.MdcProductQueryFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; /** * The class Mdc product query feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class MdcProductQueryFeignHystrix implements MdcProductQueryFeignApi { @Override public Wrapper getProductDetail(final Long productId) { return null; } @Override public Wrapper selectById(final Long productId) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/pom.xml ================================================ 4.0.0 paascloud-provider-omc-api 1.0 jar paascloud-provider-omc-api Demo project for Spring Boot com.liuzm.paascloud.provider.api paascloud-provider-api 1.0 UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-starter-hystrix org.springframework.boot spring-boot-starter-web com.liuzm.paascloud.common paascloud-common-util com.github.pagehelper pagehelper 5.0.3 ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/exceptions/OmcBizException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcBizException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.exceptions; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import lombok.extern.slf4j.Slf4j; /** * The class Omc biz exception. * * @author paascloud.net @gmail.com */ @Slf4j public class OmcBizException extends BusinessException { private static final long serialVersionUID = -6552248511084911254L; /** * Instantiates a new Uac rpc exception. */ public OmcBizException() { } /** * Instantiates a new Uac rpc exception. * * @param code the code * @param msgFormat the msg format * @param args the args */ public OmcBizException(int code, String msgFormat, Object... args) { super(code, msgFormat, args); log.info("<== OmcRpcException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Uac rpc exception. * * @param code the code * @param msg the msg */ public OmcBizException(int code, String msg) { super(code, msg); log.info("<== OmcRpcException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Omc rpc exception. * * @param codeEnum the code enum */ public OmcBizException(ErrorCodeEnum codeEnum) { super(codeEnum.code(), codeEnum.msg()); log.info("<== OmcRpcException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Omc rpc exception. * * @param codeEnum the code enum * @param args the args */ public OmcBizException(ErrorCodeEnum codeEnum, Object... args) { super(codeEnum, args); log.info("<== OmcRpcException, code:{}, message:{}", this.code, super.getMessage()); } } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/constant/OmcApiConstant.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcApiConstant.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; /** * The class Omc api constant. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class OmcApiConstant { /** * The interface Cart. */ public interface Cart { /** * 即购物车选中状态 */ int CHECKED = 1; /** * 购物车中未选中状态 */ int UN_CHECKED = 0; /** * The constant LIMIT_NUM_FAIL. */ String LIMIT_NUM_FAIL = "LIMIT_NUM_FAIL"; /** * The constant LIMIT_NUM_SUCCESS. */ String LIMIT_NUM_SUCCESS = "LIMIT_NUM_SUCCESS"; } /** * The interface Shipping. */ public interface Shipping { /** * The constant DEFAULT. */ int DEFAULT = 1; /** * The constant NOT_DEFAULT. */ int NOT_DEFAULT = 0; } /** * The enum Order status enum. */ public enum OrderStatusEnum { /** * Canceled order status enum. */ CANCELED(0, "已取消"), /** * No pay order status enum. */ NO_PAY(10, "未支付"), /** * Paid order status enum. */ PAID(20, "已付款"), /** * Shipped order status enum. */ SHIPPED(40, "已发货"), /** * Order success order status enum. */ ORDER_SUCCESS(50, "订单完成"), /** * Order close order status enum. */ ORDER_CLOSE(60, "订单关闭"); OrderStatusEnum(int code, String value) { this.code = code; this.value = value; } private String value; private int code; /** * Gets value. * * @return the value */ public String getValue() { return value; } /** * Gets code. * * @return the code */ public int getCode() { return code; } /** * Code of order status enum. * * @param code the code * * @return the order status enum */ public static OrderStatusEnum codeOf(int code) { OrderStatusEnum result = null; for (OrderStatusEnum paymentTypeEnum : values()) { if (paymentTypeEnum.getCode() == code) { result = paymentTypeEnum; break; } } return result; } } } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/constant/PtcApiConstant.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PtcApiConstant.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; /** * The class Ptc api constant. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class PtcApiConstant { /** * The interface Alipay callback. * * @author paascloud.net@gmail.com */ public interface AlipayCallback { /** * The constant TRADE_STATUS_WAIT_BUYER_PAY. */ String TRADE_STATUS_WAIT_BUYER_PAY = "WAIT_BUYER_PAY"; /** * The constant TRADE_STATUS_TRADE_SUCCESS. */ String TRADE_STATUS_TRADE_SUCCESS = "TRADE_SUCCESS"; /** * The constant RESPONSE_SUCCESS. */ String RESPONSE_SUCCESS = "success"; /** * The constant RESPONSE_FAILED. */ String RESPONSE_FAILED = "failed"; } /** * The enum Pay platform enum. * * @author paascloud.net@gmail.com */ public enum PayPlatformEnum { /** * Alipay pay platform enum. */ ALIPAY(1, "支付宝"); PayPlatformEnum(int code, String value) { this.code = code; this.value = value; } private String value; private int code; /** * Gets value. * * @return the value */ public String getValue() { return value; } /** * Gets code. * * @return the code */ public int getCode() { return code; } } } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/dto/OrderDetailDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OrderDetailDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; /** * The class Order detail dto. * * @author paascloud.net@gmail.com */ @Data public class OrderDetailDto implements Serializable { private static final long serialVersionUID = 4423448618530228839L; private Long id; /** * 订单明细序列号 */ private String detailNo; private Long userId; private String orderNo; private Long productId; /** * 商品名称 */ private String productName; /** * 商品图片地址 */ private String productImage; /** * 生成订单时的商品单价, 单位是元,保留两位小数 */ private BigDecimal currentUnitPrice; /** * 商品数量 */ private Integer quantity; /** * 商品总价,单位是元,保留两位小数 */ private BigDecimal totalPrice; } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/dto/OrderDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OrderDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; /** * The class Order dto. * * @author paascloud.net@gmail.com */ @Data public class OrderDto implements Serializable { private static final long serialVersionUID = 529837303004214782L; private Long id; /** * 版本号 */ private Integer version; /** * 订单号 */ private String orderNo; /** * 用户id */ private Long userId; private Long shippingId; /** * 实际付款金额,单位是元,保留两位小数 */ private BigDecimal payment; /** * 支付类型,1-在线支付 */ private Integer paymentType; /** * 运费,单位是元 */ private Integer postage; /** * 订单状态:0-已取消-10-未付款, 20-已付款, 40-已发货, 50-交易成功, 60-交易关闭 */ private Integer status; /** * 支付时间 */ private Date paymentTime; /** * 发货时间 */ private Date sendTime; /** * 交易完成时间 */ private Date endTime; /** * 交易关闭时间 */ private Date closeTime; /** * 创建人 */ private String creator; /** * 创建人ID */ private Long creatorId; /** * 创建时间 */ private Date createdTime; /** * 最近操作人 */ private String lastOperator; /** * 最后操作人ID */ private Long lastOperatorId; /** * 更新时间 */ private Date updateTime; } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/dto/OrderPageQuery.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OrderPageQuery.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import com.paascloud.base.dto.BaseQuery; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Order page query. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class OrderPageQuery extends BaseQuery { private static final long serialVersionUID = -7997684399705866704L; /** * 状态 */ private String status; /** * 订单号 */ private String orderNo; } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/CartProductVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CartProductVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; /** * The class Cart product vo. * * @author paascloud.net@gmail.com */ @Data public class CartProductVo implements Serializable { private static final long serialVersionUID = 975884590599516501L; private Long id; private Long userId; private Long productId; /** * 购物车中此商品的数量 */ private Integer quantity; private String productName; private String productSubtitle; private String productMainImage; private BigDecimal productPrice; private Integer productStatus; private BigDecimal productTotalPrice; private Integer productStock; /** * 此商品是否勾选 */ private Integer checked; /** * 限制数量的一个返回结果 */ private String limitQuantity; } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/CartVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CartVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; /** * The class Cart vo. * * @author paascloud.net@gmail.com */ @Data public class CartVo implements Serializable { private static final long serialVersionUID = -7852680577412931768L; private List cartProductVoList; private BigDecimal cartTotalPrice; /** * 是否已经都勾选 */ private Boolean allChecked; private String imageHost; } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/OrderDocVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OrderDocVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.paascloud.base.dto.BaseVo; import lombok.Data; import lombok.EqualsAndHashCode; import java.math.BigDecimal; import java.util.Date; /** * The class Order doc vo. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class OrderDocVo extends BaseVo { private static final long serialVersionUID = 4282588127249930700L; /** * 订单号 */ private String orderNo; /** * 收货人 */ private String receiverName; /** * 实际付款金额,单位是元,保留两位小数 */ private BigDecimal payment; /** * 支付类型,1-在线支付 */ private Integer paymentType; /** * 订单状态:0-已取消-10-未付款, 20-已付款, 40-已发货, 50-交易成功, 60-交易关闭 */ private Integer status; /** * 支付时间 */ private Date paymentTime; /** * 发货时间 */ private Date sendTime; /** * 交易完成时间 */ private Date endTime; /** * 交易关闭时间 */ private Date closeTime; } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/OrderItemVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OrderItemVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; /** * The class Order item vo. * * @author paascloud.net@gmail.com */ @Data public class OrderItemVo implements Serializable { private static final long serialVersionUID = -8309014197153665106L; private String orderNo; private Long productId; private String productName; private String productImage; private BigDecimal currentUnitPrice; private Integer quantity; private BigDecimal totalPrice; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/OrderProductVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OrderProductVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import lombok.Data; import java.io.Serializable; import java.math.BigDecimal; import java.util.List; /** * The class Order product vo. * * @author paascloud.net@gmail.com */ @Data public class OrderProductVo implements Serializable { private static final long serialVersionUID = 9200251296138955758L; private List orderItemVoList; private BigDecimal productTotalPrice; private String imageHost; } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/OrderVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OrderVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.math.BigDecimal; import java.util.Date; import java.util.List; /** * The class Order vo. * * @author paascloud.net@gmail.com */ @Data public class OrderVo implements Serializable { private static final long serialVersionUID = 5829292780030349525L; private String orderNo; private BigDecimal payment; private Integer paymentType; private String paymentTypeDesc; private Integer postage; private Integer status; private String statusDesc; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date paymentTime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date sendTime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date closeTime; @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date createTime; private String creator; /** * 订单的明细 */ private List orderItemVoList; private String imageHost; private Long shippingId; private String receiverName; private ShippingVo shippingVo; } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/model/vo/ShippingVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ShippingVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import lombok.Data; import java.io.Serializable; /** * The class Shipping vo. * * @author paascloud.net@gmail.com */ @Data public class ShippingVo implements Serializable { private static final long serialVersionUID = 1650395734521093800L; private String receiverName; private String receiverPhone; private String receiverMobile; private String receiverProvince; private String receiverCity; private String receiverDistrict; private String receiverAddress; private String receiverZip; } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcCartFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcCartFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.vo.CartProductVo; import com.paascloud.provider.service.hystrix.OmcCartFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; /** * The interface Omc cart feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-omc", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcCartFeignHystrix.class) public interface OmcCartFeignApi { /** * 更新购物车. * * @param cartProductVoList the cart product vo list * * @return the wrapper */ @PostMapping(value = "/api/cart/updateCartList") Wrapper updateCartList(@RequestBody List cartProductVoList); /** * 添加购物车. * * @param userId the user id * @param productId the product id * @param count the count * * @return the wrapper */ @PostMapping(value = "/api/cart/addProduct") Wrapper addProduct(@RequestParam("userId") Long userId, @RequestParam("productId") Long productId, @RequestParam("count") Integer count); /** * 更新商品信息. * * @param userId the user id * @param productId the product id * @param count the count * * @return the wrapper */ @PostMapping(value = "/api/cart/updateProduct") Wrapper updateProduct(@RequestParam("userId") Long userId, @RequestParam("productId") Long productId, @RequestParam("count") Integer count); /** * 删除商品信息. * * @param userId the user id * @param productIds the product ids * * @return the wrapper */ @PostMapping(value = "/api/cart/deleteProduct") Wrapper deleteProduct(@RequestParam("userId") Long userId, @RequestParam("productIds") String productIds); /** * 选中和反选商品. * * @param userId the user id * @param productId the product id * @param checked the checked * * @return the wrapper */ @PostMapping(value = "/api/cart/selectOrUnSelect") Wrapper selectOrUnSelect(@RequestParam(name = "userId") Long userId, @RequestParam(name = "productId", required = false) Long productId, @RequestParam(name = "checked") Integer checked); } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcCartQueryFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcCartQueryFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.vo.CartVo; import com.paascloud.provider.service.hystrix.OmcCartQueryFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** * The interface Omc cart query feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-omc", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcCartQueryFeignHystrix.class) public interface OmcCartQueryFeignApi { /** * Gets cart vo. * * @param userId the user id * * @return the cart vo */ @PostMapping(value = "/api/cart/getCarVo") Wrapper getCartVo(@RequestParam("userId") Long userId); } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcOrderDetailFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderDetailFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.service.hystrix.OmcOrderDetailFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import org.springframework.cloud.netflix.feign.FeignClient; /** * The interface Omc order detail feign api. * * @author paascloud.net@gmail.com */ @FeignClient(value = "paascloud-provider-omc", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcOrderDetailFeignHystrix.class) public interface OmcOrderDetailFeignApi { } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcOrderDetailQueryFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderDetailQueryFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.OrderDetailDto; import com.paascloud.provider.service.hystrix.OmcOrderDetailQueryFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import java.util.List; /** * The interface Omc order detail query feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-omc", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcOrderDetailQueryFeignHystrix.class) public interface OmcOrderDetailQueryFeignApi { /** * Gets list by order no user id. * * @param orderNo the order no * @param userId the user id * * @return the list by order no user id */ @PostMapping(value = "/api/orderDetail/getListByOrderNoUserId/{userId}/{orderNo}") Wrapper> getListByOrderNoUserId(@PathVariable("orderNo") String orderNo, @PathVariable("userId") Long userId); } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcOrderFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.OrderDto; import com.paascloud.provider.service.hystrix.OmcOrderFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; /** * The interface Omc order feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-omc", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcOrderFeignHystrix.class) public interface OmcOrderFeignApi { /** * Update order by id wrapper. * * @param order the order * * @return the wrapper */ @PostMapping(value = "/api/order/updateOrderById") Wrapper updateOrderById(@RequestBody OrderDto order); } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/OmcOrderQueryFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderQueryFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.OrderDto; import com.paascloud.provider.service.hystrix.OmcOrderQueryFeignHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; /** * The interface Omc order query feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-omc", configuration = OAuth2FeignAutoConfiguration.class, fallback = OmcOrderQueryFeignHystrix.class) public interface OmcOrderQueryFeignApi { /** * Query by order no wrapper. * * @param orderNo the order no * * @return the wrapper */ @PostMapping(value = "/api/order/queryByOrderNo/{orderNo}") Wrapper queryByOrderNo(@PathVariable("orderNo") String orderNo); /** * Query by user id and order no wrapper. * * @param userId the user id * @param orderNo the order no * * @return the wrapper */ @PostMapping(value = "/api/order/queryByUserIdAndOrderNo/{userId}/{orderNo}") Wrapper queryByUserIdAndOrderNo(@PathVariable("userId") Long userId, @PathVariable("orderNo") String orderNo); } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcCartFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcCartFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.vo.CartProductVo; import com.paascloud.provider.service.OmcCartFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; import java.util.List; /** * The class Omc cart feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class OmcCartFeignHystrix implements OmcCartFeignApi { @Override public Wrapper updateCartList(final List cartProductVoList) { return null; } @Override public Wrapper addProduct(final Long userId, final Long productId, final Integer count) { return null; } @Override public Wrapper updateProduct(final Long userId, final Long productId, final Integer count) { return null; } @Override public Wrapper deleteProduct(final Long userId, final String productIds) { return null; } @Override public Wrapper selectOrUnSelect(final Long userId, final Long productId, final Integer checked) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcCartQueryFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcCartQueryFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.vo.CartVo; import com.paascloud.provider.service.OmcCartQueryFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; /** * The class Omc cart query feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class OmcCartQueryFeignHystrix implements OmcCartQueryFeignApi { @Override public Wrapper getCartVo(final Long userId) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcOrderDetailFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderDetailFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.service.OmcOrderDetailFeignApi; import org.springframework.stereotype.Component; /** * The class Omc order detail feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class OmcOrderDetailFeignHystrix implements OmcOrderDetailFeignApi { } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcOrderDetailQueryFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderDetailQueryFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.OrderDetailDto; import com.paascloud.provider.service.OmcOrderDetailQueryFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; import java.util.List; /** * The class Omc order detail query feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class OmcOrderDetailQueryFeignHystrix implements OmcOrderDetailQueryFeignApi { @Override public Wrapper> getListByOrderNoUserId(final String orderNo, final Long userId) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcOrderFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.OrderDto; import com.paascloud.provider.service.OmcOrderFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; /** * The class Omc order feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class OmcOrderFeignHystrix implements OmcOrderFeignApi { @Override public Wrapper updateOrderById(final OrderDto order) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-omc-api/src/main/java/com/paascloud/provider/service/hystrix/OmcOrderQueryFeignHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OmcOrderQueryFeignHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.OrderDto; import com.paascloud.provider.service.OmcOrderQueryFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; /** * The class Omc order query feign hystrix. * * @author paascloud.net@gmail.com */ @Component public class OmcOrderQueryFeignHystrix implements OmcOrderQueryFeignApi { @Override public Wrapper queryByOrderNo(final String orderNo) { return null; } @Override public Wrapper queryByUserIdAndOrderNo(final Long userId, final String orderNo) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/pom.xml ================================================ 4.0.0 paascloud-provider-opc-api jar paascloud-provider-opc-api Demo project for Spring Boot com.liuzm.paascloud.provider.api paascloud-provider-api 1.0 UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-starter-hystrix org.springframework.boot spring-boot-starter-web com.liuzm.paascloud.common paascloud-common-util com.github.pagehelper pagehelper 5.0.3 io.github.openfeign.form feign-form 3.0.3 io.github.openfeign.form feign-form-spring 3.0.3 ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/exceptions/OpcBizException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcBizException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.exceptions; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import lombok.extern.slf4j.Slf4j; /** * The class Opc biz exception. * * @author paascloud.net @gmail.com */ @Slf4j public class OpcBizException extends BusinessException { private static final long serialVersionUID = -6552248511084911254L; /** * Instantiates a new Uac rpc exception. */ public OpcBizException() { } /** * Instantiates a new Uac rpc exception. * * @param code the code * @param msgFormat the msg format * @param args the args */ public OpcBizException(int code, String msgFormat, Object... args) { super(code, msgFormat, args); log.info("<== OpcBizException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Uac rpc exception. * * @param code the code * @param msg the msg */ public OpcBizException(int code, String msg) { super(code, msg); log.info("<== OpcBizException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Opc rpc exception. * * @param codeEnum the code enum */ public OpcBizException(ErrorCodeEnum codeEnum) { super(codeEnum.code(), codeEnum.msg()); log.info("<== OpcBizException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Opc rpc exception. * * @param codeEnum the code enum * @param args the args */ public OpcBizException(ErrorCodeEnum codeEnum, Object... args) { super(codeEnum, args); log.info("<== OpcBizException, code:{}, message:{}", this.code, super.getMessage()); } } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/constant/OpcApiConstant.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcApiConstant.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; /** * The class Opc api constant. * * @author paascloud.net @gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class OpcApiConstant { } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/PcSendEmailRequest.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcSendEmailRequest.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import lombok.Data; import java.io.Serializable; import java.util.Set; /** * The class Pc send email request. * * @author paascloud.net@gmail.com */ @Data public class PcSendEmailRequest implements Serializable { private static final long serialVersionUID = 8391763073747981998L; private String text; private String subject; private Set to; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/PcSendSmsRequest.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcSendSmsRequest.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import lombok.Data; import java.io.Serializable; /** * The class Pc send sms request. * * @author paascloud.net@gmail.com */ @Data public class PcSendSmsRequest implements Serializable { private static final long serialVersionUID = 8391763073747981998L; private String phoneNumbers; private String templateCode; private String templateParam; private String outId; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/attachment/OptAttachmentDeleteReqDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptAttachmentDeleteReqDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.attachment; import lombok.Data; import java.io.Serializable; /** * The class Opt attachment delete req dto. * * @author paascloud.net@gmail.com */ @Data public class OptAttachmentDeleteReqDto implements Serializable { private static final long serialVersionUID = 731160897713227519L; private String[] serialNos; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/attachment/OptAttachmentQueryReqDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptAttachmentQueryReqDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.attachment; import lombok.Data; import java.io.Serializable; /** * The class Opt attachment query req dto. * * @author paascloud.net@gmail.com */ @Data public class OptAttachmentQueryReqDto implements Serializable { private static final long serialVersionUID = 4781783608243094328L; private Long id; /** * 附件流水号 */ private String serialNo; /** * 上传附件的相关业务流水号 */ private String refNo; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/attachment/OptAttachmentRespDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptAttachmentRespDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.attachment; import lombok.Data; import java.io.Serializable; /** * The class Opt attachment resp dto. * * @author paascloud.net@gmail.com */ @Data public class OptAttachmentRespDto implements Serializable { private static final long serialVersionUID = 7156713126848745258L; private Long id; private String serialNo; private String refNo; private String name; private String path; private String type; private String format; private String description; /** * 文件服务器根目录 */ private String bucketName; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/attachment/OptUpdateAttachmentReqDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptUpdateAttachmentReqDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.attachment; import lombok.Data; import java.io.Serializable; /** * The class Opt update attachment req dto. * * @author paascloud.net@gmail.com */ @Data public class OptUpdateAttachmentReqDto implements Serializable { private static final long serialVersionUID = -1727131719075160349L; /** * 附件流水号 */ private String serialNo; /** * 上传附件的相关业务流水号 */ private String refNo; private Long userId; private String userName; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/attachment/OptUploadFileByteInfoReqDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptUploadFileByteInfoReqDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.attachment; import lombok.Data; import java.io.Serializable; /** * The class Opt upload file byte info req dto. * * @author paascloud.net@gmail.com */ @Data public class OptUploadFileByteInfoReqDto implements Serializable { private static final long serialVersionUID = 4695223041316258658L; /** * 文件字节码 */ private byte[] fileByteArray; /** * 文件名 */ private String fileName; /** * 文件类型 */ private String fileType; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/gaode/GaodeLocation.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:GaodeLocation.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.gaode; import com.paascloud.base.dto.GaodeBaseDto; import lombok.Data; import lombok.EqualsAndHashCode; /** * The class Gaode location. * * @author paascloud.net @gmail.com */ @EqualsAndHashCode(callSuper = true) @Data public class GaodeLocation extends GaodeBaseDto { private String province; private String city; private String adcode; private String rectangle; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/oss/ElementImgUrlDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ElementImgUrlDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.oss; import lombok.AllArgsConstructor; import lombok.Data; import java.io.Serializable; /** * The class Element img url dto. * * @author paascloud.net @gmail.com */ @Data @AllArgsConstructor public class ElementImgUrlDto implements Serializable { public ElementImgUrlDto() { } private static final long serialVersionUID = -5800852605728871320L; /** * 图片完整地址 */ private String url; /** * 图片名称 */ private String name; /** * 图片关联的附件ID */ private Long attachmentId; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/oss/OptBatchGetUrlRequest.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptBatchGetUrlRequest.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.oss; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.NoArgsConstructor; /** * The class Opt batch get url request. * * @author paascloud.net @gmail.com */ @Data @ApiModel @NoArgsConstructor public class OptBatchGetUrlRequest { public OptBatchGetUrlRequest(String refNo) { this.refNo = refNo; } @ApiModelProperty(value = "文件流水号") private String refNo; @ApiModelProperty(value = "超时时间") private Long expires; @ApiModelProperty(value = "是否需要解密") private boolean encrypt; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/oss/OptGetUrlRequest.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptGetUrlRequest.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.oss; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * The class Opt get url request. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class OptGetUrlRequest { @ApiModelProperty(value = "附件ID") private Long attachmentId; @ApiModelProperty(value = "超时时间") private Long expires; @ApiModelProperty(value = "是否需要解密") private boolean encrypt; @ApiModelProperty(value = "附件ID集合") private List attachmentIdList; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/oss/OptUploadFileReqDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptUploadFileReqDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.oss; import com.paascloud.provider.model.dto.attachment.OptUploadFileByteInfoReqDto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Opt upload file req dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel(value = "OptUploadFileReqDto") public class OptUploadFileReqDto implements Serializable { private static final long serialVersionUID = -8008720269972450739L; /** * 文件类型 */ @ApiModelProperty(value = "文件类型") private String fileType; /** * 文件路径 */ @ApiModelProperty(value = "文件路径") private String filePath; /** * 文件服务器根目录 */ @ApiModelProperty(value = "文件服务器根目录") private String bucketName; @ApiModelProperty(value = "用户ID") private Long userId; @ApiModelProperty(value = "用户名") private String userName; private OptUploadFileByteInfoReqDto uploadFileByteInfoReqDto; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/oss/OptUploadFileRespDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OptUploadFileRespDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.oss; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Opt upload file resp dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "OptUploadFileReqDto") public class OptUploadFileRespDto implements Serializable { private static final long serialVersionUID = -8008720269972450739L; @ApiModelProperty(value = "附件ID") private Long attachmentId; @ApiModelProperty(value = "文件完整url") private String attachmentUrl; @ApiModelProperty(value = "文件名") private String attachmentName; @ApiModelProperty(value = "文件路径(等于七牛文件名)") private String attachmentPath; @ApiModelProperty(value = "文件类型") private String fileType; @ApiModelProperty(value = "关联业务单号") private String refNo; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/robot/AtDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:AtDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.robot; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class At dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel(value = "AtDto") public class AtDto implements Serializable { private static final long serialVersionUID = 2344037651462081640L; /** * 被@人的手机号 */ @ApiModelProperty(value = "被@人的手机号") private String[] atMobiles; /** * \@所有人时:true,否则为:false */ @ApiModelProperty(value = "@所有人时:true,否则为:false") private boolean isAtAll; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/robot/ChatRobotMsgDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ChatRobotMsgDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.robot; import com.fasterxml.jackson.annotation.JsonProperty; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 自定义机器人消息. * * @author paascloud.net @gmail.com */ @Data @ApiModel(value = "自定义机器人消息体") public class ChatRobotMsgDto implements Serializable { private static final long serialVersionUID = -9132398786027223009L; /** * 机器人URL */ @ApiModelProperty(value = "机器人URL") private String webhookToken; /** * 此消息类型为固定markdown * {@link com.paascloud.provider.model.enums.RobotMsgTypeEnum} */ @ApiModelProperty(value = "首屏会话透出的展示内容", required = true) @JsonProperty(value = "msgtype") private String msgType; /** * markdown消息体 */ @ApiModelProperty(value = "markdown消息体") private MarkdownDto markdown; /** * link类型 */ @ApiModelProperty(value = "link类型") private LinkDto link; /** * link类型 */ @ApiModelProperty(value = "link类型") private TextDto text; /** * link类型 */ @ApiModelProperty(value = "link类型") private AtDto at; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/robot/LinkDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:LinkDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.robot; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Link dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel(value = "link类型") public class LinkDto implements Serializable { private static final long serialVersionUID = 414254079011512757L; @ApiModelProperty(value = "消息标题", required = true) private String title; @ApiModelProperty(value = "消息内容。如果太长只会部分展示", required = true) private String text; @ApiModelProperty(value = "点击消息跳转的URL", required = true) private String messageUrl; @ApiModelProperty(value = "图片URL") private String picUrl; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/robot/MarkdownDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MarkdownDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.robot; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Markdown dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel(value = "link类型") public class MarkdownDto implements Serializable { private static final long serialVersionUID = 5169795915361197484L; /** * 首屏会话透出的展示内容 */ @ApiModelProperty(value = "首屏会话透出的展示内容", required = true) private String title; /** * markdown格式的消息 */ @ApiModelProperty(value = "markdown格式的消息", required = true) private String text; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/dto/robot/TextDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TextDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.robot; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Text dto. * * @author paascloud.net @gmail.com */ @Data @ApiModel(value = "text类型") public class TextDto implements Serializable { private static final long serialVersionUID = 8825625125019746717L; @ApiModelProperty(value = "消息内容", required = true) private String content; } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/enums/RobotMsgTypeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:RobotMsgTypeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Robot msg type enum. * * @author paascloud.net @gmail.com */ public enum RobotMsgTypeEnum { /** * 操作日志 */ MARKDOWN("markdown", "markdown"), /** * Link robot msg type enum. */ LINK("link", "link"), /** * Text robot msg type enum. */ TEXT("text", "text"),; /** * The Type. */ String type; /** * The Name. */ String name; RobotMsgTypeEnum(String type, String name) { this.type = type; this.name = name; } /** * Gets type. * * @return the type */ public String getType() { return type; } /** * Gets name. * * @return the name */ public String getName() { return name; } /** * Gets name. * * @param type the type * * @return the name */ public static String getName(String type) { for (RobotMsgTypeEnum ele : RobotMsgTypeEnum.values()) { if (ele.getType().equals(type)) { return ele.getName(); } } return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/model/factory/ChatRobotMsgFactory.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ChatRobotMsgFactory.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.factory; import com.paascloud.provider.model.dto.robot.*; import com.paascloud.provider.model.enums.RobotMsgTypeEnum; import lombok.AccessLevel; import lombok.NoArgsConstructor; /** * 钉钉消息对象创建工厂. * * @author paascloud.net @gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class ChatRobotMsgFactory { /** * 创建钉钉机器人Markdown消息 * * @param webhookToken token * @param text 消息内容 * @param title 标题 * @param isAtAll 是否@所有人:true,否则为:false * @param atMobiles 被@人的手机号(在text内容里要有@手机号) * * @return chat robot msg dto */ public static ChatRobotMsgDto createChatRobotMarkdownMsg(String webhookToken, String text, String title, boolean isAtAll, String[] atMobiles) { ChatRobotMsgDto entity = new ChatRobotMsgDto(); entity.setMsgType(RobotMsgTypeEnum.MARKDOWN.getType()); entity.setWebhookToken(webhookToken); MarkdownDto markdownDto = new MarkdownDto(); markdownDto.setTitle(title); markdownDto.setText(text); entity.setMarkdown(markdownDto); AtDto atDto = new AtDto(); atDto.setAtAll(isAtAll); if (atMobiles != null && atMobiles.length > 0) { atDto.setAtMobiles(atMobiles); } entity.setAt(atDto); return entity; } /** * 创建钉钉机器人Link消息 * * @param webhookToken token * @param text 消息内容。如果太长只会部分展示 * @param title 消息标题 * @param messageUrl 点击消息跳转的URL * @param picUrl 图片URL * * @return chat robot msg dto */ public static ChatRobotMsgDto createChatRobotLinkMsg(String webhookToken, String text, String title, String messageUrl, String picUrl) { ChatRobotMsgDto entity = new ChatRobotMsgDto(); entity.setMsgType(RobotMsgTypeEnum.LINK.getType()); entity.setWebhookToken(webhookToken); LinkDto linkDto = new LinkDto(); linkDto.setText(text); linkDto.setTitle(title); linkDto.setPicUrl(picUrl); linkDto.setMessageUrl(messageUrl); entity.setLink(linkDto); return entity; } /** * 创建钉钉机器人文本消息 * * @param webhookToken token * @param text 消息内容 * @param isAtAll 是否@所有人:true,否则为:false * @param atMobiles 被@人的手机号(在text内容里要有@手机号) * * @return chat robot msg dto */ public static ChatRobotMsgDto createChatRobotTextMsg(String webhookToken, String text, boolean isAtAll, String[] atMobiles) { ChatRobotMsgDto entity = new ChatRobotMsgDto(); entity.setMsgType(RobotMsgTypeEnum.TEXT.getType()); entity.setWebhookToken(webhookToken); TextDto textDto = new TextDto(); textDto.setContent(text); entity.setText(textDto); AtDto atDto = new AtDto(); atDto.setAtAll(isAtAll); if (atMobiles != null && atMobiles.length > 0) { atDto.setAtMobiles(atMobiles); } entity.setAt(atDto); return entity; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/DingtalkFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:DingtalkFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.annotation.NoNeedAccessAuthentication; import com.paascloud.provider.model.dto.robot.ChatRobotMsgDto; import com.paascloud.provider.service.hystrix.DingtalkFeignApiHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; /** * The interface Dingtalk feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-opc", configuration = OAuth2FeignAutoConfiguration.class, fallback = DingtalkFeignApiHystrix.class) public interface DingtalkFeignApi { /** * 钉钉机器人推送消息. * * @param uacUserReqDto the uac user req dto * * @return the wrapper */ @PostMapping(value = "/api/opc/dingtalk/sendChatRobotMsg") @NoNeedAccessAuthentication Wrapper sendChatRobotMsg(@RequestBody ChatRobotMsgDto uacUserReqDto); } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/OpcGaodeFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcGaodeFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.gaode.GaodeLocation; import com.paascloud.provider.service.hystrix.OpcGaodeFeignApiHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; /** * The interface Opc gao feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-opc", configuration = OAuth2FeignAutoConfiguration.class, fallback = OpcGaodeFeignApiHystrix.class) public interface OpcGaodeFeignApi { /** * IP定位. * * @param ipAddr the ip addr * * @return the location by ip addr */ @PostMapping(value = "/api/auth/getLocationByIpAddr") Wrapper getLocationByIpAddr(@RequestParam("ipAddr") String ipAddr); } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/OpcMqMessageFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcMqMessageFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.provider.service.hystrix.OpcMqMessageFeignApiHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; /** * The interface Opc mq message feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-opc", configuration = OAuth2FeignAutoConfiguration.class, fallback = OpcMqMessageFeignApiHystrix.class) public interface OpcMqMessageFeignApi { /** * Query waiting confirm message list wrapper. * * @param messageKeyList the message key list * * @return the wrapper */ @PostMapping(value = "/api/opc/message/queryMessageKeyList") Wrapper> queryMessageKeyList(@RequestParam("messageKeyList") List messageKeyList); /** * Query message list with page wrapper. * * @param messageQueryDto the message query dto * * @return the wrapper */ @PostMapping(value = "/api/opc/message/queryMessageListWithPage") Wrapper> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto); } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/OpcOssFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcOssFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.oss.*; import com.paascloud.provider.service.hystrix.OpcOssFeignApiHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import feign.codec.Encoder; import feign.form.spring.SpringFormEncoder; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.context.annotation.Bean; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestPart; import org.springframework.web.multipart.MultipartFile; import java.util.List; /** * The interface Opc oss feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-opc", configuration = OAuth2FeignAutoConfiguration.class, fallback = OpcOssFeignApiHystrix.class) public interface OpcOssFeignApi { /** * 上传文件. * * @param optUploadFileReqDto the opt upload file req dto * * @return the wrapper */ @PostMapping(value = "/api/opc/oss/uploadFile") Wrapper uploadFile(@RequestBody OptUploadFileReqDto optUploadFileReqDto); /** * 获取附件完整路径. * * @param optGetUrlRequest the opt get url request * * @return the file url */ @PostMapping(value = "/api/opc/oss/getFileUrl") Wrapper getFileUrl(@RequestBody OptGetUrlRequest optGetUrlRequest); /** * List file url wrapper. * * @param urlRequest the url request * * @return the wrapper */ @PostMapping(value = "/api/opc/oss/listFileUrl") Wrapper> listFileUrl(@RequestBody OptBatchGetUrlRequest urlRequest); /** * Upload file with feign wrapper. * * @param file the file * * @return the wrapper */ @PostMapping(value = "/api/opc/oss/handleFileUpload") Wrapper handleFileUpload(@RequestPart(value = "file") MultipartFile file); /** * 删除过期的文件. */ @PostMapping(value = "/api/opc/oss/deleteExpireFile") void deleteExpireFile(); /** * The class Multipart support config. * * @author paascloud.net @gmail.com */ class MultipartSupportConfig { /** * Feign form encoder encoder. * * @return the encoder */ @Bean public Encoder feignFormEncoder() { return new SpringFormEncoder(); } } } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/hystrix/DingtalkFeignApiHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:DingtalkFeignApiHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.robot.ChatRobotMsgDto; import com.paascloud.provider.service.DingtalkFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; /** * The class Chat robot feign api hystrix. * * @author paascloud.net @gmail.com */ @Component public class DingtalkFeignApiHystrix implements DingtalkFeignApi { @Override public Wrapper sendChatRobotMsg(final ChatRobotMsgDto uacUserReqDto) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/hystrix/OpcGaodeFeignApiHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcGaodeFeignApiHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.gaode.GaodeLocation; import com.paascloud.provider.service.OpcGaodeFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; /** * The class Opc oss feign api hystrix. * * @author paascloud.net@gmail.com */ @Component public class OpcGaodeFeignApiHystrix implements OpcGaodeFeignApi { @Override public Wrapper getLocationByIpAddr(final String ipAddr) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/hystrix/OpcMqMessageFeignApiHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcMqMessageFeignApiHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.provider.service.OpcMqMessageFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; import java.util.List; /** * The class Opc mq message feign api hystrix. * * @author paascloud.net @gmail.com */ @Component public class OpcMqMessageFeignApiHystrix implements OpcMqMessageFeignApi { @Override public Wrapper> queryMessageKeyList(final List messageKeyList) { return null; } @Override public Wrapper> queryMessageListWithPage(final MessageQueryDto messageQueryDto) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-opc-api/src/main/java/com/paascloud/provider/service/hystrix/OpcOssFeignApiHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:OpcOssFeignApiHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.oss.*; import com.paascloud.provider.service.OpcOssFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; import org.springframework.web.multipart.MultipartFile; import java.util.List; /** * The class Opc oss feign api hystrix. * * @author paascloud.net@gmail.com */ @Component public class OpcOssFeignApiHystrix implements OpcOssFeignApi { @Override public Wrapper uploadFile(final OptUploadFileReqDto optUploadFileReqDto) { return null; } @Override public Wrapper getFileUrl(final OptGetUrlRequest optGetUrlRequest) { return null; } @Override public Wrapper> listFileUrl(final OptBatchGetUrlRequest urlRequest) { return null; } @Override public Wrapper handleFileUpload(final MultipartFile file) { return null; } @Override public void deleteExpireFile() { } } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/pom.xml ================================================ com.liuzm.paascloud.provider.api paascloud-provider-api 1.0 4.0.0 paascloud-provider-sdk-api org.springframework.boot spring-boot provided org.springframework.boot spring-boot-autoconfigure provided org.springframework.boot spring-boot-configuration-processor true org.projectlombok lombok org.modelmapper modelmapper com.liuzm.paascloud.provider.api paascloud-provider-tpc-api com.liuzm.paascloud.common paascloud-common-zk org.mybatis mybatis tk.mybatis mapper org.aspectj aspectjweaver org.springframework spring-tx org.apache.rocketmq rocketmq-client org.apache.maven.plugins maven-compiler-plugin ${maven-compiler-plugin.version} ${java.version} ${java.version} ${java.version} ${java.version} org.apache.maven.plugins maven-javadoc-plugin ${maven-javadoc-plugin.version} UTF-8 true UTF-8 UTF-8 attach-javadocs jar org.apache.maven.plugins maven-source-plugin ${maven-source-plugin.version} attach-sources jar ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/annotation/MqConsumerStore.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqConsumerStore.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.annotation; import java.lang.annotation.*; /** * 保存消费者消息. * * @author paascloud.net @gmail.com */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface MqConsumerStore { boolean storePreStatus() default true; } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/annotation/MqProducerStore.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqProducerStore.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.annotation; import com.paascloud.provider.model.enums.DelayLevelEnum; import com.paascloud.provider.model.enums.MqOrderTypeEnum; import com.paascloud.provider.model.enums.MqSendTypeEnum; import java.lang.annotation.*; /** * 保存生产者消息. * * @author paascloud.net @gmail.com */ @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented public @interface MqProducerStore { MqSendTypeEnum sendType() default MqSendTypeEnum.WAIT_CONFIRM; MqOrderTypeEnum orderType() default MqOrderTypeEnum.ORDER; DelayLevelEnum delayLevel() default DelayLevelEnum.ZERO; } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/aspect/MqConsumerStoreAspect.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqConsumerStoreAspect.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.aspect; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.annotation.MqConsumerStore; import com.paascloud.provider.exceptions.TpcBizException; import com.paascloud.provider.model.domain.MqMessageData; import com.paascloud.provider.model.enums.MqMessageTypeEnum; import com.paascloud.provider.service.MqMessageService; import lombok.extern.slf4j.Slf4j; import org.apache.rocketmq.common.message.MessageExt; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Value; import javax.annotation.Resource; import java.lang.reflect.Method; import java.util.List; /** * The class Mq consumer store aspect. * * @author paascloud.net @gmail.com */ @Slf4j @Aspect public class MqConsumerStoreAspect { @Resource private MqMessageService mqMessageService; @Value("${paascloud.aliyun.rocketMq.consumerGroup}") private String consumerGroup; private static final String CONSUME_SUCCESS = "CONSUME_SUCCESS"; /** * Add exe time annotation pointcut. */ @Pointcut("@annotation(com.paascloud.provider.annotation.MqConsumerStore)") public void mqConsumerStoreAnnotationPointcut() { } /** * Add exe time method object. * * @param joinPoint the join point * * @return the object * * @throws Throwable the throwable */ @Around(value = "mqConsumerStoreAnnotationPointcut()") public Object processMqConsumerStoreJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable { log.info("processMqConsumerStoreJoinPoint - 线程id={}", Thread.currentThread().getId()); Object result; long startTime = System.currentTimeMillis(); Object[] args = joinPoint.getArgs(); MqConsumerStore annotation = getAnnotation(joinPoint); boolean isStorePreStatus = annotation.storePreStatus(); List messageExtList; if (args == null || args.length == 0) { throw new TpcBizException(ErrorCodeEnum.TPC10050005); } if (!(args[0] instanceof List)) { throw new TpcBizException(ErrorCodeEnum.GL99990001); } try { messageExtList = (List) args[0]; } catch (Exception e) { log.error("processMqConsumerStoreJoinPoint={}", e.getMessage(), e); throw new TpcBizException(ErrorCodeEnum.GL99990001); } MqMessageData dto = this.getTpcMqMessageDto(messageExtList.get(0)); final String messageKey = dto.getMessageKey(); if (isStorePreStatus) { mqMessageService.confirmReceiveMessage(consumerGroup, dto); } String methodName = joinPoint.getSignature().getName(); try { result = joinPoint.proceed(); log.info("result={}", result); if (CONSUME_SUCCESS.equals(result.toString())) { mqMessageService.saveAndConfirmFinishMessage(consumerGroup, messageKey); } } catch (Exception e) { log.error("发送可靠消息, 目标方法[{}], 出现异常={}", methodName, e.getMessage(), e); throw e; } finally { log.info("发送可靠消息 目标方法[{}], 总耗时={}", methodName, System.currentTimeMillis() - startTime); } return result; } private MqConsumerStore getAnnotation(JoinPoint joinPoint) { MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); return method.getAnnotation(MqConsumerStore.class); } private MqMessageData getTpcMqMessageDto(MessageExt messageExt) { MqMessageData data = new MqMessageData(); data.setMessageBody(new String(messageExt.getBody())); data.setMessageKey(messageExt.getKeys()); data.setMessageTag(messageExt.getTags()); data.setMessageTopic(messageExt.getTopic()); data.setMessageType(MqMessageTypeEnum.CONSUMER_MESSAGE.messageType()); return data; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/aspect/MqProducerStoreAspect.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqProducerStoreAspect.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.aspect; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.provider.annotation.MqProducerStore; import com.paascloud.provider.exceptions.TpcBizException; import com.paascloud.provider.model.domain.MqMessageData; import com.paascloud.provider.model.enums.DelayLevelEnum; import com.paascloud.provider.model.enums.MqSendTypeEnum; import com.paascloud.provider.service.MqMessageService; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.task.TaskExecutor; import javax.annotation.Resource; import java.lang.reflect.Method; /** * The class Mq producer store aspect. * * @author paascloud.net @gmail.com */ @Slf4j @Aspect public class MqProducerStoreAspect { @Resource private MqMessageService mqMessageService; @Value("${paascloud.aliyun.rocketMq.producerGroup}") private String producerGroup; @Resource private TaskExecutor taskExecutor; /** * Add exe time annotation pointcut. */ @Pointcut("@annotation(com.paascloud.provider.annotation.MqProducerStore)") public void mqProducerStoreAnnotationPointcut() { } /** * Add exe time method object. * * @param joinPoint the join point * * @return the object */ @Around(value = "mqProducerStoreAnnotationPointcut()") public Object processMqProducerStoreJoinPoint(ProceedingJoinPoint joinPoint) throws Throwable { log.info("processMqProducerStoreJoinPoint - 线程id={}", Thread.currentThread().getId()); Object result; Object[] args = joinPoint.getArgs(); MqProducerStore annotation = getAnnotation(joinPoint); MqSendTypeEnum type = annotation.sendType(); int orderType = annotation.orderType().orderType(); DelayLevelEnum delayLevelEnum = annotation.delayLevel(); if (args.length == 0) { throw new TpcBizException(ErrorCodeEnum.TPC10050005); } MqMessageData domain = null; for (Object object : args) { if (object instanceof MqMessageData) { domain = (MqMessageData) object; break; } } if (domain == null) { throw new TpcBizException(ErrorCodeEnum.TPC10050005); } domain.setOrderType(orderType); domain.setProducerGroup(producerGroup); if (type == MqSendTypeEnum.WAIT_CONFIRM) { if (delayLevelEnum != DelayLevelEnum.ZERO) { domain.setDelayLevel(delayLevelEnum.delayLevel()); } mqMessageService.saveWaitConfirmMessage(domain); } result = joinPoint.proceed(); if (type == MqSendTypeEnum.SAVE_AND_SEND) { mqMessageService.saveAndSendMessage(domain); } else if (type == MqSendTypeEnum.DIRECT_SEND) { mqMessageService.directSendMessage(domain); } else { final MqMessageData finalDomain = domain; taskExecutor.execute(() -> mqMessageService.confirmAndSendMessage(finalDomain.getMessageKey())); } return result; } private static MqProducerStore getAnnotation(JoinPoint joinPoint) { MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature(); Method method = methodSignature.getMethod(); return method.getAnnotation(MqProducerStore.class); } } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/autoconfigure/MessageAutoConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MessageAutoConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.autoconfigure; import org.springframework.context.annotation.Configuration; /** * The class Elastic job auto configuration. * * @author paascloud.net @gmail.com */ @Configuration public class MessageAutoConfiguration { } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/autoconfigure/MessageBeanConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MessageBeanConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.autoconfigure; import com.paascloud.provider.aspect.MqConsumerStoreAspect; import com.paascloud.provider.aspect.MqProducerStoreAspect; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * The class Elastic job auto configuration. * * @author paascloud.net @gmail.com */ @Configuration public class MessageBeanConfiguration { @Bean @ConditionalOnExpression("${paascloud.aliyun.rocketMq.reliableMessageConsumer:true}") public MqConsumerStoreAspect mqConsumerStoreAspect() { return new MqConsumerStoreAspect(); } @Bean @ConditionalOnExpression("${paascloud.aliyun.rocketMq.reliableMessageProducer:true}") public MqProducerStoreAspect mqProducerStoreAspect() { return new MqProducerStoreAspect(); } } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/mapper/MqMessageDataMapper.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqMessageDataMapper.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.mapper; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.provider.model.domain.MqMessageData; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Component; import java.util.List; /** * The interface Mq message data mapper. * * @author paascloud.net @gmail.com */ @Component @Mapper public interface MqMessageDataMapper extends tk.mybatis.mapper.common.Mapper { /** * 获取7天前消息总数. * * @param shardingTotalCount the sharding total count * @param shardingItem the sharding item * @param messageType the message type * * @return the delete total count */ int getBefore7DayTotalCount(@Param("shardingTotalCount") int shardingTotalCount, @Param("shardingItem") int shardingItem, @Param("messageType") int messageType); /** * Gets id list before 7 day. * * @param shardingTotalCount the sharding total count * @param shardingItem the sharding item * @param messageType the message type * @param currentPage the current page * @param pageSize the page size * * @return the id list before 7 day */ List getIdListBefore7Day(@Param("shardingTotalCount") int shardingTotalCount, @Param("shardingItem") int shardingItem, @Param("messageType") int messageType, @Param("currentPage") int currentPage, @Param("pageSize") int pageSize); /** * Batch delete by id list. * * @param idList the id list * * @return the int */ int batchDeleteByIdList(@Param("idList") List idList); /** * Query message key list list. * * @param messageKeyList the message key list * * @return the list */ List queryMessageKeyList(@Param("messageKeyList") List messageKeyList); /** * Query message list with page list. * * @param messageQueryDto the message query dto * * @return the list */ List queryMessageListWithPage(MessageQueryDto messageQueryDto); } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/domain/MqMessageData.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqMessageData.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.domain; import com.paascloud.provider.model.dto.TpcMqMessageDto; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.*; import java.util.Date; /** * The class Mq message data. * * @author paascloud.net @gmail.com */ @Table(name = "pc_mq_message_data") @Data @NoArgsConstructor public class MqMessageData { /** * ID */ @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; /** * 版本号 */ private Integer version; /** * 消息key */ @Column(name = "message_key") private String messageKey; /** * topic */ @Column(name = "message_topic") private String messageTopic; /** * tag */ @Column(name = "message_tag") private String messageTag; /** * 消息内容 */ @Column(name = "message_body") private String messageBody; /** * 消息类型: 10 - 生产者 ; 20 - 消费者 */ @Column(name = "message_type") private Integer messageType; /** * 顺序类型, 0有序 1无序 */ private int orderType; /** * 消息状态 */ private Integer status; /** * 延时级别 */ @Column(name = "delay_level") private int delayLevel; /** * 创建人 */ private String creator; /** * 创建人ID */ @Column(name = "creator_id") private Long creatorId; /** * 创建时间 */ @Column(name = "created_time") private Date createdTime; /** * 最近操作人 */ @Column(name = "last_operator") private String lastOperator; /** * 最后操作人ID */ @Column(name = "last_operator_id") private Long lastOperatorId; /** * 更新时间 */ @Column(name = "update_time") private Date updateTime; /** * 是否删除 -0 未删除 -1 已删除 */ private Integer yn; /** * producer group name */ @Transient private String producerGroup; public MqMessageData(final String msgBody, final String topic, final String tag, final String key) { this.messageBody = msgBody; this.messageTopic = topic; this.messageTag = tag; this.messageKey = key; } /** * Gets tpc mq message dto. * * @return the tpc mq message dto */ @Transient public TpcMqMessageDto getTpcMqMessageDto() { TpcMqMessageDto tpcMqMessageDto = new TpcMqMessageDto(); tpcMqMessageDto.setMessageBody(this.messageBody); tpcMqMessageDto.setMessageKey(this.messageKey); tpcMqMessageDto.setMessageTag(this.messageTag); tpcMqMessageDto.setMessageTopic(this.messageTopic); tpcMqMessageDto.setMessageType(this.messageType); tpcMqMessageDto.setRefNo(this.messageKey); tpcMqMessageDto.setDelayLevel(this.delayLevel); tpcMqMessageDto.setOrderType(this.orderType); tpcMqMessageDto.setProducerGroup(this.producerGroup); return tpcMqMessageDto; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/dto/UpdateAttachmentDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UpdateAttachmentDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import com.paascloud.base.dto.LoginAuthDto; import lombok.AllArgsConstructor; import lombok.Data; import java.io.Serializable; import java.util.List; /** * 更新福建表. * * @author paascloud.net @gmail.com */ @Data @AllArgsConstructor public class UpdateAttachmentDto implements Serializable { private static final long serialVersionUID = -768471033009336091L; public UpdateAttachmentDto() { } private String refNo; /** * 商品图片流水号集合 */ private List attachmentIdList; /** * 操作人信息 */ private LoginAuthDto loginAuthDto; } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/enums/DelayLevelEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:DelayLevelEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * Rocketmq默认延时级别. * * @author paascloud.net @gmail.com */ public enum DelayLevelEnum { /** * Zero delay level enum. */ ZERO(0, "不延时"), /** * One delay level enum. */ ONE(1, "1秒"), /** * Two delay level enum. */ TWO(2, "5秒"), /** * Three delay level enum. */ THREE(3, "10秒"), /** * Four delay level enum. */ FOUR(4, "30秒"), /** * Five delay level enum. */ FIVE(5, "1分钟"), /** * Six delay level enum. */ SIX(6, "2分钟"), /** * Seven delay level enum. */ SEVEN(7, "3分钟"), /** * Eight delay level enum. */ EIGHT(8, "4分钟"), /** * Nine delay level enum. */ NINE(9, "5分钟"), /** * Ten delay level enum. */ TEN(10, "6分钟"), /** * Eleven delay level enum. */ ELEVEN(11, "7分钟"), /** * Twelve delay level enum. */ TWELVE(12, "8分钟"), /** * Thirteen delay level enum. */ THIRTEEN(13, "9分钟"), /** * Fourteen delay level enum. */ FOURTEEN(14, "10分钟"), /** * Fifteen delay level enum. */ FIFTEEN(15, "20分钟"), /** * Sixteen delay level enum. */ SIXTEEN(16, "30分钟"), /** * Seventeen delay level enum. */ SEVENTEEN(17, "1小时"), /** * Eighteen delay level enum. */ EIGHTEEN(18, "2小时"); DelayLevelEnum(int delayLevel, String value) { this.delayLevel = delayLevel; this.value = value; } private int delayLevel; private String value; /** * Delay level int. * * @return the int */ public int delayLevel() { return delayLevel; } /** * Value string. * * @return the string */ public String value() { return value; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/enums/MqMessageTypeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqMessageTypeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Mq message type enum. * * @author paascloud.net @gmail.com */ public enum MqMessageTypeEnum { /** * 生产者. */ PRODUCER_MESSAGE(10, "生产者"), /** * 消费者. */ CONSUMER_MESSAGE(20, "消费者"); private int messageType; private String value; MqMessageTypeEnum(int messageType, String value) { this.messageType = messageType; this.value = value; } /** * Message type int. * * @return the int */ public int messageType() { return messageType; } /** * Value string. * * @return the string */ public String value() { return value; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/enums/MqOrderTypeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqOrderTypeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Mq send type enum. * * @author paascloud.net @gmail.com */ public enum MqOrderTypeEnum { /** * 有序. */ ORDER(1), /** * 无序. */ DIS_ORDER(0); /** * The Order type. */ int orderType; MqOrderTypeEnum(final int orderType) { this.orderType = orderType; } /** * Order type int. * * @return the int */ public int orderType() { return orderType; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/model/enums/MqSendTypeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqSendTypeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; /** * The enum Mq send type enum. * * @author paascloud.net @gmail.com */ public enum MqSendTypeEnum { /** * 等待确认. */ WAIT_CONFIRM, /** * 直接发送. */ SAVE_AND_SEND, /** * 直接发送 */ //TODO 消费切口 有问题, 日后修复 暂时不可用 @Deprecated DIRECT_SEND } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/service/MqMessageService.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqMessageService.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.provider.model.domain.MqMessageData; import com.paascloud.provider.model.enums.MqSendTypeEnum; import com.paascloud.wrapper.Wrapper; import java.util.List; /** * The interface Tpc mq message feign api. * * @author paascloud.net @gmail.com */ public interface MqMessageService { /** * 保存生产者信息. * * @param mqMessageData the mq message data */ void saveMqProducerMessage(MqMessageData mqMessageData); /** * Confirm and send message. * * @param messageKey the message key */ void confirmAndSendMessage(String messageKey); /** * 保存消费者信息. * * @param mqMessageData the mq message data */ void saveMqConsumerMessage(MqMessageData mqMessageData); /** * 根据messageKey删除消息记录. * * @param messageKey the message key * @param type the type */ void deleteMessageByMessageKey(String messageKey, MqSendTypeEnum type); /** * Confirm receive message. * * @param cid 消费者分组id * @param dto the dto */ void confirmReceiveMessage(String cid, MqMessageData dto); /** * Save and confirm finish message. * * @param cid 消费者分组id * @param messageKey the message key */ void saveAndConfirmFinishMessage(String cid, String messageKey); /** * Delete mq producer message. * * @param shardingTotalCount the sharding total count * @param shardingItem the sharding item * @param tags the tags */ void deleteMqMessage(int shardingTotalCount, int shardingItem, String tags); /** * Delete message topic. * * @param body the body * @param tags the tags */ void deleteMessageTopic(String body, String tags); /** * 查询含有的messageKey. * * @param messageKeyList the message key list * * @return the wrapper */ List queryMessageKeyList(List messageKeyList); /** * 保存等待确认的消息(前置拦截器). * * @param mqMessageData the mq message data */ void saveWaitConfirmMessage(MqMessageData mqMessageData); /** * 保存并发送消息(后置拦截器). * * @param mqMessageData the mq message data */ void saveAndSendMessage(MqMessageData mqMessageData); /** * 直接发送消息(后置拦截器). * * @param mqMessageData the mq message data */ void directSendMessage(MqMessageData mqMessageData); /** * Query message list with page wrapper. * * @param messageQueryDto the message query dto * * @return the wrapper */ Wrapper> queryMessageListWithPage(MessageQueryDto messageQueryDto); } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/java/com/paascloud/provider/service/impl/MqMessageServiceImpl.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MqMessageServiceImpl.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.impl; import com.alibaba.fastjson.JSON; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.google.common.collect.Lists; import com.paascloud.PublicUtil; import com.paascloud.base.constant.AliyunMqTopicConstants; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.base.dto.ShardingContextDto; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.core.generator.UniqueIdGenerator; import com.paascloud.provider.exceptions.TpcBizException; import com.paascloud.provider.mapper.MqMessageDataMapper; import com.paascloud.provider.model.domain.MqMessageData; import com.paascloud.provider.model.dto.TpcMqMessageDto; import com.paascloud.provider.model.enums.MqMessageTypeEnum; import com.paascloud.provider.model.enums.MqSendTypeEnum; import com.paascloud.provider.service.MqMessageService; import com.paascloud.provider.service.TpcMqMessageFeignApi; import com.paascloud.wrapper.WrapMapper; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.task.TaskExecutor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * The class Mq message service. * * @author paascloud.net @gmail.com */ @Slf4j @Service public class MqMessageServiceImpl implements MqMessageService { @Resource private MqMessageDataMapper mqMessageDataMapper; @Resource private TpcMqMessageFeignApi tpcMqMessageFeignApi; @Resource private TaskExecutor taskExecutor; @Value("${spring.profiles.active}") String profile; @Value("${spring.application.name}") String applicationName; @Override public void saveMqProducerMessage(MqMessageData mqMessageData) { // 校验消息数据 this.checkMessage(mqMessageData); // 先保存消息 mqMessageData.setMessageType(MqMessageTypeEnum.PRODUCER_MESSAGE.messageType()); mqMessageData.setId(UniqueIdGenerator.generateId()); mqMessageDataMapper.insertSelective(mqMessageData); } private void checkMessage(MqMessageData mqMessageData) { if (null == mqMessageData) { throw new TpcBizException(ErrorCodeEnum.TPC10050007); } String messageTopic = mqMessageData.getMessageTopic(); String messageBody = mqMessageData.getMessageBody(); String messageKey = mqMessageData.getMessageKey(); String producerGroup = mqMessageData.getProducerGroup(); if (StringUtils.isEmpty(messageKey)) { throw new TpcBizException(ErrorCodeEnum.TPC10050009); } if (StringUtils.isEmpty(messageTopic)) { throw new TpcBizException(ErrorCodeEnum.TPC10050001); } if (StringUtils.isEmpty(messageBody)) { throw new TpcBizException(ErrorCodeEnum.TPC10050008, mqMessageData.getMessageKey()); } if (StringUtils.isEmpty(producerGroup)) { throw new TpcBizException(ErrorCodeEnum.TPC100500015, mqMessageData.getMessageKey()); } } @Override public void confirmAndSendMessage(String messageKey) { // 发送确认消息给消息中心 try { Wrapper wrapper = tpcMqMessageFeignApi.confirmAndSendMessage(messageKey); if (wrapper == null) { throw new TpcBizException(ErrorCodeEnum.GL99990002); } if (wrapper.error()) { throw new TpcBizException(ErrorCodeEnum.TPC10050004, wrapper.getMessage(), messageKey); } log.info("<== saveMqProducerMessage - 存储并发送消息给消息中心成功. messageKey={}", messageKey); } catch (Exception e) { log.error("<== saveMqProducerMessage - 存储并发送消息给消息中心失败. messageKey={}", messageKey, e); } } @Override public void saveMqConsumerMessage(MqMessageData mqMessageData) { } @Override public void deleteMessageByMessageKey(String messageKey, MqSendTypeEnum type) { log.info("删除预发送消息. messageKey={}, type={}", messageKey, type); if (type == MqSendTypeEnum.WAIT_CONFIRM) { taskExecutor.execute(() -> tpcMqMessageFeignApi.deleteMessageByMessageKey(messageKey)); } } @Override @Transactional(rollbackFor = Exception.class) public void confirmReceiveMessage(String cid, MqMessageData messageData) { final String messageKey = messageData.getMessageKey(); log.info("confirmReceiveMessage - 消费者={}, 确认收到key={}的消息", cid, messageKey); // 先保存消息 messageData.setMessageType(MqMessageTypeEnum.CONSUMER_MESSAGE.messageType()); messageData.setId(UniqueIdGenerator.generateId()); mqMessageDataMapper.insertSelective(messageData); Wrapper wrapper = tpcMqMessageFeignApi.confirmReceiveMessage(cid, messageKey); log.info("tpcMqMessageFeignApi.confirmReceiveMessage result={}", wrapper); if (wrapper == null) { throw new TpcBizException(ErrorCodeEnum.GL99990002); } if (wrapper.error()) { throw new TpcBizException(ErrorCodeEnum.TPC10050004, wrapper.getMessage(), messageKey); } } @Override public void saveAndConfirmFinishMessage(String cid, String messageKey) { Wrapper wrapper = tpcMqMessageFeignApi.confirmConsumedMessage(cid, messageKey); log.info("tpcMqMessageFeignApi.confirmReceiveMessage result={}", wrapper); if (wrapper == null) { throw new TpcBizException(ErrorCodeEnum.GL99990002); } if (wrapper.error()) { throw new TpcBizException(ErrorCodeEnum.TPC10050004, wrapper.getMessage(), messageKey); } } @Override @Transactional(rollbackFor = Exception.class) public void deleteMqMessage(final int shardingTotalCount, final int shardingItem, final String tags) { // 分页参数每页5000条 int pageSize = 1000; int messageType; if (AliyunMqTopicConstants.MqTagEnum.DELETE_PRODUCER_MESSAGE.getTag().equals(tags)) { messageType = MqMessageTypeEnum.PRODUCER_MESSAGE.messageType(); } else { messageType = MqMessageTypeEnum.CONSUMER_MESSAGE.messageType(); } int totalCount = mqMessageDataMapper.getBefore7DayTotalCount(shardingTotalCount, shardingItem, messageType); if (totalCount == 0) { return; } // 分页参数, 总页数 int pageNum = (totalCount - 1) / pageSize + 1; for (int currentPage = 1; currentPage < pageNum; currentPage++) { List idList = mqMessageDataMapper.getIdListBefore7Day(shardingTotalCount, shardingItem, messageType, currentPage, pageSize); mqMessageDataMapper.batchDeleteByIdList(idList); } } @Override public void deleteMessageTopic(final String body, final String tags) { ShardingContextDto shardingContextDto = JSON.parseObject(body, ShardingContextDto.class); int shardingTotalCount = shardingContextDto.getShardingTotalCount(); int shardingItem = shardingContextDto.getShardingItem(); this.deleteMqMessage(shardingTotalCount, shardingItem, tags); } @Override public List queryMessageKeyList(final List messageKeyList) { return mqMessageDataMapper.queryMessageKeyList(messageKeyList); } @Override @Transactional(rollbackFor = Exception.class) public void saveWaitConfirmMessage(final MqMessageData mqMessageData) { this.saveMqProducerMessage(mqMessageData); // 发送预发送状态的消息给消息中心 TpcMqMessageDto tpcMqMessageDto = mqMessageData.getTpcMqMessageDto(); tpcMqMessageFeignApi.saveMessageWaitingConfirm(tpcMqMessageDto); log.info("<== saveWaitConfirmMessage - 存储预发送消息成功. messageKey={}", mqMessageData.getMessageKey()); } @Override public void saveAndSendMessage(final MqMessageData mqMessageData) { this.saveMqProducerMessage(mqMessageData); // 发送预发送状态的消息给消息中心 TpcMqMessageDto tpcMqMessageDto = mqMessageData.getTpcMqMessageDto(); tpcMqMessageFeignApi.saveAndSendMessage(tpcMqMessageDto); log.info("<== saveAndSendMessage - 保存并送消息成功. messageKey={}", mqMessageData.getMessageKey()); } @Override public void directSendMessage(final MqMessageData mqMessageData) { // 发送预发送状态的消息给消息中心 TpcMqMessageDto tpcMqMessageDto = mqMessageData.getTpcMqMessageDto(); tpcMqMessageFeignApi.directSendMessage(tpcMqMessageDto); log.info("<== directSendMessage - 直接送消息成功. messageKey={}", mqMessageData.getMessageKey()); } @Override public Wrapper> queryMessageListWithPage(final MessageQueryDto messageQueryDto) { PageHelper.startPage(messageQueryDto.getPageNum(), messageQueryDto.getPageSize()); List list = mqMessageDataMapper.queryMessageListWithPage(messageQueryDto); if (PublicUtil.isEmpty(list)) { list = Lists.newArrayList(); } return WrapMapper.ok(new PageInfo<>(list)); } } ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/resources/META-INF/spring.factories ================================================ # Auto Configure org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.paascloud.provider.autoconfigure.MessageAutoConfiguration ================================================ FILE: paascloud-provider-api/paascloud-provider-sdk-api/src/main/resources/sdk/mapper/MqMessageDataMapper.xml ================================================ ${alias}.id, ${alias}.version, ${alias}.message_key, ${alias}.message_topic, ${alias}.message_tag, ${alias}.message_type, ${alias}.delay_level, ${alias}.order_type, ${alias}.status, ${alias}.creator, ${alias}.creator_id, ${alias}.created_time, ${alias}.last_operator, ${alias}.last_operator_id, ${alias}.update_time, ${alias}.yn message_body delete from pc_mq_message_data where id IN #{item} ================================================ FILE: paascloud-provider-api/paascloud-provider-tpc-api/pom.xml ================================================ 4.0.0 paascloud-provider-tpc-api jar paascloud-provider-tpc-api Demo project for Spring Boot com.liuzm.paascloud.provider.api paascloud-provider-api 1.0 UTF-8 UTF-8 1.8 com.liuzm.paascloud.common paascloud-common-util com.github.pagehelper pagehelper 5.0.3 ================================================ FILE: paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/exceptions/TpcBizException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcBizException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.exceptions; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import lombok.extern.slf4j.Slf4j; /** * The class Opc biz exception. * * @author paascloud.net @gmail.com */ @Slf4j public class TpcBizException extends BusinessException { private static final long serialVersionUID = -6552248511084911254L; /** * Instantiates a new Uac rpc exception. */ public TpcBizException() { } /** * Instantiates a new Uac rpc exception. * * @param code the code * @param msgFormat the msg format * @param args the args */ public TpcBizException(int code, String msgFormat, Object... args) { super(code, msgFormat, args); log.info("<== TpcBizException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Uac rpc exception. * * @param code the code * @param msg the msg */ public TpcBizException(int code, String msg) { super(code, msg); log.info("<== TpcBizException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Opc rpc exception. * * @param codeEnum the code enum */ public TpcBizException(ErrorCodeEnum codeEnum) { super(codeEnum.code(), codeEnum.msg()); log.info("<== TpcBizException, code:{}, message:{}", this.code, super.getMessage()); } /** * Instantiates a new Opc rpc exception. * * @param codeEnum the code enum * @param args the args */ public TpcBizException(ErrorCodeEnum codeEnum, Object... args) { super(codeEnum, args); log.info("<== TpcBizException, code:{}, message:{}", this.code, super.getMessage()); } } ================================================ FILE: paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/model/dto/PcJobTask.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcJobTask.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class Pc job task. * * @author paascloud.net @gmail.com */ @Data public class PcJobTask implements Serializable { private static final long serialVersionUID = -1689940882253489536L; /** * 自增ID */ private String id; /** * 版本号 */ private String version; /** * 关联单号 */ private String refNo; /** * Worker任务类型 */ private String taskType; /** * 业务json数据 */ private String taskData; /** * 执行次数 */ private Integer taskExeCount; /** * 执行实例IP */ private String exeInstanceIp; /** * 任务运行状态 */ private Integer taskStatus; /** * 前置状态 */ private List preStatusList; } ================================================ FILE: paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/model/dto/PcMessageJobTask.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PcMessageJobTask.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import lombok.Data; import java.io.Serializable; /** * The class Pc message job task. * * @author paascloud.net @gmail.com */ @Data public class PcMessageJobTask implements Serializable { private static final long serialVersionUID = -1689940882253489536L; /** * 自增ID */ private String id; /** * 版本号 */ private String version; /** * 消息key */ private Long messageKey; /** * topic */ private String messageTopic; /** * tag */ private String messageTag; } ================================================ FILE: paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/model/dto/TpcMqMessageDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqMessageDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto; import lombok.Data; import java.io.Serializable; /** * The class Tpc mq message dto. * * @author paascloud.net @gmail.com */ @Data public class TpcMqMessageDto implements Serializable { private static final long serialVersionUID = -6980935654952282538L; /** * 生产者组 */ private String producerGroup; /** * 业务单据号 */ private String refNo; /** * 消息key */ private String messageKey; /** * topic */ private String messageTopic; /** * tag */ private String messageTag; /** * 消息类型 */ private Integer messageType; /** * 消息内容 */ private String messageBody; /** * 延时消息的延时级别 */ private int delayLevel; /** * 顺序类型, 0有序 1无序 */ private int orderType; } ================================================ FILE: paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/model/enums/JobTaskStatusEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:JobTaskStatusEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; import com.google.common.collect.Lists; import java.util.List; /** * The enum Job task status enum. * * @author paascloud.net @gmail.com */ public enum JobTaskStatusEnum { /** * 创建任务数据 状态码0 */ TASK_CREATE(0, "创建任务数据"), /** * 等待处理 状态码1 */ TASK_WAITING(1, "等待处理"), /** * 正在处理中 状态码2 */ TASK_EXETING(2, "正在处理中"), /** * 处理成功 */ TASK_SUCCESS(3, "处理成功"), /** * 任务异常 */ TASK_FAIL(4, "处理失败"),; /** * The Status. */ int status; /** * The Value. */ String value; JobTaskStatusEnum(int status, String value) { this.status = status; this.value = value; } /** * Gets status. * * @return the status */ public int status() { return status; } /** * Gets value. * * @return the value */ public String value() { return value; } private static List getStatusList() { List list = Lists.newArrayList(); for (JobTaskStatusEnum ele : JobTaskStatusEnum.values()) { list.add(ele.status()); } return list; } /** * Contains boolean. * * @param status the status * * @return the boolean */ public static boolean contains(Integer status) { List statusList = getStatusList(); return statusList.contains(status); } } ================================================ FILE: paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/service/TpcMqMessageFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqMessageFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service; import com.paascloud.provider.model.dto.TpcMqMessageDto; import com.paascloud.provider.service.hystrix.TpcMqMessageFeignApiHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; /** * The interface Tpc mq message feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-tpc", configuration = OAuth2FeignAutoConfiguration.class, fallback = TpcMqMessageFeignApiHystrix.class) public interface TpcMqMessageFeignApi { /** * 预存储消息. * * @param mqMessageDto the mq message dto * * @return the wrapper */ @PostMapping(value = "/api/tpc/saveMessageWaitingConfirm") Wrapper saveMessageWaitingConfirm(@RequestBody TpcMqMessageDto mqMessageDto); /** * 确认并发送消息. * * @param messageKey the message key * * @return the wrapper */ @PostMapping(value = "/api/tpc/confirmAndSendMessage") Wrapper confirmAndSendMessage(@RequestParam("messageKey") String messageKey); /** * 存储并发送消息. * * @param mqMessageDto the mq message dto * * @return the wrapper */ @PostMapping(value = "/api/tpc/saveAndSendMessage") Wrapper saveAndSendMessage(@RequestBody TpcMqMessageDto mqMessageDto); /** * 直接发送消息. * * @param mqMessageDto the mq message dto * * @return the wrapper */ @PostMapping(value = "/api/tpc/directSendMessage") Wrapper directSendMessage(@RequestBody TpcMqMessageDto mqMessageDto); /** * 根据messageKey删除消息记录. * * @param messageKey the message key * * @return the wrapper */ @PostMapping(value = "/api/tpc/deleteMessageByMessageKey") Wrapper deleteMessageByMessageKey(@RequestParam("messageKey") String messageKey); /** * Confirm receive message wrapper. * * @param cid the cid * @param messageKey the message key * * @return the wrapper */ @PostMapping(value = "/api/tpc/confirmReceiveMessage") Wrapper confirmReceiveMessage(@RequestParam("cid") final String cid, @RequestParam("messageKey") final String messageKey); /** * Save and confirm finish message wrapper. * * @param cid the cid * @param messageKey the message key * * @return the wrapper */ @PostMapping(value = "/api/tpc/saveAndConfirmFinishMessage") Wrapper confirmConsumedMessage(@RequestParam("cid") final String cid, @RequestParam("messageKey") final String messageKey); } ================================================ FILE: paascloud-provider-api/paascloud-provider-tpc-api/src/main/java/com/paascloud/provider/service/hystrix/TpcMqMessageFeignApiHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:TpcMqMessageFeignApiHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.service.hystrix; import com.paascloud.provider.model.dto.TpcMqMessageDto; import com.paascloud.provider.service.TpcMqMessageFeignApi; import com.paascloud.wrapper.Wrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; /** * The class Tpc mq message feign api hystrix. * * @author paascloud.net @gmail.com */ @Component @Slf4j public class TpcMqMessageFeignApiHystrix implements TpcMqMessageFeignApi { @Override public Wrapper saveMessageWaitingConfirm(final TpcMqMessageDto mqMessageDto) { log.error("saveMessageWaitingConfirm - 服务降级. mqMessageDto={}", mqMessageDto); return null; } @Override public Wrapper confirmAndSendMessage(final String messageKey) { return null; } @Override public Wrapper saveAndSendMessage(final TpcMqMessageDto mqMessageDto) { return null; } @Override public Wrapper directSendMessage(final TpcMqMessageDto mqMessageDto) { return null; } @Override public Wrapper deleteMessageByMessageKey(final String messageKey) { return null; } @Override public Wrapper confirmReceiveMessage(final String cid, final String messageKey) { return null; } @Override public Wrapper confirmConsumedMessage(final String cid, final String messageKey) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/pom.xml ================================================ 4.0.0 paascloud-provider-uac-api 1.0 jar paascloud-provider-uac-api Demo project for Spring Boot com.liuzm.paascloud.provider.api paascloud-provider-api 1.0 UTF-8 UTF-8 1.8 com.liuzm.paascloud.common paascloud-common-util com.github.pagehelper pagehelper 5.0.3 ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/constant/UacApiConstant.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacApiConstant.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.constant; import lombok.AccessLevel; import lombok.NoArgsConstructor; /** * The class Uac api constant. * * @author paascloud.net@gmail.com */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public class UacApiConstant { /** * token变量 */ @NoArgsConstructor(access = AccessLevel.PRIVATE) public static final class Valid { /** * The constant EMAIL. */ public static final String EMAIL = "email"; /** * The constant LOGIN_NAME. */ public static final String LOGIN_NAME = "loginName"; /** * The constant MOBILE_NO. */ public static final String MOBILE_NO = "mobileNo"; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/constant/UacConstant.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacConstant.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.constant; /** * The class Uac constant. * * @author paascloud.net @gmail.com */ public class UacConstant { /** * The constant MENU_ROOT. */ public static final String MENU_ROOT = "root"; /** * token变量 * * @author paascloud.net @gmail.com */ public static final class Token { /** * 用户名密码加密秘钥 */ public static final String SEC_TOKEN = "SEC_TOKEN"; /** * 验证码 */ public static final String KAPTCHA = "KAPTCHA"; /** * The constant SMS_TOKEN. */ public static final String SMS_TOKEN = "SMS_TOKEN"; /** * The constant AUTH_TOKEN_KEY. */ public static final String AUTH_TOKEN_KEY = "PAAS_TOKEN_KEY"; /** * The constant REGISTER_TOKEN_KEY. */ public static final String REGISTER_TOKEN_KEY = "REGISTER_TOKEN_KEY"; /** * The constant RESET_PWD_TOKEN_KEY. */ public static final String RESET_PWD_TOKEN_KEY = "RESET_PWD_TOKEN_KEY"; /** * 登录人信息 */ public static final String TOKEN_AUTH_DTO = "TOKEN_AUTH_DTO"; /** * The class Jwt. * * @author paascloud.net @gmail.com */ public static final class Jwt { /** * The constant VIEW. */ public static final String VIEW = "JWT_VIEW_PRIVATE"; /** * The constant API. */ public static final String API = "JWT_API_PRIVATE"; } } /** * The class User. * * @author paascloud.net @gmail.com */ public static final class User { /** * The constant LOGIN_NAME. */ public static final String LOGIN_NAME = "LOGIN_NAME"; } /** * The class Cookie. * * @author paascloud.net @gmail.com */ public static final class Cookie { /** * 用户名密码加密秘钥 */ public static final String PAASCLOUD_DOMAIN = "paascloud.com"; /** * token 前缀 */ public static final String PAASCLOUD_PATH = "/ "; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/ForgetCheckAnswerDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ForgetCheckAnswerDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Forget check answer dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class ForgetCheckAnswerDto implements Serializable { private static final long serialVersionUID = -4611532562847293450L; @ApiModelProperty(value = "登录名") private String loginName; @ApiModelProperty(value = "问题") private String email; @ApiModelProperty(value = "答案") private String answer; } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/ForgetResetPasswordDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ForgetResetPasswordDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 忘记密码. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class ForgetResetPasswordDto implements Serializable { private static final long serialVersionUID = 5478700873789068921L; @ApiModelProperty(value = "登录名") private String loginName; @ApiModelProperty(value = "密码") private String loginPwd; @ApiModelProperty(value = "邮箱") private String email; @ApiModelProperty(value = "验证码") private String emailCode; @ApiModelProperty(value = "token") private String forgetToken; } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/IdStatusDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:IdStatusDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Id status dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class IdStatusDto implements Serializable { private static final long serialVersionUID = -1976690893998068416L; @ApiModelProperty(value = "用户ID", required = true) private Long id; @ApiModelProperty(value = "推送状态", required = true) private Integer status; } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/LoginReqDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:LoginReqDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class Login req dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "登录参数") public class LoginReqDto implements Serializable { private static final long serialVersionUID = -3455057005375331843L; /** * 登录名 */ @ApiModelProperty(value = "登录名") private String loginName; /** * 密码 */ @ApiModelProperty(value = "密码") private String loginPwd; /** * 登录IP地址 */ @ApiModelProperty(value = "ip") private String ip; /** * 登录秘钥 */ @ApiModelProperty(value = "登录秘钥") private String secToken; @ApiModelProperty(value = "系统ID") private Long applicationId; } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/Perm.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:Perm.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import lombok.Data; import java.io.Serializable; /** * The class Perm. * * @author paascloud.net@gmail.com */ @Data public class Perm implements Serializable { private static final long serialVersionUID = 6578617729619284277L; private String resource; private String perm; } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/ResetPasswordDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:ResetPasswordDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * 重置密码. * * @author paascloud.net@gmail.com */ @Data @ApiModel public class ResetPasswordDto implements Serializable { private static final long serialVersionUID = 4762153981220090958L; @ApiModelProperty("登录名") private String loginName; @ApiModelProperty(value = "旧密码") private String passwordOld; @ApiModelProperty(value = "新密码") private String passwordNew; } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/UserInfoDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UserInfoDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.Date; /** * The class User info dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "用户注册Dto") public class UserInfoDto implements Serializable { private static final long serialVersionUID = -889913964833331690L; private Long id; private String userId; /** * 登录名 */ private String loginName; /** * 盐,用于shiro加密, 字段停用 */ private String salt; /** * 工号 */ private String userCode; /** * 姓名 */ private String userName; /** * 手机号 */ private String mobileNo; /** * 状态 */ private String status; /** * 用户来源 */ private String userSource; /** * 操作员类型() */ private String type; /** * 最后登录IP地址 */ private String lastLoginIp; /** * 描述 */ private String remark; /** * 最后登录时间 */ private Date lastLoginTime; /** * 邮箱 */ private String email; /** * 用户所属的组织ID */ @ApiModelProperty(value = "用户所属的组织ID") private Long groupId; @ApiModelProperty(value = "用户所属的组织名称") private String groupName; } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/dto/user/UserRegisterDto.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UserRegisterDto.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.dto.user; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; /** * The class User register dto. * * @author paascloud.net@gmail.com */ @Data @ApiModel(value = "用户注册Dto") public class UserRegisterDto implements Serializable { private static final long serialVersionUID = -8019925037057525804L; /** * 用户名 */ @ApiModelProperty(value = "登录名") private String loginName; /** * 手机号 */ @ApiModelProperty(value = "手机号") private String mobileNo; /** * 密码 */ @ApiModelProperty(value = "密码") private String loginPwd; /** * 确认密码 */ @ApiModelProperty(value = "确认密码") private String confirmPwd; /** * 邮箱 */ @ApiModelProperty(value = "邮箱") private String email; /** * 注册token */ @ApiModelProperty(value = "注册渠道") private String registerSource; } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/enums/UacGroupTypeEnum.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacGroupTypeEnum.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.enums; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import java.util.Arrays; import java.util.List; import java.util.Map; /** * The enum Uac group type enum. * * @author paascloud.net@gmail.com */ public enum UacGroupTypeEnum { /** * Group area uac group type enum. */ GROUP_AREA("1", "大区"), /** * Group warehouse uac group type enum. */ GROUP_WAREHOUSE("2", "仓库"), /** * Group base uac group type enum. */ GROUP_BASE("3", "基地"), /** * Group franchisee uac group type enum. */ GROUP_FRANCHISEE("5", "加盟商"), /** * Group other uac group type enum. */ GROUP_OTHER("4", "其它"),; /** * The Key. */ String key; /** * The Value. */ String value; UacGroupTypeEnum(String key, String value) { this.key = key; this.value = value; } /** * Gets key. * * @return the key */ public String getKey() { return key; } /** * Sets key. * * @param key the key */ public void setKey(String key) { this.key = key; } /** * Gets value. * * @return the value */ public String getValue() { return value; } /** * Sets value. * * @param value the value */ public void setValue(String value) { this.value = value; } /** * 获取key获取value * * @param key key * * @return value value */ public static String getValue(String key) { for (UacGroupTypeEnum ele : UacGroupTypeEnum.values()) { if (key.equals(ele.getKey())) { return ele.getValue(); } } return null; } /** * 根据key获取该对象 * * @param key key * * @return this enum */ public static UacGroupTypeEnum getEnum(String key) { for (UacGroupTypeEnum ele : UacGroupTypeEnum.values()) { if (key.equals(ele.getKey())) { return ele; } } return null; } /** * 获取List集合 * * @return List list */ public static List getList() { return Arrays.asList(UacGroupTypeEnum.values()); } /** * 获取map类型集合 * * @return Map类型List集合 map 2 list */ public static List> getMap2List() { List> list = Lists.newArrayList(); for (UacGroupTypeEnum ele : UacGroupTypeEnum.values()) { Map map = Maps.newHashMap(); map.put("key", ele.getKey()); map.put("value", ele.getValue()); list.add(map); } return list; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/exceptions/UacBizException.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacBizException.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.exceptions; import com.paascloud.base.enums.ErrorCodeEnum; import com.paascloud.base.exception.BusinessException; import lombok.extern.slf4j.Slf4j; /** * The class Uac biz exception. * * @author paascloud.net @gmail.com */ @Slf4j public class UacBizException extends BusinessException { private static final long serialVersionUID = -6552248511084911254L; /** * Instantiates a new Uac rpc exception. */ public UacBizException() { } /** * Instantiates a new Uac rpc exception. * * @param code the code * @param msgFormat the msg format * @param args the args */ public UacBizException(int code, String msgFormat, Object... args) { super(code, msgFormat, args); log.info("<== UacRpcException, code:" + this.code + ", message:" + super.getMessage()); } /** * Instantiates a new Uac rpc exception. * * @param code the code * @param msg the msg */ public UacBizException(int code, String msg) { super(code, msg); log.info("<== UacRpcException, code:" + this.code + ", message:" + super.getMessage()); } /** * Instantiates a new Uac rpc exception. * * @param codeEnum the code enum */ public UacBizException(ErrorCodeEnum codeEnum) { super(codeEnum.code(), codeEnum.msg()); log.info("<== UacRpcException, code:" + this.code + ", message:" + super.getMessage()); } /** * Instantiates a new Uac rpc exception. * * @param codeEnum the code enum * @param args the args */ public UacBizException(ErrorCodeEnum codeEnum, Object... args) { super(codeEnum, args); log.info("<== OpcRpcException, code:" + this.code + ", message:" + super.getMessage()); } } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/service/UacMqMessageFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacMqMessageFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.service; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.provider.model.service.hystrix.UacMqMessageApiHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; import java.util.List; /** * The interface Uac user token feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-uac", configuration = OAuth2FeignAutoConfiguration.class, fallback = UacMqMessageApiHystrix.class) public interface UacMqMessageFeignApi { /** * Query waiting confirm message list wrapper. * * @param messageKeyList the message key list * * @return the wrapper */ @PostMapping(value = "/api/uac/message/queryMessageKeyList") Wrapper> queryMessageKeyList(@RequestParam("messageKeyList") List messageKeyList); /** * Query message list with page wrapper. * * @param messageQueryDto the message query dto * * @return the wrapper */ @PostMapping(value = "/api/uac/message/queryMessageListWithPage") Wrapper> queryMessageListWithPage(@RequestBody MessageQueryDto messageQueryDto); } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/service/UacUserTokenFeignApi.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserTokenFeignApi.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.service; import com.paascloud.provider.model.service.hystrix.UacUserTokenFeignApiHystrix; import com.paascloud.security.feign.OAuth2FeignAutoConfiguration; import com.paascloud.wrapper.Wrapper; import org.springframework.cloud.netflix.feign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; /** * The interface Uac user token feign api. * * @author paascloud.net @gmail.com */ @FeignClient(value = "paascloud-provider-uac", configuration = OAuth2FeignAutoConfiguration.class, fallback = UacUserTokenFeignApiHystrix.class) public interface UacUserTokenFeignApi { /** * 超时token更新为离线. * * @return the wrapper */ @PostMapping(value = "/api/uac/token/updateTokenOffLine") Wrapper updateTokenOffLine(); } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/service/hystrix/UacMqMessageApiHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacMqMessageApiHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.service.hystrix; import com.github.pagehelper.PageInfo; import com.paascloud.base.dto.MessageQueryDto; import com.paascloud.base.dto.MqMessageVo; import com.paascloud.provider.model.service.UacMqMessageFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; import java.util.List; /** * The class Uac mq message api hystrix. * * @author paascloud.net @gmail.com */ @Component public class UacMqMessageApiHystrix implements UacMqMessageFeignApi { @Override public Wrapper> queryMessageKeyList(final List messageKeyList) { return null; } @Override public Wrapper> queryMessageListWithPage(final MessageQueryDto messageQueryDto) { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/service/hystrix/UacUserTokenFeignApiHystrix.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:UacUserTokenFeignApiHystrix.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.service.hystrix; import com.paascloud.provider.model.service.UacUserTokenFeignApi; import com.paascloud.wrapper.Wrapper; import org.springframework.stereotype.Component; /** * The class Uac user token feign api hystrix. * * @author paascloud.net @gmail.com */ @Component public class UacUserTokenFeignApiHystrix implements UacUserTokenFeignApi { @Override public Wrapper updateTokenOffLine() { return null; } } ================================================ FILE: paascloud-provider-api/paascloud-provider-uac-api/src/main/java/com/paascloud/provider/model/vo/MenuVo.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:MenuVo.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.provider.model.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.io.Serializable; import java.util.List; /** * The class Menu vo. * * @author paascloud.net@gmail.com */ @Data @ApiModel("菜单") public class MenuVo implements Serializable { /** * serialVersionUID:用一句话描述这个变量表示什么. * * @since JDK 1.7 */ private static final long serialVersionUID = -2099147126084213856L; /** * menu.id; */ @ApiModelProperty("菜单编号") private Long id; /** * 父id */ @ApiModelProperty("父id") private Long pid; /** * 菜单编码 */ @ApiModelProperty("菜单编码") private String menuCode; /** * 菜单名称 */ @ApiModelProperty("菜单名称") private String menuName; /** * 菜单URL */ @ApiModelProperty("菜单URL") private String url; /** * 图标 */ @ApiModelProperty("图标") private String icon; /** * 序号 */ @ApiModelProperty("序号") private String number; /** * 备注(研发中心) */ @ApiModelProperty("备注(研发中心)") private String remark; /** * 删除标识 */ @ApiModelProperty("删除标识") private Short yn; private MenuVo parentMenu; private List subMenu; private boolean hasMenu = false; } ================================================ FILE: paascloud-provider-api/pom.xml ================================================ paascloud-master com.liuzm.paascloud 1.0 com.liuzm.paascloud.provider.api 4.0.0 pom paascloud-provider-api paascloud-provider-uac-api paascloud-provider-mdc-api paascloud-provider-omc-api paascloud-provider-opc-api paascloud-provider-tpc-api paascloud-provider-sdk-api com.liuzm.paascloud.common paascloud-common-base com.liuzm.paascloud.common paascloud-security-feign 1.0 org.apache.maven.plugins maven-compiler-plugin ${maven-compiler-plugin.version} ${java.version} ${java.version} ${java.version} ${java.version} org.apache.maven.plugins maven-javadoc-plugin ${maven-javadoc-plugin.version} UTF-8 true UTF-8 UTF-8 attach-javadocs jar org.apache.maven.plugins maven-source-plugin ${maven-source-plugin.version} attach-sources jar ================================================ FILE: paascloud-zipkin/pom.xml ================================================ 4.0.0 com.liuzm.paascloud.zipkin paascloud-zipkin jar paascloud-zipkin 微服务链路追踪 com.liuzm.paascloud paascloud-master 1.0 UTF-8 UTF-8 1.8 org.springframework.cloud spring-cloud-starter-config io.zipkin.java zipkin-autoconfigure-ui io.zipkin.java zipkin-server org.jooq jooq 3.8.0 org.springframework.boot spring-boot-starter-jdbc com.alibaba druid-spring-boot-starter com.alibaba druid mysql mysql-connector-java org.springframework.cloud spring-cloud-sleuth-zipkin-stream org.springframework.cloud spring-cloud-starter-sleuth org.springframework.cloud spring-cloud-stream-binder-rabbit org.springframework.cloud spring-cloud-sleuth-stream org.springframework.boot spring-boot-starter-actuator de.codecentric spring-boot-admin-starter-client io.zipkin.java zipkin-autoconfigure-collector-rabbitmq ${project.artifactId} org.springframework.boot spring-boot-maven-plugin build-info com.spotify docker-maven-plugin 0.4.13 ${project.artifactId}:${project.version} java ["java", "-jar", "/${project.build.finalName}.jar"] / ${project.build.directory} ${project.build.finalName}.jar ================================================ FILE: paascloud-zipkin/src/main/java/com/paascloud/discovery/CustomPollerConfiguration.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:CustomPollerConfiguration.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.discovery; import org.springframework.cloud.sleuth.Sampler; import org.springframework.cloud.sleuth.sampler.AlwaysSampler; import org.springframework.cloud.sleuth.stream.StreamSpanReporter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.integration.scheduling.PollerMetadata; import org.springframework.scheduling.support.PeriodicTrigger; /** * The class Custom poller configuration. * * @author paascloud.net@gmail.com */ @Configuration public class CustomPollerConfiguration { /** * Custom poller poller metadata. * * @return the poller metadata */ @Bean(name = StreamSpanReporter.POLLER) PollerMetadata customPoller() { PollerMetadata poller = new PollerMetadata(); poller.setMaxMessagesPerPoll(500); poller.setTrigger(new PeriodicTrigger(5000L)); return poller; } @Bean public Sampler defaultSampler() { return new AlwaysSampler(); } } ================================================ FILE: paascloud-zipkin/src/main/java/com/paascloud/discovery/PaasCloudZipkinApplication.java ================================================ /* * Copyright (c) 2018. paascloud.net All Rights Reserved. * 项目名称:paascloud快速搭建企业级分布式微服务平台 * 类名称:PaasCloudZipkinApplication.java * 创建人:刘兆明 * 联系方式:paascloud.net@gmail.com * 开源地址: https://github.com/paascloud * 博客地址: http://blog.paascloud.net * 项目官网: http://paascloud.net */ package com.paascloud.discovery; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import zipkin.server.EnableZipkinServer; /** * The class Paas cloud zipkin application. * * @author paascloud.net@gmail.com */ @EnableDiscoveryClient @SpringBootApplication @EnableZipkinServer public class PaasCloudZipkinApplication { /** * The entry point of application. * * @param args the input arguments */ public static void main(String[] args) { SpringApplication.run(PaasCloudZipkinApplication.class, args); } } ================================================ FILE: paascloud-zipkin/src/main/resources/application.yml ================================================ server: port: 8020 spring: profiles: active: dev application: name: @pom.artifactId@ datasource: username: root password: 123456 ================================================ FILE: paascloud-zipkin/src/main/resources/banner.txt ================================================ ${AnsiColor.BRIGHT_CYAN} .__ .___ __ ___________ _____ ______ ____ | | ____ __ __ __| _/ ____ _____/ |_ \____ \__ \ \__ \ / ___// ___\| | / _ \| | \/ __ | / \_/ __ \ __\ | |_> > __ \_/ __ \_\___ \\ \___| |_( <_> ) | / /_/ | | | \ ___/| | | __(____ (____ /____ >\___ >____/\____/|____/\____ | /\ |___| /\___ >__| |__| \/ \/ \/ \/ Powered by liuzhaoming\/ \/ \/ \/ ================================================ FILE: paascloud-zipkin/src/main/resources/bootstrap.yml ================================================ spring: cloud: config: fail-fast: true discovery: service-id: paascloud-discovery enabled: true label: ${spring.profiles.active} profile: ${spring.profiles.active} username: admin password: admin eureka: client: serviceUrl: defaultZone: http://root:root@paascloud-eureka:8761/eureka/ instance: instance-id: ${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port} ================================================ FILE: paascloud-zipkin/src/main/resources/logback-spring.xml ================================================ ${LOG_PATH}${LOG_FILE} %date [%level] [%thread] %logger{60} [%file : %line] %msg%n ${LOG_PATH}daily/${LOG_FILE}.%d{yyyy-MM-dd}.gz 30 ================================================ FILE: paascloud-zipkin/src/main/resources/mysql.sql ================================================ CREATE TABLE IF NOT EXISTS zipkin_spans ( `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit', `trace_id` BIGINT NOT NULL, `id` BIGINT NOT NULL, `name` VARCHAR(255) NOT NULL, `parent_id` BIGINT, `debug` BIT(1), `start_ts` BIGINT COMMENT 'Span.timestamp(): epoch micros used for endTs query and to implement TTL', `duration` BIGINT COMMENT 'Span.duration(): micros used for minDuration and maxDuration query' ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; ALTER TABLE zipkin_spans ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `id`) COMMENT 'ignore insert on duplicate'; ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`, `id`) COMMENT 'for joining with zipkin_annotations'; ALTER TABLE zipkin_spans ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTracesByIds'; ALTER TABLE zipkin_spans ADD INDEX(`name`) COMMENT 'for getTraces and getSpanNames'; ALTER TABLE zipkin_spans ADD INDEX(`start_ts`) COMMENT 'for getTraces ordering and range'; CREATE TABLE IF NOT EXISTS zipkin_annotations ( `trace_id_high` BIGINT NOT NULL DEFAULT 0 COMMENT 'If non zero, this means the trace uses 128 bit traceIds instead of 64 bit', `trace_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.trace_id', `span_id` BIGINT NOT NULL COMMENT 'coincides with zipkin_spans.id', `a_key` VARCHAR(255) NOT NULL COMMENT 'BinaryAnnotation.key or Annotation.value if type == -1', `a_value` BLOB COMMENT 'BinaryAnnotation.value(), which must be smaller than 64KB', `a_type` INT NOT NULL COMMENT 'BinaryAnnotation.type() or -1 if Annotation', `a_timestamp` BIGINT COMMENT 'Used to implement TTL; Annotation.timestamp or zipkin_spans.timestamp', `endpoint_ipv4` INT COMMENT 'Null when Binary/Annotation.endpoint is null', `endpoint_ipv6` BINARY(16) COMMENT 'Null when Binary/Annotation.endpoint is null, or no IPv6 address', `endpoint_port` SMALLINT COMMENT 'Null when Binary/Annotation.endpoint is null', `endpoint_service_name` VARCHAR(255) COMMENT 'Null when Binary/Annotation.endpoint is null' ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; ALTER TABLE zipkin_annotations ADD UNIQUE KEY(`trace_id_high`, `trace_id`, `span_id`, `a_key`, `a_timestamp`) COMMENT 'Ignore insert on duplicate'; ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`, `span_id`) COMMENT 'for joining with zipkin_spans'; ALTER TABLE zipkin_annotations ADD INDEX(`trace_id_high`, `trace_id`) COMMENT 'for getTraces/ByIds'; ALTER TABLE zipkin_annotations ADD INDEX(`endpoint_service_name`) COMMENT 'for getTraces and getServiceNames'; ALTER TABLE zipkin_annotations ADD INDEX(`a_type`) COMMENT 'for getTraces'; ALTER TABLE zipkin_annotations ADD INDEX(`a_key`) COMMENT 'for getTraces'; ALTER TABLE zipkin_annotations ADD INDEX(`trace_id`, `span_id`, `a_key`) COMMENT 'for dependencies job'; CREATE TABLE IF NOT EXISTS zipkin_dependencies ( `day` DATE NOT NULL, `parent` VARCHAR(255) NOT NULL, `child` VARCHAR(255) NOT NULL, `call_count` BIGINT ) ENGINE=InnoDB ROW_FORMAT=COMPRESSED CHARACTER SET=utf8 COLLATE utf8_general_ci; ALTER TABLE zipkin_dependencies ADD UNIQUE KEY(`day`, `parent`, `child`); ================================================ FILE: pom.xml ================================================ 4.0.0 com.liuzm.paascloud paascloud-master 1.0 pom org.springframework.boot spring-boot-starter-parent 1.5.13.RELEASE paascloud-eureka paascloud-discovery paascloud-monitor paascloud-zipkin paascloud-gateway paascloud-provider-api paascloud-common paascloud-provider paascloud-generator 刘兆明 https://paascloud.net paascloud.net@gmail.com UTF-8 UTF-8 1.8 2.6.1 1.10 0.7.0 1.9.13 1.2.0 2.0.7 1.0.29 3.4.0 4.3.8.RELEASE 1.0 1.0 2.1.5 2.10.0 5.1.39 3.5.1 2.10.4 3.0.1 17.0 1.5.7 1.0 3.0.3 4.3.11.RELEASE 1.2.29 1.1.2 4.1.0-incubating org.springframework.cloud spring-cloud-starter-netflix-eureka-client paascloud-lib-rep http://139.199.125.217:8081/content/repositories/paascloud-lib-rep/ nexus-snapshots User Project Snapshot http://139.199.125.217:8081/content/repositories/snapshots/ true io.spring.platform platform-bom Brussels-SR10 pom import org.springframework.cloud spring-cloud-dependencies Edgware.SR3 pom import com.google.guava guava ${guava.version} com.liuzm.paascloud.common paascloud-common-base ${paascloud.version} com.liuzm.paascloud.common paascloud-common-core ${paascloud.version} com.liuzm.paascloud.common paascloud-common-util ${paascloud.version} com.liuzm.paascloud.common paascloud-common-zk ${paascloud.version} com.liuzm.paascloud.common paascloud-security-app ${paascloud.version} io.springfox springfox-swagger2 ${springfox.version} io.springfox springfox-swagger-ui ${springfox.version} org.projectlombok lombok 1.16.14 commons-codec commons-codec ${commons-codec.version} org.apache.commons commons-lang3 3.5 io.jsonwebtoken jjwt ${jjwt.version} org.codehaus.jackson jackson-jaxrs ${codehaus-jackson.version} org.codehaus.jackson jackson-smile ${codehaus-jackson.version} org.codehaus.jackson jackson-core-asl ${codehaus-jackson.version} org.codehaus.jackson jackson-mapper-asl ${codehaus-jackson.version} com.fasterxml.jackson.core jackson-databind 2.8.4 org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis-starter-version} tk.mybatis mapper ${mapper.version} tk.mybatis mapper-spring-boot-starter 1.1.1 com.github.pagehelper pagehelper-spring-boot-starter 1.1.2 com.alibaba druid ${druid.version} com.alibaba druid-spring-boot-starter 1.1.0 org.mybatis.generator mybatis-generator-core 1.3.5 test joda-time joda-time 2.9.6 org.springframework spring-context ${springframework.version} org.springframework spring-web ${springframework.version} eu.bitwalker UserAgentUtils 1.20 com.xiaoleilu hutool-all 3.0.7 com.liuzm.paascloud.provider.api paascloud-provider-uac-api ${paascloud.version} com.liuzm.paascloud.provider.api paascloud-provider-mdc-api ${paascloud.version} com.liuzm.paascloud.provider.api paascloud-provider-omc-api ${paascloud.version} com.liuzm.paascloud.provider.api paascloud-provider-tpc-api ${paascloud.version} com.liuzm.paascloud.provider.api paascloud-provider-opc-api ${paascloud.version} com.liuzm.paascloud.provider.api paascloud-provider-sdk-api ${paascloud.version} org.mybatis mybatis 3.4.2 com.aliyun aliyun-java-sdk-core 3.2.2 com.aliyun aliyun-java-sdk-dysmsapi 1.1.0 com.aliyun.mns aliyun-sdk-mns 1.1.8.4 com.aliyun.mns alicom-mns-receive-sdk 1.0 org.apache.rocketmq rocketmq-client ${rocketmq.version} com.qiniu qiniu-java-sdk [7.0.0, 7.2.99] com.alipay alipay-sdk-java 20170725114550 com.alipay alipay-trade-sdk 20161215 org.modelmapper modelmapper ${modelmapper.version} de.codecentric spring-boot-admin-server-ui-login ${boot.admin.version} de.codecentric spring-boot-admin-server ${boot.admin.version} de.codecentric spring-boot-admin-server-ui ${boot.admin.version} de.codecentric spring-boot-admin-starter-client ${boot.admin.version} de.codecentric spring-boot-admin-server-ui-hystrix ${boot.admin.version} de.codecentric spring-boot-admin-server-ui-activiti ${boot.admin.version} de.codecentric spring-boot-admin-server-ui-turbine ${boot.admin.version} com.github.penggle kaptcha 2.3.2 javax.servlet-api javax.servlet com.liuzm.paascloud elastic-job-lite-starter 1.0 mysql mysql-connector-java ${mysql.version} com.arronlong.httpclientutil httpclientutil ${httpclientutil.version} org.apache.curator curator-client ${curator.version} org.apache.curator curator-recipes ${curator.version} org.apache.curator curator-framework ${curator.version} io.github.openfeign.form feign-form ${feign.form.spring.version} io.github.openfeign.form feign-form-spring ${feign.form.spring.version} org.springframework spring-tx ${spring.version} com.alibaba fastjson ${fastjson.version} io.zipkin.java zipkin-autoconfigure-collector-rabbitmq 2.3.1 net.logstash.logback logstash-logback-encoder 4.6 org.apache.maven.plugins maven-compiler-plugin 2.3.2 1.8 1.8 UTF-8 dev dev true pro pro