Kaynağa Gözat

基础信息

Progr1mmer 6 yıl önce
ebeveyn
işleme
a40e972917
21 değiştirilmiş dosya ile 560 ekleme ve 148 silme
  1. 7 26
      common/common-entity/src/main/java/com/yihu/jw/entity/base/sms/SmsDO.java
  2. 54 20
      common/common-entity/src/main/java/com/yihu/jw/entity/base/sms/SmsGatewayDO.java
  3. 6 6
      common/common-entity/src/main/java/com/yihu/jw/entity/base/user/UserDO.java
  4. 3 9
      common/common-exception/src/main/java/com/yihu/jw/exception/ApiException.java
  5. 46 16
      common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/sms/SmsGatewayVO.java
  6. 56 51
      common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/sms/SmsVO.java
  7. 5 5
      common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/user/UserVO.java
  8. 95 0
      server/svr-authentication/pom.xml
  9. 7 0
      server/svr-authentication/src/main/java/com/yihu/AuthServer.java
  10. 14 0
      server/svr-authentication/src/main/java/com/yihu/jw/oauth2/config/WlyyAuthorizationServerConfigurerAdapter.java
  11. 49 0
      server/svr-authentication/src/main/java/com/yihu/jw/oauth2/config/WlyyWebSecurityConfigurerAdapter.java
  12. 60 0
      server/svr-authentication/src/main/java/com/yihu/jw/oauth2/core/WlyyUserDetailsService.java
  13. 10 0
      server/svr-authentication/src/main/java/com/yihu/jw/oauth2/model/WlyyUserDetails.java
  14. 10 0
      server/svr-authentication/src/main/java/com/yihu/jw/oauth2/model/WlyyUserSimple.java
  15. 3 3
      server/svr-configuration/src/main/java/com/yihu/SvrConfiguration.java
  16. 3 3
      server/svr-discovery/src/main/java/com/yihu/SvrDiscovery.java
  17. 2 2
      server/svr-zipkin/src/main/java/com/yihu/SvrZipkin.java
  18. 5 0
      svr/svr-base/src/main/java/com/yihu/jw/base/dao/SmsGatewayDao.java
  19. 4 0
      svr/svr-base/src/main/java/com/yihu/jw/base/dao/SmsTemplateDao.java
  20. 10 7
      svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/sms/SmsGatewayEndpoint.java
  21. 111 0
      svr/svr-base/src/main/java/com/yihu/jw/base/service/SmsGatewayService.java

+ 7 - 26
common/common-entity/src/main/java/com/yihu/jw/entity/base/sms/SmsDO.java

