Browse Source

Merge branch 'dev' of http://192.168.1.220:10080/jiwei/jw2.0 into dev

LiTaohong 7 years ago
parent
commit
20d606b6c4
92 changed files with 3233 additions and 408 deletions
  1. 20 0
      base/common-security/pom.xml
  2. 46 16
      base/common-security/readme.MD
  3. 30 0
      base/common-security/src/main/java/com.yihu.base.security/SercurityConfig.java
  4. 16 10
      base/common-security/src/main/java/com.yihu.base.security/config/AuthorizationServerConfig.java
  5. 35 8
      base/common-security/src/main/java/com.yihu.base.security/config/ResourceServerConfig.java
  6. 19 2
      base/common-security/src/main/java/com.yihu.base.security/hander/BaseAuthenticationSuccessHandler.java
  7. 19 4
      base/common-security/src/main/java/com.yihu.base.security/properties/AccessTokenPorperties.java
  8. 21 0
      base/common-security/src/main/java/com.yihu.base.security/properties/QQProperties.java
  9. 2 2
      base/common-security/src/main/java/com.yihu.base.security/properties/SmsValidateProperties.java
  10. 1 0
      base/common-security/src/main/java/com.yihu.base.security/rbas/IRbasService.java
  11. 1 1
      base/common-security/src/main/java/com.yihu.base.security/rbas/provider/AuthorizeConfigProvider.java
  12. 2 2
      base/common-security/src/main/java/com.yihu.base.security/rbas/provider/AuthorizeConfigProviderManager.java
  13. 3 2
      base/common-security/src/main/java/com.yihu.base.security/rbas/provider/PerssionAllAuthorizeConfigProvider.java
  14. 8 3
      base/common-security/src/main/java/com.yihu.base.security/rbas/provider/RbasAuthorizeConfigProvider.java
  15. 1 1
      base/common-security/src/main/java/com.yihu.base.security/sms/SmsCodeAuthenticationFilter.java
  16. 1 1
      base/common-security/src/main/java/com.yihu.base.security/sms/SmsCodeAuthenticationProvider.java
  17. 32 28
      base/common-security/src/main/java/com.yihu.base.security/sms/SmsCodeAuthenticationSecurityConfig.java
  18. 1 1
      base/common-security/src/main/java/com.yihu.base.security/sms/SmsCodeAuthenticationToken.java
  19. 20 4
      base/common-security/src/main/java/com.yihu.base.security/sms/controller/SmsController.java
  20. 5 11
      base/common-security/src/main/java/com.yihu.base.security/sms/filter/SmsvalidateCodeFilter.java
  21. 44 0
      base/common-security/src/main/java/com.yihu.base.security/sms/mobile/DefaultMobileCheck.java
  22. 10 0
      base/common-security/src/main/java/com.yihu.base.security/sms/mobile/MobileCheck.java
  23. 17 21
      base/common-security/src/main/java/com.yihu.base.security/sms/process/SmsValidateCodeProcessor.java
  24. 2 4
      base/common-security/src/main/java/com.yihu.base.security/sms/sender/DefaultSmsCodeSender.java
  25. 3 1
      base/common-security/src/main/java/com.yihu.base.security/sms/sender/SmsCodeSender.java
  26. 16 1
      base/common-security/src/main/java/com.yihu.base.security/sms/vo/ValidateCode.java
  27. 13 0
      base/common-security/src/main/java/com.yihu.base.security/social/qq/api/QQ.java
  28. 60 0
      base/common-security/src/main/java/com.yihu.base.security/social/qq/api/QQImpl.java
  29. 206 0
      base/common-security/src/main/java/com.yihu.base.security/social/qq/api/QQUserInfo.java
  30. 36 0
      base/common-security/src/main/java/com.yihu.base.security/social/qq/config/QQAutoConfig.java
  31. 43 0
      base/common-security/src/main/java/com.yihu.base.security/social/qq/connet/QQAdapter.java
  32. 18 0
      base/common-security/src/main/java/com.yihu.base.security/social/qq/connet/QQConnectionFactory.java
  33. 51 0
      base/common-security/src/main/java/com.yihu.base.security/social/qq/connet/QQOAuth2Template.java
  34. 32 0
      base/common-security/src/main/java/com.yihu.base.security/social/qq/connet/QQServiceProvider.java
  35. 3 2
      base/common-security/src/main/resources/template.yml
  36. 2 2
      common/common-entity/src/main/java/com/yihu/jw/base/version/BaseUserVersionDO.java
  37. 237 0
      common/common-entity/src/main/java/com/yihu/jw/iot/device/IotDeviceDO.java
  38. 182 0
      common/common-entity/src/main/java/com/yihu/jw/iot/device/IotDeviceOrderDO.java
  39. 181 0
      common/common-entity/src/main/java/com/yihu/jw/iot/device/IotDevicePurchaseDO.java
  40. 182 0
      common/common-entity/src/main/java/com/yihu/jw/iot/device/IotDeviceQualityInspectionPlanDO.java
  41. 87 0
      common/common-entity/src/main/java/com/yihu/jw/iot/dict/IotDeviceDictDO.java
  42. 194 0
      common/common-entity/src/main/java/com/yihu/jw/iot/supplier/IotDeviceSupplierDO.java
  43. 137 0
      common/common-entity/src/main/java/com/yihu/jw/iot/supplier/IotSupplyDeviceDO.java
  44. 93 0
      common/common-entity/src/main/java/com/yihu/jw/iot/supplier/IotSupplyDeviceDataTypeDO.java
  45. 34 0
      common/common-request-mapping/src/main/java/com/yihu/jw/rm/iot/IotRequestMapping.java
  46. 1 0
      common/common-rest-model/src/main/java/com/yihu/jw/restmodel/CommonContants.java
  47. 1 0
      common/common-util/pom.xml
  48. 5 0
      server/svr-discovery/src/main/resources/application.yml
  49. 1 0
      server/svr-logServer/src/main/resources/application.yml
  50. 26 3
      svr-lib-parent-pom/pom.xml
  51. 1 0
      svr/readme.MD
  52. 13 13
      svr/svr-base/src/main/java/com/yihu/jw/business/sms/controller/SmsController.java
  53. 1 0
      svr/svr-base/src/main/java/com/yihu/jw/business/sms/service/SmsService.java
  54. 2 0
      svr/svr-base/src/main/java/com/yihu/jw/business/user/contorller/EmployController.java
  55. 0 88
      svr/svr-demo/readme.MD
  56. 2 1
      svr/svr-demo/src/main/java/com/yihu/DemoApplication.java
  57. 111 75
      svr/svr-demo/src/main/java/com/yihu/jw/model/SaasDO.java
  58. 16 16
      svr/svr-demo/src/main/java/com/yihu/jw/service/ClientService.java
  59. 18 0
      svr/svr-demo/src/main/java/com/yihu/jw/service/MySmsCodeSender.java
  60. 5 5
      svr/svr-demo/src/main/java/com/yihu/jw/service/RbasService.java
  61. 9 2
      svr/svr-demo/src/main/java/com/yihu/jw/service/UserService.java
  62. 2 9
      svr/svr-demo/src/main/resources/application.yml
  63. 68 0
      svr/svr-iot/pom.xml
  64. 10 0
      svr/svr-iot/src/main/java/com/yihu/iot/IOTApplication.java
  65. 50 0
      svr/svr-iot/src/main/java/com/yihu/iot/config/SwaggerConfig.java
  66. 29 0
      svr/svr-iot/src/main/java/com/yihu/iot/config/jpa/HibernateProperties.java
  67. 55 0
      svr/svr-iot/src/main/java/com/yihu/iot/config/jpa/IotJpa.java
  68. 101 0
      svr/svr-iot/src/main/java/com/yihu/iot/controller/supplier/IotDeviceSupplierController.java
  69. 12 0
      svr/svr-iot/src/main/java/com/yihu/iot/dao/device/IotDeviceDao.java
  70. 12 0
      svr/svr-iot/src/main/java/com/yihu/iot/dao/device/IotDeviceOrderDao.java
  71. 12 0
      svr/svr-iot/src/main/java/com/yihu/iot/dao/device/IotDevicePurchaseDao.java
  72. 14 0
      svr/svr-iot/src/main/java/com/yihu/iot/dao/device/IotDeviceQualityInspectionPlanDao.java
  73. 12 0
      svr/svr-iot/src/main/java/com/yihu/iot/dao/dict/IotDeviceDictDao.java
  74. 16 0
      svr/svr-iot/src/main/java/com/yihu/iot/dao/supplier/IotDeviceSupplierDao.java
  75. 13 0
      svr/svr-iot/src/main/java/com/yihu/iot/dao/supplier/IotSupplyDeviceDao.java
  76. 13 0
      svr/svr-iot/src/main/java/com/yihu/iot/dao/supplier/IotSupplyDeviceDataTypeDao.java
  77. 44 0
      svr/svr-iot/src/main/java/com/yihu/iot/service/supplier/IotDeviceSupplierService.java
  78. 32 5
      svr/svr-iot/src/main/resources/application.yml
  79. 1 1
      svr/svr-iot/src/main/resources/bootstrap.yml
  80. 1 0
      web-gateway/src/main/java/com/yihu/jw/commnon/base/base/VersionContants.java
  81. 20 0
      web-gateway/src/main/java/com/yihu/jw/commnon/iot/SupplierContants.java
  82. 40 0
      web-gateway/src/main/java/com/yihu/jw/config/security/ClientService.java
  83. 20 13
      web-gateway/src/main/java/com/yihu/jw/config/security/roleService/UserRbasService.java
  84. 61 0
      web-gateway/src/main/java/com/yihu/jw/config/security/UserService.java
  85. 0 24
      web-gateway/src/main/java/com/yihu/jw/config/security/roleService/ClientService.java
  86. 0 25
      web-gateway/src/main/java/com/yihu/jw/config/security/roleService/UserService.java
  87. 4 0
      web-gateway/src/main/java/com/yihu/jw/controller/base/version/UserVersionController.java
  88. 115 0
      web-gateway/src/main/java/com/yihu/jw/controller/iot/supplier/IotDeviceSupplierController.java
  89. 1 1
      web-gateway/src/main/java/com/yihu/jw/controller/login/LoginController.java
  90. 1 0
      web-gateway/src/main/java/com/yihu/jw/feign/base/version/UserVersionFeign.java
  91. 50 0
      web-gateway/src/main/java/com/yihu/jw/feign/fallbackfactory/iot/supplier/IotDeviceSupplierFeignFallbackFactory.java
  92. 46 0
      web-gateway/src/main/java/com/yihu/jw/feign/iot/supplier/IotDeviceSupplierFeign.java

+ 20 - 0
base/common-security/pom.xml

@ -27,6 +27,10 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-autoconfigure</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
@ -74,6 +78,22 @@
            <artifactId>cglib</artifactId>
            <version>3.2.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.social</groupId>
            <artifactId>spring-social-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.social</groupId>
            <artifactId>spring-social-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.social</groupId>
            <artifactId>spring-social-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.social</groupId>
            <artifactId>spring-social-web</artifactId>
        </dependency>
    </dependencies>
</project>

+ 46 - 16
base/common-security/readme.MD

@ -1,36 +1,51 @@
**授权码模式:(一直开放API用)**
**授权码模式:(一般开放API用)**
注:
    1. 获取客户端的实现逻辑结合自己的客户端用户体系实现 (com.yihu.base.security.rbas.ClientServiceProvider)
第一步
获取code
http://localhost:8060/oauth/authorize?response_type=code&client_id=cwd&redirect_uri=http://example.com&scope=all
http://localhost:8060/oauth/authorize?response_type=code&client_id=cwd&redirect_uri=http://example.com&scope=app
参数说明:
response_type=code 固定
scope=app 固定
client_id=cwd 根据用户表中自己定义的填写
redirect_uri=http://example.com 根据用户表中自己定义的填写
第二步 
获取token post请求
http://localhost:8060/oauth/token
header:  Basic {appid}:{appsecuri} 加密  例如 Basic Y3dkOmN3ZA==
  
{
     "grant_type":"authorization_code",  
     "grant_type":"authorization_code", 授权模式固定
     "client_id":"cwd",
     "code":"第一步请求获取的code",
     "redirect_uri":"http://example.com",
     "scope":"all"
     "scope":"app"
}
返回值
{
    "access_token":"bd677e24-2de5-4862-a5e1-8f90a074db42",
    "access_token":"bd677e24-2de5-4862-a5e1-8f90a074db42",   默认2小时过期时间 可以配置 ,由于每次请求都需要验证access_token,所以access_token存储在redis
    "token_type":"bearer",
    "refresh_token":"1427b997-ef94-4061-8940-c71da6549acd",
    "refresh_token":"1427b997-ef94-4061-8940-c71da6549acd",  默认2小时过期时间 可以配置 
    "expires_in":43199,
    "scope":"all"
    "scope":"app"
}
**密码模式(一般自己公司系统用)**
注:  
    1. 获取用户的实现逻辑结合自己的用户体系实现 (org.springframework.security.core.userdetails.UserDetailsService)
    
获取token post请求
http://localhost:8060/oauth/token
header:  Basic {appid}:{appsecuri} 加密  例如 Basic Y3dkOmN3ZA==
  
{
     "grant_type":"password",  
     "username":"jojo",
     "username":"admin",
     "password":"123456",
     "scope":"all"
     "scope":"app"
}
返回值
@ -39,17 +54,18 @@ header:  Basic {appid}:{appsecuri} 加密  例如 Basic Y3dkOmN3ZA==
    "token_type":"bearer",
    "refresh_token":"bbb36b54-61b2-4d86-aed3-91c5135174c3",
    "expires_in":43199,
    "scope":"all"
    "scope":"app"
}
**刷新token **
**刷新token**
获取token post请求
http://localhost:8060/oauth/token
header:  Basic {appid}:{appsecuri} 加密  例如 Basic Y3dkOmN3ZA==
  
{
     "grant_type":"refresh_token",
     "refresh_token":"all"
     "refresh_token":"bbb36b54-61b2-4d86-aed3-91c5135174c3"
}
返回值
@ -58,7 +74,7 @@ header:  Basic {appid}:{appsecuri} 加密  例如 Basic Y3dkOmN3ZA==
    "token_type":"bearer",
    "refresh_token":"bbb36b54-61b2-4d86-aed3-91c5135174c3",
    "expires_in":43199,
    "scope":"all"
    "scope":"app"
}
@ -69,8 +85,10 @@ http://localhost:8060/authentication/form
header:  Basic {appid}:{appsecuri} 加密  例如 Basic Y3dkOmN3ZA==
注:  
    1. 获取用户的实现逻辑结合自己的用户体系实现 (org.springframework.security.core.userdetails.UserDetailsService)
body
{
{ 
    "username":"test",
    "password":"123456"
}
@ -82,11 +100,21 @@ body
    "expires_in":43199,
    "scope":"all"
}
{
    "access_token":"4ce54971-91f9-4c19-bf76-a3c1d3e8c495",
    "token_type":"bearer",
    "refresh_token":"37e3e3bc-8897-4eb4-b43b-4b8382f0efdf",
    "scope":"app"
}
**自定义手机号短信验证码登陆**
获取短信
注:  
    1. 短信验证码默认存在redis中(不可配置)
   2. 短信超时时间1分钟(可配置)
   3. 手机号码验证规则可自定义(实现接口com.yihu.base.security.sms.mobile.MobileCheck)
   4. 短信发送器必须自己实现(实现接口com.yihu.base.security.sms.sender.SmsCodeSender)
GET
http://localhost:8060/code/sms
@ -98,6 +126,8 @@ body
POST
http://localhost:8060/authentication/mobile
注:  
    1. 短信登陆成功验证码会删除
header:  Basic {appid}:{appsecuri} 加密  例如 Basic Y3dkOmN3ZA==
@ -113,7 +143,7 @@ body
    "token_type":"bearer",
    "refresh_token":"bbb36b54-61b2-4d86-aed3-91c5135174c3",
    "expires_in":43199,
    "scope":"all"
    "scope":"app"
}
**访问方式**

+ 30 - 0
base/common-security/src/main/java/com.yihu.base.security/SercurityConfig.java

@ -1,17 +1,38 @@
package com.yihu.base.security;
import com.yihu.base.security.sms.mobile.DefaultMobileCheck;
import com.yihu.base.security.sms.sender.DefaultSmsCodeSender;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.security.access.PermissionEvaluator;
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
import org.springframework.security.authentication.AuthenticationTrustResolver;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.provider.expression.OAuth2MethodSecurityExpressionHandler;
import java.util.ArrayList;
import java.util.List;
/**
 * Created by chenweida on 2017/12/4.
 */
