提交 6899dd41 编写于 作者:  Peijun.zhao's avatar Peijun.zhao

Merge branch 'dev-login0218' into release

# Conflicts:
#	server/src/main/java/com/pica/cloud/account/account/server/entity/LogLoginEntity.java
#	server/src/main/java/com/pica/cloud/account/account/server/service/impl/LoginServiceImpl.java
#	server/src/main/java/com/pica/cloud/account/account/server/service/impl/RegisterServiceImpl.java
......@@ -11,7 +11,7 @@
<groupId>com.pica.cloud.account</groupId>
<artifactId>pica-cloud-account-client</artifactId>
<version>1.0.2</version>
<version>1.0.3.1</version>
<name>pica-cloud-account-client</name>
<packaging>jar</packaging>
......
......@@ -3,8 +3,8 @@ package com.pica.cloud.account.account.client;
import com.pica.cloud.account.account.common.req.AccountInfoReq;
import com.pica.cloud.foundation.entity.PicaResponse;
import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
......@@ -20,4 +20,9 @@ public interface AccountInfoClient {
@PostMapping("/account/info/doctorIds")
PicaResponse<List<Integer>> getDoctorIds(@RequestBody AccountInfoReq req);
@GetMapping(value = "/account/token/continue")
PicaResponse<String> tokenContinueTime(@RequestHeader(value = "token") String token,
@RequestHeader(value = "sourceType") Integer sourceType,
@RequestParam(value = "seconds", required = false) Integer seconds);
}
......@@ -151,6 +151,44 @@
<artifactId>xxl-job-core</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.8.1</version>
</dependency>
<dependency>
<groupId>com.pica.cloud.patient</groupId>
<artifactId>pica-cloud-smartcontract-client</artifactId>
<version>1.0.8</version>
</dependency>
<dependency>
<groupId>com.pica.cloud.riskcontrol</groupId>
<artifactId>pica-cloud-riskcontrol-client</artifactId>
<version>1.0.2</version>
</dependency>
<!-- apple identifyToken校验 -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
<dependency>
<groupId>com.auth0</groupId>
<artifactId>jwks-rsa</artifactId>
<version>0.9.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
......@@ -221,6 +259,23 @@
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies>
<configuration>
<verbose>true</verbose>
<overwrite>true</overwrite>
<configurationFile>src/main/resources/mybatis-generator.xml</configurationFile>
</configuration>
</plugin>
</plugins>
</build>
</project>
......@@ -13,6 +13,9 @@ public class PropertiesConfiguration {
@Value("${pica.cloud.message.url}")
private String messageUrl;
@Value("${environment.name}")
private String environment;
public String getMessageUrl() {
return messageUrl;
......@@ -22,4 +25,8 @@ public class PropertiesConfiguration {
this.messageUrl = messageUrl;
}
public String getEnvironment(){
return environment;
}
}
package com.pica.cloud.account.account.server.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
* @Description ThreadPoolConfig
* @Author Chongwen.jiang
* @Date 2020/2/27 16:37
* @ModifyDate 2020/2/27 16:37
* @Params
* @Return
*/
@Configuration
public class ThreadPoolConfig {
@Bean(name = "accountThreadPool")
public ThreadPoolTaskExecutor getExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(3);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(100);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("account_ThreadPool");
executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
executor.initialize();
System.out.println("accountThreadPool init end-");
return executor;
}
}
......@@ -45,4 +45,25 @@ public class Constants {
*/
public static final String TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
/** 密码登录错误次数缓存key */
public static final String PWD_ERROR_NUM_KEY = "pwd-error-{mobile}";
/** 账号锁定缓存key */
public static final String ACCOUNT_LOCK_KEY = "account-lock-{mobile}";
/** 密码登录错误次数缓存时长*/
public static final int PWD_ERROR_NUM_SECONDS = 24 * 60 * 60;
/** 苹果后台获取公钥路径 */
public static final String APPLE_GET_PUBLIC_KEY_URL = "https://appleid.apple.com/auth/keys";
/** 苹果组织官网地址 */
public static final String APPLE_ISSUE_URL = "https://appleid.apple.com";
/** h5端发送短信验证码接口开关缓存key */
public static final String AUTHCODE_H5_SWITCH_KEY = "AUTH-CODE-H5-SWITCH";
/** 验证码缓存key前缀 */
public static final String AUTH_CODE_PREFIX = "authCode-";
/** 注册逻辑幂等处理缓存key */
public static final String REPEAT_REGISTER_PREFIX = "repeat-register—";
}
package com.pica.cloud.account.account.server.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.pica.cloud.account.account.server.configuration.PropertiesConfiguration;
import com.pica.cloud.account.account.server.constants.Constants;
......@@ -9,7 +10,9 @@ import com.pica.cloud.account.account.server.enums.AccountExceptionEnum;
import com.pica.cloud.account.account.server.exception.AccountException;
import com.pica.cloud.account.account.server.util.PICAPSendMsgModel;
import com.pica.cloud.foundation.entity.PicaException;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.entity.PicaResultCode;
import com.pica.cloud.foundation.entity.PicaWarnException;
import com.pica.cloud.foundation.utils.constants.SysCode;
import com.pica.cloud.foundation.utils.controller.BaseController;
import com.pica.cloud.foundation.utils.entity.PicaUser;
......@@ -127,12 +130,30 @@ public abstract class AccountBaseController extends BaseController {
picapSendMsgModel.setSysName(SysCode.APP.sysName());
String postData = JSON.toJSONString(picapSendMsgModel);
logger.info("sendMobileTo-mobile:{}, senderId-{}",mobile, senderId);
String jsonObj = HttpClientUtil.httpExecute(messageUrl, postData);
if (StringUtils.isNotBlank(jsonObj)) {
logger.info("发送短信成功,返回结果:{}", jsonObj);
} else {
logger.error("发送短信失败");
logger.info("sendMobileTo-{}", jsonObj);
if (StringUtils.isEmpty(jsonObj)) {
logger.error("send message fail, response is empty");
throw new PicaWarnException(AccountExceptionEnum.PICA_MESSAGE_SERVICE_CALL_FAIL.getCode(),
AccountExceptionEnum.PICA_MESSAGE_SERVICE_CALL_FAIL.getMessage());
}
try {
PicaResponse resp = JSON.parseObject(jsonObj, PicaResponse.class);
if(Objects.nonNull(resp) && PicaResultCode.SUCCESS.code().equals(resp.getCode())){
logger.info("send message success, the result is: {}", jsonObj);
} else {
logger.error("send message fail, response code not equals success code");
throw new PicaWarnException(AccountExceptionEnum.PICA_MESSAGE_SERVICE_CALL_FAIL.getCode(),
AccountExceptionEnum.PICA_MESSAGE_SERVICE_CALL_FAIL.getMessage());
}
} catch (JSONException e) {
logger.error("send message fail, response object is not a json object");
throw new PicaWarnException(AccountExceptionEnum.PICA_MESSAGE_SERVICE_CALL_FAIL.getCode(),
AccountExceptionEnum.PICA_MESSAGE_SERVICE_CALL_FAIL.getMessage());
}
}
/**
......
package com.pica.cloud.account.account.server.controller;
import com.pica.cloud.account.account.server.constants.Constants;
import com.pica.cloud.account.account.server.entity.Account;
import com.pica.cloud.account.account.server.entity.EncryptEntity;
import com.pica.cloud.account.account.server.entity.LoginResult;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
import com.pica.cloud.account.account.server.mapper.AccountMapper;
import com.pica.cloud.account.account.server.req.AccountReq;
import com.pica.cloud.account.account.server.req.BaseRequest;
import com.pica.cloud.account.account.server.service.AccountService;
......@@ -29,7 +29,6 @@ import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
......@@ -46,9 +45,8 @@ import java.util.UUID;
@RestController
@RequestMapping("/account")
public class AccountController extends AccountBaseController {
private final String AUTH_CODE_PREFIX = "authCode-";
private Logger logger = LoggerFactory.getLogger(AccountController.class);
@Autowired
private AccountService accountService;
@Autowired
......@@ -63,7 +61,7 @@ public class AccountController extends AccountBaseController {
return "{\"status\":\"UP\"}";
}
@ApiOperation("获取登录验证码")
@ApiOperation("获取登录验证码(已无人调用)")
@GetMapping("/authCode")
public PicaResponse<String> getAuthCode(@ApiParam(value = "手机号", required = true) @RequestParam("mobilePhone") String mobilePhone,
@ApiParam(value = "验证码类型 0默认 1注册 2修改密码 4微信登录绑定手机 5修改手机 6重置密码 7患者招募提交问卷(效验") @RequestParam(value = "flag", defaultValue = "0") String flag,
......@@ -225,8 +223,8 @@ public class AccountController extends AccountBaseController {
//获取验证码redis key
private String getAuthCodeKey(String mobilePhone, String flag) {
logger.info(AUTH_CODE_PREFIX + flag + "-" + EncryptUtils.encryptContent(mobilePhone, EncryptConstants.ENCRYPT_TYPE_MOBILE));
return AUTH_CODE_PREFIX + flag + "-" + EncryptUtils.encryptContent(mobilePhone, EncryptConstants.ENCRYPT_TYPE_MOBILE);
logger.info(Constants.AUTH_CODE_PREFIX + flag + "-" + EncryptUtils.encryptContent(mobilePhone, EncryptConstants.ENCRYPT_TYPE_MOBILE));
return Constants.AUTH_CODE_PREFIX + flag + "-" + EncryptUtils.encryptContent(mobilePhone, EncryptConstants.ENCRYPT_TYPE_MOBILE);
}
//校验验证码
......
......@@ -31,16 +31,16 @@ public class CipherController {
}
/**
* todo:上线前需要注释掉
* @param key
* @return
* @throws Exception
*/
@ApiOperation("解密操作")
@GetMapping(value = "/cipher/decrypt")
public PicaResponse<String> decryptPublicKey(@RequestParam String key) throws Exception {
return PicaResponse.toResponse(RSAUtil.decrypt(key, AESUtil.privateKey));
}
// /**
// *
// * @param key
// * @return
// * @throws Exception
// */
// @ApiOperation("解密操作")
// @GetMapping(value = "/cipher/decrypt")
// public PicaResponse<String> decryptPublicKey(@RequestParam String key) throws Exception {
// return PicaResponse.toResponse(RSAUtil.decrypt(key, AESUtil.privateKey));
// }
}
......@@ -3,24 +3,27 @@ package com.pica.cloud.account.account.server.controller;
import com.pica.cloud.account.account.server.entity.*;
import com.pica.cloud.account.account.server.enums.AccountExceptionEnum;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
import com.pica.cloud.account.account.server.enums.SourceTypeEnum;
import com.pica.cloud.account.account.server.exception.AccountException;
import com.pica.cloud.account.account.server.log.AccountLogEntityUtils;
import com.pica.cloud.account.account.server.log.AccountLogUtils;
import com.pica.cloud.account.account.server.req.BaseRequest;
import com.pica.cloud.account.account.server.req.OneClickLoginReq;
import com.pica.cloud.account.account.server.service.DoctorService;
import com.pica.cloud.account.account.server.service.LoginService;
import com.pica.cloud.account.account.server.service.TokenService;
import com.pica.cloud.account.account.server.util.AccountUtils;
import com.pica.cloud.account.account.server.util.CryptoUtil;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.entity.PicaWarnException;
import com.pica.cloud.foundation.redis.CacheClient;
import com.pica.cloud.foundation.redis.ICacheClient;
import com.pica.cloud.foundation.utils.utils.CommonUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
......@@ -29,6 +32,7 @@ import java.util.Map;
@Api(description = "登录资源")
@RestController
public class LoginController extends AccountBaseController {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private LoginService loginService;
......@@ -39,9 +43,6 @@ public class LoginController extends AccountBaseController {
@Autowired
private AccountLogUtils picaLogUtils;
@Autowired
private AccountUtils accountUtils;
@Autowired
private TokenService tokenService;
......@@ -71,7 +72,7 @@ public class LoginController extends AccountBaseController {
AccountUtils.checkMobilePhone(request.getMobile());
AccountUtils.checkPassword(request.getPassword());
LoginResult login = loginService.login(request);
if (sourceType == 3) {
if (SourceTypeEnum.SAAS.getCode().equals(sourceType)) {
login.setDoctorId("");
} else {
login.setUserId(null);
......@@ -95,7 +96,7 @@ public class LoginController extends AccountBaseController {
request.setSourceType(sourceType);
request.setLoginIp(super.getIpAddr());
LoginResult login = loginService.loginAndRegister(request);
if (sourceType == 3) {
if (SourceTypeEnum.SAAS.getCode().equals(sourceType)) {
login.setDoctorId("");
} else {
login.setUserId(null);
......@@ -118,7 +119,6 @@ public class LoginController extends AccountBaseController {
@PostMapping(value = "/login/wechat/step2")
public PicaResponse<LoginResult> loginByWeChatStep(@RequestBody EncryptEntity entity) throws Exception {
BaseRequest request = CryptoUtil.decrypt(entity, BaseRequest.class);
accountUtils.checkMobilePhoneAndAuthCode(request.getMobile(), AccountTypeEnum.SYSCODE_TYPE_WE_CHAT.getCode() + "", request.getAuthCode());
request.setProductType(super.getProductType());
request.setSourceType(super.getSourceType());
request.setLoginIp(super.getIpAddr());
......@@ -140,16 +140,21 @@ public class LoginController extends AccountBaseController {
Long result = cacheClient.setnx(cache_prifix + request.getWeChatCode(), request.getWeChatCode());
if (result == 1) {
cacheClient.set(cache_prifix + request.getWeChatCode(), 60);
long doctorId = super.getDoctorIdByToken();
String nickname = loginService.bindWeChat(doctorId, request);
Map<String, String> map = new HashMap();
map.put("nickname", nickname);
//成功以后释放锁
cacheClient.del(cache_prifix + request.getWeChatCode());
return PicaResponse.toResponse(map);
try {
cacheClient.expire(cache_prifix + request.getWeChatCode(), 60);
long doctorId = super.getDoctorIdByToken();
String nickname = loginService.bindWeChat(doctorId, request);
Map<String, String> map = new HashMap();
map.put("nickname", nickname);
//成功以后释放锁
cacheClient.del(cache_prifix + request.getWeChatCode());
return PicaResponse.toResponse(map);
} catch (Exception e) {
cacheClient.del(cache_prifix + request.getWeChatCode());
logger.error("bindWeChat-" + e.getMessage(), e);
throw new PicaWarnException(AccountExceptionEnum.PICA_BIND_WECHAT_FAIL.getCode(), AccountExceptionEnum.PICA_BIND_WECHAT_FAIL.getMessage());
}
} else {
cacheClient.del(cache_prifix + request.getWeChatCode());
return PicaResponse.toResponse(null, AccountExceptionEnum.PICA_WECHAT_UNBIND_CURRENT.getCode(),
AccountExceptionEnum.PICA_WECHAT_UNBIND_CURRENT.getMessage());
}
......@@ -207,4 +212,44 @@ public class LoginController extends AccountBaseController {
}
return PicaResponse.toResponse(resultWeb);
}
@ApiOperation(value = "统一校验(传空则不会校验)")
@PostMapping("/unifiedVerification")
public PicaResponse unifiedVerification(@RequestBody EncryptEntity entity) throws Exception{
BaseRequest request = CryptoUtil.decrypt(entity, BaseRequest.class);
loginService.preLoginValidate(request);
return PicaResponse.toResponse();
}
@ApiOperation(value = "苹果授权登录")
@PostMapping("/login/apple")
public PicaResponse appleAuth(@RequestBody EncryptEntity entity) throws Exception{
BaseRequest request = CryptoUtil.decrypt(entity, BaseRequest.class);
request.setProductType(super.getProductType());
request.setSourceType(super.getSourceType());
request.setLoginIp(super.getIpAddr());
return PicaResponse.toResponse(loginService.loginByApple(request));
}
@ApiOperation(value = "苹果登录绑定手机号")
@PostMapping("/login/apple/step2")
public PicaResponse appleAuthBind(@RequestBody EncryptEntity entity) throws Exception{
BaseRequest request = CryptoUtil.decrypt(entity, BaseRequest.class);
request.setProductType(super.getProductType());
request.setSourceType(super.getSourceType());
request.setLoginIp(super.getIpAddr());
return PicaResponse.toResponse(loginService.loginByAppleStep(request));
}
@ApiOperation(value = "app端手机号码一键登录")
@PostMapping("/login/one-click")
public PicaResponse<LoginResult> oneClickLogin(@RequestBody EncryptEntity entity) throws Exception {
OneClickLoginReq req = CryptoUtil.decrypt(entity, OneClickLoginReq.class);
req.setProductType(super.getProductType());
req.setSourceType(super.getSourceType());
req.setLoginIp(super.getIpAddr());
LoginResult oneClickLoginResultVo = loginService.oneClickLogin(req);
return PicaResponse.toResponse(oneClickLoginResultVo);
}
}
......@@ -3,18 +3,20 @@ package com.pica.cloud.account.account.server.controller;
import com.pica.cloud.account.account.server.entity.AccountInfoEntity;
import com.pica.cloud.account.account.server.entity.Doctor;
import com.pica.cloud.account.account.server.entity.EncryptEntity;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
import com.pica.cloud.account.account.server.entity.LoginResult;
import com.pica.cloud.account.account.server.enums.AccountExceptionEnum;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
import com.pica.cloud.account.account.server.enums.SourceTypeEnum;
import com.pica.cloud.account.account.server.exception.AccountException;
import com.pica.cloud.account.account.server.mapper.AccountInfoDetailMapper;
import com.pica.cloud.account.account.server.req.BaseRequest;
import com.pica.cloud.account.account.server.service.DoctorService;
import com.pica.cloud.account.account.server.service.PasswordService;
import com.pica.cloud.account.account.server.service.RegisterService;
import com.pica.cloud.account.account.server.util.AESUtil;
import com.pica.cloud.account.account.server.util.AccountUtils;
import com.pica.cloud.account.account.server.util.CryptoUtil;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.utils.entity.PicaUser;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
......@@ -38,6 +40,8 @@ public class PasswordController extends AccountBaseController {
@Autowired
private DoctorService doctorService;
@Autowired
private RegisterService registerService;
/**
* 重置密码
......@@ -78,19 +82,70 @@ public class PasswordController extends AccountBaseController {
@PostMapping(value = "/reset")
public PicaResponse forgetPassword(@RequestBody EncryptEntity entity) throws Exception {
BaseRequest request = CryptoUtil.decrypt(entity, BaseRequest.class);
if (super.getSourceType()==2){
accountUtils.checkMobilePhoneAndAuthCode(request.getMobile(), "5", request.getAuthCode());
if (request.getBizType() != null &&
request.getBizType().equals(1)) {
AccountInfoEntity account = accountInfoDetailMapper.selectByMobile(AESUtil.encryptV0(request.getMobile()));
request.setProductType(super.getProductType());
if (account == null) {
if (SourceTypeEnum.APPLE.getCode().equals(super.getSourceType())) {
// 验证码校验
accountUtils.checkRegisterMobilePhoneAndAuthCode(
request.getMobile(),
AccountTypeEnum.SYSCODE_TYPE_FORGET_PASSWORD.getCode() + "",
request.getAuthCode());
} else {
// 验证码校验
accountUtils.checkRegisterMobilePhoneAndAuthCode(
request.getMobile(),
AccountTypeEnum.SYSCODE_TYPE_RESET_PASSWORD.getCode() + "",
request.getAuthCode());
}
if (StringUtils.isEmpty(request.getPassword())) {
throw new AccountException(AccountExceptionEnum.PICA_PASSWORD_ERROR);
}
// 新版-未注册-则默认注册
request.setSourceType(super.getSourceType());
request.setLoginIp(super.getIpAddr());
LoginResult result = registerService.register(request);
// 已补全密码
result.setEntireFlag(3);
return PicaResponse.toResponse(result);
} else {
// 新版-已注册了的则找回密码
reSetPwd(request, account);
// 后台生成token返回,删除账号锁定缓存
return PicaResponse.toResponse(passwordService.findPwdLogin(request, account));
}
} else {
// 老版
return reSetPwd(request, null);
}
}
/**
* @Description 找回密码
* @Author Chongwen.jiang
* @Date 2020/2/21 20:07
* @ModifyDate 2020/2/21 20:07
* @Params [request, entity]
* @Return com.pica.cloud.foundation.entity.PicaResponse
*/
private PicaResponse reSetPwd(BaseRequest request, AccountInfoEntity entity) {
// 4重置密码 5忘记密码
if (SourceTypeEnum.APPLE.getCode().equals(super.getSourceType())) {
// ios
accountUtils.checkMobilePhoneAndAuthCode(request.getMobile(), "5", request.getAuthCode());
if (StringUtils.isEmpty(request.getPassword())) {
throw new AccountException(AccountExceptionEnum.PICA_PASSWORD_ERROR);
}
passwordService.forgetPassword(request);
passwordService.forgetPassword(request, entity);
return PicaResponse.toResponse();
}else{
accountUtils.checkMobilePhoneAndAuthCode(request.getMobile(), "4", request.getAuthCode());
} else {
accountUtils.checkMobilePhoneAndAuthCode(request.getMobile(), "4", request.getAuthCode());
if (StringUtils.isEmpty(request.getPassword())) {
throw new AccountException(AccountExceptionEnum.PICA_PASSWORD_ERROR);
}
passwordService.forgetPassword(request);
passwordService.forgetPassword(request, entity);
return PicaResponse.toResponse();
}
}
......
......@@ -6,6 +6,8 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.Map;
......@@ -30,6 +32,16 @@ public class TokenController extends AccountBaseController {
return PicaResponse.toResponse(token);
}
@ApiOperation(value = "token续时")
@GetMapping(value = "/token/continue")
public PicaResponse tokenContinueTime(
@RequestHeader(value = "token") String token,
@RequestHeader(value = "sourceType") Integer sourceType,
@RequestParam(value = "seconds", required = false) Integer seconds) throws Exception {
tokenService.tokenContinueTime(token, sourceType, seconds);
return PicaResponse.toResponse();
}
}
package com.pica.cloud.account.account.server.entity;
import java.util.Date;
public class AccountAppleInfo {
private Integer id;
private String appleUserId;
private String appleId;
private String info;
private Integer deleteFlag;
private Integer createdId;
private Date createdTime;
private Integer modifiedId;
private Date modifiedTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getAppleUserId() {
return appleUserId;
}
public void setAppleUserId(String appleUserId) {
this.appleUserId = appleUserId == null ? null : appleUserId.trim();
}
public String getAppleId() {
return appleId;
}
public void setAppleId(String appleId) {
this.appleId = appleId == null ? null : appleId.trim();
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info == null ? null : info.trim();
}
public Integer getDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(Integer deleteFlag) {
this.deleteFlag = deleteFlag;
}
public Integer getCreatedId() {
return createdId;
}
public void setCreatedId(Integer createdId) {
this.createdId = createdId;
}
public Date getCreatedTime() {
return createdTime;
}
public void setCreatedTime(Date createdTime) {
this.createdTime = createdTime;
}
public Integer getModifiedId() {
return modifiedId;
}
public void setModifiedId(Integer modifiedId) {
this.modifiedId = modifiedId;
}
public Date getModifiedTime() {
return modifiedTime;
}
public void setModifiedTime(Date modifiedTime) {
this.modifiedTime = modifiedTime;
}
}
\ No newline at end of file
......@@ -40,6 +40,16 @@ public class LogLoginEntity extends AccountLogEntity {
private String token;
private QueryMobileEntity queryMobileEntity;
public QueryMobileEntity getQueryMobileEntity() {
return queryMobileEntity;
}
public void setQueryMobileEntity(QueryMobileEntity queryMobileEntity) {
this.queryMobileEntity = queryMobileEntity;
}
public Integer getId() {
return id;
}
......
package com.pica.cloud.account.account.server.entity;
import java.util.Date;
public class LogLoginOnekey {
private Integer id;
private Integer logLoginId;
private Integer deviceType;
private String mobile;
private String tradeNo;
private Integer fanqizha;
private String tag;
private String info;
private Integer deleteFlag;
private Integer createId;
private Date createTime;
private Integer modifyId;
private Date modifyTime;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public Integer getLogLoginId() {
return logLoginId;
}
public void setLogLoginId(Integer logLoginId) {
this.logLoginId = logLoginId;
}
public Integer getDeviceType() {
return deviceType;
}
public void setDeviceType(Integer deviceType) {
this.deviceType = deviceType;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile == null ? null : mobile.trim();
}
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo == null ? null : tradeNo.trim();
}
public Integer getFanqizha() {
return fanqizha;
}
public void setFanqizha(Integer fanqizha) {
this.fanqizha = fanqizha;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag == null ? null : tag.trim();
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info == null ? null : info.trim();
}
public Integer getDeleteFlag() {
return deleteFlag;
}
public void setDeleteFlag(Integer deleteFlag) {
this.deleteFlag = deleteFlag;
}
public Integer getCreateId() {
return createId;
}
public void setCreateId(Integer createId) {
this.createId = createId;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public Integer getModifyId() {
return modifyId;
}
public void setModifyId(Integer modifyId) {
this.modifyId = modifyId;
}
public Date getModifyTime() {
return modifyTime;
}
public void setModifyTime(Date modifyTime) {
this.modifyTime = modifyTime;
}
}
\ No newline at end of file
......@@ -28,6 +28,7 @@ public class LoginResult {
@ApiModelProperty("用户id,已经加密处理")
private String doctorId;
public String getToken() {
return token;
}
......@@ -83,4 +84,5 @@ public class LoginResult {
public void setDoctorId(String doctorId) {
this.doctorId = doctorId;
}
}
package com.pica.cloud.account.account.server.entity;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 17:09
*/
public class MobileDataEntity {
private String mobileName;
private String tradeNo;
private Integer fanqizha;
private String tag;
public String getMobileName() {
return mobileName;
}
public void setMobileName(String mobileName) {
this.mobileName = mobileName;
}
public String getTradeNo() {
return tradeNo;
}
public void setTradeNo(String tradeNo) {
this.tradeNo = tradeNo;
}
public Integer getFanqizha() {
return fanqizha;
}
public void setFanqizha(Integer fanqizha) {
this.fanqizha = fanqizha;
}
public String getTag() {
return tag;
}
public void setTag(String tag) {
this.tag = tag;
}
@Override
public String toString() {
return "MobileDataEntity{" +
"mobileName='" + mobileName + '\'' +
", tradeNo='" + tradeNo + '\'' +
", fanqizha=" + fanqizha +
", tag='" + tag + '\'' +
'}';
}
}
package com.pica.cloud.account.account.server.entity;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 17:06
*/
public class QueryMobileEntity {
private String code;
private String message;
private Integer chargeStatus;
private MobileDataEntity data;
private String mobile;
private Integer sourceType;
public Integer getSourceType() {
return sourceType;
}
public void setSourceType(Integer sourceType) {
this.sourceType = sourceType;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
public Integer getChargeStatus() {
return chargeStatus;
}
public void setChargeStatus(Integer chargeStatus) {
this.chargeStatus = chargeStatus;
}
public MobileDataEntity getData() {
return data;
}
public void setData(MobileDataEntity data) {
this.data = data;
}
@Override
public String toString() {
return "QueryMobileEntity{" +
"code='" + code + '\'' +
", message='" + message + '\'' +
", chargeStatus=" + chargeStatus +
", data=" + data +
", mobile='" + mobile + '\'' +
", sourceType=" + sourceType +
'}';
}
}
......@@ -29,7 +29,30 @@ public enum AccountExceptionEnum {
PICA_WECHAT_CODE_ERROR("216521", "微信登录授权code不正确"),
PICA_WECHAT_UNBIND("216522", "该微信号已绑定其他云鹊医账户,你可以使用微信登录云鹊医,在「设置」页解除绑定"),
PICA_WECHAT_BIND_OTHER("216524", "该手机号已绑定其他微信号,你可以在「设置」页解除绑定"),
PICA_WECHAT_UNBIND_CURRENT("216523", "正在绑定中,请稍等");
PICA_WECHAT_UNBIND_CURRENT("216523", "正在绑定中,请稍等"),
PICA_PASSWORD_RULE_ERROR("216525","该手机号{mobile}尚未设置密码,请先设置密码。"),
PICA_PWD_MISMATCH_4("216526", "密码错误,请重试"),
PICA_PWD_MISMATCH_5("216527", "该账号{mobile}的密码错误次数已达上限请24小时后再试,或请使用其他登录方式或找回密码"),
PICA_APPLE_TOKEN_ERROR("216528", "Apple登录授权token不正确"),
PICA_APPLE_BIND_OTHER("216529", "该Apple账号已绑定其他账户"),
PICA_MOBILE_BIND_OTHER("216530", "该手机号已绑定其他Apple账号"),
PICA_MOBILE_REG_FALSE("216531", "请输入正确的手机号"),
PICA_MOBILE_NOT_REGIST("216533", "该手机号{mobile}尚未设置密码,请先设置密码。"),
PICA_MOBILE_NOT_SETED_PASSWORD("216534", "该手机号{mobile}尚未设置密码,请先设置密码。"),
// 风控禁止发送
PICA_RC_SEND_FAIL("216536", "发送异常"),
PICA_RC_TRIGGER("216537", "需要触发风控滑动验证"),
// 账号、IP、设备在黑名单内,前端提示发送成功,后端不发送短信
PICA_RC_BLACKLIST("216538", "发送成功"),
PICA_RC_DAY_LIMIT("216539", "今日获取验证码次数已超过上限,请使用账户密码登录"),
PICA_RC_60_SECOND_LIMIT("216540", "验证码发送频率过高,请{remainTime}秒后再试"),
PICA_H5_AUTH_CODE_INTERFACE_OFFED("216541", "该功能已关闭"),
PICA_MESSAGE_SERVICE_CALL_FAIL("216542", "短信发送失败"),
PICA_BIND_WECHAT_FAIL("216543", "绑定微信失败"),
xxx_xxx("","");
private String code;
......
......@@ -13,6 +13,8 @@ public enum AccountTypeEnum {
LOGIN_WE_CHAT(3, "微信登录"),
LOGIN_OUT(4, "退出登录"),
LOGIN_REGISTER(5, "注册登录"),
LOGIN_APPLE(6, "Apple登录"),
LOGIN_ONE_CLICK(7, "一键登录"),
//登录态相关枚举
LOGIN_STATUS_SUCCESS(1, "登录成功"),
......@@ -30,18 +32,23 @@ public enum AccountTypeEnum {
DEVICE_TYPE_ADMIN(5, "admin"),
//验证码获取类型: flag:0登录(默认)1注册 2微信登录绑定手机 3修改手机 4重置密码
//5忘记密码 7患者招募提交问卷(效验) 8Appe登录绑定手机
SYSCODE_TYPE_LOGIN(0, "登录"),
SYSCODE_TYPE_REGISTER(1, "注册"),
SYSCODE_TYPE_WE_CHAT(2, "微信登录绑定手机"),
SYSCODE_TYPE_MODIFY_MOBILE(3, "修改手机号"),
SYSCODE_TYPE_RESET_PASSWORD(4, "重置密码"),
SYSCODE_TYPE_FORGET_PASSWORD(5, "重置密码"),
SYSCODE_TYPE_SMO_COMIIT_QUESTIONNAIRE(6, "患者招募提交问卷"),
SYSCODE_TYPE_APPLE(8, "Appe登录绑定手机"),
//联合登录类型
UNION_LOGIN_WE_CHAT(1, "微信"),
UNION_LOGIN_QQ(2, "QQ"),
union_login_blog(3, "微博"),
UNION_LOGIN_APPLE(4, "苹果"),
//微信绑定状态
//微信/apple绑定状态
BIND_STATUS_SUCCESS(1, "已绑定"),
BIND_STATUS_FAILURE(0, "未绑定"),
......
package com.pica.cloud.account.account.server.enums;
/**
* @Description 统一校验响应枚举类
* @Author Chongwen.jiang
* @Date 2020/2/20 18:19
* @ModifyDate 2020/2/20 18:19
* @Params
* @Return
*/
public enum RcRepTypeEnum {
// 风控禁止发送
RC_SEND_FAIL("2", "发送失败"),
RC_TRIGGER("3", "需要触发风控滑动验证"),
// 账号、IP、设备在黑名单内,前端提示发送成功,后端不发送短信
RC_BLACKLIST("4", "发送成功"),
RC_DAY_LIMIT("5", "今日获取验证码次数已超过上限,请使用账户密码登录"),
RC_60_SECOND_LIMIT("6", "验证码发送频率过高,请{remainTime}秒后再试"),
XXX("0", "xxxxxx");
private String code;
private String msg;
RcRepTypeEnum(String code, String msg) {
this.code = code;
this.msg = msg;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setType(String msg) {
this.msg = msg;
}
}
package com.pica.cloud.account.account.server.enums;
/**
* @Description 统一校验业务类型枚举类
* @Author Chongwen.jiang
* @Date 2020/2/20 18:19
* @ModifyDate 2020/2/20 18:19
* @Params
* @Return
*/
public enum SourceTypeEnum {
ANDROID(1, "安卓"),
APPLE(2, "ios"),
SAAS(3, "saas"),
H5(4, "h5"),
ADMIN(5, "admin"),
XXX(10, "xxxxxx");
private Integer code;
private String type;
SourceTypeEnum(Integer code, String type) {
this.code = code;
this.type = type;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
......@@ -4,11 +4,13 @@ package com.pica.cloud.account.account.server.log;
import com.pica.cloud.account.account.server.entity.LogLoginEntity;
import com.pica.cloud.account.account.server.entity.LogPWDModifyEntity;
import com.pica.cloud.account.account.server.entity.LogUserInfoEntity;
import com.pica.cloud.account.account.server.entity.QueryMobileEntity;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
import com.pica.cloud.account.account.server.mapper.LogLoginMapper;
import com.pica.cloud.account.account.server.mapper.LogPWDModifyMapper;
import com.pica.cloud.account.account.server.mapper.LogUserInfoMapper;
import com.pica.cloud.account.account.server.model.OneClickProcessor;
import com.pica.cloud.account.account.server.util.BeanUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -28,6 +30,8 @@ public class AccountLogTask implements Runnable {
private LogUserInfoMapper logUserInfoMapper;
private OneClickProcessor oneClickProcessor;
/**
* 日志类型
*/
......@@ -44,6 +48,8 @@ public class AccountLogTask implements Runnable {
loginLogMapper = BeanUtil.getBean(LogLoginMapper.class);
logPWDModifyMapper = BeanUtil.getBean(LogPWDModifyMapper.class);
logUserInfoMapper = BeanUtil.getBean(LogUserInfoMapper.class);
oneClickProcessor = BeanUtil.getBean(OneClickProcessor.class);
}
@Override
......@@ -53,6 +59,11 @@ public class AccountLogTask implements Runnable {
if (type == AccountTypeEnum.LOG_TYPE_LOGIN.getCode()) {
logger.info("login record......");
loginLogMapper.insert((LogLoginEntity) picaLogEntity);
QueryMobileEntity queryMobileEntity = ((LogLoginEntity) picaLogEntity).getQueryMobileEntity();
if(queryMobileEntity != null){
// 记录一键登录日志
oneClickProcessor.savelogLoginOnekey(queryMobileEntity,((LogLoginEntity) picaLogEntity).getId());
}
} else if (type == AccountTypeEnum.LOG_TYPE_PASSWORD.getCode()) {
logPWDModifyMapper.insert((LogPWDModifyEntity) picaLogEntity);
} else if (type == AccountTypeEnum.LOG_TYPE_USER_INFO.getCode()) {
......
package com.pica.cloud.account.account.server.mapper;
import com.pica.cloud.account.account.server.entity.AccountAppleInfo;
import org.apache.ibatis.annotations.Param;
public interface AccountAppleInfoMapper {
int insert(AccountAppleInfo record);
int insertSelective(AccountAppleInfo record);
AccountAppleInfo selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(AccountAppleInfo record);
int updateByPrimaryKey(AccountAppleInfo record);
AccountAppleInfo selectByUserId(@Param("id") String appleUserId);
}
\ No newline at end of file
......@@ -3,15 +3,17 @@ package com.pica.cloud.account.account.server.mapper;
import com.pica.cloud.account.account.server.entity.AccountUnionEntity;
import java.util.Map;
public interface AccountUnionMapper {
/**
* 解除绑定关系
*
* @param acctId 账户id
* @param map
* @return
*/
int updateUnbindByAcctId(Integer acctId);
int updateUnbindByAcctId(Map<String, Object> map);
/**
* 是否绑定过手机号
......@@ -21,11 +23,7 @@ public interface AccountUnionMapper {
*/
AccountUnionEntity selectByUnionId(String unionId);
AccountUnionEntity selectByAcctId(Integer acctId);
int deleteByPrimaryKey(Integer id);
AccountUnionEntity selectByAcctId(Map<String, Object> map);
int insert(AccountUnionEntity record);
......
package com.pica.cloud.account.account.server.mapper;
import com.pica.cloud.account.account.server.entity.LogLoginOnekey;
public interface LogLoginOnekeyMapper {
int deleteByPrimaryKey(Integer id);
int insert(LogLoginOnekey record);
int insertSelective(LogLoginOnekey record);
LogLoginOnekey selectByPrimaryKey(Integer id);
int updateByPrimaryKeySelective(LogLoginOnekey record);
int updateByPrimaryKey(LogLoginOnekey record);
}
\ No newline at end of file
package com.pica.cloud.account.account.server.model;
import com.alibaba.fastjson.JSONObject;
import com.pica.cloud.account.account.server.entity.LogLoginOnekey;
import com.pica.cloud.account.account.server.entity.MobileDataEntity;
import com.pica.cloud.account.account.server.entity.QueryMobileEntity;
import com.pica.cloud.account.account.server.mapper.LogLoginOnekeyMapper;
import com.pica.cloud.account.account.server.util.AESUtil;
import com.pica.cloud.account.account.server.util.HttpUtil;
import com.pica.cloud.account.account.server.util.MD5;
import com.pica.cloud.account.account.server.util.RSAUtil;
import com.pica.cloud.account.account.server.util.SignUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-24 13:57
*/
@Component
public class OneClickProcessor {
private static final String DEFAULT_ENCRYPT_TYPE = "0";
private Logger logger = LoggerFactory.getLogger(this.getClass());
//手机号加解密方式 0 AES 1 RSA , 可以不传,不传则手机号解密直接使用AES解密
private String aesEncryptType = DEFAULT_ENCRYPT_TYPE;
private String rsaEncryptType = "1";
private String encryptType = DEFAULT_ENCRYPT_TYPE;
private static final String SHANYAN_SUCCESS_CODE = "200000";
//创建应用时填入的rsa公钥对应的私钥字符串
public static final String privateKey = "";
public static final Integer TYPE_IOS = 2;
public static final Integer TYPE_ANDROID = 1;
private static final String TOKEN = "token";
private static final String APPID = "appId";
private static final String ENCRYPT_TYPE = "encryptType";
private static final String SIGN = "sign";
@Value("${shanyan.url.mobilequery}")
private String mobileQueryUrl;
@Value("${shanyan.android.appId}")
private String androidAppId;
@Value("${shanyan.android.appKey}")
private String androidAppKey;
@Value("${shanyan.ios.appId}")
private String iosAppId;
@Value("${shanyan.ios.appKey}")
private String iosAppKey;
@Autowired
private LogLoginOnekeyMapper logLoginOnekeyMapper;
public QueryMobileEntity tokenExchangeMobile(String token, Integer type) {
if (type == null || StringUtils.isEmpty(token)) {
return null;
}
String appId;
String appKey;
if (type.equals(TYPE_ANDROID)) {
appId = androidAppId;
appKey = androidAppKey;
} else if (type.equals(TYPE_IOS)) {
appId = iosAppId;
appKey = iosAppKey;
} else {
return null;
}
//从SDK获取的token参数
QueryMobileEntity queryMobileEntity = null;
try {
Map<String, String> params = new HashMap<>();
params.put(TOKEN, token);
params.put(APPID, appId);
params.put(ENCRYPT_TYPE, encryptType);//可以不传,不传则解密直接使用AES解密
params.put(SIGN, SignUtils.getSign(params, appKey));
queryMobileEntity = HttpUtil.postForm(mobileQueryUrl, params, QueryMobileEntity.class);
if (null != queryMobileEntity) {
logger.info("一键登录token换取手机号结果:{}", queryMobileEntity);
String code = queryMobileEntity.getCode(); //返回码 200000为成功
if (SHANYAN_SUCCESS_CODE.equals(code)) {
MobileDataEntity mobileDataEntity = queryMobileEntity.getData();
String mobile = mobileDataEntity.getMobileName();
if (aesEncryptType.equals(encryptType)) {
String key = MD5.getMD5Code(appKey);
mobile = AESUtil.decrypt(mobile, key.substring(0, 16), key.substring(16));
} else if (rsaEncryptType.equals(encryptType)) {
mobile = RSAUtil.decryptByPrivateKeyForLongStr(mobile, privateKey);
}
queryMobileEntity.setMobile(mobile);
}
}
} catch (Exception e) {
logger.error(e.getMessage());
}
return queryMobileEntity;
}
@Async
public void savelogLoginOnekey(QueryMobileEntity queryMobileEntity,Integer logLoginId) {
LogLoginOnekey l = new LogLoginOnekey();
l.setDeviceType(queryMobileEntity.getSourceType());
MobileDataEntity data = queryMobileEntity.getData();
l.setFanqizha(data.getFanqizha());
l.setTradeNo(data.getTradeNo());
l.setMobile(AESUtil.encryptV0(queryMobileEntity.getMobile()));
l.setLogLoginId(logLoginId);
l.setInfo(JSONObject.toJSONString(queryMobileEntity));
Date d = new Date();
l.setCreateId(-1);
l.setCreateTime(d);
l.setModifyId(-1);
l.setModifyTime(d);
logLoginOnekeyMapper.insertSelective(l);
}
}
......@@ -34,6 +34,18 @@ public class BaseRequest {
private String captchaToken;
@ApiModelProperty("图片验证码答案")
private String captchaAnswer;
@ApiModelProperty("业务类型,1-新老业务区分标识,2-手机号格式校验业务,3-密码登录校验业务")
private Integer bizType;
@ApiModelProperty("设备id")
private String device_token;
@ApiModelProperty("苹果身份token")
private String identifyToken;
@ApiModelProperty("苹果用户id")
private String appleUserId;
@ApiModelProperty("appleId")
private String appleId;
@ApiModelProperty("apple用户信息(json字符串)")
private String info;
public String getCaptchaToken() {
return captchaToken;
......@@ -146,4 +158,52 @@ public class BaseRequest {
public void setWeChatLoginType(Integer weChatLoginType) {
this.weChatLoginType = weChatLoginType;
}
public String getAppleUserId() {
return appleUserId;
}
public void setAppleUserId(String appleUserId) {
this.appleUserId = appleUserId;
}
public Integer getBizType() {
return bizType;
}
public void setBizType(Integer bizType) {
this.bizType = bizType;
}
public String getIdentifyToken() {
return identifyToken;
}
public void setIdentifyToken(String identifyToken) {
this.identifyToken = identifyToken;
}
public String getAppleId() {
return appleId;
}
public void setAppleId(String appleId) {
this.appleId = appleId;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
public String getDevice_token() {
return device_token;
}
public void setDevice_token(String device_token) {
this.device_token = device_token;
}
}
package com.pica.cloud.account.account.server.req;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 15:58
*/
public class OneClickLoginReq {
private Integer sourceType;
private String token = "";
private String loginIp;
private int productType;
public String getLoginIp() {
return loginIp;
}
public void setLoginIp(String loginIp) {
this.loginIp = loginIp;
}
public int getProductType() {
return productType;
}
public void setProductType(int productType) {
this.productType = productType;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public Integer getSourceType() {
return sourceType;
}
public void setSourceType(Integer sourceType) {
this.sourceType = sourceType;
}
}
package com.pica.cloud.account.account.server.req;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 17:11
*/
public class QueryMobileReq {
private String token;
private String appId;
private String clientIp;
private String encryptType;
private String outId;
private String sign;
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getAppId() {
return appId;
}
public void setAppId(String appId) {
this.appId = appId;
}
public String getClientIp() {
return clientIp;
}
public void setClientIp(String clientIp) {
this.clientIp = clientIp;
}
public String getEncryptType() {
return encryptType;
}
public void setEncryptType(String encryptType) {
this.encryptType = encryptType;
}
public String getOutId() {
return outId;
}
public void setOutId(String outId) {
this.outId = outId;
}
public String getSign() {
return sign;
}
public void setSign(String sign) {
this.sign = sign;
}
}
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.resp;
import io.swagger.annotations.ApiModel;
/**
* @ClassName UnifiedVerificationResp
* @Description 统一验证响应类
* @Author Chongwen.jiang
* @Date 2020/2/20 20:48
* @ModifyDate 2020/2/20 20:48
* @Version 1.0
*/
@ApiModel(value = "UnifiedVerificationResp", description = "统一验证响应类")
public class UnifiedVerificationResp {
private Integer bizCode;
private String bizMsg;
public Integer getBizCode() {
return bizCode;
}
public void setBizCode(Integer bizCode) {
this.bizCode = bizCode;
}
public String getBizMsg() {
return bizMsg;
}
public void setBizMsg(String bizMsg) {
this.bizMsg = bizMsg;
}
}
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.service;
import com.pica.cloud.account.account.server.req.BaseRequest;
import javax.servlet.http.HttpServletRequest;
/**
* @ClassName AuthCodeService
* @Description 验证码业务
* @Author Chongwen.jiang
* @Date 2020/3/5 17:01
* @ModifyDate 2020/3/5 17:01
* @Version 1.0
*/
public interface AuthCodeService {
void rcValidate(HttpServletRequest request, BaseRequest baseRequest, String deviceInfoStr);
void recordRcData(HttpServletRequest req, BaseRequest baseRequest, String deviceIp);
}
......@@ -3,6 +3,13 @@ package com.pica.cloud.account.account.server.service;
import com.pica.cloud.account.account.server.entity.LoginResult;
import com.pica.cloud.account.account.server.entity.PICAPDoctor;
import com.pica.cloud.account.account.server.req.BaseRequest;
import com.pica.cloud.account.account.server.resp.UnifiedVerificationResp;
import com.pica.cloud.foundation.entity.PicaResponse;
import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import com.pica.cloud.account.account.server.req.OneClickLoginReq;
import com.pica.cloud.account.account.server.vo.OneClickLoginResultVo;
public interface LoginService {
/**
......@@ -52,4 +59,36 @@ public interface LoginService {
String bindWeChat(long doctorId, BaseRequest request);
PICAPDoctor queryDoctor(long doctorId);
/**
* @Description 统一校验(传空则不会校验)
* @Author Chongwen.jiang
* @Date 2020/2/20 16:55
* @ModifyDate 2020/2/20 16:55
* @Params [request]
* @Return com.pica.cloud.foundation.entity.PicaResponse
*/
void preLoginValidate(BaseRequest request);
LoginResult oneClickLogin(OneClickLoginReq req);
/**
* @Description 苹果登录授权
* @Author Chongwen.jiang
* @Date 2020/2/24 10:10
* @ModifyDate 2020/2/24 10:10
* @Params [baseRequest]
* @Return com.pica.cloud.account.account.server.entity.LoginResult
*/
LoginResult loginByApple(BaseRequest baseRequest);
/**
* @Description 苹果登录绑定手机号
* @Author Chongwen.jiang
* @Date 2020/2/24 10:10
* @ModifyDate 2020/2/24 10:10
* @Params [request]
* @Return com.pica.cloud.account.account.server.entity.LoginResult
*/
LoginResult loginByAppleStep(BaseRequest request);
}
package com.pica.cloud.account.account.server.service;
import com.pica.cloud.account.account.server.entity.AccountInfoEntity;
import com.pica.cloud.account.account.server.entity.LoginResult;
import com.pica.cloud.account.account.server.req.BaseRequest;
public interface PasswordService {
......@@ -18,5 +20,7 @@ public interface PasswordService {
*
* @param request 参数模型
*/
void forgetPassword(BaseRequest request);
void forgetPassword(BaseRequest request, AccountInfoEntity entity);
LoginResult findPwdLogin(BaseRequest request, AccountInfoEntity accountInfo);
}
package com.pica.cloud.account.account.server.service;
import com.pica.cloud.account.account.server.entity.LoginResult;
import com.pica.cloud.account.account.server.entity.QueryMobileEntity;
import com.pica.cloud.account.account.server.req.BaseRequest;
import com.pica.cloud.account.account.common.req.OCINRequest;
import com.pica.cloud.foundation.entity.PicaResponse;
......@@ -25,4 +26,6 @@ public interface RegisterService {
void ocinRegister(OCINRequest request);
LoginResult register(BaseRequest baseRequest, QueryMobileEntity queryMobileEntity);
}
......@@ -10,4 +10,7 @@ import java.util.Map;
public interface TokenService {
String getToken(Map<String, Object> map);
void tokenContinueTime(String token, Integer sourceType, Integer seconds);
}
// Copyright 2016-2101 Pica.
package com.pica.cloud.account.account.server.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.pica.cloud.account.account.server.constants.Constants;
import com.pica.cloud.account.account.server.enums.AccountExceptionEnum;
import com.pica.cloud.account.account.server.enums.RcRepTypeEnum;
import com.pica.cloud.account.account.server.req.BaseRequest;
import com.pica.cloud.account.account.server.service.AuthCodeService;
import com.pica.cloud.account.account.server.util.AESUtil;
import com.pica.cloud.account.account.server.util.IPUtil;
import com.pica.cloud.account.account.server.util.PICAPDeviceInfo;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.foundation.entity.PicaResultCode;
import com.pica.cloud.foundation.entity.PicaWarnException;
import com.pica.cloud.foundation.redis.ICacheClient;
import com.pica.cloud.riskcontrol.riskcontrol.client.CheckCodeClient;
import com.pica.cloud.riskcontrol.riskcontrol.common.req.CheckcodeRiskReq;
import com.pica.cloud.riskcontrol.riskcontrol.common.resp.CheckcodeRiskResp;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.Objects;
/**
* @ClassName AuthCodeServiceImpl
* @Description
* @Author Chongwen.jiang
* @Date 2020/3/5 17:01
* @ModifyDate 2020/3/5 17:01
* @Version 1.0
*/
@Service
public class AuthCodeServiceImpl implements AuthCodeService {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private CheckCodeClient rcClient;
@Autowired
private ICacheClient cacheClient;
@Autowired
@Qualifier("accountThreadPool")
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
/**
* @Description 调用风控接口
* @Author Chongwen.jiang
* @Date 2020/2/21 17:12
* @ModifyDate 2020/2/21 17:12
* @Params [mobile]
* @Return com.pica.cloud.account.account.server.resp.UnifiedVerificationResp
*/
@Override
public void rcValidate(HttpServletRequest request, BaseRequest baseRequest, String deviceInfoStr) {
// 调用风控接口
PicaResponse picaResponse = null;
try {
PICAPDeviceInfo deviceInfo = JSON.parseObject(deviceInfoStr, PICAPDeviceInfo.class);
String publicIp = IPUtil.getIpAdrress(request);
String deviceToken = baseRequest.getDevice_token();
CheckcodeRiskReq rcReq = new CheckcodeRiskReq();
rcReq.setMobile(baseRequest.getMobile());
rcReq.setIp(publicIp);
rcReq.setDeviceIp(deviceInfo.getDevice_ip());
rcReq.setDeviceId(deviceToken);
logger.info("rc-checkcodeRisk-req:{}", JSON.toJSONString(rcReq));
picaResponse = rcClient.checkcodeRisk(rcReq);
logger.info("rc-checkcodeRisk-resp:{}", JSON.toJSONString(picaResponse));
} catch (JSONException e) {
logger.error("rc-checkcodeRisk-JSONException", e);
} catch (Exception e) {
logger.error("rc-checkcodeRisk-invoke-exception", e);
}
if (picaResponse != null &&
PicaResultCode.SUCCESS.code().equals(picaResponse.getCode())) {
Object data = picaResponse.getData();
if (Objects.nonNull(data)) {
CheckcodeRiskResp respData = JSON.parseObject(
JSON.toJSONString(data), CheckcodeRiskResp.class);
if (StringUtils.isNotEmpty(respData.getProcessCode())) {
String processCode = respData.getProcessCode();
if (StringUtils.isNotEmpty(processCode)) {
// 请求返回正常
if (processCode.equals(RcRepTypeEnum.RC_SEND_FAIL.getCode())) {
throw new PicaWarnException(AccountExceptionEnum.PICA_RC_SEND_FAIL.getCode(),
AccountExceptionEnum.PICA_RC_SEND_FAIL.getMessage());
} else if (processCode.equals(RcRepTypeEnum.RC_TRIGGER.getCode())) {
throw new PicaWarnException(AccountExceptionEnum.PICA_RC_TRIGGER.getCode(),
AccountExceptionEnum.PICA_RC_TRIGGER.getMessage());
} else if (processCode.equals(RcRepTypeEnum.RC_BLACKLIST.getCode())) {
throw new PicaWarnException(AccountExceptionEnum.PICA_RC_BLACKLIST.getCode(),
AccountExceptionEnum.PICA_RC_BLACKLIST.getMessage());
} else if (processCode.equals(RcRepTypeEnum.RC_DAY_LIMIT.getCode())) {
throw new PicaWarnException(AccountExceptionEnum.PICA_RC_DAY_LIMIT.getCode(),
AccountExceptionEnum.PICA_RC_DAY_LIMIT.getMessage());
} else if (processCode.equals(RcRepTypeEnum.RC_60_SECOND_LIMIT.getCode())) {
// 获取剩余秒数
String authCodeKey = Constants.AUTH_CODE_PREFIX + baseRequest.getFlag() + "-" + AESUtil.encryptV0(baseRequest.getMobile()) + "-secure";
Long time = cacheClient.get(authCodeKey, Long.class);
if(Objects.nonNull(time)) {
int remainTime = 59 - (int) (System.currentTimeMillis() - time) / 1000;
if (remainTime > 0) {
throw new PicaWarnException(AccountExceptionEnum.PICA_RC_60_SECOND_LIMIT.getCode(),
AccountExceptionEnum.PICA_RC_60_SECOND_LIMIT.getMessage().replace("{remainTime}", String.valueOf(remainTime)));
}
} else {
// 刚好60秒缓存时间过去了,也允许发送短信验证码
}
} else {
// processCode equals "1" (允许发送短信验证码)
}
}
}
}
}
}
/**
* @Description 记录风控数据
* @Author Chongwen.jiang
* @Date 2020/2/27 16:53
* @ModifyDate 2020/2/27 16:53
* @Params [req, request]
* @Return void
*/
@Override
public void recordRcData(HttpServletRequest request, BaseRequest baseRequest, String deviceIp) {
CheckcodeRiskReq rec = new CheckcodeRiskReq();
rec.setMobile(baseRequest.getMobile());
rec.setIp(IPUtil.getIpAdrress(request));
rec.setDeviceIp(deviceIp);
rec.setDeviceId(baseRequest.getDevice_token());
try {
threadPoolTaskExecutor.execute(() -> {
logger.info("recordRcData-execute-{}", JSON.toJSONString(rec));
PicaResponse resp = rcClient.logSend(rec);
logger.info("recordRcData-resp-{}", JSON.toJSONString(resp));
});
} catch (Exception e) {
logger.error("recordRcData invoke error", e.getMessage());
}
}
}
package com.pica.cloud.account.account.server.service.impl;
import com.pica.cloud.account.account.server.entity.AccountInfoEntity;
import com.pica.cloud.account.account.server.entity.Doctor;
import com.pica.cloud.account.account.server.entity.LogPWDModifyEntity;
import com.pica.cloud.account.account.server.constants.Constants;
import com.pica.cloud.account.account.server.entity.*;
import com.pica.cloud.account.account.server.enums.AccountExceptionEnum;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
import com.pica.cloud.account.account.server.exception.AccountException;
......@@ -13,6 +12,11 @@ import com.pica.cloud.account.account.server.mapper.DoctorMapper;
import com.pica.cloud.account.account.server.req.BaseRequest;
import com.pica.cloud.account.account.server.service.PasswordService;
import com.pica.cloud.account.account.server.util.AESUtil;
import com.pica.cloud.account.account.server.util.AccountUtils;
import com.pica.cloud.account.account.server.util.TokenUtils;
import com.pica.cloud.foundation.encryption.common.constants.EncryptConstants;
import com.pica.cloud.foundation.encryption.util.EncryptUtils;
import com.pica.cloud.foundation.redis.ICacheClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
......@@ -35,6 +39,19 @@ public class PasswordServiceImpl implements PasswordService {
@Value("${doubleWritingMode}")
private boolean doubleWritingMode;
@Autowired
private AccountUtils accountUtils;
@Autowired
private TokenUtils tokenUtils;
@Autowired
private DoctorMapper doctorInfoMapper;
@Autowired
private ICacheClient cacheClient;
@Override
@Transactional
public void modifyPassword(String mobile, String oldPwd, String pwd) {
......@@ -65,8 +82,10 @@ public class PasswordServiceImpl implements PasswordService {
@Override
@Transactional
public void forgetPassword(BaseRequest request) {
AccountInfoEntity entity = accountInfoDetailMapper.selectByMobile(AESUtil.encryptV0(request.getMobile()));
public void forgetPassword(BaseRequest request, AccountInfoEntity entity) {
if (entity == null) {
entity = accountInfoDetailMapper.selectByMobile(AESUtil.encryptV0(request.getMobile()));
}
if (entity != null) {
String password = request.getPassword();
Integer accId = entity.getId();
......@@ -90,6 +109,48 @@ public class PasswordServiceImpl implements PasswordService {
}
}
/**
* @Description 重置密码-自动登录(生成token),删除账号锁定缓存
* @Author Chongwen.jiang
* @Date 2020/3/3 17:44
* @ModifyDate 2020/3/3 17:44
* @Params [request, accountInfo]
* @Return com.pica.cloud.account.account.server.entity.LoginResult
*/
@Override
public LoginResult findPwdLogin(BaseRequest request, AccountInfoEntity accountInfo) {
Long userId = accountUtils.getUserIdByAcctId(request.getProductType(), accountInfo.getId());
Account account2 = new Account();
account2.setId(userId);
account2.setAcctId(accountInfo.getId());
account2.setCreatTime(new Date());
account2.setMobilePhone(request.getMobile());
account2.setRegisterSource(request.getSourceType());
String newToken = tokenUtils.generateToken(account2);
LoginResult result = new LoginResult();
result.setToken(newToken);
result.setUserId(userId);
result.setMobile(request.getMobile());
result.setDoctorId(EncryptUtils.encryptContent(userId + "", EncryptConstants.ENCRYPT_TYPE_ID));
// 是否完善过个人信息(云鹊医app才需要)
if (request.getProductType() == AccountTypeEnum.PRODUCT_TYPE_DOCTOR.getCode()) {
Doctor doctorEntity = doctorInfoMapper.selectByPrimaryKey(userId.intValue());
result.setEntireFlag(doctorEntity.getEntireFlag());
}
// 删除账号锁定缓存
String lockKey = Constants.ACCOUNT_LOCK_KEY.replace("{mobile}", request.getMobile());
if(cacheClient.exists(lockKey)) {
cacheClient.del(lockKey);
}
// 删除账号错误次数缓存
String errorKey = Constants.PWD_ERROR_NUM_KEY.replace("{mobile}", request.getMobile());
if(cacheClient.exists(errorKey)) {
cacheClient.del(errorKey);
}
return result;
}
/**
* 双写模式,把密码存储到p_doctor表
*
......
package com.pica.cloud.account.account.server.service.impl;
import com.pica.cloud.account.account.common.req.OCINRequest;
import com.pica.cloud.account.account.server.constants.Constants;
import com.pica.cloud.account.account.server.entity.*;
import com.pica.cloud.account.account.server.enums.AccountExceptionEnum;
import com.pica.cloud.account.account.server.enums.AccountTypeEnum;
......@@ -30,9 +31,6 @@ import java.util.concurrent.ExecutorService;
@Service
public class RegisterServiceImpl implements RegisterService {
private final String REPEAT_REGISTER_PREFIX = "repeat-register—";
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
......@@ -41,9 +39,6 @@ public class RegisterServiceImpl implements RegisterService {
@Autowired
private AccountInfoDetailMapper accountInfoDetailMapper;
@Autowired
private AccountPatientInfoMapper accountUserInfoMapper;
@Autowired
private AccountMapper accountMapper;
......@@ -56,12 +51,6 @@ public class RegisterServiceImpl implements RegisterService {
@Autowired
private TokenUtils tokenUtils;
// @Autowired
// private QueueProducer queueProducer;
@Autowired
private AgreementEntityMapper agreementEntityMapper;
@Autowired
private AgreementLogEntityMapper agreementLogEntityMapper;
......@@ -80,15 +69,21 @@ public class RegisterServiceImpl implements RegisterService {
@Transactional
@Override
public LoginResult register(BaseRequest baseRequest) {
return register(baseRequest,null);
}
@Override
public LoginResult register(BaseRequest baseRequest,QueryMobileEntity queryMobileEntity) {
String mobile = baseRequest.getMobile();
//对注册接口做幂等性处理:注册成功,删除缓存,注册失败提示用户
String exist = redisClient.get(REPEAT_REGISTER_PREFIX + mobile);
if (StringUtils.isBlank(exist)) {
String mobileEncrypt = AESUtil.encryptV0(mobile);
AccountInfoEntity accountInfoEntity = accountInfoDetailMapper.selectByMobile(mobileEncrypt);
if (accountInfoEntity == null) {
redisClient.set(REPEAT_REGISTER_PREFIX + mobile, mobile, 30);
try {
String nxKey = Constants.REPEAT_REGISTER_PREFIX + mobile;
Long resultNx = redisClient.setnx(nxKey, mobile);
if(resultNx == 1) {
try {
String mobileEncrypt = AESUtil.encryptV0(mobile);
AccountInfoEntity accountInfoEntity = accountInfoDetailMapper.selectByMobile(mobileEncrypt);
if (accountInfoEntity == null) {
redisClient.expire(nxKey, 30);
Date currentTime = new Date();
int productType = baseRequest.getProductType();
int sourceType = baseRequest.getSourceType();
......@@ -126,6 +121,7 @@ public class RegisterServiceImpl implements RegisterService {
if (!StringUtils.isBlank(password)) {
account.setEntireFlag(3);
}
logger.info("register-add-doctor-start");
accountMapper.insertSelective(account);
Long userId = account.getId();
Account accountToken = new Account();
......@@ -141,33 +137,32 @@ public class RegisterServiceImpl implements RegisterService {
result.setEntireFlag(1);
result.setDoctorId(EncryptUtils.encryptContent(userId + "", EncryptConstants.ENCRYPT_TYPE_ID));
result.setMobile(mobile);
/* ByteArrayOutputStream bos = new ByteArrayOutputStream();
DataOutputStream dos = new DataOutputStream(bos);
try {
dos.writeLong(userId);
} catch (IOException e) {
e.printStackTrace();
}
queueProducer.send(bos.toByteArray());*/
LogLoginEntity entity = AccountLogEntityUtils.getLogLoginEntity(acctId, productType, baseRequest.getSourceType(),
AccountTypeEnum.LOGIN_REGISTER.getCode(), baseRequest.getLoginIp(), AccountTypeEnum.LOGIN_STATUS_SUCCESS.getCode(),
AccountTypeEnum.LOG_TYPE_LOGIN.getCode(),newToken);
if(queryMobileEntity != null){
entity.setQueryMobileEntity(queryMobileEntity);
}
picaLogUtils.info(entity);
processAgreement(userId);
processRoleMap(userId);
redisClient.del(REPEAT_REGISTER_PREFIX + mobile);
redisClient.del(nxKey);
return result;
} catch (Exception e) {
//向上抛出异常,让异常处理框架捕获到
throw new AccountException(AccountExceptionEnum.PICA_REGISTER_FAIL);
} finally {
//如果在注册过程中抛出异常,就删除redis中的注册标记
redisClient.del(REPEAT_REGISTER_PREFIX + mobile);
} else {
logger.info("register-account is exists");
throw new AccountException(AccountExceptionEnum.PICA_ALREADY_REGISTER);
}
} else {
throw new AccountException(AccountExceptionEnum.PICA_ALREADY_REGISTER);
} catch (Exception e) {
//向上抛出异常,让异常处理框架捕获到
logger.error("registerException-" + e.getMessage(), e);
throw new AccountException(AccountExceptionEnum.PICA_REGISTER_FAIL);
} finally {
//如果在注册过程中抛出异常,就删除redis中的注册标记
logger.info("register-finally-del-nxKey");
redisClient.del(nxKey);
}
} else {
logger.info("register-nxKey is exists");
throw new AccountException(AccountExceptionEnum.PICA_ALREADY_REGISTER);
}
}
......@@ -268,33 +263,6 @@ public class RegisterServiceImpl implements RegisterService {
private void processAgreement(Long userId) {
ExecutorService executor = ExecutorServiceUtils.getExecutor();
executor.submit(() -> {
// //用户协议
// Date currentTime = new Date();
// Integer userVersion = agreementEntityMapper.selectByType(AccountAgreementEnum.USER_AGREEMENT.getCode());
// AgreementLogEntity userAgreementLogEntity = new AgreementLogEntity();
// userAgreementLogEntity.setAgreement_type(AccountAgreementEnum.USER_AGREEMENT.getCode());
// userAgreementLogEntity.setDoctor_id(userId);
// userAgreementLogEntity.setVersion(userVersion.toString());
// userAgreementLogEntity.setCreated_id(userId);
// userAgreementLogEntity.setCreated_time(currentTime);
// userAgreementLogEntity.setModified_id(userId);
// userAgreementLogEntity.setModified_time(currentTime);
// userAgreementLogEntity.setDelete_flag(1);
// agreementLogEntityMapper.insert(userAgreementLogEntity);
// //隐私协议
// Integer privateVersion = agreementEntityMapper.selectByType(AccountAgreementEnum.PRIVACY_AGREEMENT.getCode());
// AgreementLogEntity privateAgreementLogEntity = new AgreementLogEntity();
// privateAgreementLogEntity.setAgreement_type(AccountAgreementEnum.PRIVACY_AGREEMENT.getCode());
// privateAgreementLogEntity.setDoctor_id(userId);
// privateAgreementLogEntity.setVersion(privateVersion.toString());
// privateAgreementLogEntity.setCreated_id(userId);
// privateAgreementLogEntity.setCreated_time(currentTime);
// privateAgreementLogEntity.setModified_id(userId);
// privateAgreementLogEntity.setModified_time(currentTime);
// privateAgreementLogEntity.setDelete_flag(1);
// agreementLogEntityMapper.insert(privateAgreementLogEntity);
Integer protocolId = agreementLogEntityMapper.getLatestProtocolId(2); //获取最新用户协议ID
PProtocolLog log = new PProtocolLog();
log.setUserId(userId.toString());
......
......@@ -2,14 +2,18 @@ package com.pica.cloud.account.account.server.service.impl;
import com.pica.cloud.account.account.server.constants.Constants;
import com.pica.cloud.account.account.server.service.TokenService;
import com.pica.cloud.foundation.entity.PicaResponse;
import com.pica.cloud.account.account.server.util.TokenUtils;
import com.pica.cloud.foundation.redis.ICacheClient;
import com.pica.cloud.foundation.utils.entity.PicaUser;
import com.pica.cloud.foundation.utils.utils.CommonUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.Date;
import java.util.Map;
......@@ -24,11 +28,18 @@ import static com.pica.cloud.foundation.utils.utils.json.Object2Map.objectToMapS
*/
@Service
public class TokenServiceImpl implements TokenService {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private ICacheClient redisClient;
@Autowired
private TokenUtils tokenUtils;
@Autowired
@Qualifier("accountThreadPool")
private ThreadPoolTaskExecutor threadPoolTaskExecutor;
@Override
public String getToken(Map<String, Object> headersMap) {
String mobile = new StringBuilder("9").append(CommonUtil.getRandom(10)).toString();
......@@ -56,4 +67,27 @@ public class TokenServiceImpl implements TokenService {
}
return null;
}
/**
* @Description token续时
* @Author Chongwen.jiang
* @Date 2020/2/26 14:06
* @ModifyDate 2020/2/26 14:06
* @Params [token, sourceType] sourceType: 1.android 2.ios 3.web 4.h5 5.admin
* @Return java.lang.String
*/
@Override
public void tokenContinueTime(String token, Integer sourceType, Integer seconds) {
if (StringUtils.isEmpty(token) || null == sourceType) {
return;
}
threadPoolTaskExecutor.execute(() -> {
if (tokenUtils.tokenContinueTime(token, sourceType, seconds)) {
logger.info("tokenContinueTime finish");
}
});
return;
}
}
......@@ -9,6 +9,7 @@ import sun.misc.BASE64Decoder;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigInteger;
import java.util.ArrayList;
......@@ -25,26 +26,9 @@ public class AESUtil {
//算法
private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";
public static final String privateKey="MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAJrqPdInBev+ksvBvo+rymL1K0+r5" +
"a+bq+74tZAHWE2oKVaTSNCbkacXoqPRpzaCqCwyy61zeGExppfZBm8tf6AVAcL+58YF0Fuk+0N4ZaxAi2wx//GqqWQs+Rzt5VPJ+yaulAzs" +
"Eb0tW9o9Vc9VRxl8k0Fpi5Hj5J/pmLZrIj+FAgMBAAECgYAj+0A8rZ+sfsat2ORgDnDFp1hV+wEwVqIKsW3KdEpIT0S6vR7uhRPBkbXPAwU" +
"pnhNdoLa6JNXTDWs6XcgmzpSTx32WS3450+h1QNdLL+doiEinWxGijvp+UN7CadoeFBnLml3gGjPpTMeDheialQExwwvVKKe4+0VjO4zPDG" +
"nrAQJBAM3luGYrweNcFxvVsfQG6cpR/C0DeykyojN0Kbq+3/S+wG1y53Ak1HKz4OHftC4liYNXWy9W1fQ/MSbdVaSka+UCQQDAnJmYwmJ64" +
"I35T+GmgA0r505BCuYZG9pNyrjdko7n5+DaalRWSXuAwXb2SJbFHvWmVEgZOnVRhPdFgZUGP4shAkAjmG1SrInuhoMwOrdzGqbcZWQVXB60" +
"tp44CwMT19/b7gZSZaUBTDy2P8bHBeeeerrVTArlmjuO6EXVFDq0JgDJAkBLlCdhHcVu2fZbwdCVeOGyPI0kUJaBe8BpjgaESyHwNbixe8+" +
"kHCluGHwJn+opZ0CVB7VS0PGAD2DH0VUcooqBAkEAvLBZTnNcM/I2xbV6euw9gpEw7uLkT/94McLQOuZjKPWPHKDQOqa+y+CRPYuxIhQsFK" +
"mlTze7cR+/4QUANvGAow==";
public static final String procPrivateKey="MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAKdXMOUboMkHBOyfuMWuIo6bOp+b5" +
"3i/LoO0qox+sQ+DqFTdt9tH1dF/CoAWtLj5CjDJum7JYJrsMXIqXQnIRr8ZKt+NtdKlqUUeGZYfTPSEIXWb9S+U8DQFqJgXL25xcX1SHxFoeRkZ" +
"WZX5FtUhKTimOVl1FwrkRDmFyIEUa2AbAgMBAAECgYEAlEZHxtoiL74OePRVrqNLb3zQBxkHkxAj0QPGktK3ZP3Nq9UB0kTmisi8rx5vZ+8TPoO" +
"gtAWvmdZrQbOT2NUjCUYKkGS+Wi1fXpP0Az2UJwDIQK4aQTZtNbM04f3Rmi5i24eASmSdl1svjHEv0YS6IC6sR1cbElZs94uDFshUeqECQQDTrm" +
"Zda8fo6ZNsHVYWcjTwr8JKTIgjaD/hPi0JP6hhL0GVEAVwb2rsfJf5o2TR5RsNT8ANUYgFPRaAymLLe+5zAkEAymA9V55K6IJhnSp7HmWfGVmxv" +
"TrwZFJIzPv7DLi/RAS3yFPfTpyJGLirAnBQfKO/vwjxhAuwD21aDYHMTrj1uQJBAJdAikw+cz1tiLU70QOA32sLaxyDytLh7qMXNj7hiYLHrWjB" +
"ZeGM+y23aTArHCMOPWIpleTuWO7FU4r7EdSr3RkCQQCliu4CwyhRY33H210U81memgFLYnAMEEce7qxgrqs+T4Gqa/lJy8BVqZGxkAA2xJfwA7f" +
"UJN9i7zdvvxJJ/wB5AkA+OKfnTXTp8qF4lZiVMrGl3d5sgg87q1DhC5XruviH6a3u6JOLlRNQy2+TGxzWMYaJ1RwEfygqBYOgyvoqNR3Q";
public static final String privateKey = "";
private static final String charset = "UTF-8";
/**
* aes解密
* @param encrypt 内容
......@@ -175,6 +159,28 @@ public class AESUtil {
return EncryptCreateUtil.dencrypt(data);
}
public static String decrypt(String sSrc, String sKey, String siv) throws Exception {
try {
if (sSrc == null || sSrc.length() == 0) {
return null;
}
if (sKey == null) {
throw new Exception("decrypt key is null");
}
if (sKey.length() != 16) {
throw new Exception("decrypt key length error");
}
byte[] Decrypt = ByteFormat.hexToBytes(sSrc);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec skeySpec = new SecretKeySpec(sKey.getBytes(charset), "AES");
IvParameterSpec iv = new IvParameterSpec(siv.getBytes(charset));//new IvParameterSpec(getIV());
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);//使用解密模式初始化 密
return new String(cipher.doFinal(Decrypt), charset);
} catch (Exception ex) {
throw new Exception("decrypt errot", ex);
}
}
/**
* 测试
*/
......
package com.pica.cloud.account.account.server.util;
import com.alibaba.fastjson.JSONObject;
import com.pica.cloud.account.account.server.controller.AccountController;
import com.pica.cloud.account.account.server.constants.Constants;
import com.pica.cloud.account.account.server.enums.AccountExceptionEnum;
import com.pica.cloud.account.account.server.mapper.AccountPatientInfoMapper;
import com.pica.cloud.account.account.server.mapper.DoctorMapper;
import com.pica.cloud.foundation.entity.PicaException;
import com.pica.cloud.foundation.entity.PicaResultCode;
......@@ -20,39 +18,40 @@ import org.springframework.stereotype.Component;
*/
@Component
public class AccountUtils {
private Logger logger = LoggerFactory.getLogger(AccountUtils.class);
@Autowired
private ICacheClient cacheClient;
private Logger logger = LoggerFactory.getLogger(AccountController.class);
@Autowired
private AccountPatientInfoMapper accountPatientInfoMapper;
@Autowired
private DoctorMapper doctorInfoMapper;
private static final String AUTH_CODE_PREFIX = "authCode-";
private static final String AUTH_CODE_COUNT_PREFIX = "authCode-count-";
//手机格式校验
//手机非空和格式校验
public static void checkMobilePhone(String mobilePhone) {
if (StringUtils.isBlank(mobilePhone) || !ValidateUtils.isMobile(mobilePhone)) {
throw new PicaException(PicaResultCode.PARAM_IS_INVALID.code(), "请输入正确的手机号");
}
}
//手机格式校验
//密码非空判断
public static void checkPassword(String password) {
if (StringUtils.isBlank(password)) {
throw new PicaException(AccountExceptionEnum.PICA_NOT_EMPTY.getCode(), AccountExceptionEnum.PICA_NOT_EMPTY.getMessage());
}
}
public static boolean checkPasswordRule(String password){
String regex = "^(?=.*[0-9])(?=.*[a-zA-Z])(.{6,16})$";
boolean pass = password.matches(regex);
if(password.length() < 6 || password.length() > 16 || !pass){
return false;
}
return true;
}
//获取验证码redis key
public static String getAuthCodeKey(String mobilePhone, String flag) {
return AUTH_CODE_PREFIX + flag + "-" + AESUtil.encryptV0(mobilePhone);
public String getAuthCodeKey(String mobilePhone, String flag) {
return Constants.AUTH_CODE_PREFIX + flag + "-" + AESUtil.encryptV0(mobilePhone);
}
//手机号和验证码校验
......@@ -68,7 +67,7 @@ public class AccountUtils {
logger.info("验证码缓存信息----->:" + this.getAuthCodeKey(mobile, flag));
String cacheCode = cacheClient.get(authCodeKey); //从redis获取验证码
if (!org.apache.commons.lang.StringUtils.equals(sysCode, cacheCode)) {
throw new PicaException(PicaResultCode.PARAM_IS_INVALID.code(), "短信验证码错误");
throw new PicaException(PicaResultCode.PARAM_IS_INVALID.code(), "验证码错误,请重新输入");
}
cacheClient.del(authCodeKey);
}
......@@ -83,10 +82,9 @@ public class AccountUtils {
}
String authCodeKey = RegisterCodeKeyUtils.getRegisterKey(mobile, sysCode);
Long num = cacheClient.decr(authCodeKey);
logger.info("key" + authCodeKey);
logger.info("success" + num);
if (num == -1) {
throw new PicaException(PicaResultCode.RESULE_DATA_NONE.code(), "短信验证码已失效,请重新获取");
if (num <= -1) {
throw new PicaException(PicaResultCode.RESULE_DATA_NONE.code(), "验证码错误,请重新输入");
}
if (num > 0 && num < 99) {
throw new PicaException(PicaResultCode.RESULE_DATA_NONE.code(), "您已注册成功,请直接登录");
......@@ -130,4 +128,5 @@ public class AccountUtils {
public Long getUserIdByAcctId(Integer productType, Integer AcctId) {
return doctorInfoMapper.selectUserIdByAcctId(AcctId);
}
}
package com.pica.cloud.account.account.server.util;
public final class Base64 {
/**
* Base64编码表。
*/
private static final char[] BASE64CODE = { 'A', 'B', 'C', 'D', 'E', 'F',
'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S',
'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's',
't', 'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', '+', '/', };
/**
* Base64解码表。
*/
private static final byte[] BASE64DECODE = { -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1,
-1,
-1, // 注意两个63,为兼容SMP,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 62, -1, 63,
-1,
63, // “/”和“-”都翻译成63。
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1, -1, -1, 0, -1, -1, -1,
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, // 注意两个0:
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -1, -1, -1, -1,
-1, // “A”和“=”都翻译成0。
-1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -1, -1, -1, -1, -1, };
private static final int HEX_255 = 0x0000ff;
private static final int HEX_16515072 = 0xfc0000;
private static final int HEX_258048 = 0x3f000;
private static final int HEX_4032 = 0xfc0;
private static final int HEX_63 = 0x3f;
private static final int HEX_16711680 = 0xff0000;
private static final int HEX_65280 = 0x00ff00;
private static final int NUMBER_TWO = 2;
private static final int NUMBER_THREE = 3;
private static final int NUMBER_FOUR = 4;
private static final int NUMBER_SIX = 6;
private static final int NUMBER_EIGHT = 8;
private static final int NUMBER_TWELVE = 12;
private static final int NUMBER_SIXTEEN = 16;
private static final int NUMBER_EIGHTEEN = 18;
/**
* 构造方法私有化,防止实例化。
*/
private Base64() {
}
/**
* Base64编码。将字节数组中字节3个一组编码成4个可见字符。
*
* @param b
* 需要被编码的字节数据。
* @return 编码后的Base64字符串。
*/
public static String encode(byte[] b) {
int code = 0;
// 按实际编码后长度开辟内存,加快速度
StringBuffer sb = new StringBuffer(
((b.length - 1) / NUMBER_THREE) << NUMBER_TWO + NUMBER_FOUR);
// 进行编码
for (int i = 0; i < b.length; i++) {
code |= (b[i] << (NUMBER_SIXTEEN - i % NUMBER_THREE * NUMBER_EIGHT))
& (HEX_255 << (NUMBER_SIXTEEN - i % NUMBER_THREE
* NUMBER_EIGHT));
if (i % NUMBER_THREE == NUMBER_TWO || i == b.length - 1) {
sb.append(BASE64CODE[(code & HEX_16515072) >>> NUMBER_EIGHTEEN]);
sb.append(BASE64CODE[(code & HEX_258048) >>> NUMBER_TWELVE]);
sb.append(BASE64CODE[(code & HEX_4032) >>> NUMBER_SIX]);
sb.append(BASE64CODE[code & HEX_63]);
code = 0;
}
}
// 对于长度非3的整数倍的字节数组,编码前先补0,编码后结尾处编码用=代替,
// =的个数和短缺的长度一致,以此来标识出数据实际长度
if (b.length % NUMBER_THREE > 0) {
sb.setCharAt(sb.length() - 1, '=');
}
if (b.length % NUMBER_THREE == 1) {
sb.setCharAt(sb.length() - NUMBER_TWO, '=');
}
return sb.toString();
}
/**
* Base64解码。
*
* @param code
* 用Base64编码的ASCII字符串
* @return 解码后的字节数据
*/
public static byte[] decode(String code) {
// 检查参数合法性
if (code == null) {
return null;
}
int len = code.length();
if (len % NUMBER_FOUR != 0) {
throw new IllegalArgumentException(
"Base64 string length must be 4*n");
}
if (code.length() == 0) {
return new byte[0];
}
// 统计填充的等号个数
int pad = 0;
if (code.charAt(len - 1) == '=') {
pad++;
}
if (code.charAt(len - NUMBER_TWO) == '=') {
pad++;
}
// 根据填充等号的个数来计算实际数据长度
int retLen = len / NUMBER_FOUR * NUMBER_THREE - pad;
// 分配字节数组空间
byte[] ret = new byte[retLen];
// 查表解码
char ch1, ch2, ch3, ch4;
int i;
for (i = 0; i < len; i += NUMBER_FOUR) {
int j = i / NUMBER_FOUR * NUMBER_THREE;
ch1 = code.charAt(i);
ch2 = code.charAt(i + 1);
ch3 = code.charAt(i + NUMBER_TWO);
ch4 = code.charAt(i + NUMBER_THREE);
int tmp = (BASE64DECODE[ch1] << NUMBER_EIGHTEEN)
| (BASE64DECODE[ch2] << NUMBER_TWELVE)
| (BASE64DECODE[ch3] << NUMBER_SIX) | (BASE64DECODE[ch4]);
ret[j] = (byte) ((tmp & HEX_16711680) >> NUMBER_SIXTEEN);
if (i < len - NUMBER_FOUR) {
ret[j + 1] = (byte) ((tmp & HEX_65280) >> NUMBER_EIGHT);
ret[j + NUMBER_TWO] = (byte) ((tmp & HEX_255));
} else {
if (j + 1 < retLen) {
ret[j + 1] = (byte) ((tmp & HEX_65280) >> NUMBER_EIGHT);
}
if (j + NUMBER_TWO < retLen) {
ret[j + NUMBER_TWO] = (byte) ((tmp & HEX_255));
}
}
}
return ret;
}
}
package com.pica.cloud.account.account.server.util;
/**
* 格式化操作类
*/
public class ByteFormat {
private static final char[] HEX = new char[]{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
public ByteFormat() {
}
public static final String bytesToHexString(byte[] bArray) {
StringBuffer sb = new StringBuffer(bArray.length);
for (int i = 0; i < bArray.length; ++i) {
String sTemp = Integer.toHexString(255 & bArray[i]);
if (sTemp.length() < 2) {
sb.append(0);
}
sb.append(sTemp.toUpperCase());
}
return sb.toString();
}
public static byte[] hexToBytes(String str) {
if (str == null) {
return null;
} else {
char[] hex = str.toCharArray();
int length = hex.length / 2;
byte[] raw = new byte[length];
for (int i = 0; i < length; ++i) {
int high = Character.digit(hex[i * 2], 16);
int low = Character.digit(hex[i * 2 + 1], 16);
int value = high << 4 | low;
if (value > 127) {
value -= 256;
}
raw[i] = (byte) value;
}
return raw;
}
}
public static void main(String[] args) {
byte[] data = new byte[65536];
for (int i = 0; i < data.length; ++i) {
data[i] = (byte) i;
}
}
}
package com.pica.cloud.account.account.server.util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.pica.cloud.account.account.server.entity.EncryptEntity;
import com.pica.cloud.account.account.server.req.BaseRequest;
import java.util.HashMap;
import java.util.Map;
/**
......@@ -32,6 +35,29 @@ public class CryptoUtil {
// return encryptEntity;
// }
public static void aa(String data) throws Exception{
//1、产生AES密钥
String keyString = "1234567890123456";
//2、用AES法加密数据
String content = AESUtil.aesEncrypt(data, keyString);
//3、用RSA加密AES密钥
String finalKey = RSAUtil.encrypt(keyString);
Map<String, Object> param = new HashMap<>(2);
param.put("key", finalKey);
param.put("content", content);
System.out.println(JSON.toJSONString(param));
}
public static void main(String[] args) throws Exception {
Map<String, Object> param = new HashMap<>(6);
param.put("identifyToken", "eyJraWQiOiI4NkQ4OEtmIiwiYWxnIjoiUlMyNTYifQ.eyJpc3MiOiJodHRwczovL2FwcGxlaWQuYXBwbGUuY29tIiwiYXVkIjoiY29tLnl1bnF1ZXlpLkRvY3RvciIsImV4cCI6MTU4MjcwMjg1NCwiaWF0IjoxNTgyNzAyMjU0LCJzdWIiOiIwMDExMzAuMmI4NzE0NjVmZDFmNDVmZmFmNWRjMjg3ZTQ4OWVlZjEuMDMxNSIsImNfaGFzaCI6InBpYjJScFAyc2U1eFJ4VlM1a0NRUlEiLCJlbWFpbCI6IjdnZ2E1cmo1dGNAcHJpdmF0ZXJlbGF5LmFwcGxlaWQuY29tIiwiZW1haWxfdmVyaWZpZWQiOiJ0cnVlIiwiaXNfcHJpdmF0ZV9lbWFpbCI6InRydWUiLCJhdXRoX3RpbWUiOjE1ODI3MDIyNTQsIm5vbmNlX3N1cHBvcnRlZCI6dHJ1ZX0.bLpPuyD_UJ2Pi7O2QSYSmUKy8wfssLdgOU3lztokJ-FVfTC7N_I183lyVW2C0BWRZURtGtUeqJRqEeKyMapPzgPd98PMOJn5wly_sTxSXKExR62gzcYmk0yY1rFYiiBsj9cbqvzUrqOlFvCi-h52MyimojK2XQx4DSvY69btjmdA0trjneH0HGmvvWGkU8jr1hv0ZkfD4WRAMA2AkeN8fbGHnnY6-_B0a6l_q_Id9eIWTqR2brDfrFGg7FZq_tc6hAC_Lrv6SvceD7UTk-MOXvBjzDrqqKVD-iP0pqyzyW1DjawG3AQuZRLIFN-qaYRzVMotdPeLxUqWEUDGriV9hg");
//param.put("weChatLoginType", 1);
//param.put("weChatCode", "071KMzjM1ge35a1oDekM1zptjM1KMzjO");
aa(JSON.toJSONString(param));
}
/**
* 解密数据
*
......
package com.pica.cloud.account.account.server.util;
import com.alibaba.fastjson.JSON;
import com.pica.cloud.foundation.utils.utils.HttpClientUtil;
import com.pica.cloud.foundation.utils.utils.StringUtil;
import org.apache.commons.io.IOUtils;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.net.URISyntaxException;
import java.util.Iterator;
import java.util.Map;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 17:45
*/
public class HttpUtil {
private static final Logger logger = LoggerFactory.getLogger(HttpClientUtil.class);
private static final CloseableHttpClient hc;
static {
PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
cm.setDefaultMaxPerRoute(20);
cm.setMaxTotal(200);
hc = HttpClients.custom().setConnectionManager(cm).build();
}
public static <T> T postForm(String url, Map<String, String> params, Class<T> clazz) throws IOException, URISyntaxException {
URIBuilder builder = new URIBuilder(url);
if (params != null && params.size() > 0) {
params.forEach((k, v) -> {
builder.setParameter(k, v);
});
}
HttpPost post = new HttpPost(builder.build());
CloseableHttpResponse resp = null;
T data;
try {
resp = hc.execute(post);
String buf = IOUtils.toString(resp.getEntity().getContent(), "utf-8");
data = StringUtil.isNotNull(buf) ? JSON.parseObject(buf, clazz) : null;
} finally {
if (resp != null) {
try {
resp.close();
} catch (IOException var12) {
logger.error(var12.getMessage());
}
}
}
return data;
}
}
package com.pica.cloud.account.account.server.util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
public class IPUtil {
private static Logger logger = LoggerFactory.getLogger(IPUtil.class);
/**
* @Description 获取请求的外网ip
* @Author Chongwen.jiang
* @Date 2020/2/25 9:34
* @ModifyDate 2020/2/25 9:34
* @Params [request]
* @Return java.lang.String
*/
public static String getIpAdrress(HttpServletRequest request) {
String ip = null;
//X-Forwarded-For:Squid 服务代理
String ipAddresses = request.getHeader("X-Forwarded-For");
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
//打印所有头信息
String s = headerNames.nextElement();
String header = request.getHeader(s);
// System.out.println(s+"::::"+header);
}
// System.out.println("headerNames:"+ JSON.toJSONString(headerNames));
// System.out.println("RemoteHost:"+request.getRemoteHost());
// System.out.println("RemoteAddr:"+request.getRemoteAddr());
String unknown = "unknown";
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//Proxy-Client-IP:apache 服务代理
ipAddresses = request.getHeader("Proxy-Client-IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//WL-Proxy-Client-IP:weblogic 服务代理
ipAddresses = request.getHeader("WL-Proxy-Client-IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//HTTP_CLIENT_IP:有些代理服务器
ipAddresses = request.getHeader("HTTP_CLIENT_IP");
}
if (ipAddresses == null || ipAddresses.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
//X-Real-IP:nginx服务代理
ipAddresses = request.getHeader("X-Real-IP");
}
//有些网络通过多层代理,那么获取到的ip就会有多个,一般都是通过逗号(,)分割开来,并且第一个ip为客户端的真实IP
if (ipAddresses != null && ipAddresses.length() != 0) {
ip = ipAddresses.split(",")[0];
}
//还是不能获取到,最后再通过request.getRemoteAddr();获取
if (ip == null || ip.length() == 0 || unknown.equalsIgnoreCase(ipAddresses)) {
ip = request.getRemoteAddr();
}
if("0:0:0:0:0:0:0:1".equalsIgnoreCase(ip)){
ip = "127.0.0.1";
}
return ip;
}
}
package com.pica.cloud.account.account.server.util;
import java.security.MessageDigest;
public class MD5 {
// 全局数组
private final static String[] strDigits = { "0", "1", "2", "3", "4", "5",
"6", "7", "8", "9", "a", "b", "c", "d", "e", "f","g","h","j","?","~" };
// 返回形式为数字跟字符串
private static String byteToArrayString(byte bByte) {
int iRet = bByte;
if (iRet < 0) {
iRet += 256;
}
int iD1 = iRet / 16;
int iD2 = iRet % 16;
return strDigits[iD1] + strDigits[iD2];
}
// 转换字节数组为16进制字串
private static String byteToString(byte[] bByte) {
StringBuffer sBuffer = new StringBuffer();
for (int i = 0; i < bByte.length; i++) {
sBuffer.append(byteToArrayString(bByte[i]));
}
return sBuffer.toString();
}
public static String getMD5Code(String strObj) {
String resultString = null;
try {
resultString = new String(strObj);
MessageDigest md = MessageDigest.getInstance("MD5");
// md.digest() 该函数返回值为存放哈希值结果的byte数组
resultString = byteToString(md.digest(strObj.getBytes("UTF-8")));
} catch (Exception ex) {
ex.printStackTrace();
}
return resultString;
}
}
......@@ -2,12 +2,12 @@ package com.pica.cloud.account.account.server.util;
import org.apache.tomcat.util.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.crypto.Cipher;
import java.io.ByteArrayOutputStream;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
......@@ -16,7 +16,6 @@ import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;
/**
* RSA加解密工具类
*/
......@@ -39,6 +38,21 @@ public class RSAUtil {
RSAUtil.rsapublickey = rsapublickeyTemp;
}
/**
* 加密算法RSA
*/
public static final String KEY_ALGORITHM = "RSA";
/**
* RSA最大加密明文大小
*/
private static final int MAX_ENCRYPT_BLOCK = 117;
/**
* RSA最大解密密文大小
*/
private static final int MAX_DECRYPT_BLOCK = 128;
/**
* 加密方法
*
......@@ -121,6 +135,43 @@ public class RSAUtil {
return outStr;
}
/**
* 私钥解密
*
* @param encryptedStr 已加密数据
* @param privateKey 私钥(BASE64编码)
* @return
* @throws Exception
*/
public static String decryptByPrivateKeyForLongStr(String encryptedStr, String privateKey) throws Exception {
byte[] encryptedData = ByteFormat.hexToBytes(encryptedStr);
byte[] keyBytes = com.pica.cloud.account.account.server.util.Base64.decode(privateKey);
PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
Key privateK = keyFactory.generatePrivate(pkcs8KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(Cipher.DECRYPT_MODE, privateK);
int inputLen = encryptedData.length;
ByteArrayOutputStream out = new ByteArrayOutputStream();
int offSet = 0;
byte[] cache;
int i = 0;
// 对数据分段解密
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
byte[] decryptedData = out.toByteArray();
out.close();
return new String(decryptedData);
}
public static void main(String[] args) throws Exception {
//生成公钥和私钥
// genKeyPair();
......
package com.pica.cloud.account.account.server.util;
import com.pica.cloud.account.account.server.constants.Constants;
/**
* Created on 2020/1/9 16:18
* author:crs
......@@ -7,8 +9,6 @@ package com.pica.cloud.account.account.server.util;
*/
public class RegisterCodeKeyUtils {
private static final String AUTH_CODE_PREFIX = "authCode-";
/**
* 获取注册验证码的key
*
......@@ -17,7 +17,7 @@ public class RegisterCodeKeyUtils {
* @return
*/
public static String getRegisterKey(String mobilePhone, String authCode) {
return AUTH_CODE_PREFIX + AESUtil.encryptV0(mobilePhone) +"-"+ authCode;
return Constants.AUTH_CODE_PREFIX + AESUtil.encryptV0(mobilePhone) +"-"+ authCode;
}
......
package com.pica.cloud.account.account.server.util;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Arrays;
import java.util.Map;
/**
* Description:签名工具类
* User: liutao
* Date: 2019-09-11
* Time: 10:29
*/
public class SignUtils {
public static String getSign(Map<String, String> requestMap, String appKey) {
return hmacSHA256Encrypt(requestMap2Str(requestMap), appKey);
}
private static String hmacSHA256Encrypt(String encryptText, String encryptKey) {
byte[] result = null;
try {
//根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
SecretKeySpec signinKey = new SecretKeySpec(encryptKey.getBytes("UTF-8"), "HmacSHA256");
//生成一个指定 Mac 算法 的 Mac 对象
Mac mac = Mac.getInstance("HmacSHA256");
//用给定密钥初始化 Mac 对象
mac.init(signinKey);
//完成 Mac 操作
byte[] rawHmac = mac.doFinal(encryptText.getBytes("UTF-8"));
return ByteFormat.bytesToHexString(rawHmac);
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
private static String requestMap2Str(Map<String, String> requestMap) {
String[] keys = requestMap.keySet().toArray(new String[0]);
Arrays.sort(keys);
StringBuilder stringBuilder = new StringBuilder();
for (String str : keys) {
if (!str.equals("sign")) {
stringBuilder.append(str).append(requestMap.get(str));
}
}
return stringBuilder.toString();
}
}
......@@ -2,14 +2,15 @@ package com.pica.cloud.account.account.server.util;
import com.pica.cloud.account.account.server.entity.Account;
import com.pica.cloud.account.account.server.entity.Doctor;
import com.pica.cloud.account.account.server.enums.SourceTypeEnum;
import com.pica.cloud.account.account.server.mapper.DoctorMapper;
import com.pica.cloud.foundation.redis.ICacheClient;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import java.text.SimpleDateFormat;
import java.util.HashMap;
......@@ -22,11 +23,9 @@ import java.util.UUID;
*/
@Component
public class TokenUtils {
private Logger logger = LoggerFactory.getLogger(this.getClass());
@Autowired
private ICacheClient cacheClient;
@Autowired
......@@ -43,6 +42,55 @@ public class TokenUtils {
return StringUtils.isBlank(str);
}
/**
* @Description token续时
* @Author Chongwen.jiang
* @Date 2020/2/26 13:07
* @ModifyDate 2020/2/26 13:07
* @Params [token, sourceType]
* @Return boolean
*/
public boolean tokenContinueTime(String token, Integer sourceType, Integer seconds) {
logger.info("tokenContinueTime-token-{}, sourceType-{}, seconds-{}", token, sourceType, seconds);
// 非游客token才去执行token续时代码
Map<String, String> map = cacheClient.getToken(token);
if (!CollectionUtils.isEmpty(map)) {
String id = map.get("id");
logger.info("tokenContinueTime-start-userId-{}", id);
if (StringUtils.isNotEmpty(id) && Integer.parseInt(id) > 0) {
// 根据不同的产品线设置token有效期(web/admin token有效期30天,ios/android/h5 token有效期24小时)
int expiredSeconds = 24 * 60 * 60;
if (!SourceTypeEnum.SAAS.getCode().equals(sourceType) &&
!SourceTypeEnum.ADMIN.getCode().equals(sourceType)) {
expiredSeconds = expiredSeconds * 30;
}
String sourceTypeRedis = AccountUtils.getSourceType(sourceType);
String key = "token-" + token;
// value = "token-doctor-{doctorId}";
if (!cacheClient.exists(key)) {
logger.info("tokenContinueTime-key not exists");
return false;
}
String value = cacheClient.get(key);
if (!cacheClient.exists(value + "-" + sourceTypeRedis)) {
logger.info("tokenContinueTime-value not exists");
return false;
}
try {
cacheClient.set(key, value, expiredSeconds);
cacheClient.set(value + "-" + sourceTypeRedis, key, expiredSeconds);
return true;
} catch (Exception e) {
logger.error("tokenContinueTime-Exception-{}" + e.getMessage(), e);
return false;
}
}
}
return false;
}
/**
* 获取新的token
*
......
package com.pica.cloud.account.account.server.vo;
import com.pica.cloud.account.account.server.entity.QueryMobileEntity;
/**
* @program: pica-cloud-account
* @description:
* @author: wfy
* @create: 2020-02-12 16:01
*/
public class OneClickLoginResultVo {
private QueryMobileEntity queryMobileEntity;
public QueryMobileEntity getQueryMobileEntity() {
return queryMobileEntity;
}
public void setQueryMobileEntity(QueryMobileEntity queryMobileEntity) {
this.queryMobileEntity = queryMobileEntity;
}
}
......@@ -33,12 +33,15 @@ spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
#spring.jackson.default-property-inclusion=non_null
memcached.url=192.168.130.230:11211
#微信登陆
#\u5FAE\u4FE1\u767B\u9646
weChatAppID=wx5103ed453ef2dbe8
weChatAppSecret=6faa9bef3302786c08b2baf278613f38
#h5\u4F7F\u7528\u7684\u4E91\u9E4A\u533B\u516C\u4F17\u53F7
weChatAppIDH5=wx08b383d002c73f26
weChatAppSecretH5=b3a6be25c9f62423b88a3d0611f060d1
weChatURL=https://api.weixin.qq.com/sns/userinfo?
#是否开启双写模式,是否需要向p_doctor表写数据
#\u662F\u5426\u5F00\u542F\u53CC\u5199\u6A21\u5F0F\uFF0C\u662F\u5426\u9700\u8981\u5411p_doctor\u8868\u5199\u6570\u636E
doubleWritingMode=true
#rabbitmq settings
......@@ -53,10 +56,10 @@ management.endpoint.health.show-details=always
# Job config begin
# 控制器地址:服务启动自动注册到控制器中
# \u63A7\u5236\u5668\u5730\u5740\uFF1A\u670D\u52A1\u542F\u52A8\u81EA\u52A8\u6CE8\u518C\u5230\u63A7\u5236\u5668\u4E2D
xxl.job.admin.addresses=http://192.168.110.124:7899/job
#执行器命名规则job-exec-<申请Port>
#\u6267\u884C\u5668\u547D\u540D\u89C4\u5219job-exec-<\u7533\u8BF7Port>
xxl.job.executor.appname=job-exec-7906
xxl.job.executor.ip=
xxl.job.executor.port=7906
......@@ -64,13 +67,10 @@ xxl.job.executor.port=7906
### xxl-job, access token
xxl.job.accessToken=
### 确保改目录可写/opt/xxl-job-logs/jobhandler
### \u786E\u4FDD\u6539\u76EE\u5F55\u53EF\u5199/opt/xxl-job-logs/jobhandler
xxl.job.executor.logpath=/opt/xxl-job-logs/jobhandler
### xxl-job log retention days
xxl.job.executor.logretentiondays=-1
pica.cloud.message.url=https://dev-sc.yunqueyi.com/message
pica.cloud.message.url=https://dev-sc.yunqueyi.com/message
\ No newline at end of file
......@@ -40,6 +40,8 @@ memcached.url=172.19.121.31:11211
#微信登陆
weChatAppID=wx5103ed453ef2dbe8
weChatAppSecret=6faa9bef3302786c08b2baf278613f38
weChatAppIDH5=wx2c577552a2d28550
weChatAppSecretH5=397a92bda46180efa2c2a235b74a409a
weChatURL=https://api.weixin.qq.com/sns/userinfo?
#是否开启双写模式,是否需要向p_doctor表写数据
......
......@@ -39,6 +39,8 @@ memcached.url=192.168.130.230:11211
#微信登陆
weChatAppID=wx5103ed453ef2dbe8
weChatAppSecret=6faa9bef3302786c08b2baf278613f38
weChatAppIDH5=wxcaad75b7fff5659c
weChatAppSecretH5=3d6eea715bc34489b49925b3dbde9c8b
weChatURL=https://api.weixin.qq.com/sns/userinfo?
#是否开启双写模式,是否需要向p_doctor表写数据
......
......@@ -39,6 +39,8 @@ memcached.url=192.168.130.230:11211
#微信登陆
weChatAppID=wx5103ed453ef2dbe8
weChatAppSecret=6faa9bef3302786c08b2baf278613f38
weChatAppIDH5=wx342ef0e5afee54a7
weChatAppSecretH5=3859052f07d3f87cda644bf073927ef1
weChatURL=https://api.weixin.qq.com/sns/userinfo?
#是否开启双写模式,是否需要向p_doctor表写数据
......
spring.profiles.active=dev
\ No newline at end of file
spring.profiles.active=dev
# \u95EA\u9A8C\u4E00\u952E\u767B\u5F55\u914D\u7F6E
shanyan.url.mobilequery=https://api.253.com/open/flashsdk/mobile-query
shanyan.android.appId=s0Iauo2D
shanyan.android.appKey=HRbjBatK
shanyan.ios.appId=w8VjljyP
shanyan.ios.appKey=RmjmLSJo
spring.datasource.tomcat.init-s-q-l=SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci
\ No newline at end of file
......@@ -12,7 +12,7 @@
<appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${encoder.pattern}</pattern>
<charset>GBK</charset>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACE</level>
......@@ -28,7 +28,7 @@
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${encoder.pattern}</pattern>
<charset>GBK</charset>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
......@@ -44,7 +44,7 @@
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${encoder.pattern}</pattern>
<charset>GBK</charset>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
......@@ -60,7 +60,7 @@
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${encoder.pattern}</pattern>
<charset>GBK</charset>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
......@@ -76,7 +76,7 @@
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder>
<pattern>${encoder.pattern}</pattern>
<charset>GBK</charset>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
......
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<!-- 数据库驱动:选择你的本地硬盘上面的数据库驱动包-->
<classPathEntry location="D:\programer\reponsitory\maven\mysql\mysql-connector-java\5.1.39\mysql-connector-java-5.1.39.jar"/>
<!--<classPathEntry location="E:\mysql_jar/mysql-connector-java-5.1.39.jar"/>-->
<context id="tableEntity" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
<property name="addRemarkComments" value="true"/>
<property name="dateFormat" value="false"/>
<property name="suppressDate" value="false"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://192.168.130.200:3306/pica"
userId="pica" password="Joa5@73&amp;8yAYJ2fe">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.pica.cloud.account.account.server.entity" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="mybatis" targetProject="src/main/resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.pica.cloud.account.account.server.mapper" targetProject="src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<table tableName="account_apple_info" domainObjectName="AccountAppleInfo" enableCountByExample="false"
enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pica.cloud.account.account.server.mapper.AccountAppleInfoMapper" >
<resultMap id="BaseResultMap" type="com.pica.cloud.account.account.server.entity.AccountAppleInfo" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="apple_user_id" property="appleUserId" jdbcType="VARCHAR" />
<result column="apple_id" property="appleId" jdbcType="VARCHAR" />
<result column="info" property="info" jdbcType="VARCHAR" />
<result column="delete_flag" property="deleteFlag" jdbcType="INTEGER" />
<result column="created_id" property="createdId" jdbcType="INTEGER" />
<result column="created_time" property="createdTime" jdbcType="TIMESTAMP" />
<result column="modified_id" property="modifiedId" jdbcType="INTEGER" />
<result column="modified_time" property="modifiedTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
id, apple_user_id, apple_id, info, delete_flag, created_id, created_time, modified_id,
modified_time
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from account_apple_info
where id = #{id,jdbcType=INTEGER}
</select>
<insert id="insert" parameterType="com.pica.cloud.account.account.server.entity.AccountAppleInfo" >
insert into account_apple_info (id, apple_user_id, apple_id,
info, delete_flag, created_id,
created_time, modified_id, modified_time
)
values (#{id,jdbcType=INTEGER}, #{appleUserId,jdbcType=VARCHAR}, #{appleId,jdbcType=VARCHAR},
#{info,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=INTEGER}, #{createdId,jdbcType=INTEGER},
#{createdTime,jdbcType=TIMESTAMP}, #{modifiedId,jdbcType=INTEGER}, #{modifiedTime,jdbcType=TIMESTAMP}
)
</insert>
<insert id="insertSelective" parameterType="com.pica.cloud.account.account.server.entity.AccountAppleInfo" >
insert into account_apple_info
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="appleUserId != null" >
apple_user_id,
</if>
<if test="appleId != null" >
apple_id,
</if>
<if test="info != null" >
info,
</if>
delete_flag,
<if test="createdId != null" >
created_id,
</if>
created_time,
<if test="modifiedId != null" >
modified_id,
</if>
modified_time
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=INTEGER},
</if>
<if test="appleUserId != null" >
#{appleUserId,jdbcType=VARCHAR},
</if>
<if test="appleId != null" >
#{appleId,jdbcType=VARCHAR},
</if>
<if test="info != null" >
#{info,jdbcType=VARCHAR},
</if>
1,
<if test="createdId != null" >
#{createdId,jdbcType=INTEGER},
</if>
now(),
<if test="modifiedId != null" >
#{modifiedId,jdbcType=INTEGER},
</if>
now()
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.pica.cloud.account.account.server.entity.AccountAppleInfo" >
update account_apple_info
<set >
<if test="appleUserId != null" >
apple_user_id = #{appleUserId,jdbcType=VARCHAR},
</if>
<if test="appleId != null" >
apple_id = #{appleId,jdbcType=VARCHAR},
</if>
<if test="info != null" >
info = #{info,jdbcType=VARCHAR},
</if>
<if test="deleteFlag != null" >
delete_flag = #{deleteFlag,jdbcType=INTEGER},
</if>
<if test="createdId != null" >
created_id = #{createdId,jdbcType=INTEGER},
</if>
<if test="createdTime != null" >
created_time = #{createdTime,jdbcType=TIMESTAMP},
</if>
<if test="modifiedId != null" >
modified_id = #{modifiedId,jdbcType=INTEGER},
</if>
<if test="modifiedTime != null" >
modified_time = #{modifiedTime,jdbcType=TIMESTAMP},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.pica.cloud.account.account.server.entity.AccountAppleInfo" >
update account_apple_info
set apple_user_id = #{appleUserId,jdbcType=VARCHAR},
apple_id = #{appleId,jdbcType=VARCHAR},
info = #{info,jdbcType=VARCHAR},
delete_flag = #{deleteFlag,jdbcType=INTEGER},
created_id = #{createdId,jdbcType=INTEGER},
created_time = #{createdTime,jdbcType=TIMESTAMP},
modified_id = #{modifiedId,jdbcType=INTEGER},
modified_time = #{modifiedTime,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=INTEGER}
</update>
<!--通过appleUserId获取apple信息-->
<select id="selectByUserId" resultMap="BaseResultMap" parameterType="java.lang.String">
select
id
from account_apple_info
where apple_user_id = #{id} and delete_flag = 1
limit 1
</select>
</mapper>
\ No newline at end of file
......@@ -34,26 +34,25 @@
</select>
<!--通过unionId查询用户信息-->
<select id="selectByAcctId" resultMap="BaseResultMap" parameterType="java.lang.Integer">
<select id="selectByAcctId" resultMap="BaseResultMap" parameterType="java.util.Map">
select
<include refid="Base_Column_List"/>
from account_union
where acct_id = #{acctId,jdbcType=INTEGER} and delete_flag = 1
where acct_id = #{acctId,jdbcType=INTEGER}
and union_type = #{unionType}
and delete_flag = 1
limit 1
</select>
<!--解除绑定关系-->
<update id="updateUnbindByAcctId" parameterType="java.lang.Integer">
<update id="updateUnbindByAcctId" parameterType="java.util.Map">
update account_union
set delete_flag = 2
set delete_flag = 2, modified_time=NOW()
where acct_id = #{acctId,jdbcType=INTEGER}
and union_type = #{unionType}
and delete_flag = 1
</update>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer">
delete from account_union
where id = #{id,jdbcType=INTEGER}
</delete>
<!--更新以前的unionId状态-->
<update id="updateUnionStatus" parameterType="java.lang.String">
update account_union
......@@ -86,21 +85,15 @@
<if test="unionId != null">
union_id,
</if>
<if test="deleteFlag != null">
delete_flag,
</if>
<if test="createdId != null">
created_id,
</if>
<if test="createdTime != null">
created_time,
</if>
<if test="modifiedId != null">
modified_id,
</if>
<if test="modifiedTime != null">
modified_time,
</if>
modified_time
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">
......@@ -115,21 +108,15 @@
<if test="unionId != null">
#{unionId,jdbcType=VARCHAR},
</if>
<if test="deleteFlag != null">
#{deleteFlag,jdbcType=INTEGER},
</if>
1,
<if test="createdId != null">
#{createdId,jdbcType=INTEGER},
</if>
<if test="createdTime != null">
#{createdTime,jdbcType=TIMESTAMP},
</if>
now(),
<if test="modifiedId != null">
#{modifiedId,jdbcType=INTEGER},
</if>
<if test="modifiedTime != null">
#{modifiedTime,jdbcType=TIMESTAMP},
</if>
now()
</trim>
</insert>
<update id="updateByPrimaryKeySelective"
......
......@@ -33,6 +33,9 @@
</delete>
<insert id="insert" parameterType="com.pica.cloud.account.account.server.entity.LogLoginEntity" >
<selectKey resultType="java.lang.Integer" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
insert into log_login ( acct_id, acct_name,
product_type, source_type, login_type,
login_ip, login_time, login_status,
......
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.pica.cloud.account.account.server.mapper.LogLoginOnekeyMapper" >
<resultMap id="BaseResultMap" type="com.pica.cloud.account.account.server.entity.LogLoginOnekey" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="log_login_id" property="logLoginId" jdbcType="INTEGER" />
<result column="device_type" property="deviceType" jdbcType="INTEGER" />
<result column="mobile" property="mobile" jdbcType="VARCHAR" />
<result column="trade_no" property="tradeNo" jdbcType="VARCHAR" />
<result column="fanqizha" property="fanqizha" jdbcType="INTEGER" />
<result column="tag" property="tag" jdbcType="VARCHAR" />
<result column="info" property="info" jdbcType="VARCHAR" />
<result column="delete_flag" property="deleteFlag" jdbcType="INTEGER" />
<result column="create_id" property="createId" jdbcType="INTEGER" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<result column="modify_id" property="modifyId" jdbcType="INTEGER" />
<result column="modify_time" property="modifyTime" jdbcType="TIMESTAMP" />
</resultMap>
<sql id="Base_Column_List" >
id, log_login_id, device_type, mobile, trade_no, fanqizha, tag, info, delete_flag,
create_id, create_time, modify_id, modify_time
</sql>
<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Integer" >
select
<include refid="Base_Column_List" />
from log_login_onekey
where id = #{id,jdbcType=INTEGER}
</select>
<delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
delete from log_login_onekey
where id = #{id,jdbcType=INTEGER}
</delete>
<insert id="insert" parameterType="com.pica.cloud.account.account.server.entity.LogLoginOnekey" >
insert into log_login_onekey (id, log_login_id, device_type,
mobile, trade_no, fanqizha,
tag, info, delete_flag,
create_id, create_time, modify_id,
modify_time)
values (#{id,jdbcType=INTEGER}, #{logLoginId,jdbcType=INTEGER}, #{deviceType,jdbcType=INTEGER},
#{mobile,jdbcType=VARCHAR}, #{tradeNo,jdbcType=VARCHAR}, #{fanqizha,jdbcType=INTEGER},
#{tag,jdbcType=VARCHAR}, #{info,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=INTEGER},
#{createId,jdbcType=INTEGER}, #{createTime,jdbcType=TIMESTAMP}, #{modifyId,jdbcType=INTEGER},
#{modifyTime,jdbcType=TIMESTAMP})
</insert>
<insert id="insertSelective" parameterType="com.pica.cloud.account.account.server.entity.LogLoginOnekey" >
insert into log_login_onekey
<trim prefix="(" suffix=")" suffixOverrides="," >
<if test="id != null" >
id,
</if>
<if test="logLoginId != null" >
log_login_id,
</if>
<if test="deviceType != null" >
device_type,
</if>
<if test="mobile != null" >
mobile,
</if>
<if test="tradeNo != null" >
trade_no,
</if>
<if test="fanqizha != null" >
fanqizha,
</if>
<if test="tag != null" >
tag,
</if>
<if test="info != null" >
info,
</if>
<if test="deleteFlag != null" >
delete_flag,
</if>
<if test="createId != null" >
create_id,
</if>
<if test="createTime != null" >
create_time,
</if>
<if test="modifyId != null" >
modify_id,
</if>
<if test="modifyTime != null" >
modify_time,
</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides="," >
<if test="id != null" >
#{id,jdbcType=INTEGER},
</if>
<if test="logLoginId != null" >
#{logLoginId,jdbcType=INTEGER},
</if>
<if test="deviceType != null" >
#{deviceType,jdbcType=INTEGER},
</if>
<if test="mobile != null" >
#{mobile,jdbcType=VARCHAR},
</if>
<if test="tradeNo != null" >
#{tradeNo,jdbcType=VARCHAR},
</if>
<if test="fanqizha != null" >
#{fanqizha,jdbcType=INTEGER},
</if>
<if test="tag != null" >
#{tag,jdbcType=VARCHAR},
</if>
<if test="info != null" >
#{info,jdbcType=VARCHAR},
</if>
<if test="deleteFlag != null" >
#{deleteFlag,jdbcType=INTEGER},
</if>
<if test="createId != null" >
#{createId,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
#{createTime,jdbcType=TIMESTAMP},
</if>
<if test="modifyId != null" >
#{modifyId,jdbcType=INTEGER},
</if>
<if test="modifyTime != null" >
#{modifyTime,jdbcType=TIMESTAMP},
</if>
</trim>
</insert>
<update id="updateByPrimaryKeySelective" parameterType="com.pica.cloud.account.account.server.entity.LogLoginOnekey" >
update log_login_onekey
<set >
<if test="logLoginId != null" >
log_login_id = #{logLoginId,jdbcType=INTEGER},
</if>
<if test="deviceType != null" >
device_type = #{deviceType,jdbcType=INTEGER},
</if>
<if test="mobile != null" >
mobile = #{mobile,jdbcType=VARCHAR},
</if>
<if test="tradeNo != null" >
trade_no = #{tradeNo,jdbcType=VARCHAR},
</if>
<if test="fanqizha != null" >
fanqizha = #{fanqizha,jdbcType=INTEGER},
</if>
<if test="tag != null" >
tag = #{tag,jdbcType=VARCHAR},
</if>
<if test="info != null" >
info = #{info,jdbcType=VARCHAR},
</if>
<if test="deleteFlag != null" >
delete_flag = #{deleteFlag,jdbcType=INTEGER},
</if>
<if test="createId != null" >
create_id = #{createId,jdbcType=INTEGER},
</if>
<if test="createTime != null" >
create_time = #{createTime,jdbcType=TIMESTAMP},
</if>
<if test="modifyId != null" >
modify_id = #{modifyId,jdbcType=INTEGER},
</if>
<if test="modifyTime != null" >
modify_time = #{modifyTime,jdbcType=TIMESTAMP},
</if>
</set>
where id = #{id,jdbcType=INTEGER}
</update>
<update id="updateByPrimaryKey" parameterType="com.pica.cloud.account.account.server.entity.LogLoginOnekey" >
update log_login_onekey
set log_login_id = #{logLoginId,jdbcType=INTEGER},
device_type = #{deviceType,jdbcType=INTEGER},
mobile = #{mobile,jdbcType=VARCHAR},
trade_no = #{tradeNo,jdbcType=VARCHAR},
fanqizha = #{fanqizha,jdbcType=INTEGER},
tag = #{tag,jdbcType=VARCHAR},
info = #{info,jdbcType=VARCHAR},
delete_flag = #{deleteFlag,jdbcType=INTEGER},
create_id = #{createId,jdbcType=INTEGER},
create_time = #{createTime,jdbcType=TIMESTAMP},
modify_id = #{modifyId,jdbcType=INTEGER},
modify_time = #{modifyTime,jdbcType=TIMESTAMP}
where id = #{id,jdbcType=INTEGER}
</update>
</mapper>
\ No newline at end of file
package com.pica.cloud.account.account.server.mapper;// Copyright 2016-2101 Pica.
import com.pica.cloud.account.account.server.constants.Constants;
import com.pica.cloud.account.account.server.entity.AccountWeChatInfoEntity;
import com.pica.cloud.foundation.redis.ICacheClient;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @ClassName com.pica.cloud.account.account.server.mapper.Test
* @Description junit test
* @Author Chongwen.jiang
* @Date 2020/2/25 14:51
* @ModifyDate 2020/2/25 14:51
* @Version 1.0
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class AccountWeChatInfoMapperTest {
@Autowired
private AccountWeChatInfoMapper weChatInfoMapper;
@Autowired
private ICacheClient cacheClient;
@org.junit.Test
public void test1(){
/* AccountWeChatInfoEntity record = new AccountWeChatInfoEntity();
record.setNickname("Zz");
record.setSex(1);
record.setCountry("中国");
record.setCity("邵阳");
int count = weChatInfoMapper.insertSelective(record);
System.out.println(count);*/
//System.out.println(cacheClient.set(Constants.AUTHCODE_H5_SWITCH_KEY, Constants.AUTHCODE_H5_SWITCH_KEY+"-/account/H5/authCode"));
//System.out.println(cacheClient.del(Constants.AUTHCODE_H5_SWITCH_KEY));
}
}
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册