Browse Source

jw2.0代码提交

liuwenbin 7 years ago
parent
commit
28fe56b10d
44 changed files with 2003 additions and 194 deletions
  1. 10 0
      common/common-entity/src/main/java/com/yihu/jw/base/base/SaasDO.java
  2. 10 10
      common/common-entity/src/main/java/com/yihu/jw/base/sms/BaseSmsDO.java
  3. 38 0
      common/common-entity/src/main/java/com/yihu/jw/base/user/BaseEmployDO.java
  4. 6 0
      common/common-fegin/src/main/java/com/yihu/jw/fegin/base/base/SaasFeign.java
  5. 51 0
      common/common-fegin/src/main/java/com/yihu/jw/fegin/base/login/LoginFeign.java
  6. 34 0
      common/common-fegin/src/main/java/com/yihu/jw/fegin/base/sms/RegisterSmsFeign.java
  7. 6 1
      common/common-fegin/src/main/java/com/yihu/jw/fegin/base/user/EmployFeign.java
  8. 25 0
      common/common-fegin/src/main/java/com/yihu/jw/fegin/common/security/LoginSmsFeign.java
  9. 5 0
      common/common-fegin/src/main/java/com/yihu/jw/fegin/fallbackfactory/base/base/SaasFeignFallbackFactory.java
  10. 4 0
      common/common-fegin/src/main/java/com/yihu/jw/fegin/fallbackfactory/base/user/EmployeeFeignFallbackFactory.java
  11. 5 0
      common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseLoginRequestMapping.java
  12. 15 0
      common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseSecurityRequestMapping.java
  13. 1 1
      common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseSmsRequestMapping.java
  14. 31 0
      common/common-util/pom.xml
  15. 168 0
      common/common-util/src/main/java/com/yihu/jw/util/common/ConvertToSpellUtils.java
  16. 148 0
      common/common-util/src/main/java/com/yihu/jw/util/common/IdCardUtil.java
  17. 43 0
      common/common-util/src/main/java/com/yihu/jw/util/common/MobileUtils.java
  18. 58 0
      common/common-util/src/main/java/com/yihu/jw/util/common/NetworkUtil.java
  19. 39 0
      common/common-util/src/main/java/com/yihu/jw/util/common/SmsValidateCodeUtils.java
  20. 221 0
      common/common-util/src/main/java/com/yihu/jw/util/http/HttpClientUtil.java
  21. 72 0
      common/common-util/src/main/java/com/yihu/jw/vo/ValidateCode.java
  22. BIN
      data/elasticsearch/nodes/0/_state/global-0.st
  23. 0 0
      data/elasticsearch/nodes/0/node.lock
  24. 9 0
      svr/svr-base/src/main/java/com/yihu/jw/SvrBaseApplication.java
  25. 2 1
      svr/svr-base/src/main/java/com/yihu/jw/business/base/controller/ModuleFunController.java
  26. 2 1
      svr/svr-base/src/main/java/com/yihu/jw/business/base/service/ModuleFunService.java
  27. 117 0
      svr/svr-base/src/main/java/com/yihu/jw/business/login/contorller/LoginController.java
  28. 131 0
      svr/svr-base/src/main/java/com/yihu/jw/business/login/service/LoginService.java
  29. 9 0
      svr/svr-base/src/main/java/com/yihu/jw/business/sms/dao/SmsDao.java
  30. 166 5
      svr/svr-base/src/main/java/com/yihu/jw/business/sms/service/SmsService.java
  31. 49 0
      svr/svr-base/src/main/java/com/yihu/jw/business/sms/vo/SMSHttpVo.java
  32. 11 4
      svr/svr-base/src/main/java/com/yihu/jw/config/jpa/HibernateProperties.java
  33. 33 15
      svr/svr-base/src/main/resources/application.yml
  34. 9 2
      svr/svr-base/src/main/resources/bootstrap.yml
  35. 11 6
      web-gateway/pom.xml
  36. 3 1
      web-gateway/src/main/java/com/yihu/jw/WebGateWayAppliaction.java
  37. 55 39
      web-gateway/src/main/java/com/yihu/jw/config/security/ClientService.java
  38. 49 48
      web-gateway/src/main/java/com/yihu/jw/config/security/RbasService.java
  39. 63 59
      web-gateway/src/main/java/com/yihu/jw/config/security/UserService.java
  40. 100 0
      web-gateway/src/main/java/com/yihu/jw/controller/base/login/LoginContorller.java
  41. 40 0
      web-gateway/src/main/java/com/yihu/jw/controller/base/login/RegisterSmsContorller.java
  42. 134 0
      web-gateway/src/main/java/com/yihu/jw/controller/base/security/TokenController.java
  43. 18 0
      web-gateway/src/main/resources/application.yml
  44. 2 1
      web-gateway/src/main/resources/bootstrap.yml

+ 10 - 0
common/common-entity/src/main/java/com/yihu/jw/base/base/SaasDO.java

@ -20,6 +20,7 @@ public class SaasDO extends IdEntityWithOperation implements java.io.Serializabl
	private String name;//名称
	private Integer status;//状态 -1 已删除 0待审核 1审核通过 2 审核不通过
	private String remark;//备注
	private String familyTel;
	// Constructors
	/** default constructor */
@ -53,4 +54,13 @@ public class SaasDO extends IdEntityWithOperation implements java.io.Serializabl
	public void setRemark(String remark) {
		this.remark = remark;
	}
	@Column(name = "family_tel", length = 100)
	public String getFamilyTel() {
		return familyTel;
	}
	public void setFamilyTel(String familyTel) {
		this.familyTel = familyTel;
	}
}

+ 10 - 10
common/common-entity/src/main/java/com/yihu/jw/base/sms/BaseSmsDO.java

@ -21,11 +21,11 @@ public class BaseSmsDO extends IdEntityWithOperation implements java.io.Serializ
	private String mobile;	//电话号码
	private String ip;	//发送短信的ip地址
	private Integer type;	//发送短信的类别
	private String captcha;	//验证码 1微信端注册,2微信端找回密码,3医生端找回密码,4患者登录,5医生登录
	private String captcha;	//验证码 1居民端注册,2居民端找回密码,3医生端找回密码,4居民登录,5医生登录
	private String content;	// 短信内容
	private Date deadline;	//过期时间
	private Integer status;	//短信状态 状态,0未发送,1已发送
	private Date czrq;//操作日期
//	private Date czrq;//操作日期
	// Constructors
@ -133,12 +133,12 @@ public class BaseSmsDO extends IdEntityWithOperation implements java.io.Serializ
		this.status = status;
	}
	@Column(name = "czrq")
	public Date getCzrq() {
		return czrq;
	}
	public void setCzrq(Date czrq) {
		this.czrq = czrq;
	}
//	@Column(name = "czrq")
//	public Date getCzrq() {
//		return czrq;
//	}
//
//	public void setCzrq(Date czrq) {
//		this.czrq = czrq;
//	}
}

+ 38 - 0
common/common-entity/src/main/java/com/yihu/jw/base/user/BaseEmployDO.java

@ -20,12 +20,16 @@ public class BaseEmployDO extends IdEntityWithOperation implements java.io.Seria
	private String saasId; //saasIDF
	private String name; //名字
	private String pyCode; //拼音
	private String ssc;//医保卡号
	private String sex; //性别
	private String photo; //头像
	private String skill;//专长
	private String workPortal;//医生门户首页
	private String email;//邮箱
	private String phone;//联系电话
	private String password;//账户密码
	private String salt;//账户密码的盐
	private String idcard;//身份证号
	private String secondPhone;//备用电话
	private String familyTel;//家庭电话(固)
	private String officeTel;//办公电话(固)
@ -211,5 +215,39 @@ public class BaseEmployDO extends IdEntityWithOperation implements java.io.Seria
		this.status = status;
	}
	@Column(name = "password")
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	@Column(name = "salt")
	public String getSalt() {
		return salt;
	}
	public void setSalt(String salt) {
		this.salt = salt;
	}
	@Column(name = "idcard")
	public String getIdcard() {
		return idcard;
	}
	public void setIdcard(String idcard) {
		this.idcard = idcard;
	}
	@Column(name = "ssc")
	public String getSsc() {
		return ssc;
	}
	public void setSsc(String ssc) {
		this.ssc = ssc;
	}
}

+ 6 - 0
common/common-fegin/src/main/java/com/yihu/jw/fegin/base/base/SaasFeign.java