@Configuration
public class SercurityConfig {
    private Logger logger = LoggerFactory.getLogger(SercurityConfig.class);
    @Autowired(required = false)
    List<AuthenticationTrustResolver> trustResolvers = new ArrayList<>();
    @Autowired(required = false)
    List<PermissionEvaluator> permissionEvaluators = new ArrayList<>();
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
@ -20,6 +41,15 @@ public class SercurityConfig {
    @Bean
    @ConditionalOnMissingBean
    public DefaultSmsCodeSender defaultSmsCodeSender() {
        logger.info("使用默认的短信发送DefaultSmsCodeSender");
        return new DefaultSmsCodeSender();
    }
    @Bean
    @ConditionalOnMissingBean
    public DefaultMobileCheck defaultMobileCheck() {
        logger.info("使用默认的手机号验证规则");
        return new DefaultMobileCheck();
    }
}

+ 16 - 10
base/common-security/src/main/java/com.yihu.base.security/config/AuthorizationServerConfig.java

@ -5,22 +5,19 @@ import com.yihu.base.security.properties.AccessTokenPorperties;
import com.yihu.base.security.properties.SecurityProperties;
import com.yihu.base.security.rbas.ClientServiceProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
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.provider.ClientDetailsService;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.authentication.OAuth2AuthenticationManager;
import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
import org.springframework.security.oauth2.provider.token.ResourceServerTokenServices;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
@ -42,26 +39,34 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Autowired
    private DataSource dataSource;
    @Autowired
    private AccessTokenPorperties accessTokenPorperties;
    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        security.passwordEncoder(passwordEncoder);
    }
    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.authenticationManager(oAuth2AuthenticationManager())
                .tokenStore(tokenStore())
                .userDetailsService(userDetailsService)
                .tokenServices(defaultTokenServices());
                .tokenServices(defaultTokenServices())
               // .pathMapping("/oauth/confirm_access", "/extenal/oauth/confirm_access");//授权码模式  授权页面转换
        ;
        //endpoints.setClientDetailsService(clientDetailsService);
    }
    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        clients.jdbc(dataSource)
                .passwordEncoder(passwordEncoder)
                .clients(clientDetailsService)
        //.jdbc(dataSource).passwordEncoder(passwordEncoder) .clients(clientDetailsService)
        clients.withClientDetails(clientDetailsService);
        ;
    }
@ -89,6 +94,7 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap
        defaultTokenServices.setTokenStore(tokenStore());
        defaultTokenServices.setAccessTokenValiditySeconds(60 * 60 * accessTokenPorperties.getAccessTokenValidityHours()); //默认2小时
        defaultTokenServices.setRefreshTokenValiditySeconds(60 * 60 * accessTokenPorperties.getRefreshTokenValidityHours());//默认2小时
        defaultTokenServices.setClientDetailsService(clientDetailsService);
        return defaultTokenServices;
    }

+ 35 - 8
base/common-security/src/main/java/com.yihu.base.security/config/ResourceServerConfig.java

@ -1,19 +1,27 @@
package com.yihu.base.security.config;
import com.yihu.base.security.properties.SecurityProperties;
import com.yihu.base.security.rbas.IRbasService;
import com.yihu.base.security.rbas.provider.AuthorizeConfigProviderManager;
import com.yihu.base.security.sms.SmsCodeAuthenticationSecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
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.authentication.OAuth2AuthenticationManager;
import org.springframework.security.oauth2.provider.expression.OAuth2MethodSecurityExpressionHandler;
import org.springframework.security.oauth2.provider.expression.OAuth2WebSecurityExpressionHandler;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.web.access.expression.DefaultWebSecurityExpressionHandler;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.util.Base64Utils;
/**
 * Created by chenweida on 2017/12/4.
@ -34,29 +42,48 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
    private SmsCodeAuthenticationSecurityConfig smsCodeAuthenticationSecurityConfig;
    @Autowired
    private AuthorizeConfigProviderManager authorizeConfigProviderManager;
    @Autowired
    private OAuth2WebSecurityExpressionHandler oAuth2WebSecurityExpressionHandler;
    @Override
    public void configure(HttpSecurity http) throws Exception {
        http
                    .csrf().disable()
                .formLogin()//设置验证码 账号密码登陆
                    .loginPage(SecurityProperties.formLoginPage)
                    .loginProcessingUrl(SecurityProperties.formLogin)
                    .successHandler(authenticationSuccessHandler)
                    .failureHandler(authenticationFailureHandler)
                .and()
                    .apply(smsCodeAuthenticationSecurityConfig)  //添加自定义短信登陆
                .and()
                    .csrf().disable();
                    .apply(smsCodeAuthenticationSecurityConfig) //添加自定义短信登陆;
        ;
        //验证路径
        authorizeConfigProviderManager.condfig(http.authorizeRequests());
        authorizeConfigProviderManager.config(http.authorizeRequests());
    }
    @Override
    public void configure(ResourceServerSecurityConfigurer resources) throws Exception {
        resources.
                authenticationManager(authenticationManager).
                tokenStore(redisTokenStore);
                authenticationManager(authenticationManager)
                .tokenStore(redisTokenStore)
                .expressionHandler(oAuth2WebSecurityExpressionHandler);
    }
    /**
     * 解决bug
     * Failed to evaluate expression '#oauth2.throwOnError
     * No bean resolver registered in the context to resolve access to bean
     * @param applicationContext
     * @return
     */
    @Bean
    @Primary
    public OAuth2WebSecurityExpressionHandler oAuth2WebSecurityExpressionHandler(ApplicationContext applicationContext) {
        OAuth2WebSecurityExpressionHandler expressionHandler = new OAuth2WebSecurityExpressionHandler();
        expressionHandler.setApplicationContext(applicationContext);
        return expressionHandler;
    }
}

+ 19 - 2
base/common-security/src/main/java/com.yihu.base.security/hander/BaseAuthenticationSuccessHandler.java

@ -4,7 +4,9 @@
package com.yihu.base.security.hander;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.base.security.properties.SecurityProperties;
import com.yihu.base.security.rbas.ClientServiceProvider;
import com.yihu.base.security.sms.process.SmsValidateCodeProcessor;
import org.apache.commons.codec.binary.StringUtils;
import org.apache.commons.collections.MapUtils;
import org.slf4j.Logger;
@ -14,6 +16,7 @@ import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.core.Authentication;
import org.springframework.security.crypto.codec.Base64;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.exceptions.UnapprovedClientAuthenticationException;
import org.springframework.security.oauth2.provider.*;
@ -21,6 +24,8 @@ import org.springframework.security.oauth2.provider.token.AuthorizationServerTok
import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.context.request.ServletWebRequest;
import javax.annotation.Resource;
import javax.servlet.ServletException;
@ -39,12 +44,20 @@ public class BaseAuthenticationSuccessHandler extends SavedRequestAwareAuthentic
    private Logger logger = LoggerFactory.getLogger(getClass());
    /**
     * 验证请求url与配置的url是否匹配的工具类
     */
    private AntPathMatcher pathMatcher = new AntPathMatcher();
    @Autowired
    private ObjectMapper objectMapper;
    @Autowired
    private ClientServiceProvider clientDetailsService;
    @Autowired
    private AuthorizationServerTokenServices defaultTokenServices;
    @Autowired
    private SmsValidateCodeProcessor smsValidateCodeProcessor;
    @Autowired
    private PasswordEncoder passwordEncoder;
    /*
         * (non-Javadoc)
@ -66,13 +79,13 @@ public class BaseAuthenticationSuccessHandler extends SavedRequestAwareAuthentic
        assert tokens.length == 2;
        String clientId = tokens[0];
        String clientSecurity = tokens[1];
        String clientSecurity =tokens[1];
        //得到ClientDetails
        ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);
        if (clientDetails == null) {
            throw new UnapprovedClientAuthenticationException("clientId不存在 client:" + clientId);
        } else if (!StringUtils.equals(clientDetails.getClientSecret(), clientSecurity)) {
        } else if (!passwordEncoder.matches(clientSecurity,clientDetails.getClientSecret())) {
            throw new UnapprovedClientAuthenticationException("clientSecurity 不匹配 client:" + clientId);
        }
@ -84,6 +97,10 @@ public class BaseAuthenticationSuccessHandler extends SavedRequestAwareAuthentic
        OAuth2AccessToken token = defaultTokenServices.createAccessToken(oAuth2Authentication);
        if(pathMatcher.match(SecurityProperties.mobileLogin, request.getRequestURI())){
            //验证码模式登陆,说明登陆成功  删除验证码
            smsValidateCodeProcessor.reomve(new ServletWebRequest(request,response));
        }
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(objectMapper.writeValueAsString(token));

+ 19 - 4
base/common-security/src/main/java/com.yihu.base.security/properties/AccessTokenPorperties.java

@ -9,11 +9,15 @@ import org.springframework.stereotype.Component;
 */