@ -13,15 +13,6 @@ import java.util.Date;
@Table(name = "base_sms")
public class SmsDO extends UuidIdentityEntity {
	/**
	 * 0 - 未发送
	 * 1 - 已发送
	 */
	public enum Status {
		unsent,
		sent
	}
	//应用ID
	private String clientId;
	//使用的网关
@ -29,17 +20,15 @@ public class SmsDO extends UuidIdentityEntity {
	//请求的ip地址
	private String requestIp;
	//短信接收号码
	private String mobile;
	private String to;
	//短信内容
	private String content;
	//过期时间
	private Date deadline;
	//验证码
	private String captcha;
	//短信类别
	//短信标签
	private SmsTemplateDO.Type type;
	//状态
	private Status status;
	@Column(name = "client_id", nullable = false)
	public String getClientId() {
@ -68,13 +57,13 @@ public class SmsDO extends UuidIdentityEntity {
		this.requestIp = requestIp;
	}
	@Column(name = "mobile", nullable = false)
	public String getMobile() {
		return mobile;
	@Column(name = "to", nullable = false)
	public String getTo() {
		return to;
	}
	public void setMobile(String mobile) {
		this.mobile = mobile;
	public void setTo(String to) {
		this.to = to;
	}
	@Column(name = "content", nullable = false)
@ -113,12 +102,4 @@ public class SmsDO extends UuidIdentityEntity {
		this.captcha = captcha;
	}
	@Column(name = "status", nullable = false)
	public Status getStatus() {
		return status;
	}
	public void setStatus(Status status) {
		this.status = status;
	}
}

+ 54 - 20
common/common-entity/src/main/java/com/yihu/jw/entity/base/sms/SmsGatewayDO.java

@ -24,8 +24,8 @@ public class SmsGatewayDO extends UuidIdentityEntity {
		delete
	}
	//关联 base_saas id
	private String saasId;
	//关联 client id
	private String clientId;
	//名称
	private String name;
	//短信接口的账号
@ -34,21 +34,26 @@ public class SmsGatewayDO extends UuidIdentityEntity {
	private String password;
	//官网地址
	private String website;
	//超时时间(分钟)
	private Integer expireMin;
	//短信接口调用的地址
	private String url;
	private String requestUrl;
	//调用凭证(json串)
	private String certificate;
	private String requestCertificate;
	//短信接口调用状态标识
	private String responseCode;
	//调用成功的状态码
	private String successValue;
	//状态
	private Status status;
	@Column(name = "saas_id", nullable = false)
	public String getSaasId() {
		return saasId;
	@Column(name = "client_id", nullable = false)
	public String getClientId() {
		return clientId;
	}
	public void setSaasId(String saasId) {
		this.saasId = saasId;
	public void setClientId(String clientId) {
		this.clientId = clientId;
	}
	@Column(name = "name")
@ -87,22 +92,49 @@ public class SmsGatewayDO extends UuidIdentityEntity {
		this.website = website;
	}
	@Column(name = "url")
	public String getUrl() {
		return this.url;
	@Column(name = "expire_min")
	public Integer getExpireMin() {
		return expireMin;
	}
	public void setExpireMin(Integer expireMin) {
		this.expireMin = expireMin;
	}
	@Column(name = "request_url", nullable = false)
	public String getRequestUrl() {
		return requestUrl;
	}
	public void setRequestUrl(String requestUrl) {
		this.requestUrl = requestUrl;
	}
	public void setUrl(String url) {
		this.url = url;
	@Column(name = "request_certificate", nullable = false)
	public String getRequestCertificate() {
		return requestCertificate;
	}
	@Column(name = "certificate", nullable = false)
	public String getCertificate() {
		return certificate;
	public void setRequestCertificate(String requestCertificate) {
		this.requestCertificate = requestCertificate;
	}
	public void setCertificate(String certificate) {
		this.certificate = certificate;
	@Column(name = "response_code", nullable = false)
	public String getResponseCode() {
		return responseCode;
	}
	public void setResponseCode(String responseCode) {
		this.responseCode = responseCode;
	}
	@Column(name = "success_value", nullable = false)
	public String getSuccessValue() {
		return successValue;
	}
	public void setSuccessValue(String successValue) {
		this.successValue = successValue;
	}
	@Column(name = "status", nullable = false)
@ -113,4 +145,6 @@ public class SmsGatewayDO extends UuidIdentityEntity {
	public void setStatus(Status status) {
		this.status = status;
	}
}

+ 6 - 6
common/common-entity/src/main/java/com/yihu/jw/entity/base/user/UserDO.java

@ -38,7 +38,7 @@ public class UserDO extends UuidIdentityEntityWithOperator {
    //身份证号码
    private String idcard;
    //手机号码
    private String phone;
    private String mobile;
    //邮箱
    private String email;
    //是否可用
@ -106,13 +106,13 @@ public class UserDO extends UuidIdentityEntityWithOperator {
        this.idcard = idcard;
    }
    @Column(name = "phone", length = 200)
    public String getPhone() {
        return phone;
    @Column(name = "mobile", length = 200)
    public String getMobile() {
        return mobile;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    @Column(name = "email", length = 200)

+ 3 - 9
common/common-exception/src/main/java/com/yihu/jw/exception/ApiException.java

@ -26,6 +26,7 @@ public class ApiException extends RuntimeException {
    private Integer errorCode = -10000;
    public ApiException() {
        super();
    }
    public ApiException(String message) {
@ -37,16 +38,9 @@ public class ApiException extends RuntimeException {
        this.errorCode = errorCode;
    }
    public ApiException(String message, Throwable cause) {
    public ApiException(String message, Integer errorCode, Throwable cause) {
        super(message, cause);
    }
    public ApiException(Throwable cause) {
        super(cause);
    }
    public ApiException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
        super(message, cause, enableSuppression, writableStackTrace);
        this.errorCode = errorCode;
    }
    public Integer getErrorCode() {

+ 46 - 16
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/sms/SmsGatewayVO.java

@ -12,8 +12,8 @@ import io.swagger.annotations.ApiModelProperty;
@ApiModel(value = "SmsGatewayVO", description = "短信网关")
public class SmsGatewayVO extends UuidIdentityVO {
    @ApiModelProperty(value = "saas id", example = "402803ee656498890165649ad2da0000")
    private String saasId;
    @ApiModelProperty(value = "client id", example = "EwC0iRSrcS")
    private String clientId;
    @ApiModelProperty(value = "网关名称", example = "基础短信网关")
    private String name;
    @ApiModelProperty(value = "短信接口的账号", example = "user123")
@ -22,19 +22,25 @@ public class SmsGatewayVO extends UuidIdentityVO {
    private String password;
    @ApiModelProperty(value = "官网地址", example = "http://www.smsgateway.com")
    private String website;
    @ApiModelProperty(value = "超时时间(分钟)", example = "10")
    private Integer expireMin;
    @ApiModelProperty(value = "短信接口调用的地址", example = "http://www.smsgateway.com/api/v1.0")
    private String url;
    private String requestUrl;
    @ApiModelProperty(value = "调用凭证(json串)", example = "{\"app_id\":\"EwC0iRSrcS\",\"signature\":\"iREOlyuyKfRBIGOHbBGJ\"}")
    private String certificate;
    private String requestCertificate;
    @ApiModelProperty(value = "短信接口调用状态标识", example = "result")
    private String responseCode;
    @ApiModelProperty(value = "调用成功的状态码", example = "0")
    private String successValue;
    @ApiModelProperty(value = "状态", example = "available")
    private SmsGatewayDO.Status status;
    public String getSaasId() {
        return saasId;
    public String getClientId() {
        return clientId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    public void setClientId(String clientId) {
        this.clientId = clientId;
    }
    public String getName() {
@ -69,20 +75,44 @@ public class SmsGatewayVO extends UuidIdentityVO {
        this.website = website;
    }
    public String getUrl() {
        return url;
    public Integer getExpireMin() {
        return expireMin;
    }
    public void setUrl(String url) {
        this.url = url;
    public void setExpireMin(Integer expireMin) {
        this.expireMin = expireMin;
    }
    public String getCertificate() {
        return certificate;
    public String getRequestUrl() {
        return requestUrl;
    }
    public void setCertificate(String certificate) {
        this.certificate = certificate;
    public void setRequestUrl(String requestUrl) {
        this.requestUrl = requestUrl;
    }
    public String getRequestCertificate() {
        return requestCertificate;
    }
    public void setRequestCertificate(String requestCertificate) {
        this.requestCertificate = requestCertificate;
    }
    public String getResponseCode() {
        return responseCode;
    }
    public void setResponseCode(String responseCode) {
        this.responseCode = responseCode;
    }
    public String getSuccessValue() {
        return successValue;
    }
    public void setSuccessValue(String successValue) {
        this.successValue = successValue;
    }
    public SmsGatewayDO.Status getStatus() {

+ 56 - 51
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/sms/SmsVO.java

@ -1,68 +1,73 @@
package com.yihu.jw.restmodel.base.sms;
import com.yihu.jw.entity.base.sms.SmsTemplateDO;
import com.yihu.jw.restmodel.UuidIdentityVO;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import java.util.Date;
/**
 * Created by chenweida on 2017/5/22.
 * VO - 短信记录
 * Created by progr1mmer on 2018/8/28.
 */
public class SmsVO {
    private String id;
    private String saasId;	//saasid 关联base_saas code
    private String mobile;	//电话号码
    private String ip;	//发送短信的ip地址
    private Integer type;	//发送短信的类别
    private String captcha;	//验证码 1微信端注册,2微信端找回密码,3医生端找回密码,4患者登录,5医生登录
    private String content;	// 短信内容
    private Date deadline;	//过期时间
    private Integer status;	//短信状态 状态,0未发送,1已发送
    private Date czrq; //操作时间
    public String getId() {
        return id;
    }
@ApiModel(value = "SmsVO", description = "短信记录")
public class SmsVO extends UuidIdentityVO {
    public void setId(String id) {
        this.id = id;
    }
    //应用ID
    @ApiModelProperty(value = "应用ID", example = "EwC0iRSrcS")
    private String clientId;
    //使用的网关
    @ApiModelProperty(value = "使用的网关", example = "402803f9657fa37b01657fb58b9b0000")
    private String smsGatewayId;
    //请求的ip地址
    @ApiModelProperty(value = "请求的ip地址", example = "192.168.0.121")
    private String requestIp;
    //短信接收号码
    @ApiModelProperty(value = "短信接收号码", example = "18888888888")
    private String to;
    //短信内容
    @ApiModelProperty(value = "短信内容", example = "【i健康综合管理平台】您使用的是i健康综合管理平台短信模板,您的验证码是826612,请于10分钟内正确输入!")
    private String content;
    //过期时间
    @ApiModelProperty(value = "应用ID", example = "EwC0iRSrcS")
    private Date deadline;
    //验证码
    private String captcha;
    @ApiModelProperty(value = "标签", example = "login")
    private SmsTemplateDO.Type type;
    public String getSaasId() {
        return saasId;
    public String getClientId() {
        return clientId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    public void setClientId(String clientId) {
        this.clientId = clientId;
    }
    public String getMobile() {
        return mobile;
    public String getSmsGatewayId() {
        return smsGatewayId;
    }
    public void setMobile(String mobile) {
        this.mobile = mobile;
    public void setSmsGatewayId(String smsGatewayId) {
        this.smsGatewayId = smsGatewayId;
    }
    public String getIp() {
        return ip;
    public String getRequestIp() {
        return requestIp;
    }
    public void setIp(String ip) {
        this.ip = ip;
    public void setRequestIp(String requestIp) {
        this.requestIp = requestIp;
    }
    public Integer getType() {
        return type;
    public String getTo() {
        return to;
    }
    public void setType(Integer type) {
        this.type = type;
    }
    public String getCaptcha() {
        return captcha;
    }
    public void setCaptcha(String captcha) {
        this.captcha = captcha;
    public void setTo(String to) {
        this.to = to;
    }
    public String getContent() {
@ -81,19 +86,19 @@ public class SmsVO {
        this.deadline = deadline;
    }
    public Integer getStatus() {
        return status;
    public String getCaptcha() {
        return captcha;
    }
    public void setStatus(Integer status) {
        this.status = status;
    public void setCaptcha(String captcha) {
        this.captcha = captcha;
    }
    public Date getCzrq() {
        return czrq;
    public SmsTemplateDO.Type getType() {
        return type;
    }
    public void setCzrq(Date czrq) {
        this.czrq = czrq;
    public void setType(SmsTemplateDO.Type type) {
        this.type = type;
    }
}

+ 5 - 5
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/user/UserVO.java

@ -34,7 +34,7 @@ public class UserVO extends UuidIdentityVOWithOperator {
    private String idcard;
    //手机号码
    @ApiModelProperty(value = "手机号码", example = "18888888888")
    private String phone;
    private String mobile;
    //邮箱
    @ApiModelProperty(value = "邮箱", example = "wxm@jkzl.com")
    private String email;
@ -102,12 +102,12 @@ public class UserVO extends UuidIdentityVOWithOperator {
        this.idcard = idcard;
    }
    public String getPhone() {
        return phone;
    public String getMobile() {
        return mobile;
    }
    public void setPhone(String phone) {
        this.phone = phone;
    public void setMobile(String mobile) {
        this.mobile = mobile;
    }
    public String getEmail() {

+ 95 - 0
server/svr-authentication/pom.xml

@ -12,5 +12,100 @@
    <artifactId>svr-authentication</artifactId>
    <dependencies>
        <!-- 支持Tomcat启动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>
        <!-- 支持Tomcat启动 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security.oauth</groupId>
            <artifactId>spring-security-oauth2</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-feign</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- Redis  -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <scope>${dependency.scope}</scope>
        </dependency>
        <!-- Redis  -->
        <!-- JdbcTemplate-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
        </dependency>
        <!-- JdbcTemplate-->
    </dependencies>
</project>

+ 7 - 0
server/svr-authentication/src/main/java/com/yihu/AuthServer.java

@ -0,0 +1,7 @@
package com.yihu;
/**
 * Created by progr1mmer on 2018/8/29.
 */
public class AuthServer {
}

+ 14 - 0
server/svr-authentication/src/main/java/com/yihu/jw/oauth2/config/WlyyAuthorizationServerConfigurerAdapter.java

@ -0,0 +1,14 @@
package com.yihu.jw.oauth2.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
/**
 *
 * Created by progr1mmer on 2018/8/29.
 */
@Configuration
@EnableAuthorizationServer
public class WlyyAuthorizationServerConfigurerAdapter extends AuthorizationServerConfigurerAdapter {
}

+ 49 - 0
server/svr-authentication/src/main/java/com/yihu/jw/oauth2/config/WlyyWebSecurityConfigurerAdapter.java

@ -0,0 +1,49 @@
package com.yihu.jw.oauth2.config;
import com.yihu.jw.oauth2.core.WlyyUserDetailsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.UserDetailsService;
/**
 * Config - Spring Security
 * Created by progr1mmer on 2018/8/29.
 */
@Configuration
public class WlyyWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
    @Autowired
    private AuthenticationProvider authenticationProvider;
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/oauth/**");
    }
    @Override
    protected void configure(AuthenticationManagerBuilder authBuilder) throws Exception {
        authBuilder.authenticationProvider(authenticationProvider);
    }
    @Bean
    WlyyUserDetailsService wlyyUserDetailsService(){
        return new WlyyUserDetailsService();
    }
    @Bean
    public AuthenticationProvider authenticationProvider(UserDetailsService userDetailsService) {
        DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
        authenticationProvider.setUserDetailsService(userDetailsService);
        authenticationProvider.setPasswordEncoder(new Md5PasswordEncoder());
        return authenticationProvider;
    }
}

+ 60 - 0
server/svr-authentication/src/main/java/com/yihu/jw/oauth2/core/WlyyUserDetailsService.java

@ -0,0 +1,60 @@
package com.yihu.jw.oauth2.core;
import com.yihu.jw.oauth2.model.WlyyUserSimple;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
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 java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
 * Service - 用户加载
 * Created by progr1mmer on 2018/8/29.
 */
public class WlyyUserDetailsService extends JdbcDaoSupport implements UserDetailsService {
    private static final String DEFAULT_USER_DETAILS_STATEMENT = "SELECT * FROM user u WHERE u.username = ? OR u.mobile = ? OR u.idcard = ?";
    /**
     * 用户登录判读接口
     *
     * @param username
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        List<UserDetails> users = this.getJdbcTemplate().query(DEFAULT_USER_DETAILS_STATEMENT, new BeanPropertyRowMapper(UserDetails.class), username, username, username);
        if (users == null || users.size() == 0) {
            throw new UsernameNotFoundException(username);
        }
        return new User(username, users.get(0).getPassword(), getGrantedAuthorities(username));
        /*if (username.equals("admin")){
            return new User("admin", "e10adc3949ba59abbe56e057f20f883e", getGrantedAuthorities(username));
        }
        return null;*/
    }
    private Collection<? extends GrantedAuthority> getGrantedAuthorities(String username) {
        Collection<GrantedAuthority> authorities = new ArrayList<>(1);
        authorities.add(new SimpleGrantedAuthority("ROLE_USER"));
        return authorities;
    }
    public WlyyUserSimple loadUserSimpleByUsername(String username) throws UsernameNotFoundException {
        List<WlyyUserSimple> users = this.getJdbcTemplate().query(DEFAULT_USER_DETAILS_STATEMENT, new BeanPropertyRowMapper(WlyyUserSimple.class), username, username, username);
        if (users == null || users.size() == 0) {
            throw new UsernameNotFoundException(username);
        }
        return users.get(0);
    }
}

+ 10 - 0
server/svr-authentication/src/main/java/com/yihu/jw/oauth2/model/WlyyUserDetails.java

@ -0,0 +1,10 @@
package com.yihu.jw.oauth2.model;
import java.io.Serializable;
/**
 * Model - 认证用户详细信息
 * Created by progr1mmer on 2018/8/29.
 */
public class WlyyUserDetails implements Serializable {
}

+ 10 - 0
server/svr-authentication/src/main/java/com/yihu/jw/oauth2/model/WlyyUserSimple.java

@ -0,0 +1,10 @@
package com.yihu.jw.oauth2.model;
import java.io.Serializable;
/**
 * Model - 认证用户简略信息
 * Created by progr1mmer on 2018/8/29.
 */
public class WlyyUserSimple implements Serializable {
}

+ 3 - 3
server/svr-configuration/src/main/java/com/yihu/SvrConfiguration.java

@ -11,14 +11,14 @@ import org.springframework.cloud.config.server.EnableConfigServer;
 */
@SpringBootApplication
@EnableConfigServer
public class SvrConfiguration extends SpringBootServletInitializer {
public class ConfigServer extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(SvrConfiguration.class, args);
        SpringApplication.run(ConfigServer.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SvrConfiguration.class);
        return application.sources(ConfigServer.class);
    }
}

+ 3 - 3
server/svr-discovery/src/main/java/com/yihu/SvrDiscovery.java

@ -11,14 +11,14 @@ import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
 */
@SpringBootApplication
@EnableEurekaServer
public class SvrDiscovery extends SpringBootServletInitializer {
public class DiscoveryServer extends SpringBootServletInitializer {
    public static void main(String[] args) {
        SpringApplication.run(SvrDiscovery.class, args);
        SpringApplication.run(DiscoveryServer.class, args);
    }
    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(SvrDiscovery.class);
        return application.sources(DiscoveryServer.class);
    }
}

+ 2 - 2
server/svr-zipkin/src/main/java/com/yihu/SvrZipkin.java

@ -9,9 +9,9 @@ import zipkin.server.EnableZipkinServer;
 */
@SpringBootApplication
@EnableZipkinServer
public class SvrZipkin {
public class ZipkinTrackServer {
    public static void main(String[] args) {
        SpringApplication.run(SvrZipkin.class, args);
        SpringApplication.run(ZipkinTrackServer.class, args);
    }
}

+ 5 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/dao/SmsGatewayDao.java

@ -4,9 +4,14 @@ import com.yihu.jw.entity.base.sms.SmsGatewayDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
/**
 * Dao - 短信网关
 * Created by progr1mmer on 2018/8/23.
 */
public interface SmsGatewayDao extends PagingAndSortingRepository<SmsGatewayDO, String>, JpaSpecificationExecutor<SmsGatewayDO> {
    List<SmsGatewayDO> findByClientIdAndStatus(String clientId, SmsGatewayDO.Status status);
}

+ 4 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/dao/SmsTemplateDao.java

@ -4,10 +4,14 @@ import com.yihu.jw.entity.base.sms.SmsTemplateDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.List;
/**
 * Dao - 短信模板
 * Created by progr1mmer on 2018/8/23.
 */
public interface SmsTemplateDao extends PagingAndSortingRepository<SmsTemplateDO, String>, JpaSpecificationExecutor<SmsTemplateDO> {
    List<SmsTemplateDO> findByClientIdAndType(String clientId, SmsTemplateDO.Type type);
}

+ 10 - 7
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/sms/SmsGatewayEndpoint.java

@ -1,8 +1,11 @@
package com.yihu.jw.base.endpoint.sms;
import com.yihu.jw.base.service.SmsGatewayService;
import com.yihu.jw.entity.base.sms.SmsDO;
import com.yihu.jw.entity.base.sms.SmsGatewayDO;
import com.yihu.jw.entity.base.sms.SmsTemplateDO;
import com.yihu.jw.restmodel.base.sms.SmsGatewayVO;
import com.yihu.jw.restmodel.base.sms.SmsVO;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.ListEnvelop;
import com.yihu.jw.restmodel.web.ObjEnvelop;
@ -93,16 +96,16 @@ public class SmsGatewayEndpoint extends EnvelopRestEndpoint {
        return success(smsGatewayDOS, SmsGatewayVO.class);
    }
    @GetMapping(value = BaseRequestMapping.SmsGateway.SEND)
    @PostMapping(value = BaseRequestMapping.SmsGateway.SEND)
    @ApiOperation(value = "发送短信")
    public Envelop send (
    public ObjEnvelop<SmsVO> send (
            @ApiParam(name = "clientId", value = "应用ID", required = true)
            @RequestParam(value = "clientId") String clientId,
            @ApiParam(name = "type", value = "短信标签类型", required = true)
            @RequestParam(value = "type") Integer type,
            @ApiParam(name = "mobile", value = "手机号码", required = true)
            @RequestParam(value = "mobile") String mobile) {
        return success("");
            @RequestParam(value = "type") SmsTemplateDO.Type type,
            @ApiParam(name = "to", value = "手机号码", required = true)
            @RequestParam(value = "to") String to) throws Exception {
        SmsDO smsDO = smsGatewayService.send(clientId, type, to);
        return success(smsDO, SmsVO.class);
    }
}

+ 111 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/service/SmsGatewayService.java

@ -1,9 +1,28 @@
package com.yihu.jw.base.service;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.yihu.jw.base.dao.SmsDao;
import com.yihu.jw.base.dao.SmsGatewayDao;
import com.yihu.jw.base.dao.SmsTemplateDao;
import com.yihu.jw.entity.base.sms.SmsDO;
import com.yihu.jw.entity.base.sms.SmsGatewayDO;
import com.yihu.jw.entity.base.sms.SmsTemplateDO;
import com.yihu.jw.exception.ApiException;
import com.yihu.mysql.query.BaseJpaService;
import com.yihu.utils.network.HttpResponse;
import com.yihu.utils.network.HttpUtils;
import com.yihu.utils.network.IPInfoUtils;
import org.apache.commons.lang3.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.MalformedParameterizedTypeException;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * Service - 短信网关
@ -12,4 +31,96 @@ import org.springframework.stereotype.Service;
@Service
public class SmsGatewayService extends BaseJpaService<SmsGatewayDO, SmsGatewayDao> {
    private static final Pattern PATTERN  = Pattern.compile("\\$\\{[A-Za-z0-9]+\\}");
    @Autowired
    private SmsTemplateDao smsTemplateDao;
    @Autowired
    private SmsGatewayDao smsGatewayDao;
    @Autowired
    private SmsDao smsDao;
    @Autowired
    private ObjectMapper objectMapper;
    public SmsDO send(String clientId, SmsTemplateDO.Type type, String to) throws Exception {
        List<SmsGatewayDO> smsGatewayDOS = smsGatewayDao.findByClientIdAndStatus(clientId, SmsGatewayDO.Status.available);
        if (smsGatewayDOS.size() == 0) {
            throw new ApiException("no gateway available");
        }
        List<SmsTemplateDO> smsTemplateDOS = smsTemplateDao.findByClientIdAndType(clientId, type);
        if (smsTemplateDOS.size() == 0) {
            throw new ApiException("no template available");
        }
        Random random = new Random();
        SmsGatewayDO smsGatewayDO = smsGatewayDOS.get(random.nextInt(smsGatewayDOS.size()));
        SmsTemplateDO smsTemplateDO = smsTemplateDOS.get(random.nextInt(smsTemplateDOS.size()));
        //生成内容
        String rawContent = smsTemplateDO.getContent();
        /*
         * 0 - 验证码
         * 1 - 过期时间(分钟)
         */
        String [] contentDatas = new String[] {
                randomInt(6),
                smsGatewayDO.getExpireMin().toString()
        };
        Matcher contentMatcher = PATTERN.matcher(rawContent);
        int index = 0;
        while (contentMatcher.find()) {
            String matchWord = contentMatcher.group(0);
            rawContent = rawContent.replace(matchWord, contentDatas[index]);
            index ++;
        }
        String sendContent = smsTemplateDO.getHeader() + rawContent;
        //第三方API服务请求参数
        String rawCertificate = smsGatewayDO.getRequestCertificate();
        /*
         * 0 - 接收手机号码
         * 1 - 短信内容
         */
        String [] certificateDatas = new String[] {
                to,
                sendContent
        };
        Matcher certificateMatcher = PATTERN.matcher(rawCertificate);
        index = 0;
        while (certificateMatcher.find()) {
            String matchWord = certificateMatcher.group(0);
            rawCertificate = rawCertificate.replace(matchWord, certificateDatas[index]);
            index ++;
        }
        HttpResponse httpResponse = HttpUtils.doPost(smsGatewayDO.getRequestUrl(), objectMapper.readValue(rawCertificate, Map.class));
        if (httpResponse.isSuccessFlg()) {
            Map<String, Object> response = objectMapper.readValue(httpResponse.getContent(), Map.class);
            if (response.get(smsGatewayDO.getResponseCode()).equals(smsGatewayDO.getSuccessValue())) {
                HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
                SmsDO smsDO = new SmsDO();
                smsDO.setClientId(clientId);
                smsDO.setSmsGatewayId(smsGatewayDO.getId());
                smsDO.setRequestIp(IPInfoUtils.getIPAddress(request));
                smsDO.setTo(to);
                smsDO.setContent(sendContent);
                smsDO.setDeadline(DateUtils.addMinutes(new Date(), smsGatewayDO.getExpireMin()));
                smsDO.setCaptcha(contentDatas[0]);
                smsDO.setType(type);
                return smsDao.save(smsDO);
            } else {
                throw new ApiException(httpResponse.getContent());
            }
        } else {
            throw new ApiException(httpResponse.getContent());
        }
    }
    private String randomInt(int length) {
        String str = "0123456789";
        StringBuffer buffer = new StringBuffer();
        Random random = new Random();
        for(int i = 0; i < length; ++i) {
            int pos = random.nextInt(str.length());
            buffer.append(str.charAt(pos));
        }
        return buffer.toString();
    }
}