@ -4,7 +4,10 @@ import com.yihu.jw.fegin.fallbackfactory.base.base.SaasFeignFallbackFactory;
import com.yihu.jw.restmodel.CommonContants;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.rm.base.BaseRequestMapping;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@ -19,4 +22,7 @@ public interface SaasFeign {
    @GetMapping(value = BaseRequestMapping.Saas.api_getSaassNoPage)
    Envelop getList(@RequestParam(value = "fields",required = false)String fields,@RequestParam(value = "filters",required = false) String filters,@RequestParam(value = "sorts",required = false) String sorts);
    @GetMapping(value = BaseRequestMapping.Saas.api_getById, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    Envelop findByCode(@RequestParam(value = "id", required = true) String id);
}

+ 51 - 0
common/common-fegin/src/main/java/com/yihu/jw/fegin/base/login/LoginFeign.java

@ -0,0 +1,51 @@
package com.yihu.jw.fegin.base.login;
import com.yihu.jw.fegin.fallbackfactory.base.base.FunctionFeignFallbackFactory;
import com.yihu.jw.restmodel.CommonContants;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.restmodel.common.base.BaseEnvelop;
import com.yihu.jw.rm.base.BaseLoginRequestMapping;
import com.yihu.jw.rm.base.BaseRequestMapping;
import com.yihu.jw.rm.base.BaseUserRequestMapping;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Created by 刘文彬 on 2018/4/20.
 */
@FeignClient(
        name = CommonContants.svr_base // name值是eurika的实例名字
//        ,fallbackFactory  = FunctionFeignFallbackFactory.class
)
@RequestMapping(value = BaseLoginRequestMapping.api_common)
public interface LoginFeign {
    @PostMapping(value = BaseLoginRequestMapping.BaseLoginAccount.api_checkoutInfo, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    Envelop checkoutInfo();
    @PostMapping(value = BaseLoginRequestMapping.BaseLoginAccount.api_accountSub, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    Envelop register(
            @RequestParam(value = "mobilePhone", required = true) String mobilePhone,
            @RequestParam(value = "saasId", required = true) String saasId,
            @RequestParam(value = "type", required = true) int type,
            @RequestParam(value = "captcha", required = true) String captcha,
            @RequestParam(value = "name", required = true) String name,
            @RequestParam(value = "password", required = true) String password,
            @RequestParam(value = "idcard", required = true) String idcard,
            @RequestParam(value = "ssc", required = true) String ssc);
    @PostMapping(value = BaseLoginRequestMapping.BaseLoginAccount.api_login, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    Envelop login(@RequestParam(value = "mobilePhone", required = false) String mobilePhone,
                           @RequestParam(value = "password", required = false) String password,
                           @RequestParam(value = "saasId", required = true) String saasId,
                           @RequestParam(value = "captcha", required = false) String captcha);
}

+ 34 - 0
common/common-fegin/src/main/java/com/yihu/jw/fegin/base/sms/RegisterSmsFeign.java

@ -0,0 +1,34 @@
package com.yihu.jw.fegin.base.sms;
import com.yihu.jw.restmodel.CommonContants;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.restmodel.common.base.BaseEnvelop;
import com.yihu.jw.rm.base.BaseLoginRequestMapping;
import com.yihu.jw.rm.base.BaseRequestMapping;
import com.yihu.jw.rm.base.BaseSmsRequestMapping;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
 * Created by 刘文彬 on 2018/4/23.
 */
@FeignClient(
        name = CommonContants.svr_base // name值是eurika的实例名字
)
@RequestMapping(value = BaseSmsRequestMapping.api_common)
public interface RegisterSmsFeign {
    @PostMapping(value = BaseSmsRequestMapping.Sms.api_sms_send, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    BaseEnvelop send(@ApiParam(name = "mobile", value = "手机号码", required = true) @RequestParam(value = "mobile", required = true) String mobile,
                     @ApiParam(name = "type", value = "短信验证码类型", required = true) @RequestParam(value = "type", required = true) int type,
                     @ApiParam(name = "saasId", value = "saasId", required = true) @RequestParam(value = "saasId", required = true) String saasId) throws IOException ;
    }

+ 6 - 1
common/common-fegin/src/main/java/com/yihu/jw/fegin/base/user/EmployFeign.java

@ -6,6 +6,8 @@ import com.yihu.jw.restmodel.CommonContants;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.rm.base.BaseRequestMapping;
import com.yihu.jw.rm.base.BaseUserRequestMapping;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@ -17,7 +19,7 @@ import org.springframework.web.bind.annotation.*;
        name = CommonContants.svr_base // name值是eurika的实例名字
        ,fallbackFactory  = EmployeeFeignFallbackFactory.class
)
@RequestMapping(value = BaseRequestMapping.api_base_common)
@RequestMapping(value = BaseUserRequestMapping.api_user_common)
public interface EmployFeign {
    @RequestMapping(value = BaseUserRequestMapping.BaseEmploy.api_create,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,method = RequestMethod.POST)
@ -57,5 +59,8 @@ public interface EmployFeign {
    @RequestMapping(value = BaseUserRequestMapping.BaseEmployRole.api_getListNoPage,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE,method = RequestMethod.POST)
    Envelop getRoleList(@RequestBody String jsonData) throws JiWeiException;
    @GetMapping(value = BaseUserRequestMapping.BaseEmploy.api_getByPhone)
    Envelop getEmployeeByPhoneAndSaasId(@RequestParam(value = "phone", required = true) String phone,@RequestParam(value = "saasId", required = true) String saasId);
}

+ 25 - 0
common/common-fegin/src/main/java/com/yihu/jw/fegin/common/security/LoginSmsFeign.java

@ -0,0 +1,25 @@
package com.yihu.jw.fegin.common.security;
import com.yihu.jw.fegin.fallbackfactory.base.base.SaasFeignFallbackFactory;
import com.yihu.jw.restmodel.CommonContants;
import com.yihu.jw.rm.base.BaseLoginRequestMapping;
import com.yihu.jw.rm.base.BaseRequestMapping;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.request.ServletWebRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Created by 刘文彬 on 2018/4/23.
 */
@FeignClient(
        name = CommonContants.svr_base // name值是eurika的实例名字
)
@RequestMapping(value = BaseRequestMapping.api_base_common)
public interface LoginSmsFeign {
    @GetMapping(BaseLoginRequestMapping.BaseLoginAccount.mobileSendSms)
    void createCode(HttpServletRequest request,HttpServletResponse response)throws Exception;
}

+ 5 - 0
common/common-fegin/src/main/java/com/yihu/jw/fegin/fallbackfactory/base/base/SaasFeignFallbackFactory.java

@ -16,6 +16,11 @@ public class SaasFeignFallbackFactory implements FallbackFactory<SaasFeign> {
            public Envelop getList(@RequestParam(value = "fields") String fields, @RequestParam(value = "filters") String filters, @RequestParam(value = "sorts") String sorts) {
                return null;
            }
            @Override
            public Envelop findByCode(@RequestParam(value = "id") String id) {
                return null;
            }
        };
    }
}

+ 4 - 0
common/common-fegin/src/main/java/com/yihu/jw/fegin/fallbackfactory/base/user/EmployeeFeignFallbackFactory.java

@ -97,6 +97,10 @@ public class EmployeeFeignFallbackFactory  implements FallbackFactory<EmployFeig
                throw new JiWeiException(e);
            }
            @Override
            public Envelop getEmployeeByPhoneAndSaasId(String phone, String saasId){
                return null;
            }
        };
    }
}

+ 5 - 0
common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseLoginRequestMapping.java