@Component
public class AccessTokenPorperties {
    @Value("${security.oauth2.token.accessTokenValidityHours}")
    private Integer accessTokenValidityHours = 2; //accesstoken超时时间
    @Value("${security.oauth2.token.accessTokenValidityHours:2}")
    private Integer accessTokenValidityHours ; //accesstoken超时时间
    @Value("${security.oauth2.token.refreshTokenValidityHours:2}")
    private Integer refreshTokenValidityHours ;//刷新token过期时间
    @Value("${security.oauth2.token.tokenType:accessToken}")
    private String tokenType;
    @Value("${security.oauth2.token.refreshTokenValidityHours}")
    private Integer refreshTokenValidityHours = 2;//刷新token过期时间
    public Integer getAccessTokenValidityHours() {
@ -31,4 +35,15 @@ public class AccessTokenPorperties {
    public void setRefreshTokenValidityHours(Integer refreshTokenValidityHours) {
        this.refreshTokenValidityHours = refreshTokenValidityHours;
    }
    public String getTokenType() {
        return tokenType;
    }
    public void setTokenType(String tokenType) {
        this.tokenType = tokenType;
    }
}

+ 21 - 0
base/common-security/src/main/java/com.yihu.base.security/properties/QQProperties.java

@ -0,0 +1,21 @@
package com.yihu.base.security.properties;
import org.springframework.boot.autoconfigure.social.SocialProperties;
import org.springframework.stereotype.Component;
/**
 * Created by chenweida on 2017/12/9.
 */
@Component
public class QQProperties extends SocialProperties {
    private String providerId = "qq";
    public String getProviderId() {
        return providerId;
    }
    public void setProviderId(String providerId) {
        this.providerId = providerId;
    }
}

+ 2 - 2
base/common-security/src/main/java/com.yihu.base.security/properties/SmsValidateProperties.java

@ -10,10 +10,10 @@ import org.springframework.stereotype.Component;
@Component
public class SmsValidateProperties {
    @Value("${security.oauth2.sms.expireIn}")
    @Value("${security.oauth2.sms.expireIn:1}")
    private Integer expireIn = 1; //短信验证码过期时间
    @Value("${security.oauth2.sms.length}")
    @Value("${security.oauth2.sms.length:6}")
    private Integer length = 6; //短信验证码过期时间
    public Integer getExpireIn() {

+ 1 - 0
base/common-security/src/main/java/com.yihu.base.security/rbas/IRbasService.java

@ -1,5 +1,6 @@
package com.yihu.base.security.rbas;
import org.springframework.security.core.Authentication;
import javax.servlet.http.HttpServletRequest;

+ 1 - 1
base/common-security/src/main/java/com.yihu.base.security/rbas/provider/AuthorizeConfigProvider.java

@ -7,5 +7,5 @@ import org.springframework.security.config.annotation.web.configurers.Expression
 * Created by chenweida on 2017/12/5.
 */
public interface AuthorizeConfigProvider {
    void condfig(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config);
    void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry expressionInterceptUrlRegistry);
}

+ 2 - 2
base/common-security/src/main/java/com.yihu.base.security/rbas/provider/AuthorizeConfigProviderManager.java

@ -16,9 +16,9 @@ public class AuthorizeConfigProviderManager {
    @Autowired
    Set<AuthorizeConfigProvider> authorizeConfigProviders;
   public void condfig(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
   public void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
        for (AuthorizeConfigProvider authorizeConfigProvider : authorizeConfigProviders) {
            authorizeConfigProvider.condfig(config);
            authorizeConfigProvider.config(config);
        }
    }
}

+ 3 - 2
base/common-security/src/main/java/com.yihu.base.security/rbas/provider/PerssionAllAuthorizeConfigProvider.java

@ -14,10 +14,11 @@ import org.springframework.stereotype.Component;
@Order(Integer.MIN_VALUE)
public class PerssionAllAuthorizeConfigProvider implements AuthorizeConfigProvider {
    @Override
    public void condfig(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
    public void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry expressionInterceptUrlRegistry) {
        config
        expressionInterceptUrlRegistry
                .antMatchers(
                        SecurityProperties.formLogin,
                        SecurityProperties.formLoginPage,

+ 8 - 3
base/common-security/src/main/java/com.yihu.base.security/rbas/provider/RbasAuthorizeConfigProvider.java

@ -1,10 +1,13 @@
package com.yihu.base.security.rbas.provider;
import com.yihu.base.security.rbas.IRbasService;
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;
import javax.annotation.Resource;
/**
 * Created by chenweida on 2017/12/5.
 * 角色认证
@ -12,9 +15,11 @@ import org.springframework.stereotype.Component;
@Component
@Order(Integer.MAX_VALUE)
public class RbasAuthorizeConfigProvider implements AuthorizeConfigProvider {
    @Resource(name="rbasService")
    private IRbasService rbasService;
    @Override
    public void condfig(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry config) {
        // config.anyRequest().access("@rbasService.hasPerssion(request,authentication)");
        config.anyRequest().access("@rbasbean.hello()");
    public void config(ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry expressionInterceptUrlRegistry) {
        expressionInterceptUrlRegistry.anyRequest().access("@rbasService.hasPerssion(request,authentication)");
    }
}

+ 1 - 1
base/common-security/src/main/java/com.yihu.base.security/sms/SmsCodeAuthenticationFilter.java

@ -15,7 +15,7 @@ import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * @author zhailiang
 * @author chenweida
 *
 */
public class SmsCodeAuthenticationFilter extends AbstractAuthenticationProcessingFilter {

+ 1 - 1
base/common-security/src/main/java/com.yihu.base.security/sms/SmsCodeAuthenticationProvider.java

@ -11,7 +11,7 @@ import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
/**
 * @author zhailiang
 * @author chenweida
 *
 */
public class SmsCodeAuthenticationProvider implements AuthenticationProvider {

+ 32 - 28
base/common-security/src/main/java/com.yihu.base.security/sms/SmsCodeAuthenticationSecurityConfig.java

@ -1,8 +1,9 @@
/**
 * 
 *
 */
package com.yihu.base.security.sms;
import com.yihu.base.security.sms.filter.SmsvalidateCodeFilter;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.SecurityConfigurerAdapter;
@ -15,35 +16,38 @@ import org.springframework.security.web.authentication.UsernamePasswordAuthentic
import org.springframework.stereotype.Component;
/**
 * @author zhailiang
 *
 * @author chenweida
 */
@Component
public class SmsCodeAuthenticationSecurityConfig extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity> {
	
	@Autowired
	private AuthenticationSuccessHandler authenticationSuccessHandler;
	
	@Autowired
	private AuthenticationFailureHandler authenticationFailureHandler;
	
	@Autowired
	private UserDetailsService userDetailsService;
	
	@Override
	public void configure(HttpSecurity http) throws Exception {
		
		SmsCodeAuthenticationFilter smsCodeAuthenticationFilter = new SmsCodeAuthenticationFilter();
		smsCodeAuthenticationFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class));
		smsCodeAuthenticationFilter.setAuthenticationSuccessHandler(authenticationSuccessHandler);
		smsCodeAuthenticationFilter.setAuthenticationFailureHandler(authenticationFailureHandler);
		
		SmsCodeAuthenticationProvider smsCodeAuthenticationProvider = new SmsCodeAuthenticationProvider();
		smsCodeAuthenticationProvider.setUserDetailsService(userDetailsService);
		
		http.authenticationProvider(smsCodeAuthenticationProvider)
			.addFilterAfter(smsCodeAuthenticationFilter, UsernamePasswordAuthenticationFilter.class);
		
	}
    @Autowired
    private AuthenticationSuccessHandler authenticationSuccessHandler;
    @Autowired
    private AuthenticationFailureHandler authenticationFailureHandler;
    @Autowired
    private UserDetailsService userDetailsService;
    @Autowired
    private SmsvalidateCodeFilter smsvalidateCodeFilter;
    @Override
    public void configure(HttpSecurity http) throws Exception {
        SmsCodeAuthenticationFilter smsCodeAuthenticationFilter = new SmsCodeAuthenticationFilter();
        smsCodeAuthenticationFilter.setAuthenticationManager(http.getSharedObject(AuthenticationManager.class));
        smsCodeAuthenticationFilter.setAuthenticationSuccessHandler(authenticationSuccessHandler);
        smsCodeAuthenticationFilter.setAuthenticationFailureHandler(authenticationFailureHandler);
        SmsCodeAuthenticationProvider smsCodeAuthenticationProvider = new SmsCodeAuthenticationProvider();
        smsCodeAuthenticationProvider.setUserDetailsService(userDetailsService);
        http.authenticationProvider(smsCodeAuthenticationProvider)
                .addFilterAfter(smsCodeAuthenticationFilter, UsernamePasswordAuthenticationFilter.class)
                .addFilterBefore(smsvalidateCodeFilter,SmsCodeAuthenticationFilter.class);
        ;
    }
}

+ 1 - 1
base/common-security/src/main/java/com.yihu.base.security/sms/SmsCodeAuthenticationToken.java

@ -10,7 +10,7 @@ import org.springframework.security.core.SpringSecurityCoreVersion;
import java.util.Collection;
/**
 * @author zhailiang
 * @author chenweida
 *
 */
public class SmsCodeAuthenticationToken extends AbstractAuthenticationToken {

+ 20 - 4
base/common-security/src/main/java/com.yihu.base.security/sms/controller/SmsController.java

@ -1,15 +1,18 @@
package com.yihu.base.security.sms.controller;
import com.yihu.base.security.properties.SecurityProperties;
import com.yihu.base.security.sms.mobile.MobileCheck;
import com.yihu.base.security.sms.process.SmsValidateCodeProcessor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.context.request.ServletWebRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.OutputStream;
import java.io.PrintWriter;
/**
 * Created by chenweida on 2017/12/5.
@ -18,6 +21,8 @@ import javax.servlet.http.HttpServletResponse;
public class SmsController {
    @Autowired
    private SmsValidateCodeProcessor smsValidateCodeProcessor;
    @Autowired
    private MobileCheck mobileCheck;
    /**
     * 创建验证码
@ -33,8 +38,19 @@ public class SmsController {
            throws Exception {
        //获取手机号
        String mobile = request.getParameter(SecurityProperties.mobileLoginAccountKey);
        //发送短信验证码并且保存到redis中
        smsValidateCodeProcessor.create(new ServletWebRequest(request, response));
        //验证手机号是否正确
        if (!mobileCheck.checkMobile(mobile)) {
            //通过设置响应头控制浏览器以UTF-8的编码显示数据,如果不加这句话,那么浏览器显示的将是乱码
            response.setHeader("content-type", "text/html;charset=UTF-8");
            response.setStatus(HttpStatus.NOT_IMPLEMENTED.value());//参数错误
            PrintWriter pw = response.getWriter();
            pw.write(new String("{\"content\":\"电话号码格式错误\"}"));
            pw.flush();
        } else {
            //发送短信验证码并且保存到redis中
            smsValidateCodeProcessor.create(new ServletWebRequest(request, response));
        }
    }
}

+ 5 - 11
base/common-security/src/main/java/com.yihu.base.security/sms/filter/SmsvalidateCodeFilter.java

@ -24,7 +24,7 @@ import java.io.IOException;
/**
 * @author chenweida
 */
@Component("smsvalidateCodeFilter")
@Component
public class SmsvalidateCodeFilter extends OncePerRequestFilter implements InitializingBean {
    /**
@ -40,22 +40,16 @@ public class SmsvalidateCodeFilter extends OncePerRequestFilter implements Initi
    private SmsValidateCodeProcessor smsValidateCodeProcessor;
    /*
     * (non-Javadoc)
     *
     * @see
     * org.springframework.web.filter.OncePerRequestFilter#doFilterInternal(
     * javax.servlet.http.HttpServletRequest,
     * javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain)
     *   短信验证码登陆过滤器
     */
    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain)
            throws ServletException, IOException {
        if (!StringUtils.equalsIgnoreCase(request.getMethod(), "get")) {
            if (pathMatcher.match(SecurityProperties.mobileSendSms, request.getRequestURI())) {
        if (StringUtils.equalsIgnoreCase(request.getMethod(), "post")) {
            if (pathMatcher.match(SecurityProperties.mobileLogin, request.getRequestURI())) {
                logger.info("校验请求(" + request.getRequestURI() + ")中的验证码");
                try {
                    smsValidateCodeProcessor
                            .validate(new ServletWebRequest(request, response));
                    smsValidateCodeProcessor.validate(new ServletWebRequest(request, response));
                    logger.info("验证码校验通过");
                } catch (ValidateCodeException exception) {
                    authenticationFailureHandler.onAuthenticationFailure(request, response, exception);

+ 44 - 0
base/common-security/src/main/java/com.yihu.base.security/sms/mobile/DefaultMobileCheck.java

@ -0,0 +1,44 @@
package com.yihu.base.security.sms.mobile;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * Created by chenweida on 2017/12/8.
 */
public class DefaultMobileCheck implements MobileCheck {
    @Override
    public Boolean checkMobile(String mobile) {
        return checkCellphone(mobile);
    }
    /**
     * 验证手机号码
     * <p>
     * 移动号码段:139、138、137、136、135、134、150、151、152、157、158、159、182、183、187、188、147
     * 联通号码段:130、131、132、136、185、186、145
     * 电信号码段:133、153、180、189,181
     *
     * @param cellphone
     * @return
     */
    public static boolean checkCellphone(String cellphone) {
        String regex = "^((13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0,1,5-9]))\\d{8}$";
        return check(cellphone, regex);
    }
    /**
     * 使用正则表达式进行表单验证
     */
    public static boolean check(String str, String regex) {
        boolean flag = false;
        try {
            Pattern pattern = Pattern.compile(regex);
            Matcher matcher = pattern.matcher(str);
            flag = matcher.matches();
        } catch (Exception e) {
            flag = false;
        }
        return flag;
    }
}

+ 10 - 0
base/common-security/src/main/java/com.yihu.base.security/sms/mobile/MobileCheck.java

@ -0,0 +1,10 @@
package com.yihu.base.security.sms.mobile;
/**
 * Created by chenweida on 2017/12/8.
 * 验证码验证
 */
public interface MobileCheck {
    Boolean checkMobile(String mobile);
}

+ 17 - 21
base/common-security/src/main/java/com.yihu.base.security/sms/process/SmsValidateCodeProcessor.java

@ -34,16 +34,15 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
    private SmsValidateCodeGenerator smsValidateCodeGenerator;
    /*
     * (non-Javadoc)
     *
     * @see
     * com.imooc.security.core.validate.code.ValidateCodeProcessor#create(org.
     * springframework.web.context.request.ServletWebRequest)
     *  生成验证码
     */
    @Override
    public void create(ServletWebRequest request) throws Exception {
        //生成校验码
        ValidateCode validateCode = generate(request);
        //保存校验码
        save(request, validateCode);
        //发送校验码到手机号
        send(request, validateCode);
    }
@ -54,7 +53,7 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
     * @return
     */
    @SuppressWarnings("unchecked")
    private ValidateCode generate(ServletWebRequest request) {
    public ValidateCode generate(ServletWebRequest request) {
        return smsValidateCodeGenerator.generate(request);
    }
@ -64,10 +63,11 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
     * @param request
     * @param validateCode
     */
    private void save(ServletWebRequest request, ValidateCode validateCode) {
    public void save(ServletWebRequest request, ValidateCode validateCode) {
        JSONObject jo = new JSONObject();
        jo.put("code", validateCode.getCode());
        jo.put("expireTime", validateCode.getExpireTimeString());
        jo.put("code", validateCode.getCode());//保存验证码
        jo.put("expireTime", validateCode.getExpireTimeString()); //保存超时时间
        jo.put("createTime", validateCode.getCreateTimeString()); //保存超时时间
        redisTemplate.opsForValue().set(key(request), jo.toString());
    }
@ -76,7 +76,7 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
     *
     * @param request
     */
    private void reomve(ServletWebRequest request) {
    public void reomve(ServletWebRequest request) {
        redisTemplate.delete((key(request)));
    }
@ -92,6 +92,7 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
            ValidateCode validateCode = new ValidateCode();
            validateCode.setCode(jo.getString("code"));
            validateCode.setExpireTimeString(jo.getString("expireTime"));
            validateCode.setCreateTimeString(jo.getString("createTime"));
            return validateCode;
        } else {
            return null;
@ -99,7 +100,7 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
    }
    /**
     * 拼凑放在redis的key
     * 拼凑放在redis的key  格式 security:oauth2:smsLogin:{手机号}
     *
     * @param request
     * @return
@ -122,39 +123,34 @@ public class SmsValidateCodeProcessor implements ValidateCodeProcessor {
    @SuppressWarnings("unchecked")
    @Override
    public void validate(ServletWebRequest request) {
        String sessionKey = key(request);
        //获取验证码
        ValidateCode validateCode = get(request);
        if (validateCode == null) {
            throw new ValidateCodeException("验证码不存在");
        }
        String codeInRequest;
        //获取请求中的验证码
        try {
            codeInRequest = ServletRequestUtils.getStringParameter(request.getRequest(),
                    SecurityProperties.mobileSendSms);
                    SecurityProperties.mobileLoginSmsKey);
        } catch (ServletRequestBindingException e) {
            throw new ValidateCodeException("获取验证码的值失败");
        }
        if (StringUtils.isBlank(codeInRequest)) {
            throw new ValidateCodeException("验证码的值不能为空");
        }
        if (validateCode == null) {
            throw new ValidateCodeException("验证码不存在");
        }
        if (validateCode.isExpried()) {
            reomve(request);
            throw new ValidateCodeException("验证码已过期");
        }
        if (!StringUtils.equals(validateCode.getCode(), codeInRequest)) {
            throw new ValidateCodeException("验证码不匹配");
        }
        //验证成功删除验证码
        reomve(request);
    }
}

+ 2 - 4
base/common-security/src/main/java/com.yihu.base.security/sms/sender/DefaultSmsCodeSender.java

@ -3,6 +3,7 @@
 */
package com.yihu.base.security.sms.sender;
import com.yihu.base.security.sms.exception.ValidateCodeException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@ -14,11 +15,8 @@ import org.springframework.stereotype.Component;
public class DefaultSmsCodeSender implements SmsCodeSender {
    private Logger logger = LoggerFactory.getLogger(DefaultSmsCodeSender.class);
    /* (non-Javadoc)
     * @see com.imooc.security.core.validate.code.sms.SmsCodeSender#send(java.lang.String, java.lang.String)
     */
    @Override
    public void send(String mobile, String code) {
    public void send(String mobile, String code) throws ValidateCodeException {
        logger.info("向手机" + mobile + "发送短信验证码" + code);
    }

+ 3 - 1
base/common-security/src/main/java/com.yihu.base.security/sms/sender/SmsCodeSender.java

@ -3,12 +3,14 @@
 */
package com.yihu.base.security.sms.sender;
import com.yihu.base.security.sms.exception.ValidateCodeException;
/**
 * @author chenweida
 *
 */
public interface SmsCodeSender {
	
	void send(String mobile, String code);
	void send(String mobile, String code) throws ValidateCodeException;
}

+ 16 - 1
base/common-security/src/main/java/com.yihu.base.security/sms/vo/ValidateCode.java

@ -18,12 +18,15 @@ public class ValidateCode implements Serializable {
    private LocalDateTime expireTime;
    private LocalDateTime createTime=LocalDateTime.now();
    public ValidateCode() {
    }
    public ValidateCode(String code, int expireIn) {
        this.code = code;
        this.expireTime = LocalDateTime.now().plusSeconds(expireIn);
        this.expireTime = LocalDateTime.now().plusMinutes(expireIn);
    }
    public ValidateCode(String code, LocalDateTime expireTime) {
@ -59,4 +62,16 @@ public class ValidateCode implements Serializable {
    public void setExpireTimeString(String strTime) {
        expireTime = LocalDateTime.parse(strTime, DateTimeFormatter.ISO_DATE_TIME);
    }
    public LocalDateTime getCreateTime() {
        return createTime;
    }
    public String getCreateTimeString() {
        return createTime.format(DateTimeFormatter.ISO_DATE_TIME);
    }
    public void setCreateTimeString(String createTime) {
        this.createTime = LocalDateTime.parse(createTime, DateTimeFormatter.ISO_DATE_TIME);
    }
}

+ 13 - 0
base/common-security/src/main/java/com.yihu.base.security/social/qq/api/QQ.java

@ -0,0 +1,13 @@
/**
 * 
 */
package com.yihu.base.security.social.qq.api;
/**
 *
 */
public interface QQ {
	
	QQUserInfo getUserInfo();
}

+ 60 - 0
base/common-security/src/main/java/com.yihu.base.security/social/qq/api/QQImpl.java

@ -0,0 +1,60 @@
/**
 * 
 */
package com.yihu.base.security.social.qq.api;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.apache.commons.lang.StringUtils;
import org.springframework.social.oauth2.AbstractOAuth2ApiBinding;
import org.springframework.social.oauth2.TokenStrategy;
/**
 *
 */
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();
	
	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);
		
		System.out.println(result);
		
		this.openId = StringUtils.substringBetween(result, "\"openid\":\"", "\"}");
	}
	
	/* (non-Javadoc)
	 * @see com.imooc.security.core.social.qq.api.QQ#getUserInfo()
	 */
	@Override
	public QQUserInfo getUserInfo() {
		
		String url = String.format(URL_GET_USERINFO, appId, openId);
		String result = getRestTemplate().getForObject(url, String.class);
		
		System.out.println(result);
		
		QQUserInfo userInfo = null;
		try {
			userInfo = objectMapper.readValue(result, QQUserInfo.class);
			userInfo.setOpenId(openId);
			return userInfo;
		} catch (Exception e) {
			throw new RuntimeException("获取用户信息失败", e);
		}
	}
}

+ 206 - 0
base/common-security/src/main/java/com.yihu.base.security/social/qq/api/QQUserInfo.java

@ -0,0 +1,206 @@
/**
 * 
 */
package com.yihu.base.security.social.qq.api;
/**
 *
 */
public class QQUserInfo {
	
	/**
	 * 	返回码
	 */
	private String ret;
	/**
	 * 如果ret<0,会有相应的错误信息提示,返回数据全部用UTF-8编码。
	 */
	private String msg;
	/**
	 * 
	 */
	private String openId;
	/**
	 * 不知道什么东西,文档上没写,但是实际api返回里有。
	 */
	private String is_lost;
	/**
	 * 省(直辖市)
	 */
	private String province;
	/**
	 * 市(直辖市区)
	 */
	private String city;
	/**
	 * 出生年月
	 */
	private String year;
	/**
	 * 	用户在QQ空间的昵称。
	 */
	private String nickname;
	/**
	 * 	大小为30×30像素的QQ空间头像URL。
	 */
	private String figureurl;
	/**
	 * 	大小为50×50像素的QQ空间头像URL。
	 */
	private String figureurl_1;
	/**
	 * 	大小为100×100像素的QQ空间头像URL。
	 */
	private String figureurl_2;
	/**
	 * 	大小为40×40像素的QQ头像URL。
	 */
	private String figureurl_qq_1;
	/**
	 * 	大小为100×100像素的QQ头像URL。需要注意,不是所有的用户都拥有QQ的100×100的头像,但40×40像素则是一定会有。
	 */
	private String figureurl_qq_2;
	/**
	 * 	性别。 如果获取不到则默认返回”男”
	 */
	private String gender;
	/**
	 * 	标识用户是否为黄钻用户(0:不是;1:是)。
	 */
	private String is_yellow_vip;
	/**
	 * 	标识用户是否为黄钻用户(0:不是;1:是)
	 */
	private String vip;
	/**
	 * 	黄钻等级
	 */
	private String yellow_vip_level;
	/**
	 * 	黄钻等级
	 */
	private String level;
	/**
	 * 标识是否为年费黄钻用户(0:不是; 1:是)
	 */
	private String is_yellow_year_vip;
	
	
	public String getRet() {
		return ret;
	}
	public void setRet(String ret) {
		this.ret = ret;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public String getOpenId() {
		return openId;
	}
	public void setOpenId(String openId) {
		this.openId = openId;
	}
	public String getIs_lost() {
		return is_lost;
	}
	public void setIs_lost(String is_lost) {
		this.is_lost = is_lost;
	}
	public String getProvince() {
		return province;
	}
	public void setProvince(String province) {
		this.province = province;
	}
	public String getCity() {
		return city;
	}
	public void setCity(String city) {
		this.city = city;
	}
	public String getYear() {
		return year;
	}
	public void setYear(String year) {
		this.year = year;
	}
	public String getNickname() {
		return nickname;
	}
	public void setNickname(String nickname) {
		this.nickname = nickname;
	}
	public String getFigureurl() {
		return figureurl;
	}
	public void setFigureurl(String figureurl) {
		this.figureurl = figureurl;
	}
	public String getFigureurl_1() {
		return figureurl_1;
	}
	public void setFigureurl_1(String figureurl_1) {
		this.figureurl_1 = figureurl_1;
	}
	public String getFigureurl_2() {
		return figureurl_2;
	}
	public void setFigureurl_2(String figureurl_2) {
		this.figureurl_2 = figureurl_2;
	}
	public String getFigureurl_qq_1() {
		return figureurl_qq_1;
	}
	public void setFigureurl_qq_1(String figureurl_qq_1) {
		this.figureurl_qq_1 = figureurl_qq_1;
	}
	public String getFigureurl_qq_2() {
		return figureurl_qq_2;
	}
	public void setFigureurl_qq_2(String figureurl_qq_2) {
		this.figureurl_qq_2 = figureurl_qq_2;
	}
	public String getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public String getIs_yellow_vip() {
		return is_yellow_vip;
	}
	public void setIs_yellow_vip(String is_yellow_vip) {
		this.is_yellow_vip = is_yellow_vip;
	}
	public String getVip() {
		return vip;
	}
	public void setVip(String vip) {
		this.vip = vip;
	}
	public String getYellow_vip_level() {
		return yellow_vip_level;
	}
	public void setYellow_vip_level(String yellow_vip_level) {
		this.yellow_vip_level = yellow_vip_level;
	}
	public String getLevel() {
		return level;
	}
	public void setLevel(String level) {
		this.level = level;
	}
	public String getIs_yellow_year_vip() {
		return is_yellow_year_vip;
	}
	public void setIs_yellow_year_vip(String is_yellow_year_vip) {
		this.is_yellow_year_vip = is_yellow_year_vip;
	}
	
	
}

+ 36 - 0
base/common-security/src/main/java/com.yihu.base.security/social/qq/config/QQAutoConfig.java

@ -0,0 +1,36 @@
/**
 * 
 */
package com.yihu.base.security.social.qq.config;
import com.yihu.base.security.properties.QQProperties;
import com.yihu.base.security.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;
/**
 *
 */
@Configuration
@ConditionalOnProperty(prefix = "imooc.security.social.qq", name = "app-id")
public class QQAutoConfig extends SocialAutoConfigurerAdapter {
	@Autowired
	private QQProperties qqConfig;
	/*
	 * (non-Javadoc)
	 * 
	 * @see
	 * org.springframework.boot.autoconfigure.social.SocialAutoConfigurerAdapter
	 * #createConnectionFactory()
	 */
	@Override
	protected ConnectionFactory<?> createConnectionFactory() {
		return new QQConnectionFactory(qqConfig.getProviderId(), qqConfig.getAppId(), qqConfig.getAppSecret());
	}
}

+ 43 - 0
base/common-security/src/main/java/com.yihu.base.security/social/qq/connet/QQAdapter.java

@ -0,0 +1,43 @@
/**
 * 
 */
package com.yihu.base.security.social.qq.connet;
import com.yihu.base.security.social.qq.api.QQ;
import com.yihu.base.security.social.qq.api.QQUserInfo;
import org.springframework.social.connect.ApiAdapter;
import org.springframework.social.connect.ConnectionValues;
import org.springframework.social.connect.UserProfile;
/**
 *
 */
public class QQAdapter implements ApiAdapter<QQ> {
	@Override
	public boolean test(QQ api) {
		return true;
	}
	@Override
	public void setConnectionValues(QQ api, ConnectionValues values) {
		QQUserInfo userInfo = api.getUserInfo();
		
		values.setDisplayName(userInfo.getNickname());
		values.setImageUrl(userInfo.getFigureurl_qq_1());
		values.setProfileUrl(null);
		values.setProviderUserId(userInfo.getOpenId());
	}
	@Override
	public UserProfile fetchUserProfile(QQ api) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public void updateStatus(QQ api, String message) {
		//do noting
	}
}

+ 18 - 0
base/common-security/src/main/java/com.yihu.base.security/social/qq/connet/QQConnectionFactory.java

@ -0,0 +1,18 @@
/**
 * 
 */
package com.yihu.base.security.social.qq.connet;
import com.yihu.base.security.social.qq.api.QQ;
import org.springframework.social.connect.support.OAuth2ConnectionFactory;
/**
 *
 */
public class QQConnectionFactory extends OAuth2ConnectionFactory<QQ> {
	public QQConnectionFactory(String providerId, String appId, String appSecret) {
		super(providerId, new QQServiceProvider(appId, appSecret), new QQAdapter());
	}
}

+ 51 - 0
base/common-security/src/main/java/com.yihu.base.security/social/qq/connet/QQOAuth2Template.java

@ -0,0 +1,51 @@
/**
 * 
 */
package com.yihu.base.security.social.qq.connet;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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;
/**
 *
 */
public class QQOAuth2Template extends OAuth2Template {
	
	private Logger logger = LoggerFactory.getLogger(getClass());
	public QQOAuth2Template(String clientId, String clientSecret, String authorizeUrl, String accessTokenUrl) {
		super(clientId, clientSecret, authorizeUrl, accessTokenUrl);
		setUseParametersForClientAuthentication(true);
	}
	
	@Override
	protected AccessGrant postForAccessGrant(String accessTokenUrl, MultiValueMap<String, String> parameters) {
		String responseStr = getRestTemplate().postForObject(accessTokenUrl, parameters, String.class);
		
		logger.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);
	}
	
	@Override
	protected RestTemplate createRestTemplate() {
		RestTemplate restTemplate = super.createRestTemplate();
		restTemplate.getMessageConverters().add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
		return restTemplate;
	}
}

+ 32 - 0
base/common-security/src/main/java/com.yihu.base.security/social/qq/connet/QQServiceProvider.java

@ -0,0 +1,32 @@
/**
 * 
 */
package com.yihu.base.security.social.qq.connet;
import com.yihu.base.security.social.qq.api.QQ;
import com.yihu.base.security.social.qq.api.QQImpl;
import org.springframework.social.oauth2.AbstractOAuth2ServiceProvider;
/**
 *
 */
public class QQServiceProvider extends AbstractOAuth2ServiceProvider<QQ> {
	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";
	
	public QQServiceProvider(String appId, String appSecret) {
		super(new QQOAuth2Template(appId, appSecret, URL_AUTHORIZE, URL_ACCESS_TOKEN));
		this.appId = appId;
	}
	
	@Override
	public QQ getApi(String accessToken) {
		return new QQImpl(accessToken, appId);
	}
}

+ 3 - 2
base/common-security/src/main/resources/template.yml

@ -23,7 +23,7 @@ spring:
  redis:
    host: 172.19.103.88 # Redis server host.
    port: 6379 # Redis server port.
    database: 1
    database: 0
  aop:
    proxy-target-class: true
@ -35,6 +35,7 @@ security:
    token:
      accessTokenValidityHours: 2 # 2小时
      refreshTokenValidityHours: 2 # 2小时
      tokenType: accessToken
    sms:
      expireIn: 1 ##1分钟
      expireIn: 1 ##1分钟过期
      length: 6 #验证码长度

+ 2 - 2
common/common-entity/src/main/java/com/yihu/jw/base/version/BaseUserVersionDO.java

@ -22,8 +22,8 @@ public class BaseUserVersionDO  extends IdEntity implements java.io.Serializable
	// Fields
	private String employeeId;
	private String version;
	private String employeeId; //用户id
	private String version; //版本
	// Constructors

+ 237 - 0
common/common-entity/src/main/java/com/yihu/jw/iot/device/IotDeviceDO.java

@ -0,0 +1,237 @@
package com.yihu.jw.iot.device;
import com.yihu.jw.IdEntityWithOperation;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
/**
 * @author yeshijie on 2017/12/1.
 */
@Entity
@Table(name = "iot_device")
public class IotDeviceDO extends IdEntityWithOperation implements Serializable {
    @Column(name = "saas_id")
    private String saasId;
    @Column(name = "code")
    private String code;
    @Column(name = "name")
    private String name;//设备名称
    @Column(name = "device_model")
    private String deviceModel;//设备型号
    @Column(name = "device_sn")
    private String deviceSn;//设备sn码
    @Column(name = "is_composite")
    private Integer isComposite;//是否复合型(1是,0否即设备为单一功能)
    @Column(name = "is_platform")
    private Integer isPlatform;//是否平台型(1是,0否)
    @Column(name = "device_type")
    private String deviceType;//设备种类
    @Column(name = "device_source")
    private String deviceSource;//设备来源(1采购订单关联,2居民绑定,3管理员新增)
    @Column(name = "supplier_code")
    private String supplierCode;//供应商code
    @Column(name = "supplier_name")
    private String supplierName;//供应商名称
    @Column(name = "manufacturer_code")
    private String manufacturerCode;//厂商code
    @Column(name = "manufacturer_name")
    private String manufacturerName;//厂商名称
    @Column(name = "order_code")
    private String orderCode;//订单code
    @Column(name = "order_no")
    private String orderNo;//订单编号
    @Column(name = "status")
    private String status;//设备状态(正常、报废、检修)
    @Column(name = "next_quality_time")
    private Date nextQualityTime;//下次质检时间
    @Column(name = "purchase_code")
    private String purchaseCode;//采购code
    @Column(name = "sim_no")
    private String simNo;//sim卡号
    @Column(name = "del")
    private Integer del;//删除标志(1有效,0删除)
    public String getSaasId() {
        return saasId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDeviceModel() {
        return deviceModel;
    }
    public void setDeviceModel(String deviceModel) {
        this.deviceModel = deviceModel;
    }
    public String getDeviceSn() {
        return deviceSn;
    }
    public void setDeviceSn(String deviceSn) {
        this.deviceSn = deviceSn;
    }
    public Integer getIsComposite() {
        return isComposite;
    }
    public void setIsComposite(Integer isComposite) {
        this.isComposite = isComposite;
    }
    public Integer getIsPlatform() {
        return isPlatform;
    }
    public void setIsPlatform(Integer isPlatform) {
        this.isPlatform = isPlatform;
    }
    public String getDeviceType() {
        return deviceType;
    }
    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }
    public String getDeviceSource() {
        return deviceSource;
    }
    public void setDeviceSource(String deviceSource) {
        this.deviceSource = deviceSource;
    }
    public String getSupplierCode() {
        return supplierCode;
    }
    public void setSupplierCode(String supplierCode) {
        this.supplierCode = supplierCode;
    }
    public String getSupplierName() {
        return supplierName;
    }
    public void setSupplierName(String supplierName) {
        this.supplierName = supplierName;
    }
    public String getManufacturerCode() {
        return manufacturerCode;
    }
    public void setManufacturerCode(String manufacturerCode) {
        this.manufacturerCode = manufacturerCode;
    }
    public String getManufacturerName() {
        return manufacturerName;
    }
    public void setManufacturerName(String manufacturerName) {
        this.manufacturerName = manufacturerName;
    }
    public String getOrderCode() {
        return orderCode;
    }
    public void setOrderCode(String orderCode) {
        this.orderCode = orderCode;
    }
    public String getOrderNo() {
        return orderNo;
    }
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public Date getNextQualityTime() {
        return nextQualityTime;
    }
    public void setNextQualityTime(Date nextQualityTime) {
        this.nextQualityTime = nextQualityTime;
    }
    public String getPurchaseCode() {
        return purchaseCode;
    }
    public void setPurchaseCode(String purchaseCode) {
        this.purchaseCode = purchaseCode;
    }
    public String getSimNo() {
        return simNo;
    }
    public void setSimNo(String simNo) {
        this.simNo = simNo;
    }
    public Integer getDel() {
        return del;
    }
    public void setDel(Integer del) {
        this.del = del;
    }
}

+ 182 - 0
common/common-entity/src/main/java/com/yihu/jw/iot/device/IotDeviceOrderDO.java

@ -0,0 +1,182 @@
package com.yihu.jw.iot.device;
import com.yihu.jw.IdEntityWithOperation;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
/**
 * @author yeshijie on 2017/12/1.
 */
@Entity
@Table(name = "iot_device_order")
public class IotDeviceOrderDO extends IdEntityWithOperation implements Serializable{
    @Column(name = "saas_id")
    private String saasId;
    @Column(name = "order_no")
    private String orderNo;//订单编号
    @Column(name = "order_status")
    private String orderStatus;//订单状态
    @Column(name = "purchase_time")
    private Date purchaseTime;//采购时间
    @Column(name = "order_contract_name")
    private String orderContractName;//订单合同名称
    @Column(name = "order_contract_url")
    private String orderContractUrl;//订单合同链接
    @Column(name = "purchase_unit_code")
    private String purchaseUnitCode;//采购单位编码
    @Column(name = "purchase_unit_name")
    private String purchaseUnitName;//采购单位名称
    @Column(name = "purchaser_name")
    private String purchaserName;//采购负责人
    @Column(name = "purchaser_phone")
    private String purchaserPhone;//采购负责人联系方式
    @Column(name = "supplier_code")
    private String supplierCode;//供应商code
    @Column(name = "supplier_name")
    private String supplierName;//供应商名称
    @Column(name = "supplier_type")
    private String supplierType;//供应商类型
    @Column(name = "supplier_leader")
    private String supplierLeader;//供应商负责人
    @Column(name = "supplier_leader_phone")
    private String supplierLeaderPhone;//供应商负责人联系方式
    public String getSaasId() {
        return saasId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    }
    public String getOrderNo() {
        return orderNo;
    }
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
    public String getOrderStatus() {
        return orderStatus;
    }
    public void setOrderStatus(String orderStatus) {
        this.orderStatus = orderStatus;
    }
    public Date getPurchaseTime() {
        return purchaseTime;
    }
    public void setPurchaseTime(Date purchaseTime) {
        this.purchaseTime = purchaseTime;
    }
    public String getOrderContractName() {
        return orderContractName;
    }
    public void setOrderContractName(String orderContractName) {
        this.orderContractName = orderContractName;
    }
    public String getOrderContractUrl() {
        return orderContractUrl;
    }
    public void setOrderContractUrl(String orderContractUrl) {
        this.orderContractUrl = orderContractUrl;
    }
    public String getPurchaseUnitCode() {
        return purchaseUnitCode;
    }
    public void setPurchaseUnitCode(String purchaseUnitCode) {
        this.purchaseUnitCode = purchaseUnitCode;
    }
    public String getPurchaseUnitName() {
        return purchaseUnitName;
    }
    public void setPurchaseUnitName(String purchaseUnitName) {
        this.purchaseUnitName = purchaseUnitName;
    }
    public String getPurchaserName() {
        return purchaserName;
    }
    public void setPurchaserName(String purchaserName) {
        this.purchaserName = purchaserName;
    }
    public String getPurchaserPhone() {
        return purchaserPhone;
    }
    public void setPurchaserPhone(String purchaserPhone) {
        this.purchaserPhone = purchaserPhone;
    }
    public String getSupplierCode() {
        return supplierCode;
    }
    public void setSupplierCode(String supplierCode) {
        this.supplierCode = supplierCode;
    }
    public String getSupplierName() {
        return supplierName;
    }
    public void setSupplierName(String supplierName) {
        this.supplierName = supplierName;
    }
    public String getSupplierType() {
        return supplierType;
    }
    public void setSupplierType(String supplierType) {
        this.supplierType = supplierType;
    }
    public String getSupplierLeader() {
        return supplierLeader;
    }
    public void setSupplierLeader(String supplierLeader) {
        this.supplierLeader = supplierLeader;
    }
    public String getSupplierLeaderPhone() {
        return supplierLeaderPhone;
    }
    public void setSupplierLeaderPhone(String supplierLeaderPhone) {
        this.supplierLeaderPhone = supplierLeaderPhone;
    }
}

+ 181 - 0
common/common-entity/src/main/java/com/yihu/jw/iot/device/IotDevicePurchaseDO.java

@ -0,0 +1,181 @@
package com.yihu.jw.iot.device;
import com.yihu.jw.IdEntityWithOperation;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
/**
 * @author yeshijie on 2017/12/1.
 */
@Entity
@Table(name = "iot_device_purchase")
public class IotDevicePurchaseDO extends IdEntityWithOperation implements Serializable{
    @Column(name = "saas_id")
    private String saasId;
    @Column(name = "order_code")
    private String orderCode;//订单code
    @Column(name = "order_no")
    private String orderNo;//订单编号
    @Column(name = "supplier_code")
    private String supplierCode;//供应商code
    @Column(name = "supplier_name")
    private String supplierName;//供应商名称
    @Column(name = "device_name")
    private String deviceName;//采购设备名称
    @Column(name = "device_model")
    private String deviceModel;//采购设备型号
    @Column(name = "device_type")
    private String deviceType;//设备种类
    @Column(name = "manufacturer_code")
    private String manufacturerCode;//厂商code
    @Column(name = "manufacturer_name")
    private String manufacturerName;//厂商名称
    @Column(name = "purchase_num")
    private Long purchaseNum;//采购数量
    @Column(name = "quality_cycle")
    private String qualityCycle;//质检周期
    @Column(name = "associated_num")
    private Long associatedNum;//已关联设备数量
    @Column(name = "unassociated_num")
    private Long unassociatedNum;//未关联设备数量
    @Column(name = "del")
    private Integer del;//删除标志
    public String getSaasId() {
        return saasId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    }
    public String getOrderCode() {
        return orderCode;
    }
    public void setOrderCode(String orderCode) {
        this.orderCode = orderCode;
    }
    public String getOrderNo() {
        return orderNo;
    }
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
    public String getSupplierCode() {
        return supplierCode;
    }
    public void setSupplierCode(String supplierCode) {
        this.supplierCode = supplierCode;
    }
    public String getSupplierName() {
        return supplierName;
    }
    public void setSupplierName(String supplierName) {
        this.supplierName = supplierName;
    }
    public String getDeviceName() {
        return deviceName;
    }
    public void setDeviceName(String deviceName) {
        this.deviceName = deviceName;
    }
    public String getDeviceModel() {
        return deviceModel;
    }
    public void setDeviceModel(String deviceModel) {
        this.deviceModel = deviceModel;
    }
    public String getDeviceType() {
        return deviceType;
    }
    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }
    public String getManufacturerCode() {
        return manufacturerCode;
    }
    public void setManufacturerCode(String manufacturerCode) {
        this.manufacturerCode = manufacturerCode;
    }
    public String getManufacturerName() {
        return manufacturerName;
    }
    public void setManufacturerName(String manufacturerName) {
        this.manufacturerName = manufacturerName;
    }
    public Long getPurchaseNum() {
        return purchaseNum;
    }
    public void setPurchaseNum(Long purchaseNum) {
        this.purchaseNum = purchaseNum;
    }
    public String getQualityCycle() {
        return qualityCycle;
    }
    public void setQualityCycle(String qualityCycle) {
        this.qualityCycle = qualityCycle;
    }
    public Long getAssociatedNum() {
        return associatedNum;
    }
    public void setAssociatedNum(Long associatedNum) {
        this.associatedNum = associatedNum;
    }
    public Long getUnassociatedNum() {
        return unassociatedNum;
    }
    public void setUnassociatedNum(Long unassociatedNum) {
        this.unassociatedNum = unassociatedNum;
    }
    public Integer getDel() {
        return del;
    }
    public void setDel(Integer del) {
        this.del = del;
    }
}

+ 182 - 0
common/common-entity/src/main/java/com/yihu/jw/iot/device/IotDeviceQualityInspectionPlanDO.java

@ -0,0 +1,182 @@
package com.yihu.jw.iot.device;
import com.yihu.jw.IdEntityWithOperation;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
import java.util.Date;
/**
 * @author yeshijie on 2017/12/1.
 */
@Entity
@Table(name = "iot_device_quality_inspection_plan")
public class IotDeviceQualityInspectionPlanDO extends IdEntityWithOperation implements Serializable{
    @Column(name = "saas_id")
    private String saasId;
    @Column(name = "purchase_code")
    private String purchaseCode;//采购code
    @Column(name = "order_code")
    private String orderCode;//订单code
    @Column(name = "order_no")
    private String orderNo;//订单编号
    @Column(name = "device_code")
    private String deviceCode;//设备code
    @Column(name = "device_name")
    private String deviceName;//设备名称
    @Column(name = "device_model")
    private String deviceModel;//设备型号
    @Column(name = "device_type")
    private String deviceType;//设备种类
    @Column(name = "purchase_num")
    private Long purchaseNum;//采购数量
    @Column(name = "quality_leader")
    private String qualityLeader;//质检负责人
    @Column(name = "quality_leader_phone")
    private String qualityLeaderPhone;//质检负责人联系方式
    @Column(name = "plan_time")
    private Date planTime;//计划质检时间
    @Column(name = "actual_time")
    private Date actualTime;//实际质检时间
    @Column(name = "status")
    private String status;//质检状态(1未检,2已检)
    @Column(name = "del")
    private Integer del;//删除标志
    public String getSaasId() {
        return saasId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    }
    public String getPurchaseCode() {
        return purchaseCode;
    }
    public void setPurchaseCode(String purchaseCode) {
        this.purchaseCode = purchaseCode;
    }
    public String getOrderCode() {
        return orderCode;
    }
    public void setOrderCode(String orderCode) {
        this.orderCode = orderCode;
    }
    public String getOrderNo() {
        return orderNo;
    }
    public void setOrderNo(String orderNo) {
        this.orderNo = orderNo;
    }
    public String getDeviceCode() {
        return deviceCode;
    }
    public void setDeviceCode(String deviceCode) {
        this.deviceCode = deviceCode;
    }
    public String getDeviceName() {
        return deviceName;
    }
    public void setDeviceName(String deviceName) {
        this.deviceName = deviceName;
    }
    public String getDeviceModel() {
        return deviceModel;
    }
    public void setDeviceModel(String deviceModel) {
        this.deviceModel = deviceModel;
    }
    public String getDeviceType() {
        return deviceType;
    }
    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }
    public Long getPurchaseNum() {
        return purchaseNum;
    }
    public void setPurchaseNum(Long purchaseNum) {
        this.purchaseNum = purchaseNum;
    }
    public String getQualityLeader() {
        return qualityLeader;
    }
    public void setQualityLeader(String qualityLeader) {
        this.qualityLeader = qualityLeader;
    }
    public String getQualityLeaderPhone() {
        return qualityLeaderPhone;
    }
    public void setQualityLeaderPhone(String qualityLeaderPhone) {
        this.qualityLeaderPhone = qualityLeaderPhone;
    }
    public Date getPlanTime() {
        return planTime;
    }
    public void setPlanTime(Date planTime) {
        this.planTime = planTime;
    }
    public Date getActualTime() {
        return actualTime;
    }
    public void setActualTime(Date actualTime) {
        this.actualTime = actualTime;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public Integer getDel() {
        return del;
    }
    public void setDel(Integer del) {
        this.del = del;
    }
}

+ 87 - 0
common/common-entity/src/main/java/com/yihu/jw/iot/dict/IotDeviceDictDO.java

@ -0,0 +1,87 @@
package com.yihu.jw.iot.dict;
import com.yihu.jw.IdEntityWithOperation;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
/**
 * @author yeshijie on 2017/12/1.
 */
@Entity
@Table(name = "iot_device_dict")
public class IotDeviceDictDO extends IdEntityWithOperation implements Serializable {
    @Column(name = "saas_id")
    private String saasId;
    @Column(name = "device_type")
    private String deviceType;//设备种类
    @Column(name = "name")
    private String name;//设备种类名称
    @Column(name = "data_type")
    private String dataType;//测量数据种类
    @Column(name = "data_type_name")
    private String dataTypeName;//测量数据种类名称
    @Column(name = "del")
    private Integer del;//删除标志
    public IotDeviceDictDO() {
    }
    public String getSaasId() {
        return saasId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    }
    public String getDeviceType() {
        return deviceType;
    }
    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDataType() {
        return dataType;
    }
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }
    public String getDataTypeName() {
        return dataTypeName;
    }
    public void setDataTypeName(String dataTypeName) {
        this.dataTypeName = dataTypeName;
    }
    public Integer getDel() {
        return del;
    }
    public void setDel(Integer del) {
        this.del = del;
    }
}

+ 194 - 0
common/common-entity/src/main/java/com/yihu/jw/iot/supplier/IotDeviceSupplierDO.java

@ -0,0 +1,194 @@
package com.yihu.jw.iot.supplier;
import com.yihu.jw.IdEntityWithOperation;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
/**
 * @author yeshijie on 2017/12/1.
 */
@Entity
@Table(name = "iot_device_supplier")
public class IotDeviceSupplierDO extends IdEntityWithOperation implements Serializable{
    private static final long serialVersionUID = 41357656279822210L;
    @Column(name = "saas_id")
    private String saasId;
    @Column(name = "supplier_name")
    private String supplierName;//供应商名称
    @Column(name = "organization_code")
    private String organizationCode;//组织机构代码/统一社会信用代码
    @Column(name = "juridical_person_name")
    private String juridicalPersonName;//法定代表人/负责人姓名
    @Column(name = "organization_address")
    private String organizationAddress;//机构地址
    @Column(name = "office_phone")
    private String officePhone;//办公电话
    @Column(name = "contacts_name")
    private String contactsName;//联系人姓名
    @Column(name = "contacts_mobile")
    private String contactsMobile;//联系人手机号码
    @Column(name = "contacts_phone")
    private String contactsPhone;//联系人座机
    @Column(name = "contacts_idcard")
    private String contactsIdcard;//联系人身份证号
    @Column(name = "contacts_email")
    private String contactsEmail;//联系人邮件
    @Column(name = "type")
    private String type;//类型 1、供应商,2、厂商
    @Column(name = "organization_code_img")
    private String organizationCodeImg;//组织机构代码证照片
    @Column(name = "contacts_idcard_img")
    private String contactsIdcardImg;//联系人身份证照片
    @Column(name = "data_transmission_mode")
    private String dataTransmissionMode;//数据传输方式
    @Column(name = "del")
    private Integer del;//删除标志(1有效,0删除)
    public String getSaasId() {
        return saasId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    }
    public String getSupplierName() {
        return supplierName;
    }
    public void setSupplierName(String supplierName) {
        this.supplierName = supplierName;
    }
    public String getOrganizationCode() {
        return organizationCode;
    }
    public void setOrganizationCode(String organizationCode) {
        this.organizationCode = organizationCode;
    }
    public String getJuridicalPersonName() {
        return juridicalPersonName;
    }
    public void setJuridicalPersonName(String juridicalPersonName) {
        this.juridicalPersonName = juridicalPersonName;
    }
    public String getOrganizationAddress() {
        return organizationAddress;
    }
    public void setOrganizationAddress(String organizationAddress) {
        this.organizationAddress = organizationAddress;
    }
    public String getOfficePhone() {
        return officePhone;
    }
    public void setOfficePhone(String officePhone) {
        this.officePhone = officePhone;
    }
    public String getContactsName() {
        return contactsName;
    }
    public void setContactsName(String contactsName) {
        this.contactsName = contactsName;
    }
    public String getContactsMobile() {
        return contactsMobile;
    }
    public void setContactsMobile(String contactsMobile) {
        this.contactsMobile = contactsMobile;
    }
    public String getContactsPhone() {
        return contactsPhone;
    }
    public void setContactsPhone(String contactsPhone) {
        this.contactsPhone = contactsPhone;
    }
    public String getContactsIdcard() {
        return contactsIdcard;
    }
    public void setContactsIdcard(String contactsIdcard) {
        this.contactsIdcard = contactsIdcard;
    }
    public String getContactsEmail() {
        return contactsEmail;
    }
    public void setContactsEmail(String contactsEmail) {
        this.contactsEmail = contactsEmail;
    }
    public String getType() {
        return type;
    }
    public void setType(String type) {
        this.type = type;
    }
    public String getOrganizationCodeImg() {
        return organizationCodeImg;
    }
    public void setOrganizationCodeImg(String organizationCodeImg) {
        this.organizationCodeImg = organizationCodeImg;
    }
    public String getContactsIdcardImg() {
        return contactsIdcardImg;
    }
    public void setContactsIdcardImg(String contactsIdcardImg) {
        this.contactsIdcardImg = contactsIdcardImg;
    }
    public String getDataTransmissionMode() {
        return dataTransmissionMode;
    }
    public void setDataTransmissionMode(String dataTransmissionMode) {
        this.dataTransmissionMode = dataTransmissionMode;
    }
    public Integer getDel() {
        return del;
    }
    public void setDel(Integer del) {
        this.del = del;
    }
}

+ 137 - 0
common/common-entity/src/main/java/com/yihu/jw/iot/supplier/IotSupplyDeviceDO.java

@ -0,0 +1,137 @@
package com.yihu.jw.iot.supplier;
import com.yihu.jw.IdEntityWithOperation;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
/**
 * @author yeshijie on 2017/12/1.
 */
@Entity
@Table(name = "iot_supply_device")
public class IotSupplyDeviceDO extends IdEntityWithOperation implements Serializable {
    @Column(name = "saas_id")
    private String saasId;
    @Column(name = "name")
    private String name;//'设备名称
    @Column(name = "device_model")
    private String deviceModel;//型号
    @Column(name = "devie_type")
    private String deviceType;//设备种类
    @Column(name = "is_composite")
    private Integer isComposite;//是否复合型
    @Column(name = "is_platform")
    private Integer isPlatform;//是否平台型
    @Column(name = "device_sn")
    private String deviceSn;//设备编码
    @Column(name = "supplier_type")
    private String supplierType;//供应商类型
    @Column(name = "supplier_code")
    private String supplierCode;//供应商code
    @Column(name = "supplier_name")
    private String supplierName;//供应商名称
    @Column(name = "del")
    private Integer del;//删除标志(1有效,0删除)
    public String getSaasId() {
        return saasId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDeviceModel() {
        return deviceModel;
    }
    public void setDeviceModel(String deviceModel) {
        this.deviceModel = deviceModel;
    }
    public String getDeviceType() {
        return deviceType;
    }
    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }
    public Integer getIsComposite() {
        return isComposite;
    }
    public void setIsComposite(Integer isComposite) {
        this.isComposite = isComposite;
    }
    public Integer getIsPlatform() {
        return isPlatform;
    }
    public void setIsPlatform(Integer isPlatform) {
        this.isPlatform = isPlatform;
    }
    public String getDeviceSn() {
        return deviceSn;
    }
    public void setDeviceSn(String deviceSn) {
        this.deviceSn = deviceSn;
    }
    public String getSupplierType() {
        return supplierType;
    }
    public void setSupplierType(String supplierType) {
        this.supplierType = supplierType;
    }
    public String getSupplierCode() {
        return supplierCode;
    }
    public void setSupplierCode(String supplierCode) {
        this.supplierCode = supplierCode;
    }
    public String getSupplierName() {
        return supplierName;
    }
    public void setSupplierName(String supplierName) {
        this.supplierName = supplierName;
    }
    public Integer getDel() {
        return del;
    }
    public void setDel(Integer del) {
        this.del = del;
    }
}

+ 93 - 0
common/common-entity/src/main/java/com/yihu/jw/iot/supplier/IotSupplyDeviceDataTypeDO.java

@ -0,0 +1,93 @@
package com.yihu.jw.iot.supplier;
import com.yihu.jw.IdEntityWithOperation;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
/**
 * @author yeshijie on 2017/12/1.
 */
@Entity
@Table(name = "iot_supply_device_data_type")
public class IotSupplyDeviceDataTypeDO extends IdEntityWithOperation implements Serializable {
    @Column(name = "saas_id")
    private String saasId;
    @Column(name = "supplier_device_code")
    private String supplierDeviceCode;//供应商设备code',
    @Column(name = "device_model")
    private String deviceModel;//设备型号',
    @Column(name = "device_type")
    private String deviceType;//设备种类',
    @Column(name = "data_type")
    private String dataType;//测量数据种类',
    @Column(name = "data_type_name")
    private String dataTypeName;//测量数据种类名称',
    @Column(name = "del")
    private Integer del;//
    public String getSaasId() {
        return saasId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    }
    public String getSupplierDeviceCode() {
        return supplierDeviceCode;
    }
    public void setSupplierDeviceCode(String supplierDeviceCode) {
        this.supplierDeviceCode = supplierDeviceCode;
    }
    public String getDeviceModel() {
        return deviceModel;
    }
    public void setDeviceModel(String deviceModel) {
        this.deviceModel = deviceModel;
    }
    public String getDeviceType() {
        return deviceType;
    }
    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }
    public String getDataType() {
        return dataType;
    }
    public void setDataType(String dataType) {
        this.dataType = dataType;
    }
    public String getDataTypeName() {
        return dataTypeName;
    }
    public void setDataTypeName(String dataTypeName) {
        this.dataTypeName = dataTypeName;
    }
    public Integer getDel() {
        return del;
    }
    public void setDel(Integer del) {
        this.del = del;
    }
}

+ 34 - 0
common/common-request-mapping/src/main/java/com/yihu/jw/rm/iot/IotRequestMapping.java

@ -0,0 +1,34 @@
package com.yihu.jw.rm.iot;
/**
 * @author yeshijie on 2017/12/5.
 */
public class IotRequestMapping {
    public static final String api_iot_common = "svr-iot";
    //协议模块常量
    public static class DeviceSupplier {
        public static final String api_create = "deviceSupplier";
        public static final String api_delete = "deviceSupplier";
        public static final String api_getById = "getDeviceSupplierById";
        public static final String api_update = "deviceSupplier";
        public static final String api_queryPage = "queryDeviceSupplierPage";
        public static final String api_getList = "getDeviceSupplierList";
        public static final String message_success_update = "deviceSupplier update success";
        public static final String message_success_delete = "deviceSupplier delete success";
        public static final String message_success_find = "deviceSupplier find success";
        public static final String message_success_create = "deviceSupplier create success";
        public static final String message_success_find_functions = "deviceSupplier find success";
        public static final String message_fail_name_is_null = "name is null";
        public static final String message_fail_price_is_null = "price is null";
        public static final String message_fail_iotDeviceSupplier_is_no_exist = "iotDeviceSupplier is no exist";
        public static final String message_fail_id_no_exist = "id no exist";
        public static final String message_fail_status_is_null = "status is null";
        public static final String message_fail_id_is_null = "id is null";
        public static final String message_fail_id_exist = "id exist";
        public static final String message_fail_saasId_is_null = "saasId is null";
    }
}

+ 1 - 0
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/CommonContants.java

@ -7,6 +7,7 @@ public class CommonContants {
    //微服务的id start
    public static final String svr_base = "svr-base";
    public static final String svr_iot = "svr-iot";
    public static final String svr_wlyy = "svr-wlyy";
    public static final String svr_gateway = "svr-gateway";

+ 1 - 0
common/common-util/pom.xml

@ -9,6 +9,7 @@
        <version>1.0.0</version>
        <relativePath>../../common-lib-parent-pom/pom.xml</relativePath>
    </parent>
    <groupId>com.yihu.jw</groupId>
    <artifactId>common-util</artifactId>
    <version>1.0.0</version>

+ 5 - 0
server/svr-discovery/src/main/resources/application.yml

@ -14,6 +14,11 @@ eureka:
    registry-fetch-interval-seconds: 30 #定期的更新客户端的服务清单 30秒更新一次
    fetch-registry: false #如果是做高可用的发现服务那就要改成true
  server:
    enable-self-preservation: true  ##是否开启自我保护模式,默认为true。
    eviction-interval-timer-in-ms: 60000 ##eureka server清理无效节点的时间间隔,默认60000毫秒,即60秒
#eurika界面的账号密码
security:

+ 1 - 0
server/svr-logServer/src/main/resources/application.yml

@ -2,6 +2,7 @@ spring:
  application:
    name: svr-logServer
---
spring:
  profiles: jwdev

+ 26 - 3
svr-lib-parent-pom/pom.xml

@ -52,9 +52,12 @@
        <version.myCommon>1.0.0</version.myCommon>
        <version.spring>4.3.10.RELEASE</version.spring>
        <version.spring.security>4.2.3.RELEASE</version.spring.security>
        <version.spring-data-jpa>1.11.3.RELEASE</version.spring-data-jpa>
        <version.spring-data-common>1.13.3.RELEASE</version.spring-data-common>
        <version.spring-data-hadoop>2.3.0.RELEASE</version.spring-data-hadoop>
        <version.spring-data.solr>2.1.8.RELEASE</version.spring-data.solr>
        <version.spring.social>1.1.4.RELEASE</version.spring.social>
        <version.zipkin>1.24.0</version.zipkin>
        <version.hibernate>5.0.12.Final</version.hibernate>
        <version.hibernate-jpa>1.0.0.Final</version.hibernate-jpa>
@ -82,10 +85,8 @@
        <version.elasticsearch>2.4.4</version.elasticsearch>
        <version.jest>2.4.0</version.jest>
        <version.hbase-client>1.1.1</version.hbase-client>
        <version.spring-data-hadoop>2.3.0.RELEASE</version.spring-data-hadoop>
        <version.joda-time>2.8.2</version.joda-time>
        <version.solr>5.5.1</version.solr>
        <version.spring-data.solr>2.1.8.RELEASE</version.spring-data.solr>
        <version.fastdfs>1.25</version.fastdfs>
    </properties>
    <!--dependencyManagement作用子配置不写版本默认继承父配置-->
@ -425,6 +426,28 @@
            </dependency>
            <!--spring end-->
            <!--spring social start-->
            <dependency>
                <groupId>org.springframework.social</groupId>
                <artifactId>spring-social-config</artifactId>
                <version>${version.spring.social}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.social</groupId>
                <artifactId>spring-social-core</artifactId>
                <version>${version.spring.social}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.social</groupId>
                <artifactId>spring-social-security</artifactId>
                <version>${version.spring.social}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.social</groupId>
                <artifactId>spring-social-web</artifactId>
                <version>${version.spring.social}</version>
            </dependency>
            <!--spring  social end-->
            <!--数据库驱动 start-->
            <dependency>
                <groupId>mysql</groupId>

+ 1 - 0
svr/readme.MD

@ -3,4 +3,5 @@ svr 相关的db设计
    svr-base 基础扩展服务,部分基础服务用ehr的
    svr-quota 统计相关服务
    svr-wlyy i健康公共业务后台
    svr-iot 医疗物联网服务
    svr-manage 基卫后台管理系统   (独立的系统不注册到发现服务)

+ 13 - 13
svr/svr-base/src/main/java/com/yihu/jw/business/sms/controller/SmsController.java

@ -30,15 +30,15 @@ public class SmsController extends EnvelopRestController {
    private SmsService smsService;
    @PostMapping(value = BaseSmsRequestMapping.Sms.api_create, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
            @ApiOperation(value = "创建短信", notes = "创建单个短信")
            public Envelop createSms(
                    @ApiParam(name = "json_data", value = "", defaultValue = "")
                    @RequestBody String jsonData) {
                try {
                    BaseSmsDO sms = toEntity(jsonData, BaseSmsDO.class);
                    return Envelop.getSuccess(BaseSmsRequestMapping.Sms.message_success_create, smsService.createSms(sms));
                } catch (ApiException e) {
                    return Envelop.getError(e.getMessage(), e.getErrorCode());
    @ApiOperation(value = "创建短信", notes = "创建单个短信")
    public Envelop createSms(
            @ApiParam(name = "json_data", value = "", defaultValue = "")
            @RequestBody String jsonData) {
        try {
            BaseSmsDO sms = toEntity(jsonData, BaseSmsDO.class);
            return Envelop.getSuccess(BaseSmsRequestMapping.Sms.message_success_create, smsService.createSms(sms));
        } catch (ApiException e) {
            return Envelop.getError(e.getMessage(), e.getErrorCode());
        }
    }
@ -75,13 +75,13 @@ public class SmsController extends EnvelopRestController {
        //得到list数据
        List<BaseSmsDO> list = smsService.search(fields, filters, sorts, page, size);
        //获取总数
        long count=smsService.getCount(filters);
        long count = smsService.getCount(filters);
        //封装头信息
        pagedResponse(request, response, count, page, size);
        //封装返回格式
        List<SmsVO> mSmss = convertToModels(list, new ArrayList<>(list.size()), SmsVO.class, fields);
        return Envelop.getSuccessListWithPage(BaseSmsRequestMapping.Sms.message_success_find_smss,mSmss, page, size,count);
        return Envelop.getSuccessListWithPage(BaseSmsRequestMapping.Sms.message_success_find_smss, mSmss, page, size, count);
    }
@ -95,9 +95,9 @@ public class SmsController extends EnvelopRestController {
            @ApiParam(name = "sorts", value = "排序,规则参见说明文档", defaultValue = "+name,+createTime")
            @RequestParam(value = "sorts", required = false) String sorts) throws Exception {
        //得到list数据
        List<BaseSmsDO> list = smsService.search(fields,filters,sorts);
        List<BaseSmsDO> list = smsService.search(fields, filters, sorts);
        //封装返回格式
        List<SmsVO> mSmss = convertToModels(list, new ArrayList<>(list.size()), SmsVO.class, fields);
        return Envelop.getSuccessList(BaseSmsRequestMapping.Sms.message_success_find_smss,mSmss);
        return Envelop.getSuccessList(BaseSmsRequestMapping.Sms.message_success_find_smss, mSmss);
    }
}

+ 1 - 0
svr/svr-base/src/main/java/com/yihu/jw/business/sms/service/SmsService.java

@ -18,6 +18,7 @@ public class SmsService  extends BaseJpaService<BaseSmsDO, SmsDao> {
    @Transactional
    public BaseSmsDO createSms(BaseSmsDO sms) throws ApiException {
        return smsDao.save(sms);
    }

+ 2 - 0
svr/svr-base/src/main/java/com/yihu/jw/business/user/contorller/EmployController.java

@ -78,4 +78,6 @@ public class EmployController extends EnvelopRestController {
            return Envelop.getError(e.getMessage(), e.getErrorCode());
        }
    }
}

+ 0 - 88
svr/svr-demo/readme.MD

@ -1,88 +0,0 @@
**授权码模式:(一直开放API用)**
获取code
http://localhost:8060/oauth/authorize?response_type=code&client_id=cwd&redirect_uri=http://example.com&scope=all
获取token post请求
http://localhost:8060/oauth/token
header:  Basic {appid}:{appsecuri} 加密  例如 Basic Y3dkOmN3ZA==
  
{
     "grant_type":"authorization_code",  
     "client_id":"cwd",
     "code":"第一步请求获取的code",
     "redirect_uri":"http://example.com",
     "scope":"all"
}
返回值
{
    "access_token":"bd677e24-2de5-4862-a5e1-8f90a074db42",
    "token_type":"bearer",
    "refresh_token":"1427b997-ef94-4061-8940-c71da6549acd",
    "expires_in":43199,
    "scope":"all"
}
**密码模式(一般自己公司系统用)**
获取token post请求
http://localhost:8060/oauth/token
header:  Basic {appid}:{appsecuri} 加密  例如 Basic Y3dkOmN3ZA==
  
{
     "grant_type":"password",  
     "username":"jojo",
     "password":"123456",
     "scope":"all"
}
返回值
{
    "access_token":"630e2ccc-a5ce-4486-a855-ba755eb3d0d2",
    "token_type":"bearer",
    "refresh_token":"bbb36b54-61b2-4d86-aed3-91c5135174c3",
    "expires_in":43199,
    "scope":"all"
}
**刷新token **
获取token post请求
http://localhost:8060/oauth/token
header:  Basic {appid}:{appsecuri} 加密  例如 Basic Y3dkOmN3ZA==
  
{
     "grant_type":"refresh_token",
     "refresh_token":"all"
}
返回值
{
    "access_token":"630e2ccc-a5ce-4486-a855-ba755eb3d0d2",
    "token_type":"bearer",
    "refresh_token":"bbb36b54-61b2-4d86-aed3-91c5135174c3",
    "expires_in":43199,
    "scope":"all"
}
**自定义账号密码登陆**
POST
http://localhost:8060/authentication/form
header
Authorization  Basic Y3dkOmN3ZA==
body
{
    "username":"test",
    "password":"123456"
}
**自定义手机号短信验证码登陆**
**访问方式**
http://localhost:8060/user
header 
{
"Authorization":"bearer 5fe6b2c3-f69c-4ddc-a36a-367cdf9479a3"      即 bearer accesstoken
}

+ 2 - 1
svr/svr-demo/src/main/java/com/yihu/DemoApplication.java

@ -3,6 +3,7 @@ package com.yihu;
import org.apache.catalina.core.ApplicationContext;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
@ -10,7 +11,7 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy;
 * Created by chenweida on 2017/11/3.
 */
@SpringBootApplication
@SpringBootApplication(exclude = OAuth2AutoConfiguration.class)
@ComponentScan(basePackages = {"com"})
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
public class DemoApplication {

+ 111 - 75
svr/svr-demo/src/main/java/com/yihu/jw/model/SaasDO.java

@ -106,81 +106,6 @@ public class SaasDO implements Serializable, ClientDetails {
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    @Override
    public String getClientId() {
        return appId;
    }
    @Override
    public String getClientSecret() {
        return appSecret;
    }
    @Override
    public Set<String> getResourceIds() {
        return null;
    }
    @Override
    public boolean isSecretRequired() {
        return false;
    }
    @Override
    public boolean isScoped() {
        return false;
    }
    @Override
    public Set<String> getScope() {
        return null;
    }
    @Override
    public Set<String> getAuthorizedGrantTypes() {
        Set<String> strings = new HashSet<>();
        strings.add("password");
        strings.add("custom_password");
        strings.add("authorization_code");
        strings.add("refresh_token");
        return strings;
    }
    @Override
    public Set<String> getRegisteredRedirectUri() {
        Set<String> strings = new HashSet<>();
        strings.add(url);
        return strings;
    }
    @Override
    public Collection<GrantedAuthority> getAuthorities() {
        return null;
    }
    @Override
    public Integer getAccessTokenValiditySeconds() {
        return null;
    }
    @Override
    public Integer getRefreshTokenValiditySeconds() {
        return null;
    }
    @Override
    public boolean isAutoApprove(String scope) {
        return false;
    }
    @Override
    public Map<String, Object> getAdditionalInformation() {
        return null;
    }
    public String getCreateUser() {
        return createUser;
    }
@ -252,4 +177,115 @@ public class SaasDO implements Serializable, ClientDetails {
    public void setId(String id) {
        this.id = id;
    }
    //================================oauth2========================================
    @Override
    public String getClientId() {
        return appId;
    }
    @Override
    public String getClientSecret() {
        return appSecret;
    }
    @Override
    public Set<String> getResourceIds() {
        return new HashSet<>();
    }
    @Override
    public boolean isSecretRequired() {
        return false;
    }
    /**
     * 是否在授权范围
     * @return
     */
    @Override
    public boolean isScoped() {
        return false;
    }
    /**
     * 允许的授权范围
     *
     * @return
     */
    @Override
    public Set<String> getScope() {
        Set<String> set = new HashSet<>();
        set.add("app");
        return set;
    }
    /**
     * 该client允许的授权类型
     *
     * @return
     */
    @Override
    public Set<String> getAuthorizedGrantTypes() {
        Set<String> strings = new HashSet<>();
        strings.add("password");
        strings.add("custom_password");
        strings.add("authorization_code");
        strings.add("implicit");
        strings.add("refresh_token");
        return strings;
    }
    /**
     * 授权码模式支持的跳转请求
     * @return
     */
    @Override
    public Set<String> getRegisteredRedirectUri() {
        Set<String> strings = new HashSet<>();
        strings.add("http://example.com");
        strings.add(url);
        return strings;
    }
    @Override
    public Collection<GrantedAuthority> getAuthorities() {
        return new ArrayList<>();
    }
    /**
     * 过期时间
     * @return
     */
    @Override
    public Integer getAccessTokenValiditySeconds() {
        return 7200;
    }
    /**
     * 过期时间
     * @return
     */
    @Override
    public Integer getRefreshTokenValiditySeconds() {
        return 7200;
    }
    /**
     * 是否自动授权
     * @param scope
     * @return
     */
    @Override
    public boolean isAutoApprove(String scope) {
        return true;
    }
    @Override
    public Map<String, Object> getAdditionalInformation() {
        return new HashMap<>();
    }
}

+ 16 - 16
svr/svr-demo/src/main/java/com/yihu/jw/service/ClientService.java

@ -1,43 +1,43 @@
package com.yihu.jw.service;
import com.yihu.base.security.properties.AccessTokenPorperties;
import com.yihu.base.security.rbas.ClientServiceProvider;
import com.yihu.jw.dao.SaasDao;
import com.yihu.jw.model.SaasDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.annotation.Order;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.context.annotation.Primary;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.crypto.password.StandardPasswordEncoder;
import org.springframework.security.oauth2.provider.ClientDetails;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.ClientRegistrationException;
import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import javax.sql.DataSource;
import java.util.HashSet;
import java.util.Set;
/**
 * Created by chenweida on 2017/12/1.
 */
@Component("baseClientDetailsService")
@Primary
public class ClientService implements ClientServiceProvider {
    @Autowired
    private PasswordEncoder passwordEncoder;
    /**
     * 根据自己的业务查询表 返回相关的平台用户信息
     * @param clientId
     * @return
     * @throws ClientRegistrationException
     */
    @Override
    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
//        SaasDO saasDO = saasDao.findByAppId(clientId);
//        if (saasDO == null) {
//            throw new ClientRegistrationException("用户没有注册");
//        }
        SaasDO baseClientDetails = new SaasDO();
        baseClientDetails.setAppId("cwd");
        baseClientDetails.setAppSecret("cwd");
        baseClientDetails.setAppSecret( passwordEncoder.encode("cwd"));
        baseClientDetails.getAuthorizedGrantTypes();
        return baseClientDetails;
    }
}

+ 18 - 0
svr/svr-demo/src/main/java/com/yihu/jw/service/MySmsCodeSender.java

@ -0,0 +1,18 @@
package com.yihu.jw.service;
import com.yihu.base.security.sms.sender.SmsCodeSender;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Service;
/**
 * Created by chenweida on 2017/12/8.
 */
@Service
@Primary
public class MySmsCodeSender implements SmsCodeSender {
    @Override
    public void send(String mobile, String code) {
        System.out.println("发送号码:"+mobile);
        System.out.println("发送验证码:"+code);
    }
}

+ 5 - 5
svr/svr-demo/src/main/java/com/yihu/jw/service/RbasService.java

@ -1,6 +1,7 @@
package com.yihu.jw.service;
import com.yihu.base.security.rbas.IRbasService;
import org.springframework.context.annotation.Primary;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
@ -15,7 +16,8 @@ import java.util.Set;
 * Created by chenweida on 2017/12/5.
 * 判断用户是否有权限访问该路径
 */
@Component("rbasbean")
@Primary
@Service("rbasService")
public class RbasService implements IRbasService {
    private AntPathMatcher antPathMatcher = new AntPathMatcher();
@ -39,10 +41,8 @@ public class RbasService implements IRbasService {
                }
            }
        }
        return hasPerssion;
    }
    public Boolean hello() {
        return true;
        //return hasPerssion;
    }
}

+ 9 - 2
svr/svr-demo/src/main/java/com/yihu/jw/service/UserService.java

@ -3,6 +3,7 @@ package com.yihu.jw.service;
import com.yihu.jw.model.SaasDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
@ -10,12 +11,14 @@ import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
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 org.springframework.stereotype.Service;
import org.springframework.util.Base64Utils;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
@ -28,6 +31,7 @@ import java.util.Set;
 * 处理用户校验
 */
@Component
@Primary
public class UserService implements UserDetailsService {
    @Autowired
@ -43,7 +47,6 @@ public class UserService implements UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        if ("admin".equals(userName)) {
            System.out.printf("password:" + passwordEncoder.encode("123456"));
            return new User("admin",
                    passwordEncoder.encode("123456"),
                    true,
@ -53,7 +56,6 @@ public class UserService implements UserDetailsService {
                    , AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER") //权限
            );
        } else if ((!StringUtils.isEmpty(userName))&&userName.length() == 11) {
            System.out.printf("password:" + passwordEncoder.encode("123456"));
            return new User("admin",
                    passwordEncoder.encode("123456"),
                    true,
@ -67,4 +69,9 @@ public class UserService implements UserDetailsService {
        }
    }
    public static void main(String[] args) {
        BCryptPasswordEncoder bCryptPasswordEncoder=new BCryptPasswordEncoder();
        System.out.println(new String(Base64Utils.encode(("cwd:"+bCryptPasswordEncoder.encode("cwd")).getBytes())));
    }
}

+ 2 - 9
svr/svr-demo/src/main/resources/application.yml

@ -30,7 +30,7 @@ spring:
  redis:
    host: 172.19.103.88 # Redis server host.
    port: 6379 # Redis server port.
    database: 1
    database: 3
  aop:
    proxy-target-class: true
@ -41,11 +41,4 @@ quartz:
  overwriteExistingJobs: true ##是否覆盖job
security:
  oauth2:
    token:
      accessTokenValidityHours: 2 # 2小时
      refreshTokenValidityHours: 2 # 2小时
    sms:
      expireIn: 1 ##1分钟
      length: 6 #验证码长度

+ 68 - 0
svr/svr-iot/pom.xml

@ -14,6 +14,38 @@
    <version>1.0.0</version>
    <dependencies>
        <dependency>
            <groupId>com.yihu.jw</groupId>
            <artifactId>common-entity</artifactId>
        </dependency>
        <dependency>
            <groupId>com.yihu.jw</groupId>
            <artifactId>common-request-mapping</artifactId>
        </dependency>
        <dependency>
            <groupId>com.yihu.jw</groupId>
            <artifactId>common-exception</artifactId>
        </dependency>
        <dependency>
            <groupId>com.yihu.base</groupId>
            <artifactId>common-swagger</artifactId>
        </dependency>
        <dependency>
            <groupId>com.yihu.jw</groupId>
            <artifactId>common-rest-model</artifactId>
        </dependency>
        <dependency>
            <groupId>com.yihu.base</groupId>
            <artifactId>common-util</artifactId>
        </dependency>
        <dependency>
            <groupId>com.yihu.base</groupId>
            <artifactId>common-data-mysql</artifactId>
        </dependency>
        <dependency>
            <groupId>com.yihu.base</groupId>
            <artifactId>common-log</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
@ -30,5 +62,41 @@
            <groupId>com.yihu.base</groupId>
            <artifactId>common-quartz</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>
</project>

+ 10 - 0
svr/svr-iot/src/main/java/com/yihu/iot/IOTApplication.java

@ -1,7 +1,17 @@
package com.yihu.iot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
/**
 * Created by chenweida on 2017/11/27.
 */
@EnableJpaAuditing
@SpringBootApplication
public class IOTApplication {
    public static void main(String[] args) {
        SpringApplication.run(IOTApplication.class, args);
    }
}

+ 50 - 0
svr/svr-iot/src/main/java/com/yihu/iot/config/SwaggerConfig.java

@ -0,0 +1,50 @@
package com.yihu.iot.config;
import com.yihu.jw.rm.iot.IotRequestMapping;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
import static com.google.common.base.Predicates.or;
import static springfox.documentation.builders.PathSelectors.regex;
@Configuration
@EnableSwagger2
@ComponentScan("com.yihu.iot.**")
public class SwaggerConfig {
    public static final String Iot_API = "iot";
    @Bean
    public Docket iotAPI() {
        return new Docket(DocumentationType.SWAGGER_2)
                .groupName(Iot_API)
                .useDefaultResponseMessages(false)
                .forCodeGeneration(false)
                .pathMapping("/")
                .select()
                .paths(or(
                        regex("/" + IotRequestMapping.api_iot_common + "/.*")
                ))
                .build()
                .apiInfo(iotApiInfo());
    }
    private ApiInfo iotApiInfo() {
        ApiInfo iotInfo = new ApiInfo("基卫2.0API",
                "基卫2.0API,提供医疗物联网相关服务。",
                "1.0",
                "No terms of service",
                "wenfujian@jkzl.com",
                "The Apache License, Version 2.0",
                "http://www.apache.org/licenses/LICENSE-2.0.html"
        );
        return iotInfo;
    }
}

+ 29 - 0
svr/svr-iot/src/main/java/com/yihu/iot/config/jpa/HibernateProperties.java

@ -0,0 +1,29 @@
package com.yihu.iot.config.jpa;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;
import java.util.Properties;
/**
 * Created by chenweida on 2017/4/6.
 */
@Component
@RefreshScope
public class HibernateProperties {
    @Value("${hibernate.dialect}")
    private String dialect;
    @Value("${hibernate.show_sql}")
    private String show_sql;
    @Value("${hibernate.ejb.naming_strategy}")
    private String naming_strategy;
    public  Properties hibProperties() {
        Properties properties = new Properties();
        properties.put("hibernate.dialect",dialect);
        properties.put("hibernate.show_sql", show_sql);
        properties.put("hibernate.ejb.naming_strategy", naming_strategy);
        return properties;
    }
}

+ 55 - 0
svr/svr-iot/src/main/java/com/yihu/iot/config/jpa/IotJpa.java

@ -0,0 +1,55 @@
package com.yihu.iot.config.jpa;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.JpaVendorAdapter;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
/**
 * Created by chenweida on 2017/4/6.
 */
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "iotEntityManagerFactory",
        transactionManagerRef = "iotTransactionManager",
        basePackages = {"com.yihu.iot.dao"})   //设置Repository所在位置
public class IotJpa {
    @Autowired
    private HibernateProperties hibernateProperties;
    @Bean(name = "iotEntityManagerFactory")
    @Primary
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary(DataSource dataSource) {
        LocalContainerEntityManagerFactoryBean emfb = new LocalContainerEntityManagerFactoryBean();
        emfb.setDataSource(dataSource);
        emfb.setPackagesToScan("com.yihu.jw.iot");
        emfb.setPersistenceUnitName("iot");
        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        emfb.setJpaVendorAdapter(vendorAdapter);
        emfb.setJpaProperties(hibernateProperties.hibProperties());
        return emfb;
    }
    @Bean(name = "iotTransactionManager")
    @Primary
    JpaTransactionManager transactionManagerSecondary(
            @Qualifier("iotEntityManagerFactory") EntityManagerFactory builder) {
        return new JpaTransactionManager(builder);
    }
}

+ 101 - 0
svr/svr-iot/src/main/java/com/yihu/iot/controller/supplier/IotDeviceSupplierController.java

@ -0,0 +1,101 @@
package com.yihu.iot.controller.supplier;
import com.yihu.iot.service.supplier.IotDeviceSupplierService;
import com.yihu.jw.exception.ApiException;
import com.yihu.jw.iot.supplier.IotDeviceSupplierDO;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.restmodel.common.EnvelopRestController;
import com.yihu.jw.rm.iot.IotRequestMapping;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
/**
 * @author yeshijie on 2017/12/5.
 */
@RestController
@RequestMapping(IotRequestMapping.api_iot_common)
@Api(value = "供应商管理相关操作", description = "供应商管理相关操作")
public class IotDeviceSupplierController extends EnvelopRestController {
    @Autowired
    private IotDeviceSupplierService iotDeviceSupplierService;
    @PostMapping(value = IotRequestMapping.DeviceSupplier.api_create, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "创建供应商", notes = "创建供应商")
    public Envelop create(
            @ApiParam(name = "json_data", value = "", defaultValue = "")
            @RequestBody String jsonData) {
        try {
            IotDeviceSupplierDO iotDeviceSupplier = toEntity(jsonData, IotDeviceSupplierDO.class);
            return Envelop.getSuccess(IotRequestMapping.DeviceSupplier.message_success_create, iotDeviceSupplierService.create(iotDeviceSupplier));
        } catch (ApiException e) {
            return Envelop.getError(e.getMessage(), e.getErrorCode());
        }
    }
    @GetMapping(value = IotRequestMapping.DeviceSupplier.api_getById)
    @ApiOperation(value = "根据code查找供应商", notes = "根据code查找供应商")
    public Envelop findByCode(
            @ApiParam(name = "id", value = "id")
            @RequestParam(value = "id", required = true) String id
    ) {
        try {
            return Envelop.getSuccess(IotRequestMapping.DeviceSupplier.message_success_find, iotDeviceSupplierService.findById(id));
        } catch (ApiException e) {
            return Envelop.getError(e.getMessage(), e.getErrorCode());
        }
    }
    @RequestMapping(value = IotRequestMapping.DeviceSupplier.api_queryPage, method = RequestMethod.GET)
    @ApiOperation(value = "分页获取供应商")
    public Envelop queryPage(
            @ApiParam(name = "fields", value = "返回的字段,为空返回全部字段", defaultValue = "id,code,patientCode,signCode,kpiCode,agreementCode,kpiName")
            @RequestParam(value = "fields", required = false) String fields,
            @ApiParam(name = "filters", value = "过滤器,为空检索所有条件")
            @RequestParam(value = "filters", required = false) String filters,
            @ApiParam(name = "sorts", value = "排序,规则参见说明文档", defaultValue = "+createTime")
            @RequestParam(value = "sorts", required = false) String sorts,
            @ApiParam(name = "size", value = "分页大小", defaultValue = "15")
            @RequestParam(value = "size", required = false) int size,
            @ApiParam(name = "page", value = "页码", defaultValue = "1")
            @RequestParam(value = "page", required = false) int page,
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        //得到list数据
        List<IotDeviceSupplierDO> list = iotDeviceSupplierService.search(fields, filters, sorts, page, size);
        //获取总数
        long count=iotDeviceSupplierService.getCount(filters);
        //封装头信息
        pagedResponse(request, response, count, page, size);
        //封装返回格式
        List<IotDeviceSupplierDO> iotDeviceSuppliers = convertToModels(list, new ArrayList<>(list.size()), IotDeviceSupplierDO.class, fields);
        return Envelop.getSuccessListWithPage(IotRequestMapping.DeviceSupplier.message_success_find_functions,iotDeviceSuppliers, page, size,count);
    }
    @GetMapping(value = IotRequestMapping.DeviceSupplier.api_getList)
    @ApiOperation(value = "获取供应商列表(不分页)")
    public Envelop getList(
            @ApiParam(name = "fields", value = "返回的字段,为空返回全部字段", defaultValue = "id,code,patientCode,signCode,kpiCode,agreementCode,kpiName")
            @RequestParam(value = "fields", required = false) String fields,
            @ApiParam(name = "filters", value = "过滤器,为空检索所有条件")
            @RequestParam(value = "filters", required = false) String filters,
            @ApiParam(name = "sorts", value = "排序,规则参见说明文档", defaultValue = "+createTime")
            @RequestParam(value = "sorts", required = false) String sorts) throws Exception {
        //得到list数据
        List<IotDeviceSupplierDO> list = iotDeviceSupplierService.search(fields,filters,sorts);
        //封装返回格式
        List<IotDeviceSupplierDO> iotDeviceSuppliers = convertToModels(list, new ArrayList<>(list.size()), IotDeviceSupplierDO.class, fields);
        return Envelop.getSuccessList(IotRequestMapping.DeviceSupplier.message_success_find_functions,iotDeviceSuppliers);
    }
}

+ 12 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/device/IotDeviceDao.java

@ -0,0 +1,12 @@
package com.yihu.iot.dao.device;
import com.yihu.jw.iot.device.IotDeviceDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author yeshijie on 2017/12/1.
 */
public interface IotDeviceDao extends PagingAndSortingRepository<IotDeviceDO, Long>, JpaSpecificationExecutor<IotDeviceDO> {
}

+ 12 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/device/IotDeviceOrderDao.java

@ -0,0 +1,12 @@
package com.yihu.iot.dao.device;
import com.yihu.jw.iot.device.IotDeviceOrderDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author yeshijie on 2017/12/1.
 */
public interface IotDeviceOrderDao extends PagingAndSortingRepository<IotDeviceOrderDO,Long>,JpaSpecificationExecutor<IotDeviceOrderDO> {
}

+ 12 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/device/IotDevicePurchaseDao.java

@ -0,0 +1,12 @@
package com.yihu.iot.dao.device;
import com.yihu.jw.iot.device.IotDevicePurchaseDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author yeshijie on 2017/12/1.
 */
public interface IotDevicePurchaseDao extends PagingAndSortingRepository<IotDevicePurchaseDO,Long>,JpaSpecificationExecutor<IotDevicePurchaseDO> {
}

+ 14 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/device/IotDeviceQualityInspectionPlanDao.java

@ -0,0 +1,14 @@
package com.yihu.iot.dao.device;
import com.yihu.jw.iot.device.IotDeviceQualityInspectionPlanDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author yeshijie on 2017/12/1.
 */
public interface IotDeviceQualityInspectionPlanDao extends PagingAndSortingRepository<IotDeviceQualityInspectionPlanDO
        ,Long>,JpaSpecificationExecutor<IotDeviceQualityInspectionPlanDO> {
}

+ 12 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/dict/IotDeviceDictDao.java

@ -0,0 +1,12 @@
package com.yihu.iot.dao.dict;
import com.yihu.jw.iot.dict.IotDeviceDictDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author yeshijie on 2017/12/1.
 */
public interface IotDeviceDictDao extends PagingAndSortingRepository<IotDeviceDictDO,Long>,JpaSpecificationExecutor<IotDeviceDictDO> {
}

+ 16 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/supplier/IotDeviceSupplierDao.java

@ -0,0 +1,16 @@
package com.yihu.iot.dao.supplier;
import com.yihu.jw.iot.supplier.IotDeviceSupplierDO;
import com.yihu.jw.wlyy.agreement.WlyyAgreementKpiLogDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author yeshijie on 2017/12/5.
 */
public interface IotDeviceSupplierDao extends PagingAndSortingRepository<IotDeviceSupplierDO, Long>, JpaSpecificationExecutor<IotDeviceSupplierDO> {
    @Query("from IotDeviceSupplierDO w where w.id =?1")
    IotDeviceSupplierDO findById(String code);
}

+ 13 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/supplier/IotSupplyDeviceDao.java

@ -0,0 +1,13 @@
package com.yihu.iot.dao.supplier;
import com.yihu.jw.iot.supplier.IotSupplyDeviceDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author yeshijie on 2017/12/5.
 */
public interface IotSupplyDeviceDao extends PagingAndSortingRepository<IotSupplyDeviceDO, Long>, JpaSpecificationExecutor<IotSupplyDeviceDO> {
}

+ 13 - 0
svr/svr-iot/src/main/java/com/yihu/iot/dao/supplier/IotSupplyDeviceDataTypeDao.java

@ -0,0 +1,13 @@
package com.yihu.iot.dao.supplier;
import com.yihu.jw.iot.supplier.IotSupplyDeviceDataTypeDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
/**
 * @author yeshijie on 2017/12/5.
 */
public interface IotSupplyDeviceDataTypeDao extends PagingAndSortingRepository<IotSupplyDeviceDataTypeDO, Long>, JpaSpecificationExecutor<IotSupplyDeviceDataTypeDO> {
}

+ 44 - 0
svr/svr-iot/src/main/java/com/yihu/iot/service/supplier/IotDeviceSupplierService.java

@ -0,0 +1,44 @@
package com.yihu.iot.service.supplier;
import com.yihu.base.mysql.query.BaseJpaService;
import com.yihu.iot.dao.supplier.IotDeviceSupplierDao;
import com.yihu.jw.exception.ApiException;
import com.yihu.jw.exception.code.ExceptionCode;
import com.yihu.jw.iot.supplier.IotDeviceSupplierDO;
import com.yihu.jw.rm.iot.IotRequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.persistence.Transient;
import java.util.Date;
/**
 * @author yeshijie on 2017/12/5.
 */
@Service
public class IotDeviceSupplierService extends BaseJpaService<IotDeviceSupplierDO,IotDeviceSupplierDao>{
    @Autowired
    private IotDeviceSupplierDao iotDeviceSupplierDao;
    @Transient
    public IotDeviceSupplierDO create(IotDeviceSupplierDO iotDeviceSupplier) {
        String saasId = iotDeviceSupplier.getSaasId();
        if (StringUtils.isEmpty(saasId)) {
            throw new ApiException(IotRequestMapping.DeviceSupplier.message_fail_saasId_is_null, ExceptionCode.common_error_params_code);
        }
        //Saas saas = saasService.findByCode(saasId);
        //if(saas==null){
        //    throw new ApiException(BaseContants.Saas.message_fail_code_no_exist, ExceptionCode.common_error_params_code);
        //}
        //设置创建时间
        Date date = new Date();
        iotDeviceSupplier.setCreateTime(date);
        return iotDeviceSupplierDao.save(iotDeviceSupplier);
    }
    public IotDeviceSupplierDO findById(String id) {
        return iotDeviceSupplierDao.findById(id);
    }
}

+ 32 - 5
svr/svr-iot/src/main/resources/application.yml

@ -3,19 +3,46 @@ spring:
  application:
    name:  svr-iot  ##注册到发现服务的id 如果id一样 eurika会自动做负载
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    max-active: 50
    max-idle: 50 #最大空闲连接
    min-idle: 10 #最小空闲连接
    validation-query-timeout: 20
    log-validation-errors: true
    validation-interval: 60000 #避免过度验证,保证验证不超过这个频率——以毫秒为单位。如果一个连接应该被验证,但上次验证未达到指定间隔,将不再次验证。
    validation-query: SELECT 1 #SQL 查询, 用来验证从连接池取出的连接, 在将连接返回给调用者之前。 如果指定, 则查询必须是一个SQL SELECT 并且必须返回至少一行记录
    test-on-borrow: true #指明是否在从池中取出连接前进行检验, 如果检验失败, 则从池中去除连接并尝试取出另一个。注意: 设置为true 后如果要生效,validationQuery 参数必须设置为非空字符串
    test-on-return: true #指明是否在归还到池中前进行检验 注意: 设置为true 后如果要生效validationQuery 参数必须设置为非空字符串
    idle-timeout: 30000
    connection-test-query: SELECT 1
    num-tests-per-eviction-run: 50 #在每次空闲连接回收器线程(如果有)运行时检查的连接数量,最好和maxActive
    test-while-idle: true #指明连接是否被空闲连接回收器(如果有)进行检验,如果检测失败,则连接将被从池中去除
    min-evictable-idle-time-millis: 3600000 #连接池中连接,在时间段内一直空闲,被逐出连接池的时间(1000*60*60),以毫秒为单位
    time-between-eviction-runs-millis: 300000 #在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位,一般比minEvictableIdleTimeMillis小
#hibernate 配置
hibernate:
  dialect: org.hibernate.dialect.MySQL5Dialect
  show_sql: true
  ejb:
    naming_strategy: org.hibernate.cfg.ImprovedNamingStrategy
---
spring:
  profiles: dev
  profiles: jwdev
  datasource:
    url: jdbc:mysql://172.19.103.77:3306/xmiot?useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true
    username: root
    password: 123456
---
spring:
  profiles: test
  profiles: jwtest
---
spring:
  profiles: prod
  profiles: jwprod

+ 1 - 1
svr/svr-iot/src/main/resources/bootstrap.yml

@ -20,7 +20,7 @@ eureka:
  client:
    serviceUrl:
      #http://账号:密码@127.0.0.1:8761/eureka/
      defaultZone: http://jw:jkzl@172.19.103.33:8761/eureka/
      defaultZone: http://jw:jkzl@127.0.0.1:8761/eureka/
---
spring:

+ 1 - 0
web-gateway/src/main/java/com/yihu/jw/commnon/base/base/VersionContants.java

@ -2,6 +2,7 @@ package com.yihu.jw.commnon.base.base;
/**
 * Created by chenweida on 2017/11/13.
 * 版本发布相关
 */
public class VersionContants {
}

+ 20 - 0
web-gateway/src/main/java/com/yihu/jw/commnon/iot/SupplierContants.java

@ -0,0 +1,20 @@
package com.yihu.jw.commnon.iot;
/**
 * @author yeshijie on 2017/12/5.
 */
public class SupplierContants {
    public static final String iot = "iot";
    //设备供应商常量
    public static class DeviceSupplier {
        public static final String api_common = iot + "/deviceSupplier";
        public static final String api_create = "create";
        public static final String api_update = "update";
        public static final String api_delete = "delete";
        public static final String api_getByCode = "getByCode";
        public static final String api_queryPage = "queryPage";
        public static final String api_getList = "getList";
    }
}

+ 40 - 0
web-gateway/src/main/java/com/yihu/jw/config/security/ClientService.java

@ -0,0 +1,40 @@
package com.yihu.jw.config.security;
import com.yihu.base.security.rbas.ClientServiceProvider;
import org.springframework.context.annotation.Primary;
import org.springframework.security.oauth2.provider.ClientDetails;
import org.springframework.security.oauth2.provider.ClientRegistrationException;
import org.springframework.security.oauth2.provider.client.BaseClientDetails;
import org.springframework.stereotype.Component;
import java.util.HashSet;
import java.util.Set;
/**
 * Created by chenweida on 2017/12/1.
 */
@Component("baseClientDetailsService")
@Primary
public class ClientService implements ClientServiceProvider {
    @Override
    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
//        SaasDO saasDO = saasDao.findByAppId(clientId);
//        if (saasDO == null) {
//            throw new ClientRegistrationException("用户没有注册");
//        }
        BaseClientDetails baseClientDetails = new BaseClientDetails();
        baseClientDetails.setClientId("cwd");
        baseClientDetails.setClientSecret("cwd");
        Set<String> strings = new HashSet<>();
        strings.add("password");
        strings.add("custom_password");
        strings.add("authorization_code");
        strings.add("refresh_token");
        baseClientDetails.setAuthorizedGrantTypes(strings);
        return baseClientDetails;
    }
}

+ 20 - 13
web-gateway/src/main/java/com/yihu/jw/config/security/roleService/UserRbasService.java

@ -1,9 +1,9 @@
package com.yihu.jw.config.security.roleService;
package com.yihu.jw.config.security;
import com.yihu.base.security.rbas.RbasService;
import com.yihu.base.security.rbas.IRbasService;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.util.AntPathMatcher;
import javax.servlet.http.HttpServletRequest;
@ -11,31 +11,38 @@ import java.util.HashSet;
import java.util.Set;
/**
 * Created by chenweida on 2017/11/30.
 * Created by chenweida on 2017/12/5.
 * 判断用户是否有权限访问该路径
 */
@Component("rbasService")
public class UserRbasService implements RbasService {
@Service("rbasService")
public class RbasService implements IRbasService {
    private AntPathMatcher antPathMatcher = new AntPathMatcher();
    @Override
    public Boolean hasPerssion(HttpServletRequest request, Authentication authentication) {
        Object principal = authentication.getPrincipal();
        boolean hasPerssion = false;
        if (principal instanceof UserDetails) {
            //用户名字
            String userName = ((UserDetails) principal).getUsername();
            //获取用户名字
            String username = ((UserDetails) principal).getUsername();
            //根据用户名字去数据库查找权限
            Set<String> urls = new HashSet<>();
            for (String url : urls) {
                if (antPathMatcher.match(url, request.getRequestURI())) {
            //获取用户全部权限
            Set<String> uris = new HashSet<>();
            for (String uri : uris) {
                if (antPathMatcher.match(uri, request.getRequestURI())) {
                    hasPerssion = true;
                    break;
                }
            }
        }
        return true;
        //  return hasPerssion;
    }
        return hasPerssion;
    public Boolean hello() {
        return true;
    }
}

+ 61 - 0
web-gateway/src/main/java/com/yihu/jw/config/security/UserService.java

@ -0,0 +1,61 @@
package com.yihu.jw.config.security;
import com.yihu.jw.feign.base.user.EmployFeign;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
/**
 * Created by chenweida on 2017/11/29.
 * 处理用户校验
 */
@Component
public class UserService implements UserDetailsService {
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Autowired
    private EmployFeign employFeign;
    /**
     * 我们只需要把用户返回给spring-security 密码框架自己帮我们校验
     *
     * @param userName
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        if ("admin".equals(userName)) {
            System.out.printf("password:" + passwordEncoder.encode("123456"));
            return new User("admin",
                    passwordEncoder.encode("123456"),
                    true,
                    true,
                    true,
                    true
                    , AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER") //权限
            );
        } else if ((!StringUtils.isEmpty(userName))&&userName.length() == 11) {
            System.out.printf("password:" + passwordEncoder.encode("123456"));
            return new User("admin",
                    passwordEncoder.encode("123456"),
                    true,
                    true,
                    true,
                    true
                    , AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER") //权限
            );
        } else {
            throw new UsernameNotFoundException("用户不存在");
        }
    }
}

+ 0 - 24
web-gateway/src/main/java/com/yihu/jw/config/security/roleService/ClientService.java

@ -1,24 +0,0 @@
package com.yihu.jw.config.security.roleService;
import com.yihu.jw.feign.base.user.EmployFeign;
import org.springframework.beans.factory.annotation.Autowired;
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.Service;
/**
 * Created by chenweida on 2017/11/29.
 * 获取用户信息
 */
@Service
public class ClientService implements ClientDetailsService {
    @Autowired
    private EmployFeign employeeFeign;
    @Override
    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
        return null;
    }
}

+ 0 - 25
web-gateway/src/main/java/com/yihu/jw/config/security/roleService/UserService.java

@ -1,25 +0,0 @@
package com.yihu.jw.config.security.roleService;
import com.yihu.jw.feign.base.user.EmployFeign;
import com.yihu.jw.restmodel.common.Envelop;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
/**
 * Created by chenweida on 2017/11/29.
 * 获取用户信息
 */
@Service
public class UserService implements UserDetailsService {
    @Autowired
    private EmployFeign employeeFeign;
    @Override
    public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
        Envelop user= employeeFeign.getEmployeeByAccount(userName);
        return null;
    }
}

+ 4 - 0
web-gateway/src/main/java/com/yihu/jw/controller/base/version/UserVersionController.java

@ -1,7 +1,9 @@
package com.yihu.jw.controller.base.version;
import com.yihu.jw.commnon.base.base.BaseContants;
import com.yihu.jw.feign.base.version.UserVersionFeign;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -13,5 +15,7 @@ import org.springframework.web.bind.annotation.RestController;
@RequestMapping(BaseContants.api_common)
@Api(description = "灰度发布相关")
public class UserVersionController {
    @Autowired
    private UserVersionFeign userVersionFeign;
}

+ 115 - 0
web-gateway/src/main/java/com/yihu/jw/controller/iot/supplier/IotDeviceSupplierController.java

@ -0,0 +1,115 @@
package com.yihu.jw.controller.iot.supplier;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixProperty;
import com.yihu.jw.commnon.iot.SupplierContants;
import com.yihu.jw.feign.iot.supplier.IotDeviceSupplierFeign;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.restmodel.common.EnvelopRestController;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.Tracer;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
/**
 * @author yeshijie on 2017/12/5.
 */
@RestController
@RequestMapping(SupplierContants.DeviceSupplier.api_common)
@Api(value = "供应商相关操作", description = "供应商相关操作")
public class IotDeviceSupplierController extends EnvelopRestController{
    private Logger logger = LoggerFactory.getLogger(IotDeviceSupplierController.class);
    @Autowired
    private IotDeviceSupplierFeign iotDeviceSupplierFeign;
    @Autowired
    private Tracer tracer;
    @PostMapping(value = SupplierContants.DeviceSupplier.api_create, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "创建供应商", notes = "创建供应商")
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "-1"),//超时时间
            @HystrixProperty(name = "execution.timeout.enabled", value = "false") })
    public Envelop create(
            @ApiParam(name = "json_data", value = "", defaultValue = "")
            @RequestBody String jsonData) {
        return iotDeviceSupplierFeign.create(jsonData);
    }
    @PutMapping(value = SupplierContants.DeviceSupplier.api_update, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "修改供应商", notes = "修改供应商")
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "-1"),//超时时间
            @HystrixProperty(name = "execution.timeout.enabled", value = "false") })
    public Envelop update(
            @ApiParam(name = "json_data", value = "", defaultValue = "")
            @RequestBody String jsonData) {
        return iotDeviceSupplierFeign.update(jsonData);
    }
    @DeleteMapping(value =SupplierContants.DeviceSupplier.api_delete)
    @ApiOperation(value = "删除供应商", notes = "删除供应商")
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "-1"),//超时时间
            @HystrixProperty(name = "execution.timeout.enabled", value = "false") })
    public Envelop delete(
            @ApiParam(name = "code", value = "code")
            @RequestParam(value = "code", required = true) String code) {
        return iotDeviceSupplierFeign.delete(code);
    }
    @GetMapping(value =SupplierContants.DeviceSupplier.api_getByCode)
    @ApiOperation(value = "根据code查找供应商", notes = "根据code查找供应商")
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "-1"),//超时时间
            @HystrixProperty(name = "execution.timeout.enabled", value = "false") })
    public Envelop findByCode(
            @ApiParam(name = "code", value = "code")
            @RequestParam(value = "code", required = true) String code
    ) {
        return iotDeviceSupplierFeign.findByCode(code);
    }
    @RequestMapping(value = SupplierContants.DeviceSupplier.api_queryPage, method = RequestMethod.GET)
    @ApiOperation(value = "分页获取供应商")
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "-1"),//超时时间
            @HystrixProperty(name = "execution.timeout.enabled", value = "false") })
    public Envelop queryPage(
            @ApiParam(name = "fields", value = "返回的字段,为空返回全部字段", defaultValue = "id,code,parentCode,saasId,name,price,posterPic,remark,type,status")
            @RequestParam(value = "fields", required = false) String fields,
            @ApiParam(name = "filters", value = "过滤器,为空检索所有条件")
            @RequestParam(value = "filters", required = false) String filters,
            @ApiParam(name = "sorts", value = "排序,规则参见说明文档", defaultValue = "+createTime")
            @RequestParam(value = "sorts", required = false) String sorts,
            @ApiParam(name = "size", value = "分页大小", defaultValue = "15")
            @RequestParam(value = "size", required = false) int size,
            @ApiParam(name = "page", value = "页码", defaultValue = "1")
            @RequestParam(value = "page", required = false) int page) throws Exception {
        return iotDeviceSupplierFeign.queryPage(fields,filters,sorts,size,page);
    }
    @GetMapping(value =SupplierContants.DeviceSupplier.api_getList)
    @ApiOperation(value = "获取供应商列表(不分页)")
    @HystrixCommand(commandProperties = {
            @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "-1"),//超时时间
            @HystrixProperty(name = "execution.timeout.enabled", value = "false") })
    public Envelop getList(
            @ApiParam(name = "fields", value = "返回的字段,为空返回全部字段", defaultValue = "id,code,parentCode,saasId,name,price,posterPic,remark,type,status")
            @RequestParam(value = "fields", required = false) String fields,
            @ApiParam(name = "filters", value = "过滤器,为空检索所有条件")
            @RequestParam(value = "filters", required = false) String filters,
            @ApiParam(name = "sorts", value = "排序,规则参见说明文档", defaultValue = "+createTime")
            @RequestParam(value = "sorts", required = false) String sorts) throws Exception {
        return iotDeviceSupplierFeign.getList(fields,filters,sorts);
    }
}

+ 1 - 1
web-gateway/src/main/java/com/yihu/jw/controller/login/LoginController.java

@ -1,6 +1,6 @@
package com.yihu.jw.controller.login;
import com.yihu.jw.config.security.roleService.UserService;
import com.yihu.jw.config.security.UserService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.sleuth.Tracer;

+ 1 - 0
web-gateway/src/main/java/com/yihu/jw/feign/base/version/UserVersionFeign.java

@ -15,4 +15,5 @@ import org.springframework.web.bind.annotation.RequestMapping;
)
@RequestMapping(value = BaseRequestMapping.api_base_common)
public interface UserVersionFeign {
}

+ 50 - 0
web-gateway/src/main/java/com/yihu/jw/feign/fallbackfactory/iot/supplier/IotDeviceSupplierFeignFallbackFactory.java

@ -0,0 +1,50 @@
package com.yihu.jw.feign.fallbackfactory.iot.supplier;
import com.yihu.jw.feign.iot.supplier.IotDeviceSupplierFeign;
import com.yihu.jw.restmodel.common.Envelop;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
/**
 * @author yeshijie on 2017/12/5.
 */
@Component
public class IotDeviceSupplierFeignFallbackFactory implements FallbackFactory<IotDeviceSupplierFeign> {
    @Override
    public IotDeviceSupplierFeign create(Throwable throwable) {
        return new IotDeviceSupplierFeign() {
            @Override
            public Envelop create(@RequestBody String jsonData) {
                return null;
            }
            @Override
            public Envelop update(@RequestBody String jsonData) {
                return null;
            }
            @Override
            public Envelop delete(@RequestParam(value = "code") String code) {
                return null;
            }
            @Override
            public Envelop findByCode(@RequestParam(value = "code") String code) {
                return null;
            }
            @Override
            public Envelop queryPage(@RequestParam(value = "fields", required = false) String fields, @RequestParam(value = "filters", required = false) String filters, @RequestParam(value = "sorts", required = false) String sorts, @RequestParam(value = "size", required = false) int size, @RequestParam(value = "page", required = false) int page) {
                return null;
            }
            @Override
            public Envelop getList(@RequestParam(value = "fields", required = false) String fields, @RequestParam(value = "filters", required = false) String filters, @RequestParam(value = "sorts", required = false) String sorts) {
                return null;
            }
        };
    }
}