@ -2,6 +2,7 @@ package com.yihu.jw.rm.base;
public class BaseLoginRequestMapping {
    public static final String api_common = BaseRequestMapping.api_base_common + "/login";
    public static final String api_gateway_common = BaseRequestMapping.api_base_common + "/gateway/login";
    /**
     * 用户账号类型
@ -12,6 +13,10 @@ public class BaseLoginRequestMapping {
        public static final String api_delete = "/baseLoginAccount/{ids}";
        public static final String api_getById = "/baseLoginAccount/{id}";
        public static final String api_getOne="/baseLoginAccount";
        public static final String mobileSendSms = "/code/sms";
        public static final String api_checkoutInfo = "/register/checkInfo";
        public static final String api_accountSub = "/register/accountSub";
        public static final String api_login= "/authentication/form";
        public static final String message_success_create = "baseLoginAccount create success";
        public static final String message_success_update = "baseLoginAccount update success";

+ 15 - 0
common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseSecurityRequestMapping.java

@ -0,0 +1,15 @@
package com.yihu.jw.rm.base;
/**
 * Created by 刘文彬 on 2018/5/4.
 */
public class BaseSecurityRequestMapping {
    public static final String api_common=BaseRequestMapping.api_base_common+"/security";
    public static class BaseToken {
        public static final String api_update_token_expiration_time = "/update/tokenExpiration/time";
        public static final String api_update_token_expiration_second = "/update/tokenExpiration/second";
        public static final String api_update_token_expiration_second2 = "/update/tokenExpiration/second2";
        public static final String api_update_token_expiration = "/update/tokenExpiration";
    }
}

+ 1 - 1
common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseSmsRequestMapping.java

@ -21,7 +21,7 @@ public class BaseSmsRequestMapping {
        public static final String message_fail_id_is_null="id is null";
        public static final String api_create="sms";
        public static final String api_sms_send="send";
        public static final String api_update="sms";
        public static final String api_getSmss="getSmss";

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

@ -18,5 +18,36 @@
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>
        <dependency>
            <groupId>org.json</groupId>
            <artifactId>json</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>4.3.7.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.stuxuhai</groupId>
            <artifactId>jpinyin</artifactId>
            <version>1.1.8</version>
        </dependency>
    </dependencies>
</project>

+ 168 - 0
common/common-util/src/main/java/com/yihu/jw/util/common/ConvertToSpellUtils.java

@ -0,0 +1,168 @@
package com.yihu.jw.util.common;
import com.github.stuxuhai.jpinyin.ChineseHelper;
import com.github.stuxuhai.jpinyin.PinyinFormat;
import com.github.stuxuhai.jpinyin.PinyinHelper;
/**
 * Created by 刘文彬 on 2018/4/18.
 */
public class ConvertToSpellUtils {
    /**
     * 转换为有声调的拼音字符串
     * @param pinYinStr 汉字
     * @return 有声调的拼音字符串
     */
    public static String changeToMarkPinYin(String pinYinStr){
        String tempStr = null;
        try
        {
            tempStr =  PinyinHelper.convertToPinyinString(pinYinStr,  " ", PinyinFormat.WITH_TONE_MARK);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return tempStr;
    }
    /**
     * 转换为数字声调字符串
     * @param pinYinStr 需转换的汉字
     * @return 转换完成的拼音字符串
     */
    public static String changeToNumberPinYin(String pinYinStr){
        String tempStr = null;
        try
        {
            tempStr = PinyinHelper.convertToPinyinString(pinYinStr, " ", PinyinFormat.WITH_TONE_NUMBER);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return tempStr;
    }
    /**
     * 转换为不带音调的拼音字符串
     * @param pinYinStr 需转换的汉字
     * @return 拼音字符串
     */
    public static String changeToTonePinYin(String pinYinStr){
        String tempStr = null;
        try
        {
            tempStr =  PinyinHelper.convertToPinyinString(pinYinStr, " ", PinyinFormat.WITHOUT_TONE);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return tempStr;
    }
    /**
     * 转换为每个汉字对应拼音首字母字符串
     * @param pinYinStr 需转换的汉字
     * @return 拼音字符串
     */
    public static String changeToGetShortPinYin(String pinYinStr){
        String tempStr = null;
        try
        {
            tempStr = PinyinHelper.getShortPinyin(pinYinStr);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return tempStr;
    }
    /**
     * 检查汉字是否为多音字
     * @param pinYinStr 需检查的汉字
     * @return true 多音字,false 不是多音字
     */
    public static boolean checkPinYin(char pinYinStr){
        boolean check  = false;
        try
        {
            check = PinyinHelper.hasMultiPinyin(pinYinStr);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return check;
    }
    /**
     * 简体转换为繁体
     * @param pinYinStr
     * @return
     */
    public static String changeToTraditional(String pinYinStr){
        String tempStr = null;
        try
        {
            tempStr = ChineseHelper.convertToTraditionalChinese(pinYinStr);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return tempStr;
    }
    /**
     * 繁体转换为简体
     * @param pinYinSt
     * @return
     */
    public static String changeToSimplified(String pinYinSt){
        String tempStr = null;
        try
        {
            tempStr = ChineseHelper.convertToSimplifiedChinese(pinYinSt);
        } catch (Exception e)
        {
            e.printStackTrace();
        }
        return tempStr;
    }
    public static void main(String[] args) {
      String str = "我是谁";
      System.out.println(ConvertToSpellUtils.changeToTonePinYin(str));
      System.out.println(ConvertToSpellUtils.checkPinYin('重'));
    }
    //汉字转首字母大写的拼音
    public static String changeToInitialPinYin(String pinYinStr){
        String origin = changeToTonePinYin(pinYinStr);
        String[] perChinese =  origin.split("\\s+");
        String result ="";
        for(String one : perChinese){
            result += one.toUpperCase();
        }
        return result;
    }
}

+ 148 - 0
common/common-util/src/main/java/com/yihu/jw/util/common/IdCardUtil.java

@ -0,0 +1,148 @@
package com.yihu.jw.util.common;
import org.apache.commons.lang3.StringUtils;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
/**
 * Created by Administrator on 2016.08.17.
 * 身份证工具类
 */
public class IdCardUtil {
//    /**
//     * 根据身份证的号码算出当前身份证持有者的年龄
//     *
//     * @param
//     * @throws Exception
//     */
//    public static int getAgeForIdcard(String card)
//            throws Exception {
//        int age = 0;
//        if (card.length() == 18) {
//            String year = card.substring(6).substring(0, 4);// 得到年份
//            String yue = card.substring(10).substring(0, 2);// 得到月份
//            // String day=CardCode.substring(12).substring(0,2);//得到日
//            Date date = new Date();// 得到当前的系统时间
//            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//            String fyear = format.format(date).substring(0, 4);// 当前年份
//            String fyue = format.format(date).substring(5, 7);// 月份
//            if (Integer.parseInt(yue) <= Integer.parseInt(fyue)) { // 当前月份大于用户出身的月份表示已过生
//                age = Integer.parseInt(fyear) - Integer.parseInt(year) + 1;
//            } else {// 当前用户还没过生
//                age = Integer.parseInt(fyear) - Integer.parseInt(year);
//            }
//        } else if (card.length() == 15) {
//            String uyear = "19" + card.substring(6, 8);// 年份
//            String uyue = card.substring(8, 10);// 月份
//            Date date = new Date();// 得到当前的系统时间
//            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
//            String fyear = format.format(date).substring(0, 4);// 当前年份
//            String fyue = format.format(date).substring(5, 7);// 月份
//            // String fday=format.format(date).substring(8,10);
//            if (Integer.parseInt(uyue) <= Integer.parseInt(fyue)) { // 当前月份大于用户出身的月份表示已过生
//                age = Integer.parseInt(fyear) - Integer.parseInt(uyear) + 1;
//            } else {// 当前用户还没过生
//                age = Integer.parseInt(fyear) - Integer.parseInt(uyear);
//            }
//
//        }
//        return age;
//    }
    /**
     * 根据身份证的号码算出当前身份证持有者的年龄
     *
     * @param
     * @throws Exception
     */
    public static int getAgeForIdcard(String idcard) {
        try {
            int age = 0;
            if (StringUtils.isEmpty(idcard)) {
                return age;
            }
            String birth = "";
            if (idcard.length() == 18) {
                birth = idcard.substring(6, 14);
            } else if (idcard.length() == 15) {
                birth = "19" + idcard.substring(6, 12);
            }
            int year = Integer.valueOf(birth.substring(0, 4));
            int month = Integer.valueOf(birth.substring(4, 6));
            int day = Integer.valueOf(birth.substring(6));
            Calendar cal = Calendar.getInstance();
            age = cal.get(Calendar.YEAR) - year;
            //周岁计算
            if (cal.get(Calendar.MONTH) < (month - 1) || (cal.get(Calendar.MONTH) == (month - 1) && cal.get(Calendar.DATE) < day)) {
                age--;
            }
            return age;
        } catch (Exception e) {
        }
        return -1;
    }
    /**
     * 身份证提取出身日期
     *
     * @param card
     * @return
     * @throws Exception
     */
    public static Date getBirthdayForIdcard(String card)
            throws Exception {
        Date b = null;
        if (card.length() == 18) {
            String year = card.substring(6).substring(0, 4);// 得到年份
            String yue = card.substring(10).substring(0, 2);// 得到月份
            String ri = card.substring(12).substring(0, 2);// 得到日
            // String day=CardCode.substring(12).substring(0,2);//得到日
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            b = format.parse(year + "-" + yue + "-" + ri);
        } else if (card.length() == 15) {
            String uyear = "19" + card.substring(6, 8);// 年份
            String uyue = card.substring(8, 10);// 月份
            String uri = card.substring(10, 12);// 得到日
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            b = format.parse(uyear + "-" + uyue + "-" + uri);
        }
        return b;
    }
//    public static
//    if (cardId.length() == 15 || cardId.length() == 18) {
//        if (!this.cardCodeVerifySimple(cardId)) {
//            error.put("cardId", "15位或18位身份证号码不正确");
//        } else {
//            if (cardId.length() == 18 && !this.cardCodeVerify(cardId)) {
//                error.put("cardId", "18位身份证号码不符合国家规范");
//            }
//        }
//    } else {
//        error.put("cardId", "身份证号码长度必须等于15或18位");
//    }
    private boolean cardCodeVerifySimple(String cardcode) {
        //第一代身份证正则表达式(15位)
        String isIDCard1 = "^[1-9]\\d{7}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])\\d{3}$";
        //第二代身份证正则表达式(18位)
        String isIDCard2 ="^[1-9]\\d{5}[1-9]\\d{3}((0\\d)|(1[0-2]))(([0|1|2]\\d)|3[0-1])((\\d{4})|\\d{3}[A-Z])$";
        //验证身份证
        if (cardcode.matches(isIDCard1) || cardcode.matches(isIDCard2)) {
            return true;
        }
        return false;
    }
}

+ 43 - 0
common/common-util/src/main/java/com/yihu/jw/util/common/MobileUtils.java

@ -0,0 +1,43 @@
package com.yihu.jw.util.common;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
 * Created by 刘文彬 on 2018/4/23.
 */
public class MobileUtils {
    public static 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;
    }
}

+ 58 - 0
common/common-util/src/main/java/com/yihu/jw/util/common/NetworkUtil.java

@ -0,0 +1,58 @@
package com.yihu.jw.util.common;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/** 
 * 常用获取客户端信息的工具 
 *  
 */
public final class NetworkUtil {
	/**
	 * 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址;
	 *
	 * @param request
	 * @return
	 * @throws IOException
	 */
	public final static String getIpAddress(HttpServletRequest request) throws IOException {
		// 获取请求主机IP地址,如果通过代理进来,则透过防火墙获取真实IP地址
		String ip = request.getHeader("X-Forwarded-For");
		if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("Proxy-Client-IP");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("WL-Proxy-Client-IP");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("HTTP_CLIENT_IP");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getHeader("HTTP_X_FORWARDED_FOR");
			}
			if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
				ip = request.getRemoteAddr();
			}
		} else if (ip.length() > 15) {
			String[] ips = ip.split(",");
			for (int index = 0; index < ips.length; index++) {
				String strIp = (String) ips[index];
				if (!("unknown".equalsIgnoreCase(strIp))) {
					ip = strIp;
					break;
				}
			}
		}
		return ip;
	}
}

+ 39 - 0
common/common-util/src/main/java/com/yihu/jw/util/common/SmsValidateCodeUtils.java

@ -0,0 +1,39 @@
package com.yihu.jw.util.common;
import com.yihu.jw.vo.ValidateCode;
import org.springframework.web.context.request.ServletWebRequest;
import java.util.Random;
/**
 * Created by 刘文彬 on 2018/4/23.
 */
public class SmsValidateCodeUtils {
    /**
     *
     * @param length 短信验证码长度
     * @param expireIn 短信验证码过期时间
     * @return
     */
    public static ValidateCode generate(int length,int expireIn) {
        String code = getFixLenthString(length);
        ValidateCode validateCode = new ValidateCode(code, expireIn);
        return validateCode;
    }
    /*
 * 返回长度为【strLength】的随机数,在前面补0
 */
    private static String getFixLenthString(int strLength) {
        Random rm = new Random();
        // 获得随机数
        double pross = (1 + rm.nextDouble()) * Math.pow(10, strLength);
        // 将获得的获得随机数转化为字符串
        String fixLenthString = String.valueOf(pross);
        // 返回固定的长度的随机数
        return fixLenthString.substring(1, strLength + 1);
    }
}

+ 221 - 0
common/common-util/src/main/java/com/yihu/jw/util/http/HttpClientUtil.java

@ -0,0 +1,221 @@
package com.yihu.jw.util.http;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONObject;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@Component
public class HttpClientUtil {
    /**
     * 发送post请求
     *
     * @param url     请求地址
     * @param params  请求参数
     * @param chatSet 编码格式
     * @return
     */
    public  String post(String url, List<NameValuePair> params, String chatSet) {
        // 创建默认的httpClient实例.
        CloseableHttpClient httpclient = HttpClients.createDefault();
        // 创建httppost
        HttpPost httppost = new HttpPost(url);
        UrlEncodedFormEntity uefEntity;
        try {
            uefEntity = new UrlEncodedFormEntity(params, chatSet);
            httppost.setEntity(uefEntity);
            CloseableHttpResponse response = httpclient.execute(httppost);
            try {
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    return EntityUtils.toString(entity, chatSet);
                }
            } finally {
                response.close();
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭连接,释放资源
            try {
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    /**
     * 发送get请求
     *
     * @param url     请求地址
     * @param chatSet 编码格式
     * @return
     */
    public  String get(String url, String chatSet) {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            // 创建httpget.
            HttpGet httpget = new HttpGet(url);
            // 执行get请求.
            CloseableHttpResponse response = httpclient.execute(httpget);
            try {
                // 获取响应实体
                HttpEntity entity = response.getEntity();
                if (entity != null) {
                    return EntityUtils.toString(entity, chatSet);
                }
            } finally {
                response.close();
            }
        } catch (ClientProtocolException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 关闭连接,释放资源
            try {
                httpclient.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
    /**
     * http调用方法,(健康之路开放平台)
     *
     * @param url
     * @param params
     * @return
     * @throws Exception
     */
    public  String httpPost(String url, Map<String, String> params) throws Exception {
        CloseableHttpClient httpclient = HttpClients.createDefault();
        try {
            HttpPost httpPost = new HttpPost(url);
            if (params != null && params.size() > 0) {
                List<NameValuePair> valuePairs = new ArrayList<NameValuePair>(params.size());
                for (Map.Entry<String, String> entry : params.entrySet()) {
                    NameValuePair nameValuePair = new BasicNameValuePair(entry.getKey(), String.valueOf(entry.getValue()));
                    valuePairs.add(nameValuePair);
                }
                UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(valuePairs, "UTF-8");
                httpPost.setEntity(formEntity);
            }
            CloseableHttpResponse resp = httpclient.execute(httpPost);
            try {
                HttpEntity entity = resp.getEntity();
                String respContent = EntityUtils.toString(entity, "UTF-8").trim();
                return respContent;
            } finally {
                resp.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        } finally {
            httpclient.close();
        }
    }
    /**
     * 获取加密后参数集合(健康之路开放平台)
     *
     * @param params
     * @return
     */
    public  Map<String, String> getSecretParams(Map<String, String> params, String appId, String secret) {
        String timestamp = Long.toString(System.currentTimeMillis());
        params.put("timestamp", timestamp);
        StringBuilder stringBuilder = new StringBuilder();
        // 对参数名进行字典排序  
        String[] keyArray = params.keySet().toArray(new String[0]);
        Arrays.sort(keyArray);
        // 拼接有序的参数名-值串  
        stringBuilder.append(appId);
        for (String key : keyArray) {
            stringBuilder.append(key).append(params.get(key));
        }
        String codes = stringBuilder.append(secret).toString();
        String sign = org.apache.commons.codec.digest.DigestUtils.shaHex(codes).toUpperCase();
        // 添加签名,并发送请求  
        params.put("appId", appId);
        params.put("sign", sign);
        return params;
    }
    public static String postBody(String url, JSONObject params) {
        RestTemplate restTemplate = new RestTemplate();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(type);
        headers.add("Accept", MediaType.ALL_VALUE.toString());
        headers.add("Cache-Control", "no-cache");
        org.springframework.http.HttpEntity<String> formEntity = new org.springframework.http.HttpEntity<String>(params.toString(), headers);
        String ret = restTemplate.postForObject(url, formEntity, String.class);
        return ret;
    }
    public  void putBody(String url, JSONObject params) {
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        org.springframework.http.HttpEntity<String> formEntity = new org.springframework.http.HttpEntity<String>(params.toString(), headers);
        restTemplate.put(url, formEntity, String.class);
    }
    /**
     * 发送post请求
     *
     * @param url     请求地址
     * @param params  请求参数
     * @return
     */
    public String iotPostBody(String url, String params) {
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
        headers.setContentType(type);
        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
        org.springframework.http.HttpEntity<String> formEntity = new org.springframework.http.HttpEntity<String>(params, headers);
        String ret = restTemplate.postForObject(url, formEntity, String.class);
        return ret;
    }
}

+ 72 - 0
common/common-util/src/main/java/com/yihu/jw/vo/ValidateCode.java

@ -0,0 +1,72 @@
package com.yihu.jw.vo;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
/**
 * Created by 刘文彬 on 2018/4/23.
 */
public class ValidateCode implements Serializable {
    private String code;
    private LocalDateTime expireTime;
    private LocalDateTime createTime=LocalDateTime.now();
    public ValidateCode() {
    }
    public ValidateCode(String code, int expireIn) {
        this.code = code;
        this.expireTime = LocalDateTime.now().plusMinutes(expireIn);
    }
    public ValidateCode(String code, LocalDateTime expireTime) {
        this.code = code;
        this.expireTime = expireTime;
    }
    public boolean isExpried() {
        return LocalDateTime.now().isAfter(expireTime);
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
    public LocalDateTime getExpireTime() {
        return expireTime;
    }
    public void setExpireTime(LocalDateTime expireTime) {
        this.expireTime = expireTime;
    }
    public String getExpireTimeString() {
        return expireTime.format(DateTimeFormatter.ISO_DATE_TIME);
    }
    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);
    }
}

BIN
data/elasticsearch/nodes/0/_state/global-0.st


+ 0 - 0
data/elasticsearch/nodes/0/node.lock


+ 9 - 0
svr/svr-base/src/main/java/com/yihu/jw/SvrBaseApplication.java

@ -1,9 +1,14 @@
package com.yihu.jw;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration;
import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration;
import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
@ -19,6 +24,10 @@ import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
        transactionManagerRef = "baseTransactionManager"
)
@ComponentScan(basePackages={"com"})
@EnableJpaAuditing
@EnableAutoConfiguration(exclude = {
        ElasticsearchRepositoriesAutoConfiguration.class
})
public class SvrBaseApplication {
    public static void main(String[] args) {

+ 2 - 1
svr/svr-base/src/main/java/com/yihu/jw/business/base/controller/ModuleFunController.java

@ -6,6 +6,7 @@ import com.yihu.jw.restmodel.common.EnvelopRestController;
import com.yihu.jw.rm.base.BaseRequestMapping;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.json.JSONException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@ -31,7 +32,7 @@ public class ModuleFunController extends EnvelopRestController {
    @PutMapping(value =  BaseRequestMapping.ModuleFun.api_changeFun,consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "模块更新功能")
    public Envelop changeFun (@RequestBody String jsonData) {
    public Envelop changeFun (@RequestBody String jsonData) throws JSONException {
        moduleFunService.changeFun(jsonData);
        return Envelop.getSuccess("更新成功",null);
    }

+ 2 - 1
svr/svr-base/src/main/java/com/yihu/jw/business/base/service/ModuleFunService.java

@ -6,6 +6,7 @@ import com.yihu.jw.exception.ApiException;
import com.yihu.jw.exception.code.ExceptionCode;
import com.yihu.base.mysql.query.BaseJpaService;
import com.yihu.jw.rm.base.BaseRequestMapping;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@ -43,7 +44,7 @@ public class ModuleFunService extends BaseJpaService<ModuleFunctionDO, ModuleFun
     * 更改模块关联的功能
     * @param jsonData
     */
    public void changeFun(String jsonData) {
    public void changeFun(String jsonData) throws JSONException {
        JSONObject jsonObject =  new JSONObject(jsonData);
        if(!jsonObject.has("moduleCode")){
            throw new ApiException(BaseRequestMapping.ModuleFun.moduleId_is_null, ExceptionCode.common_error_params_code);

+ 117 - 0
svr/svr-base/src/main/java/com/yihu/jw/business/login/contorller/LoginController.java

@ -0,0 +1,117 @@
package com.yihu.jw.business.login.contorller;
//import com.yihu.base.security.properties.SecurityProperties;
//import com.yihu.base.security.sms.mobile.MobileCheck;
//import com.yihu.base.security.sms.process.SmsValidateCodeProcessor;
import com.yihu.jw.base.user.BaseEmployDO;
import com.yihu.jw.business.login.service.LoginService;
import com.yihu.jw.business.user.dao.EmployDao;
import com.yihu.jw.business.user.service.EmployService;
import com.yihu.jw.fegin.common.security.LoginSmsFeign;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.restmodel.common.EnvelopRestController;
import com.yihu.jw.restmodel.common.base.BaseEnvelop;
import com.yihu.jw.rm.base.BaseLoginRequestMapping;
import com.yihu.jw.rm.base.BaseUserRequestMapping;
import com.yihu.jw.util.common.ConvertToSpellUtils;
import com.yihu.jw.util.security.MD5;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.bouncycastle.util.encoders.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.net.InetAddress;
import java.util.UUID;
/**
 * Created by 刘文彬 on 2018/4/11.
 */
@RestController
@RequestMapping(BaseLoginRequestMapping.api_common)
@Api(description = "注册账户(医生端、微信端、用户端)")
public class LoginController extends EnvelopRestController {
    @Autowired
    private LoginService loginService;
    @PostMapping(value = BaseLoginRequestMapping.BaseLoginAccount.api_checkoutInfo, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "注册校验信息", notes = "注册校验姓名、身份证、医保卡号信息")
    public BaseEnvelop checkoutInfo(){
        //校验姓名、身份证以及医保卡号信息是否正确
        return null;
    }
    /**
     * 注册账号-提交
     * @param mobilePhone
     * @param saasId
     * @param type
     * @param captcha
     * @param name
     * @param password
     * @param idcard
     * @param ssc
     * @return
     */
    @PostMapping(value = BaseLoginRequestMapping.BaseLoginAccount.api_accountSub, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "注册账号", notes = "注册校验姓名、身份证、医保卡号信息")
    public Envelop register(
            @ApiParam(name = "mobilePhone", value = "电话号码(账号)", required = true) @RequestParam(value = "mobilePhone", required = true) String mobilePhone,
            @ApiParam(name = "saasId", value = "saasID", required = true) @RequestParam(value = "saasId", required = true) String saasId,
            @ApiParam(name = "type", value = "1微信端注册,2微信端找回密码,3医生端找回密码,4患者登录,5医生登录", required = true) @RequestParam(value = "type", required = true) int type,
            @ApiParam(name = "captcha", value = "短信验证码", required = true) @RequestParam(value = "captcha", required = true) String captcha,
            @ApiParam(name = "name", value = "姓名", required = true) @RequestParam(value = "name", required = true) String name,
            @ApiParam(name = "password", value = "账户密码", required = true) @RequestParam(value = "password", required = true) String password,
            @ApiParam(name = "idcard", value = "身份证", required = true) @RequestParam(value = "idcard", required = true) String idcard,
            @ApiParam(name = "ssc", value = "医保卡号", required = true) @RequestParam(value = "ssc", required = true) String ssc){
        try {
            //判断验证码是否正确
            Envelop envelop = new Envelop();//smsService.checkSms(mobilePhone,saasId,type,captcha);
            if(true){//if(envelop.getStatus()==200){
                return loginService.register(mobilePhone,password,saasId,name,idcard,ssc);
            }else{
                return envelop;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return new Envelop();
    }
    @PostMapping(value = BaseLoginRequestMapping.BaseLoginAccount.api_login, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public Envelop login(@ApiParam(name = "mobilePhone", value = "电话号码(账号)", required = false) @RequestParam(value = "mobilePhone", required = false) String mobilePhone,
                      @ApiParam(name = "password", value = "password", required = false) @RequestParam(value = "password", required = false) String password,
                      @ApiParam(name = "saasId", value = "saasID", required = true) @RequestParam(value = "saasId", required = true) String saasId,
                         @ApiParam(name = "captcha", value = "短信验证码", required = false) @RequestParam(value = "captcha", required = false) String captcha){
       return loginService.login(mobilePhone,password,saasId,captcha);
    }
    @PostMapping("/logout")
    public Envelop logout(){
        HttpHeaders headers = new HttpHeaders();
        headers.add("Accept", "*/*");
        headers.add("Cache-Control", "no-cache");
        RestTemplate restTemplate = new RestTemplate();
        MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
        //设置http请求实体
        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
        restTemplate.postForObject("http://localhost:8088/logout", requestEntity, String.class);
        return new Envelop();
    }
}

+ 131 - 0
svr/svr-base/src/main/java/com/yihu/jw/business/login/service/LoginService.java

@ -0,0 +1,131 @@
package com.yihu.jw.business.login.service;
import com.yihu.base.mysql.query.BaseJpaService;
import com.yihu.jw.base.login.BaseLoginAccountDO;
import com.yihu.jw.base.user.BaseEmployDO;
import com.yihu.jw.business.user.dao.EmployDao;
import com.yihu.jw.business.user.service.EmployService;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.restmodel.common.base.BaseEnvelop;
import com.yihu.jw.rm.base.BaseLoginRequestMapping;
import com.yihu.jw.util.common.ConvertToSpellUtils;
import com.yihu.jw.util.security.MD5;
import io.swagger.annotations.ApiParam;
import org.bouncycastle.util.encoders.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.client.RestTemplate;
import java.beans.Transient;
import java.util.UUID;
/**
 * Created by 刘文彬 on 2018/4/26.
 */
@Service
public class LoginService  extends BaseJpaService<BaseEmployDO,EmployDao> {
    @Autowired
    private EmployDao employDao;
    @Autowired
    private EmployService employService;
    @Value("${server.web-gateway-port}")
    private String port;
    public BaseEnvelop checkoutInfo(){
        //校验姓名、身份证以及医保卡号信息是否正确
        return null;
    }
    @Transactional
    public Envelop register(String mobilePhone,String password,String saasId,String name,String idcard,String ssc){
        //判断账号是否重复
        BaseEmployDO baseEmployDO = employDao.findByPhoneAndSaasId(mobilePhone,saasId);
        if(baseEmployDO!=null){
            return Envelop.getError("该手机号已注册!");
        }
        //保存账户基础信息
        BaseEmployDO employeeDO = new BaseEmployDO();
        employeeDO.setId(UUID.randomUUID().toString().replaceAll("-", ""));
        employeeDO.setSaasId(saasId);
        employeeDO.setName(name);
        employeeDO.setPyCode(ConvertToSpellUtils.changeToInitialPinYin(name));
        employeeDO.setIdcard(idcard);
        employeeDO.setSsc(ssc);
        employeeDO.setPhone(mobilePhone);
        String salt= UUID.randomUUID().toString().replace("-","");
        employeeDO.setSalt(salt);
        employeeDO.setPassword(MD5.GetMD5Code(password + salt));
        employService.createBaseEmployDO(employeeDO);
        return login(employeeDO.getPhone(),employeeDO.getPassword(),saasId,"");
    }
    public Envelop login(String mobilePhone,String password,String saasId,String captcha){
        BaseEmployDO baseEmployDO = employService.findByPhoneAndSaasId(mobilePhone,saasId);
        if(baseEmployDO==null){
            return Envelop.getError("该账户不存在!");
        }
        HttpHeaders headers = new HttpHeaders();
        headers.add("Accept", "*/*");
        headers.add("Cache-Control", "no-cache");
        //client_id:client_securt
        byte[] a = Base64.encode((saasId+":").getBytes());
        String client_id = new String(a);
        headers.add("Authorization","Basic "+client_id);//MTox
        String token = "";
        //传参数JSON格式
        //  封装参数,千万不要替换为Map与HashMap,否则参数无法传递
        MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
        //判断是短信登录还是账号密码登录
        if(StringUtils.isEmpty(captcha)){
            //  也支持中文
            params.add("username", mobilePhone+","+saasId);
            params.add("password", MD5.GetMD5Code(password+baseEmployDO.getSalt()));
            //设置http请求实体
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
            RestTemplate restTemplate = new RestTemplate();
            token = restTemplate.postForObject("http://localhost:"+port+"/authentication/form", requestEntity, String.class);
        }else{
            params.add("mobile", mobilePhone+","+saasId);
            params.add("sms", captcha);
            //设置http请求实体
            HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
            RestTemplate restTemplate = new RestTemplate();
            token = restTemplate.postForObject("http://localhost:"+port+"/authentication/mobile", requestEntity, String.class);
        }
        if(!StringUtils.isEmpty(token)){
            return Envelop.getSuccess("登录成功!",token);
        }else{
            return Envelop.getError("登录失败!");
        }
    }
//    public Envelop logout(){
//        HttpHeaders headers = new HttpHeaders();
//        headers.add("Accept", "*/*");
//        headers.add("Cache-Control", "no-cache");
//        RestTemplate restTemplate = new RestTemplate();
//        MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
//        //设置http请求实体
//        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
//        restTemplate.postForObject("http://localhost:"+port+"/logout", requestEntity, String.class);
//    }
}

+ 9 - 0
svr/svr-base/src/main/java/com/yihu/jw/business/sms/dao/SmsDao.java

@ -2,8 +2,17 @@ package com.yihu.jw.business.sms.dao;
import com.yihu.jw.base.sms.BaseSmsDO;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.PagingAndSortingRepository;
import java.util.Date;
import java.util.List;
public interface SmsDao extends PagingAndSortingRepository<BaseSmsDO, String>, JpaSpecificationExecutor<BaseSmsDO> {
    @Query("select count(a.id) from BaseSmsDO a where a.mobile = ?1 and a.createTime  between ?2 and ?3 ")
    int countByMobile(String mobile,Date begin, Date end);
    @Query("select a from BaseSmsDO a where a.mobile = ?1 and a.type = ?2 and a.saasId= ?3 order by a.createTime desc")
    List<BaseSmsDO> findByMobileType(String mobile, int type,String saasId);
}

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

@ -2,11 +2,35 @@ package com.yihu.jw.business.sms.service;
import com.yihu.jw.base.sms.BaseSmsDO;
import com.yihu.jw.business.sms.dao.SmsDao;
import com.yihu.jw.business.sms.vo.SMSHttpVo;
import com.yihu.jw.exception.ApiException;
import com.yihu.base.mysql.query.BaseJpaService;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.restmodel.common.base.BaseEnvelop;
import com.yihu.jw.util.common.SmsValidateCodeUtils;
import com.yihu.jw.util.date.DateUtil;
import com.yihu.jw.util.http.HttpClientUtil;
import com.yihu.jw.vo.ValidateCode;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * Created by chenweida on 2017/5/22.
@ -15,16 +39,153 @@ import org.springframework.transaction.annotation.Transactional;
public class SmsService  extends BaseJpaService<BaseSmsDO, SmsDao> {
    @Autowired
    private SmsDao smsDao;
    @Autowired
    private HttpClientUtil httpClientUtil;
    @Autowired
    private SMSHttpVo smsHttpVo;
//    @Transactional
//    public BaseSmsDO createSms(BaseSmsDO sms) throws ApiException {
//
//        return smsDao.save(sms);
//    }
//
//    @Transactional
//    public BaseSmsDO updateSms(BaseSmsDO sms) {
//        return smsDao.save(sms);
//    }
    /**
     * 发送验证码(不走权限判断,包括:注册、找回密码)
     * @param mobile
     * @param ip
     * @param type
     * @return
     * @throws Exception
     */
    @Transactional
    public BaseSmsDO createSms(BaseSmsDO sms) throws ApiException {
    public BaseEnvelop send(String mobile, String ip, int type,String saasId) throws Exception {
        // 1、同一手机一天不允许超过5条短信
        //1.1获取一天的开始和结束时间
        String today = DateUtil.getStringDateShort();
        Date begin = DateUtil.strToDate(today + " 00:00:00", DateUtil.YYYY_MM_DD_HH_MM_SS);
        Date end = DateUtil.strToDate(today + " 23:59:59", DateUtil.YYYY_MM_DD_HH_MM_SS);
        int smsCount = smsDao.countByMobile(mobile,begin,end);
        if(smsCount>=5){
            return Envelop.getError("您的验证码次数已用完,请明天再尝试!",-1);
        }
        // 2、60秒之内不允许重复发送
//        PageRequest pageRequest = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "id"));
        List<BaseSmsDO> page = smsDao.findByMobileType(mobile,type,saasId);
        if (page.size()>0) {
//            for (BaseSmsDO sms : page) {
//                if (sms == null) {
//                    continue;
//                }
                // 计算间隔时间
                Date temp = DateUtil.getNextMin(page.get(0).getCreateTime(), 1);
                long leftTime = (temp.getTime() - System.currentTimeMillis()) / 1000;
                if (leftTime > 0) {
                    return BaseEnvelop.getError("发送短信验证码间隔时间为:60秒!");
                }
//            }
        }
        //3、生成验证码
        ValidateCode vc = SmsValidateCodeUtils.generate(6,1);
        return smsDao.save(sms);
        //4、保存验证码(1微信端注册,2微信端找回密码,3医生端找回密码,4患者登录,5医生登录)
        BaseSmsDO sms = new BaseSmsDO();
        sms.setMobile(mobile);
        sms.setIp(ip);
        sms.setType(type);
        sms.setCaptcha(vc.getCode());
        switch (type){
            case 1:sms.setContent("您的注册验证码为:"+vc.getCode());break;
            case 2:sms.setContent("您找回密码验证码为:"+vc.getCode());break;
            case 3:sms.setContent("您找回密码验证码为:"+vc.getCode());break;
        }
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS");
        sms.setDeadline(s.parse(vc.getCreateTimeString()));
        sms.setStatus(1);
        sms.setSaasId(saasId);
        //5、 调用发送信息的接口
//        String result = httpClientUtil.post(smsHttpVo.getUrl(), buildSmsParams(sms.getContent(), mobile), "GBK");
//        JSONObject json = toJson(result);
//        if (json == null) {
//            // 发送失败
//            return BaseEnvelop.getError("短信接口请求失败!");
//        } else if (json.getInt("result") != 0) {
//            return BaseEnvelop.getError(json.getString("description"));
//        } else {
//            //发送成功,保存到数据库
//        }
        smsDao.save(sms);
        if(smsCount>=2&&smsCount<=5){
           return  BaseEnvelop.getSuccess("今日可重发验证码剩余"+(5-smsCount)+"次,请尽快完成验证。!");
        }
        return BaseEnvelop.getSuccess("验证码发送成功!");
    }
    @Transactional
    public BaseSmsDO updateSms(BaseSmsDO sms) {
        return smsDao.save(sms);
    //封装发送短信的参数
    public  List<NameValuePair> buildSmsParams(String content, String mobile) {
        List<NameValuePair> params = new ArrayList<NameValuePair>();
        params.add(new BasicNameValuePair("SpCode", smsHttpVo.getCode()));
        params.add(new BasicNameValuePair("LoginName", smsHttpVo.getName()));
        params.add(new BasicNameValuePair("Password", smsHttpVo.getPassword()));
        params.add(new BasicNameValuePair("MessageContent", content));
        params.add(new BasicNameValuePair("UserNumber", mobile));
        params.add(new BasicNameValuePair("SerialNumber", String.valueOf(System.currentTimeMillis())));
        params.add(new BasicNameValuePair("ScheduleTime", ""));
        params.add(new BasicNameValuePair("f", "1"));
        return params;
    }
    //校验验证码是否正确
    public Envelop checkSms(String mobile,String saasId,int type,String captcha){
        PageRequest pageRequest = new PageRequest(0, 1, new Sort(Sort.Direction.DESC, "id"));
        List<BaseSmsDO> page = smsDao.findByMobileType(mobile,type,saasId);
//        if (page != null) {
//            for (BaseSmsDO sms : page) {
                BaseSmsDO sms = page.get(0);
                String toCaptcha = sms.getCaptcha();
                Date deadline = sms.getDeadline();
                if(new Date().before(deadline)){
                    //对比校验码是否正确
                    if(captcha.equals(toCaptcha)){
                        Envelop.getSuccess("验证码校验成功!");
                    }else{
                        return Envelop.getError("验证码错误!");
                    }
                }else{
                    //过期
                    return Envelop.getError("验证码过期!");
                }
//            }
//        }
        return Envelop.getError("未发送验证码!");
    }
    //解析短信返回的json数据
    public JSONObject toJson(String result) {
        JSONObject json = new JSONObject();
        try {
            String[] temps = result.split("&");
            for (String temp : temps) {
                if (temp.split("=").length != 2) {
                    continue;
                }
                String key = temp.split("=")[0];
                String value = temp.split("=")[1];
                json.put(key, value);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return json;
    }
}

+ 49 - 0
svr/svr-base/src/main/java/com/yihu/jw/business/sms/vo/SMSHttpVo.java

@ -0,0 +1,49 @@
package com.yihu.jw.business.sms.vo;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
 * Created by 刘文彬 on 2018/4/13.
 */
@Component
@ConfigurationProperties(prefix = "jw.sms")
public class SMSHttpVo {
    private String url;
    private String code;
    private String name;
    private String password;
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    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 getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}

+ 11 - 4
svr/svr-base/src/main/java/com/yihu/jw/config/jpa/HibernateProperties.java

@ -10,20 +10,27 @@ import java.util.Properties;
 * Created by chenweida on 2017/4/6.
 */
@Component
@RefreshScope
//@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;
//    @Value("${hibernate.ejb.naming_strategy}")
//    private String naming_strategy;
    @Value("${hibernate.physical_naming_strategy}")
    private String  physical_naming_strategy;
    @Value("${hibernate.implicit_naming_strategy}")
    private String implicit_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);
        properties.put("hibernate.physical_naming_strategy", physical_naming_strategy);
        properties.put("hibernate.implicit_naming_strategy", implicit_naming_strategy);
        return properties;
    }
}

+ 33 - 15
svr/svr-base/src/main/resources/application.yml

@ -1,33 +1,51 @@
##如果有配置服务的话,远程服务器和本地服务器配置不一致的情况下,优先远程的为主  git上 svr-base ->  git application ->本地 appliction ->本地 bootstarp
spring:
  application:
    name:  svr-base  #注册到发现服务的id 如果id一样 eurika会自动做负载
    name: svr-base  #注册到发现服务的id 如果id一样 eurika会自动做负载
#  jmx:
#    default-domain: svr-base
  jmx:
    default-domain: svr-base
    enabled: true
  data:
    elasticsearch: #ElasticsearchProperties
      cluster-name: jkzl #默认即为elasticsearch  集群名
      cluster-nodes: 172.19.103.45:9300,172.19.103.68:9300 #配置es节点信息,逗号分隔,如果没有指定,则启动ClientNode
      local: false #是否本地连接
      properties: # Additional properties used to configure the client.
        enable: true
  # JEST (Elasticsearch HTTP client) (JestProperties)
  elasticsearch:
    jest:
      uris: http://172.19.103.45:9200,http://172.19.103.68:9200
#      uris: http://172.19.103.68:9200
      connection-timeout: 60000 # Connection timeout in milliseconds.
      multi-threaded: true
    elasticsearch:
      cluster-name: jkzl #es集群的名字
      cluster-nodes: 172.19.103.68:9300  #多个逗号分割
      cluster-nodes-jest: http://172.19.103.68:9200  #多个逗号分割
      repositories:
        enabled: false
      properties:
        client:
          transport:
            sniff: false #开启嗅探集群  用nginx代理一层过后会出现ip解析失败问题
management:
  security:
    enabled: false #关闭 refresh的权限认证
health:
  config:
    enabled: true
endpoints:
  info:
    enabled: true
---
spring:
  profiles: jwdev
jw:
  sms:
    url: 123
    code: 123
    name: 123
    password: 123
---
spring:
  profiles: jwtest

+ 9 - 2
svr/svr-base/src/main/resources/bootstrap.yml

@ -9,19 +9,26 @@ spring:
      discovery:
        enabled: true #使用发现服务
        service-id: svr-configurations ##配置服务的名字
  redis:
    host: 172.19.103.88 # Redis server host.
    port: 6379 # Redis server port.
    database: 0
---
spring:
  profiles: jwdev
  cloud:
    config:
      label: jwdev
##发现服务的地址
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/
#      defaultZone: http://jw:jkzl@172.19.103.33:8761//eureka/
      defaultZone: http://jw:jkzl@192.168.131.131:8761/eureka/
---
spring:

+ 11 - 6
web-gateway/pom.xml

@ -38,10 +38,11 @@
            <artifactId>common-swagger</artifactId>
        </dependency>
        <!--<dependency>-->
            <!--<groupId>com.yihu.base</groupId>-->
            <!--<artifactId>common-security</artifactId>-->
        <!--</dependency>-->
        <dependency>
            <groupId>com.yihu</groupId>
            <artifactId>common-security-starter</artifactId>
            <version>1.0.5</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
@ -68,10 +69,10 @@
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
      <!--  <dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>-->
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
@ -163,6 +164,10 @@
            <artifactId>jna</artifactId>
            <version>3.0.9</version>
        </dependency>
        <dependency>
            <groupId>com.yihu.jw</groupId>
            <artifactId>common-entity</artifactId>
        </dependency>
    </dependencies>
    <build>
        <finalName>webgate-way</finalName>

+ 3 - 1
web-gateway/src/main/java/com/yihu/jw/WebGateWayAppliaction.java

@ -13,7 +13,9 @@ import org.springframework.context.annotation.ComponentScan;
/**
 * Created by chenweida on 2017/5/10.
 */
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@SpringBootApplication(
        exclude = {DataSourceAutoConfiguration.class,
                HibernateJpaAutoConfiguration.class})
//@SpringBootApplication
@EnableDiscoveryClient//服务注册到发现服务
@EnableHystrix //启动断路器

+ 55 - 39
web-gateway/src/main/java/com/yihu/jw/config/security/ClientService.java

@ -1,40 +1,56 @@
//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;
package com.yihu.jw.config.security;
import com.yihu.base.security.rbas.ClientServiceProvider;
import com.yihu.jw.base.base.SaasDO;
import com.yihu.jw.fegin.base.base.SaasFeign;
import com.yihu.jw.restmodel.common.Envelop;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary;
import org.springframework.security.crypto.codec.Base64;
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.io.UnsupportedEncodingException;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
/**
 * Created by chenweida on 2017/12/1.
 */
@Component("baseClientDetailsService")
@Primary
public class ClientService implements ClientServiceProvider {
    @Autowired
    private SaasFeign saasFeign;
    @Override
    public ClientDetails loadClientByClientId(String clientId) throws ClientRegistrationException {
        Envelop envelop = saasFeign.findByCode(clientId);
        Map saasDO = (Map)envelop.getObj();
        if (saasDO.isEmpty()) {
            throw new ClientRegistrationException("该平台未注册");
        }
        BaseClientDetails baseClientDetails = new BaseClientDetails();
        baseClientDetails.setClientId(saasDO.get("id")+"");
        baseClientDetails.setClientSecret("");
        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;
    }
//    public static void main(String[] args) {
//        byte[] a = Base64.encode("1:".getBytes());
//        String s = new String(a);
//        System.out.println(s);
//    }
//
//
//}
}

+ 49 - 48
web-gateway/src/main/java/com/yihu/jw/config/security/RbasService.java

@ -1,48 +1,49 @@
//package com.yihu.jw.config.security;
//
//import com.yihu.base.security.rbas.IRbasService;
//import org.springframework.security.core.Authentication;
//import org.springframework.security.core.userdetails.UserDetails;
//import org.springframework.stereotype.Service;
//import org.springframework.util.AntPathMatcher;
//
//import javax.servlet.http.HttpServletRequest;
//import java.util.HashSet;
//import java.util.Set;
//
///**
// * Created by chenweida on 2017/12/5.
// * 判断用户是否有权限访问该路径
// */
//@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();
//
//
//            //获取用户全部权限
//            Set<String> uris = new HashSet<>();
//            for (String uri : uris) {
//                if (antPathMatcher.match(uri, request.getRequestURI())) {
//                    hasPerssion = true;
//                    break;
//                }
//            }
//        }
//        return true;
//        //  return hasPerssion;
//    }
//
//    public Boolean hello() {
//        return true;
//    }
//}
package com.yihu.jw.config.security;
import com.yihu.base.security.rbas.RbasServiceProvider;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import org.springframework.util.AntPathMatcher;
import javax.servlet.http.HttpServletRequest;
import java.util.HashSet;
import java.util.Set;
/**
 * Created by chenweida on 2017/12/5.
 * 判断用户是否有权限访问该请求路径
 */
@Service("rbasServiceProvider")
public class RbasService implements RbasServiceProvider {
    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[] saasPhone = username.split(",");
            String saas = saasPhone[0];
            String phone = saasPhone[1];
            //从数据库获取用户全部权限
            Set<String> uris = new HashSet<>();
            for (String uri : uris) {
                if (antPathMatcher.match(uri, request.getRequestURI())) {
                    hasPerssion = true;
                    break;
                }
            }
            return hasPerssion;
        }else{
            return true;
        }
    }
}

+ 63 - 59
web-gateway/src/main/java/com/yihu/jw/config/security/UserService.java

@ -1,61 +1,65 @@
//package com.yihu.jw.config.security;
//
//
//import com.yihu.jw.fegin.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;
package com.yihu.jw.config.security;
import com.yihu.jw.base.user.BaseEmployDO;
import com.yihu.jw.fegin.base.user.EmployFeign;
import com.yihu.jw.restmodel.common.Envelop;
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;
import java.util.Map;
/**
 * Created by chenweida on 2017/11/29.
 * 处理用户校验
 */
@Component
public class UserService implements UserDetailsService {
    @Autowired
    private PasswordEncoder passwordEncoder;
    @Autowired
    private EmployFeign employFeign;
//    @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("用户不存在");
//        }
//    }
//
//}
    /**
     * 我们只需要把用户返回给spring-security 密码框架自己帮我们校验
     *
     * @param saasPhone
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserByUsername(String saasPhone) throws UsernameNotFoundException {
        //saasPhone=saas+phone
        //根据userName获取账户信息(手机号码)
        String[] sp = saasPhone.split(",");
        String phone = sp[0];
        String saasId = sp[1];
        Envelop envelop = employFeign.getEmployeeByPhoneAndSaasId(phone,saasId);
        Map baseEmployDO =  (Map)envelop.getObj();
        if (!baseEmployDO.isEmpty()) {
            return new User(saasPhone,
                    passwordEncoder.encode(baseEmployDO.get("password")+""),
                    true,
                    true,
                    true,
                    true
                    , AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER") //权限
            );
        } else {
            throw new UsernameNotFoundException("用户不存在");
        }
    }
}

+ 100 - 0
web-gateway/src/main/java/com/yihu/jw/controller/base/login/LoginContorller.java

@ -0,0 +1,100 @@
package com.yihu.jw.controller.base.login;
import com.yihu.base.security.properties.SecurityProperties;
import com.yihu.base.security.sms.mobile.MobileCheck;
import com.yihu.base.security.sms.process.SmsValidateCodeProcessor;
import com.yihu.jw.common.base.base.BaseContants;
import com.yihu.jw.fegin.base.base.FunctionFeign;
import com.yihu.jw.fegin.base.login.LoginFeign;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.restmodel.common.base.BaseEnvelop;
import com.yihu.jw.rm.base.BaseLoginRequestMapping;
import com.yihu.jw.rm.base.BaseUserRequestMapping;
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.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.request.ServletWebRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
 * Created by 刘文彬 on 2018/4/20.
 */
@RestController
@RequestMapping(BaseLoginRequestMapping.api_gateway_common)
@Api(value = "登录模块", description = "登录模块")
public class LoginContorller {
    @Autowired
    private LoginFeign loginFeign;
    @Autowired
    private MobileCheck mobileCheck;
    @Autowired
    private SmsValidateCodeProcessor smsValidateCodeProcessor;
    @PostMapping(value = BaseLoginRequestMapping.BaseLoginAccount.api_checkoutInfo, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "注册校验信息", notes = "注册校验姓名、身份证、医保卡号信息")
    public Envelop checkoutInfo(){
        return loginFeign.checkoutInfo();
    }
    @PostMapping(value = BaseLoginRequestMapping.BaseLoginAccount.api_accountSub, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "注册账号", notes = "注册校验姓名、身份证、医保卡号信息")
    public Envelop register(
            @ApiParam(name = "mobilePhone", value = "电话号码(账号)", required = true) @RequestParam(value = "mobilePhone", required = true) String mobilePhone,
            @ApiParam(name = "saasId", value = "saasID", required = true) @RequestParam(value = "saasId", required = true) String saasId,
            @ApiParam(name = "type", value = "1微信端注册,2微信端找回密码,3医生端找回密码,4患者登录,5医生登录", required = true) @RequestParam(value = "type", required = true) int type,
            @ApiParam(name = "captcha", value = "短信验证码", required = true) @RequestParam(value = "captcha", required = true) String captcha,
            @ApiParam(name = "name", value = "姓名", required = true) @RequestParam(value = "name", required = true) String name,
            @ApiParam(name = "password", value = "账户密码", required = true) @RequestParam(value = "password", required = true) String password,
            @ApiParam(name = "idcard", value = "身份证", required = true) @RequestParam(value = "idcard", required = true) String idcard,
            @ApiParam(name = "ssc", value = "医保卡号", required = true) @RequestParam(value = "ssc", required = true) String ssc) {
        return loginFeign.register(mobilePhone,saasId,type,captcha,name,password,idcard,ssc);
    }
    @PostMapping(BaseLoginRequestMapping.BaseLoginAccount.mobileSendSms)
    @ApiOperation(value = "发送短信登录的验证码", notes = "不走校验框架")
    public BaseEnvelop createCode(@ApiParam(name = "mobile", value = "手机号", required = true) @RequestParam(value = "mobile", required = true) String mobile,
                                  HttpServletRequest request, HttpServletResponse response) throws Exception{
        //验证手机号是否正确
        String[] mobileSaas = mobile.split(",");
        if (!mobileCheck.checkMobile(mobileSaas[0])) {
            return BaseEnvelop.getError("手机格式错误!");
        } else {
            //发送短信验证码并且保存到redis中
            smsValidateCodeProcessor.create(new ServletWebRequest(request, response));
            return BaseEnvelop.getSuccess("发送成功!");
        }
    }
    @PostMapping(BaseLoginRequestMapping.BaseLoginAccount.api_login)
    public Envelop login(@ApiParam(name = "mobilePhone", value = "电话号码(账号)", required = false) @RequestParam(value = "mobilePhone", required = false) String mobilePhone,
                       @ApiParam(name = "password", value = "password", required = false) @RequestParam(value = "password", required = false) String password,
                       @ApiParam(name = "saasId", value = "saasID", required = true) @RequestParam(value = "saasId", required = true) String saasId,
                       @ApiParam(name = "captcha", value = "短信验证码", required = false) @RequestParam(value = "captcha", required = false) String captcha){
        return loginFeign.login(mobilePhone,password,saasId,captcha);
    }
//    @PostMapping("/logout")
//    public Envelop logout(){
//        HttpHeaders headers = new HttpHeaders();
//        headers.add("Accept", "*/*");
//        headers.add("Cache-Control", "no-cache");
//        RestTemplate restTemplate = new RestTemplate();
//        MultiValueMap<String, String> params= new LinkedMultiValueMap<String, String>();
//        //设置http请求实体
//        HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<MultiValueMap<String, String>>(params, headers);
//        restTemplate.postForObject("http://localhost:8088/logout", requestEntity, String.class);
//        return new Envelop();
//    }
}

+ 40 - 0
web-gateway/src/main/java/com/yihu/jw/controller/base/login/RegisterSmsContorller.java

@ -0,0 +1,40 @@
package com.yihu.jw.controller.base.login;
import com.yihu.jw.common.base.base.BaseContants;
import com.yihu.jw.fegin.base.sms.RegisterSmsFeign;
import com.yihu.jw.fegin.common.security.LoginSmsFeign;
import com.yihu.jw.restmodel.common.base.BaseEnvelop;
import com.yihu.jw.rm.base.BaseLoginRequestMapping;
import com.yihu.jw.rm.base.BaseSmsRequestMapping;
import com.yihu.jw.rm.base.BaseUserRequestMapping;
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.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
/**
 * Created by 刘文彬 on 2018/4/24.
 */
@RestController
@RequestMapping(BaseLoginRequestMapping.api_common)
@Api(value = "注册发送短信验证码", description = "注册发送短信验证码")
public class RegisterSmsContorller {
    @Autowired
    private RegisterSmsFeign registerSmsFeign;
    @PostMapping(value = BaseSmsRequestMapping.Sms.api_sms_send, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
    @ApiOperation(value = "发送短信验证码", notes = "发送短信验证码")
    BaseEnvelop send(@ApiParam(name = "mobile", value = "手机号码", required = true) @RequestParam(value = "mobile", required = true) String mobile,
                     @ApiParam(name = "type", value = "短信验证码类型", required = true) @RequestParam(value = "type", required = true) int type,
                     @ApiParam(name = "saasId", value = "saasId", required = true) @RequestParam(value = "saasId", required = true) String saasId) throws IOException{
        return registerSmsFeign.send(mobile,type,saasId);
    }
}

+ 134 - 0
web-gateway/src/main/java/com/yihu/jw/controller/base/security/TokenController.java

@ -0,0 +1,134 @@
package com.yihu.jw.controller.base.security;
import com.yihu.base.security.rbas.ClientServiceProvider;
import com.yihu.jw.fegin.base.user.EmployFeign;
import com.yihu.jw.restmodel.common.Envelop;
import com.yihu.jw.restmodel.common.base.BaseEnvelop;
import com.yihu.jw.rm.base.BaseLoginRequestMapping;
import com.yihu.jw.rm.base.BaseSecurityRequestMapping;
import com.yihu.jw.util.date.DateUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.collections.MapUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.provider.ClientDetails;
import org.springframework.security.oauth2.provider.OAuth2Authentication;
import org.springframework.security.oauth2.provider.OAuth2Request;
import org.springframework.security.oauth2.provider.TokenRequest;
import org.springframework.security.oauth2.provider.token.DefaultTokenServices;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Map;
/**
 * Created by 刘文彬 on 2018/5/4.
 */
@RestController
@RequestMapping(BaseLoginRequestMapping.api_gateway_common)
@Api(value = "权限token模块", description = "权限token模块")
public class TokenController {
    @Autowired
    private DefaultTokenServices defaultTokenServices;
    @Autowired
    private AuthenticationManager authenticationManager;
    @Autowired
    private ClientServiceProvider clientDetailsService;
    @Autowired
    private EmployFeign employFeign;
    @PostMapping(BaseSecurityRequestMapping.BaseToken.api_update_token_expiration_time)
    @ApiOperation(value = "更新token过期时间", notes = "根据token更新token过期时间")
    public BaseEnvelop updateTokenExpiration(@ApiParam(name = "expiration", value = "token过期时间,格式:yyyy-mm-dd HH:mm:ss", required = true)
                     @RequestParam(value = "expiration", required = true) String expiration,
                     @ApiParam(name = "authHeaderValue", value = "登录的token", required = true)
                     @RequestParam(value = "authHeaderValue", required = true) String authHeaderValue){
        DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken)defaultTokenServices.readAccessToken(authHeaderValue);
        if(token!=null){
            token.setExpiration(DateUtil.strToDate(expiration));
            return BaseEnvelop.getSuccess("token 过期时间设置成功!");
        }
        return BaseEnvelop.getError("token 无效!");
    }
    @PostMapping(BaseSecurityRequestMapping.BaseToken.api_update_token_expiration_second)
    @ApiOperation(value = "延长token的过期时间", notes = "根据token延长token的过期时间")
    public BaseEnvelop updateTokenExpiration(@ApiParam(name = "seconds", value = "延长token过期时间分钟数", required = true)
                                             @RequestParam(value = "seconds", required = true) int seconds,
                                             @ApiParam(name = "authHeaderValue", value = "登录的token", required = true)
                                             @RequestParam(value = "authHeaderValue", required = true) String authHeaderValue){
        DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken)defaultTokenServices.readAccessToken(authHeaderValue);
        if(token!=null){
            token.setExpiration(new Date(System.currentTimeMillis() + (seconds * 1000L)));
            return BaseEnvelop.getSuccess("token 过期时间设置成功!");
        }
        return BaseEnvelop.getError("token 无效!");
    }
    @PostMapping(BaseSecurityRequestMapping.BaseToken.api_update_token_expiration)
    @ApiOperation(value = "设置token过期", notes = "设置token过期")
    public BaseEnvelop updateTokenExpiration2(HttpServletRequest request, HttpServletResponse response,
                                              @ApiParam(name = "authHeaderValue", value = "登录的token", required = true)
                                              @RequestParam(value = "authHeaderValue", required = true) String authHeaderValue){
        DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken)defaultTokenServices.readAccessToken(authHeaderValue);
        if(token!=null){
            token.setExpiration(new Date());
            return BaseEnvelop.getSuccess("token 过期时间设置成功!");
        }
        return BaseEnvelop.getError("token 无效!");
    }
    @PostMapping(BaseSecurityRequestMapping.BaseToken.api_update_token_expiration_second2)
    @ApiOperation(value = "设置token过期", notes = "设置token过期")
    public BaseEnvelop updateTokenExpiration3(HttpServletRequest request, HttpServletResponse response,
                                              @ApiParam(name = "mobileSaas", value = "mobile和saas组合,逗号分隔", required = true)
                                              @RequestParam(value = "mobileSaas", required = true) String mobileSaas){
        String[] sp = mobileSaas.split(",");
        String phone = sp[0];
        String saasId = sp[1];
        Envelop envelop = employFeign.getEmployeeByPhoneAndSaasId(phone,saasId);
        Map baseEmployDO =  (Map)envelop.getObj();
        if(baseEmployDO.isEmpty()){
            return BaseEnvelop.getError("该用户不存在!");
        }
        UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
                mobileSaas, baseEmployDO.get("password"));
        // Allow subclasses to set the "details" property
        authRequest.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
        Authentication authentication = authenticationManager.authenticate(authRequest);
        ClientDetails clientDetails = clientDetailsService.loadClientByClientId(saasId);
        TokenRequest tokenRequest = new TokenRequest(MapUtils.EMPTY_MAP, saasId, clientDetails.getScope(), "custom_password");
        OAuth2Request oAuth2Request = tokenRequest.createOAuth2Request(clientDetails);
        OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(oAuth2Request, authentication);
        DefaultOAuth2AccessToken token = (DefaultOAuth2AccessToken)defaultTokenServices.getAccessToken(oAuth2Authentication);
        if(token!=null){
            token.setExpiration(new Date());
            return BaseEnvelop.getSuccess("token 过期时间设置成功!");
        }
        return BaseEnvelop.getError("token 无效!");
    }
}

+ 18 - 0
web-gateway/src/main/resources/application.yml

@ -11,6 +11,24 @@ spring:
      enabled: true
      max-file-size: 500MB
      max-request-size: 500MB
  data:
    elasticsearch: #ElasticsearchProperties
      cluster-name: jkzl #默认即为elasticsearch  集群名
      cluster-nodes: 172.19.103.45:9300,172.19.103.68:9300 #配置es节点信息,逗号分隔,如果没有指定,则启动ClientNode
      local: false #是否本地连接
      properties: # Additional properties used to configure the client.
        enable: true
    # JEST (Elasticsearch HTTP client) (JestProperties)
  elasticsearch:
    jest:
      uris: http://172.19.103.45:9200,http://172.19.103.68:9200
#      uris: http://172.19.103.68:9200
      connection-timeout: 60000 # Connection timeout in milliseconds.
      multi-threaded: true
  redis:
    host: 172.19.103.88 # Redis server host.
    port: 6379 # Redis server port.
    database: 0
##开启feign断路器
feign:

+ 2 - 1
web-gateway/src/main/resources/bootstrap.yml

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