+ 46 - 0
web-gateway/src/main/java/com/yihu/jw/feign/iot/supplier/IotDeviceSupplierFeign.java

@ -0,0 +1,46 @@
package com.yihu.jw.feign.iot.supplier;
import com.yihu.jw.feign.fallbackfactory.iot.supplier.IotDeviceSupplierFeignFallbackFactory;
import com.yihu.jw.restmodel.CommonContants;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.rm.iot.IotRequestMapping;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
/**
 * @author yeshijie on 2017/12/5.
 */
@FeignClient(
        name = CommonContants.svr_iot // name值是eurika的实例名字
        ,fallbackFactory  = IotDeviceSupplierFeignFallbackFactory.class
)
@RequestMapping(IotRequestMapping.api_iot_common)
public interface IotDeviceSupplierFeign {
    @PostMapping(value = IotRequestMapping.DeviceSupplier.api_create, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    Envelop create(@RequestBody String jsonData);
    @PutMapping(value = IotRequestMapping.DeviceSupplier.api_update, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    Envelop update(@RequestBody String jsonData);
    @DeleteMapping(value = IotRequestMapping.DeviceSupplier.api_delete)
    Envelop delete( @RequestParam(value = "id") String id);
    @RequestMapping(value= IotRequestMapping.DeviceSupplier.api_getById,method = RequestMethod.GET)
    Envelop findByCode( @RequestParam(value = "id" ) String id);
    @RequestMapping(value = IotRequestMapping.DeviceSupplier.api_queryPage, method = RequestMethod.GET)
    Envelop queryPage(
            @RequestParam(value = "fields", required = false) String fields,
            @RequestParam(value = "filters", required = false) String filters,
            @RequestParam(value = "sorts", required = false) String sorts,
            @RequestParam(value = "size", required = false) int size,
            @RequestParam(value = "page", required = false) int page);
    @GetMapping(value = IotRequestMapping.DeviceSupplier.api_getList)
    Envelop getList(
            @RequestParam(value = "fields", required = false) String fields,
            @RequestParam(value = "filters", required = false) String filters,
            @RequestParam(value = "sorts", required = false) String sorts);
}