Commit f332a947 authored by 技术部-任文超's avatar 技术部-任文超
parents c3e6c119 cbc5d96a
......@@ -70,6 +70,11 @@ public interface Constants {
*/
String SESSION_PREFIX = "spring:session:sessions:";
/**
* 默认随机密码长度
*/
int RANDOM_PWD_LEN = 15;
interface Channel {
long BAITIAO = 222L;
String LKB_CODE = "0002"; // 量化派channnel_code
......
......@@ -16,6 +16,7 @@ import cn.quantgroup.xyqb.service.api.IUserApiService;
import cn.quantgroup.xyqb.service.auth.IIdCardService;
import cn.quantgroup.xyqb.service.http.IHttpService;
import cn.quantgroup.xyqb.service.merchant.IMerchantService;
import cn.quantgroup.xyqb.service.register.IUserRegisterService;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.sms.ISmsService;
import cn.quantgroup.xyqb.service.user.*;
......@@ -98,6 +99,9 @@ public class MotanUserServiceImpl implements UserMotanService {
@Autowired
private IUserApiService userApiService;
@Autowired
private IUserRegisterService userRegisterService;
@Autowired
private IUserBtRegisterService userBtRegisterService;
......@@ -296,7 +300,7 @@ public class MotanUserServiceImpl implements UserMotanService {
log.info("第三方用户登录, loginFrom:{}, requestIp:{}", appLoginParam.getRegisterFrom(), requestIp);
User user = userService.findByPhoneInDb(appLoginParam.getPhoneNo());
if (user == null) {
user = register(appLoginParam.getRegisterFrom(), appLoginParam.getPhoneNo(), appLoginParam.getIdNo(), appLoginParam.getName(),appLoginParam.getChannelId());
user = userRegisterService.register(appLoginParam.getRegisterFrom(), appLoginParam.getPhoneNo(), appLoginParam.getIdNo(), appLoginParam.getName(),appLoginParam.getChannelId());
}
if (user == null) {
return returnErrorValue("账户或者密码错误");
......@@ -633,7 +637,7 @@ public class MotanUserServiceImpl implements UserMotanService {
log.info("第三方用户登录, appLoginParam:{} ", appLoginParam);
User user = userService.findByPhoneInDb(appLoginParam.getPhoneNo());
if (user == null) {
user = register(appLoginParam.getRegisterFrom(), appLoginParam.getPhoneNo(), appLoginParam.getIdNo(), appLoginParam.getName(), appLoginParam.getChannelId());
user = userRegisterService.register(appLoginParam.getRegisterFrom(), appLoginParam.getPhoneNo(), appLoginParam.getIdNo(), appLoginParam.getName(), appLoginParam.getChannelId());
}
if (user == null) {
throw new RuntimeException(USER_ERROR_OR_PASSWORD_ERROR);
......@@ -762,68 +766,6 @@ public class MotanUserServiceImpl implements UserMotanService {
return returnValue(t, "");
}
/**
* 注册新用户
*
* @return
*/
private User register(Long registerFrom, String phoneNo, String idNo, String name,Long channelId) {
String randomCode = String.valueOf(random.nextInt(899999) + 100000);
String uuid = lkbUserService.registerApp(phoneNo, randomCode);
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
log.info("第三方登录用户,保存 User");
User user = new User();
if (channelId == 222L) {
user.setRegisteredFrom(channelId);
} else {
user.setRegisteredFrom(registerFrom);
}
user.setRegisteredFrom(registerFrom);
user.setUuid(uuid);
user.setEnable(true);
user.setPhoneNo(phoneNo);
user.setPassword(PasswordUtil.MD5(randomCode + Constants.PASSWORD_SALT));
user.setUpdatedAt(currentTime);
user.setCreatedAt(currentTime);
userRepository.saveAndFlush(user);
if (registerFrom != 645L && registerFrom !=900L) {
smsService.sendAfterRegister(phoneNo);
log.info("第三方登录用户注册成功, registerFrom:{}, phoneNo:{},idNo:{},name:{} 并且已发送短信通知", registerFrom, phoneNo, idNo, name);
}else if(registerFrom ==900L){
smsService.sendAfterRegister(phoneNo,"123");
log.info("第三方(聚美)登录用户注册成功, registerFrom:{}, phoneNo:{},idNo:{},name:{} 并且已发送短信通知", registerFrom, phoneNo, idNo, name);
}
if (StringUtils.isNotBlank(idNo) && StringUtils.isNotBlank(name) && ValidationUtil.validateChinese(name)) {
IdCardInfo cardInfo;
try {
cardInfo = idCardService.getIdCardInfoWithExceptions(idNo);
UserDetail userDetail = new UserDetail();
userDetail.setIdNo(cardInfo.getIdNo());
userDetail.setPhoneNo(phoneNo);
userDetail.setName(name);
userDetail.setIdType(IdType.ID_CARD);
userDetail.setCreatedAt(currentTime);
userDetail.setUpdatedAt(currentTime);
userDetail.setUserId(user.getId());
userDetail.setGender(cardInfo.getGender());
userDetailService.saveUserDetail(userDetail);
lkbUserService.userUpdate(user.getUuid(), name, idNo);
} catch (Exception e) {
log.error("保存 UserDetail 出现异常", e);
}
}
return user;
}
@Override
public UserSysResult<XUserDetail> modifyUserDetail(UserDetailUpdateBean userDetailUpdateBean) {
return returnErrorValue("MotanUserServiceImpl modifyUserDetail(UserDetailUpdateBean userDetailUpdateBean) need to be finish.");
......
package cn.quantgroup.xyqb.controller.external.user;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.aspect.accessable.IpValidator;
import cn.quantgroup.xyqb.controller.IBaseController;
import cn.quantgroup.xyqb.entity.Merchant;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserBtRegister;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.model.*;
import cn.quantgroup.xyqb.model.AuthBean;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.LoginProperties;
import cn.quantgroup.xyqb.model.UserRet;
import cn.quantgroup.xyqb.model.session.LoginInfo;
import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.repository.IUserRepository;
import cn.quantgroup.xyqb.service.auth.IIdCardService;
import cn.quantgroup.xyqb.service.merchant.IMerchantService;
import cn.quantgroup.xyqb.service.register.IUserRegisterService;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.sms.ISmsService;
import cn.quantgroup.xyqb.service.user.ILkbUserService;
......@@ -20,10 +21,7 @@ import cn.quantgroup.xyqb.service.user.IUserBtRegisterService;
import cn.quantgroup.xyqb.service.user.IUserDetailService;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.MqUtils;
import cn.quantgroup.xyqb.util.PasswordUtil;
import cn.quantgroup.xyqb.util.ValidationUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -32,7 +30,6 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.sql.Timestamp;
import java.util.Random;
import static cn.quantgroup.xyqb.constant.UserConstant.USER_ERROR_OR_PASSWORD_ERROR;
......@@ -65,6 +62,8 @@ public class AppController implements IBaseController {
private IMerchantService merchantService;
@Autowired
private IUserBtRegisterService userBtRegisterService;
@Autowired
private IUserRegisterService userRegisterService;
/**
* 第三方用户登录
*/
......@@ -83,8 +82,7 @@ public class AppController implements IBaseController {
LOGGER.info("第三方用户登录 login --> loginFrom:{},channelId:{},btRegisterChannelId:{} requestIp:{},idNo:{},name:{}", registerFrom,channelId,btRegisterChannelId, IPUtil.getRemoteIP(request),idNo,name);
User user = userService.findByPhoneInDb(phoneNo);
if (user == null) {
user = register(registerFrom, phoneNo, idNo, name, channelId,btRegisterChannelId);
user = userRegisterService.register(registerFrom, phoneNo, idNo, name, channelId,btRegisterChannelId);
}
if (user == null) {
return JsonResult.buildErrorStateResult(USER_ERROR_OR_PASSWORD_ERROR, null);
......@@ -168,7 +166,7 @@ public class AppController implements IBaseController {
LOGGER.info("第三方用户登录 loginSuper --> loginFrom:{},channelId:{},btRegisterChannelId:{} requestIp:{},idNo:{},name:{}", registerFrom,channelId,btRegisterChannelId, IPUtil.getRemoteIP(request),idNo,name);
User user = userService.findByPhoneInDb(phoneNo);
if (user == null) {
user = register(registerFrom, phoneNo, idNo, name, channelId,btRegisterChannelId);
user = userRegisterService.register(registerFrom, phoneNo, idNo, name, channelId,btRegisterChannelId);
}
if (user == null) {
return JsonResult.buildErrorStateResult(USER_ERROR_OR_PASSWORD_ERROR, null);
......@@ -202,83 +200,4 @@ public class AppController implements IBaseController {
}
/**
* 注册新用户,带白条渠道号
* @param registerFrom
* @param phoneNo
* @param idNo
* @param name
* @param channelId
* @param btRegisterChannelId
* @return
*/
private User register(Long registerFrom, String phoneNo, String idNo, String name, Long channelId, Long btRegisterChannelId) {
User user = register(registerFrom, phoneNo, idNo, name, channelId);
if(null != user && null != btRegisterChannelId && channelId == 222L) {
UserBtRegister userBtRegister = new UserBtRegister();
userBtRegister.setUserId(user.getId());
userBtRegister.setRegisterBtMerchantId(btRegisterChannelId);
userBtRegisterService.save(userBtRegister);
}
return user;
}
/**
* 注册新用户
*
* @return
*/
private User register(Long registerFrom, String phoneNo, String idNo, String name, Long channelId) {
String randomCode = String.valueOf(random.nextInt(899999) + 100000);
String uuid = lkbUserService.registerApp(phoneNo, randomCode);
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
LOGGER.info("第三方登录用户,保存 User");
User user = new User();
if (channelId == 222L) {
user.setRegisteredFrom(channelId);
} else {
user.setRegisteredFrom(registerFrom);
}
user.setUuid(uuid);
user.setEnable(true);
user.setPhoneNo(phoneNo);
user.setPassword(PasswordUtil.MD5(randomCode + Constants.PASSWORD_SALT));
user.setUpdatedAt(currentTime);
user.setCreatedAt(currentTime);
userRepository.saveAndFlush(user);
if(registerFrom == 900L){
smsService.sendAfterRegister(phoneNo,"123");
LOGGER.info("第三方(聚美)登录用户注册成功, registerFrom:{}, phoneNo:{},idNo:{},name:{} 并且已发送短信通知", registerFrom, phoneNo, idNo, name);
}else if (registerFrom != 645L) {
smsService.sendAfterRegister(phoneNo);
LOGGER.info("第三方登录用户注册成功, registerFrom:{}, phoneNo:{}, 并且已发送短信通知", registerFrom, phoneNo);
}
if (StringUtils.isNotBlank(idNo) && StringUtils.isNotBlank(name) && ValidationUtil.validateChinese(name)) {
LOGGER.info("第三方登录用户,保存 UserDetail");
IdCardInfo cardInfo;
try {
cardInfo = idCardService.getIdCardInfoWithExceptions(idNo);
UserDetail userDetail = new UserDetail();
userDetail.setIdNo(cardInfo.getIdNo());
userDetail.setPhoneNo(phoneNo);
userDetail.setName(name);
userDetail.setIdType(IdType.ID_CARD);
userDetail.setCreatedAt(currentTime);
userDetail.setUpdatedAt(currentTime);
userDetail.setUserId(user.getId());
userDetail.setGender(cardInfo.getGender());
userDetailService.saveUserDetail(userDetail);
lkbUserService.userUpdate(user.getUuid(), name, idNo);
} catch (Exception e) {
LOGGER.error("保存 UserDetail 出现异常", e);
}
}
MqUtils.sendRegisterMessage(channelId,null,user);
return user;
}
}
......@@ -11,13 +11,11 @@ import cn.quantgroup.xyqb.model.*;
import cn.quantgroup.xyqb.service.api.IUserApiService;
import cn.quantgroup.xyqb.service.auth.IIdCardService;
import cn.quantgroup.xyqb.service.http.IHttpService;
import cn.quantgroup.xyqb.service.register.IUserRegisterService;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.user.*;
import cn.quantgroup.xyqb.service.wechat.IWechatService;
import cn.quantgroup.xyqb.util.AESUtil;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.MqUtils;
import cn.quantgroup.xyqb.util.ValidationUtil;
import cn.quantgroup.xyqb.util.*;
import cn.quantgroup.xyqb.util.encrypt.MD5Util;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
......@@ -76,6 +74,8 @@ public class InnerController implements IBaseController {
@Autowired
private IHttpService httpService;
@Autowired
private IUserRegisterService userRegisterService;
@Value("${xyqb.user.query.url}")
private String queryUrl;
......@@ -89,6 +89,11 @@ public class InnerController implements IBaseController {
MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
MAPPER.configure(SerializationFeature.WRITE_ENUMS_USING_INDEX, true);
}
private static final char[] PWD_BASE = {
'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'
};
@RequestMapping("/user/search/phoneNo")
@LogHttpCaller
......@@ -184,7 +189,8 @@ public class InnerController implements IBaseController {
registeredFrom = 0L;
}
if (StringUtils.isBlank(password)) {
password = "";
password= genRandomPwd();
password = PasswordUtil.MD5(password.toLowerCase() + Constants.PASSWORD_SALT);
}
if (StringUtils.isBlank(uuid)) {
return JsonResult.buildErrorStateResult("用户uuid为空.", null);
......@@ -916,7 +922,7 @@ public class InnerController implements IBaseController {
return JsonResult.buildErrorStateResult("用户已存在,手机号被占用", null);
}
user = userService.registerAndReturn(Long.valueOf(registeredFrom), Long.valueOf(channelId), phoneNo, name, idNo, provinceCode, province, cityCode, city, districtCode, district, address, contacts);
user = userRegisterService.register(Long.valueOf(registeredFrom), Long.valueOf(channelId), phoneNo, name, idNo, provinceCode, province, cityCode, city, districtCode, district, address, contacts);
UserRet userRet = new UserRet(user);
return JsonResult.buildSuccessResult(null, userRet);
......@@ -930,7 +936,7 @@ public class InnerController implements IBaseController {
LOGGER.info("[/innerapi/user/register]channelId={},ip={}", channelId, getIp());
User user = userService.findByPhoneInDb(phoneNo);
if (user == null) {
user = userService.registerAndReturn(phoneNo, StringUtils.defaultString(password, ""), channelId);
user = userRegisterService.register(phoneNo, StringUtils.defaultString(password, ""), channelId);
}
if (user == null) {
return JsonResult.buildErrorStateResult("注册失败", null);
......@@ -1034,5 +1040,22 @@ public class InnerController implements IBaseController {
httpService.get(hanguguanUrl.concat("/innerapi/forbiddenUserOrNot"), param);
return JsonResult.buildSuccessResult("用户禁用或重启成功成功", affectedRows);
}
private String genRandomPwd() {
int pwdMax = PWD_BASE.length;
// 生成的随机数
int i;
// 生成的密码的长度
int count = 0;
StringBuffer pwd = new StringBuffer();
Random r = new Random();
while (count < 15) {
// 生成的数最大为36-1
i = Math.abs(r.nextInt(pwdMax));
if (i >= 0 && i < PWD_BASE.length) {
pwd.append(PWD_BASE[i]);
count++;
}
}
return pwd.toString();
}
}
\ No newline at end of file
......@@ -9,20 +9,23 @@ import cn.quantgroup.xyqb.entity.Merchant;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.entity.WechatUserInfo;
import cn.quantgroup.xyqb.exception.PasswordErrorLimitException;
import cn.quantgroup.xyqb.exception.UserNotExistException;
import cn.quantgroup.xyqb.exception.VerificationCodeErrorException;
import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.UserModel;
import cn.quantgroup.xyqb.model.UserStatistics;
import cn.quantgroup.xyqb.service.merchant.IMerchantService;
import cn.quantgroup.xyqb.service.register.IUserRegisterService;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.sms.ISmsService;
import cn.quantgroup.xyqb.service.user.ILockIpv4Service;
import cn.quantgroup.xyqb.service.user.IUserDetailService;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.service.wechat.IWechatService;
import cn.quantgroup.xyqb.util.*;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.MqUtils;
import cn.quantgroup.xyqb.util.PasswordUtil;
import cn.quantgroup.xyqb.util.ValidationUtil;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
......@@ -37,8 +40,8 @@ import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.HashMap;
import java.util.Map;
/**
* Http服务接口:用户注册、登录、重置密码
......@@ -74,12 +77,8 @@ public class UserController implements IBaseController {
private IMerchantService merchantService;
@Autowired
private IWechatService wechatService;
private static final char[] PWD_BASE = {
'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'
};
@Autowired
private IUserRegisterService userRegisterService;
@RequestMapping("/test")
public JsonResult test() {
......@@ -182,6 +181,10 @@ public class UserController implements IBaseController {
}
JsonResult successResult = validMap.get("success");
String phoneNo = successResult.getData().toString();
if (!ValidationUtil.validatePhoneNo(phoneNo)) {
LOGGER.info("用户快速注册失败,手机号错误, createdFrom:{},phoneNo:{}", createdFrom, phoneNo);
throw new UserNotExistException("手机号错误");
}
String verificationCode = successResult.getMsg();
// 执行短信验证码检查
smsValidForFastLogin(phoneNo, verificationCode);
......@@ -191,7 +194,7 @@ public class UserController implements IBaseController {
return JsonResult.buildErrorStateResult("登录失败", null);
}
if (user == null) {
user = registerFastWhenLogin(phoneNo, channelId, createdFrom, appChannel,btRegisterChannelId,dimension);
user = userRegisterService.register(phoneNo, channelId, createdFrom, appChannel,btRegisterChannelId,dimension);
if (user == null) {
throw new UserNotExistException("用户未找到");
}
......@@ -203,25 +206,6 @@ public class UserController implements IBaseController {
// return createSession(channelId, createdFrom, appChannel, user);
}
private User registerFastWhenLogin(String phoneNo, Long channelId, Long registerFrom, String appChannel, Long btRegisterChannelId,String dimension) {
String password = genRandomPwd();
LOGGER.info("用户快速注册:login/fast -> phoneNo:{}, channelId:{}, registerFrom:{},appChannel:{},btRegisterChannelId:{}", phoneNo, channelId, registerFrom, appChannel,btRegisterChannelId);
if (!ValidationUtil.validatePhoneNo(phoneNo)) {
LOGGER.info("用户快速注册失败,手机号错误:login/fast -> registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
throw new UserNotExistException("手机号错误");
}
if (null == registerFrom) {
registerFrom = 1L;
}
if (channelId == 222L) {
registerFrom=222L;
}
User user=userService.registerAndReturn(phoneNo, password, registerFrom,btRegisterChannelId);
LOGGER.info("用户快速注册成功:login/fast -> registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
MqUtils.sendRegisterMessage(channelId,dimension, user);
return user;
}
/**
* 快速登录验证
*
......@@ -259,50 +243,6 @@ public class UserController implements IBaseController {
return result;
}
/**
* 用户快速注册
*
* @param phoneNo
* @param verificationCode
* @param channelId
* @return
*/
@LogHttpCaller
@RequestMapping("/register/fast")
public JsonResult registerFast(@RequestParam String phoneNo, @RequestParam String verificationCode, @RequestParam(required = false) Long channelId,
@RequestParam(required = false) Long registerFrom, @RequestParam(required = false, defaultValue = "") String appChannel,
@RequestParam(required = false)Long btRegisterChannelId,@RequestParam(required = false)String dimension) {
String password = genRandomPwd();
LOGGER.info("用户快速注册:register/fast -> phoneNo:{}, verificationCode:{}, channelId:{}, registerFrom:{},appChannel:{},btRegisterChannelId:{},dimension:{}", phoneNo, verificationCode, channelId, registerFrom, appChannel,btRegisterChannelId,dimension);
if (!ValidationUtil.validatePhoneNo(phoneNo)) {
LOGGER.info("用户快速注册失败,手机号错误:register/fast -> registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
return JsonResult.buildErrorStateResult("手机号错误", null);
}
if (StringUtils.isEmpty(password)) {
LOGGER.info("用户快速注册失败,密码不能为空:register/fast -> registerFrom:{}, phoneNo:{}, password:{}", registerFrom, phoneNo, password);
return JsonResult.buildErrorStateResult("密码不能为空", null);
}
if (password.length() < 6 || password.length() > 12) {
LOGGER.info("用户快速注册失败,密码长度须在6位至12位之间:register/fast -> registerFrom:{}, phoneNo:{}, password:{}", registerFrom, phoneNo, password);
return JsonResult.buildErrorStateResult("密码应为6-12位", null);
}
if (null == registerFrom) {
registerFrom = 1L;
}
smsValidForFastLogin(phoneNo, verificationCode);
if (userService.exist(phoneNo)) {
LOGGER.info("用户快速注册失败,该手机号已经被注册:register/fast -> registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
return JsonResult.buildErrorStateResult("该手机号已经被注册", null);
}
if (!userService.register(phoneNo, password, registerFrom, getIp(), channelId,btRegisterChannelId,dimension)) {
LOGGER.info("用户快速注册失败,请稍后重试:register/fast -> registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
return JsonResult.buildErrorStateResult("注册失败,请稍后重试", null);
}
LOGGER.info("用户快速注册成功:register/fast -> registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
return JsonResult.buildSuccessResult(null, null);
}
/**
* 用户注册
*
......@@ -338,8 +278,8 @@ public class UserController implements IBaseController {
LOGGER.info("用户注册失败,该手机号已经被注册:register -> registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
return JsonResult.buildErrorStateResult("该手机号已经被注册", null);
}
if (!userService.register(phoneNo, password, registerFrom, getIp(), channelId,btRegisterChannelId,dimension)) {
LOGGER.info("用户快速注册失败,请稍后重试:register -> registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
if (!userRegisterService.register(phoneNo, password, registerFrom, getIp(), channelId,btRegisterChannelId,dimension)) {
LOGGER.info("用户快速注册失败,请稍后重试, registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
return JsonResult.buildErrorStateResult("注册失败,请稍后重试", null);
}
LOGGER.info("用户注册成功:register -> registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
......@@ -431,27 +371,6 @@ public class UserController implements IBaseController {
return JsonResult.buildSuccessResult(null, stringRedisTemplate.hasKey(tokenKey)||stringRedisTemplate.hasKey(tokenKey2));
}
private String genRandomPwd() {
int pwdMax = PWD_BASE.length;
// 生成的随机数
int i;
// 生成的密码的长度
int count = 0;
StringBuffer pwd = new StringBuffer();
Random r = new Random();
while (count < 15) {
// 生成的数最大为36-1
i = Math.abs(r.nextInt(pwdMax));
if (i >= 0 && i < PWD_BASE.length) {
pwd.append(PWD_BASE[i]);
count++;
}
}
return pwd.toString();
}
@RequestMapping("/syncUserInfo")
public JsonResult syncUserInfo() {
User user = getCurrentUserFromRedis();
......
package cn.quantgroup.xyqb.exception;
/**
* Created by liqing on 2017/12/5 0005.
* 同步用户信息至Lkb异常
*/
public class PushUserToLkbException extends RuntimeException {
public PushUserToLkbException() {
}
public PushUserToLkbException(String message) {
super(message);
}
public PushUserToLkbException(String message, Throwable cause) {
super(message, cause);
}
public PushUserToLkbException(Throwable cause) {
super(cause);
}
public PushUserToLkbException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
super(message, cause, enableSuppression, writableStackTrace);
}
}
package cn.quantgroup.xyqb.model;
import cn.quantgroup.xyqb.entity.Address;
import cn.quantgroup.xyqb.entity.User;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* Created by liqing on 2017/12/4 0004.
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserRegisterParam {
/** ======数据部分开始====== */
private Long registerFrom; // 注册渠道
private String phoneNo; // 手机号
private String password; // 密码
private String idNo; // 身份证号
private String name; // 姓名
private Long channelId; // 业务渠道
private Long btRegisterChannelId; // 白条渠道
private String dimension;
private Address address; // 地址
private String contacts; // 联系人
private User user; // 注册生成的用户,也是返回结果
/** ======数据部分结束====== */
/** ======流程控制部分开始====== */
private boolean generateRandomPwd = false; // 是否生成随机密码
private boolean sendSuccessSms = true; // 是否发送注册成功短信
private boolean sendAppSms = true; // 是否发送推送App短信
private boolean sendSuccessMq = true; // 是否发送注册成功mq
/** ======流程控制部分开始====== */
}
package cn.quantgroup.xyqb.service.register;
import cn.quantgroup.xyqb.service.register.handler.AbstractUserRegisterHandler;
import cn.quantgroup.xyqb.util.ApplicationContextHolder;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import java.util.Map;
/**
* Created by liqing on 2017/12/5 0005.
*/
@Slf4j
public abstract class AbstractUserRegisterService implements IUserRegisterService,ApplicationContextAware {
private static Map<String, AbstractUserRegisterHandler> userRegisterHandlerMap = Maps.newConcurrentMap();
private static final String USER_REGISTER_HANDLER_DEFAULT_KEY = "register_default";
private static final String USER_REGISTER_HANDLER_EXT_KEY = "register_ext";
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
// 创建默认注册流程
createDefaultUserRegisterHandler(applicationContext);
// 创建扩展注册流程
createExtUserRegisterHandler(applicationContext);
}
/**
* 创建默认注册流程
* 1、保存基本信息 - 2、保存用户详情 - 3、保存白条信息 - 4、发送短信 - 5、发送mq
* @param applicationContext
*/
protected AbstractUserRegisterHandler createDefaultUserRegisterHandler(ApplicationContext applicationContext){
AbstractUserRegisterHandler baseUserRegisterHandler = applicationContext.getBean("baseUserRegisterHandler", AbstractUserRegisterHandler.class);
AbstractUserRegisterHandler detailUserRegisterHandler = applicationContext.getBean("detailUserRegisterHandler", AbstractUserRegisterHandler.class);
AbstractUserRegisterHandler btUserRegisterHandler = applicationContext.getBean("btUserRegisterHandler", AbstractUserRegisterHandler.class);
AbstractUserRegisterHandler smsUserRegisterHandler = applicationContext.getBean("smsUserRegisterHandler", AbstractUserRegisterHandler.class);
AbstractUserRegisterHandler mqUserRegisterHandler = applicationContext.getBean("mqUserRegisterHandler", AbstractUserRegisterHandler.class);
baseUserRegisterHandler.setSuccessor(detailUserRegisterHandler);
detailUserRegisterHandler.setSuccessor(btUserRegisterHandler);
btUserRegisterHandler.setSuccessor(smsUserRegisterHandler);
smsUserRegisterHandler.setSuccessor(mqUserRegisterHandler);
userRegisterHandlerMap.put(USER_REGISTER_HANDLER_DEFAULT_KEY, baseUserRegisterHandler);
return baseUserRegisterHandler;
}
/**
* 创建扩展注册流程
* 1、保存基本信息 - 2、保存用户详情 - 3、保存白条信息 - 4、保存用户地址 - 5、保存联系人
* 5、发送短信 - 6、发送mq
* @param applicationContext
*/
protected AbstractUserRegisterHandler createExtUserRegisterHandler(ApplicationContext applicationContext){
AbstractUserRegisterHandler baseUserRegisterHandler = applicationContext.getBean("baseUserRegisterHandler", AbstractUserRegisterHandler.class);
AbstractUserRegisterHandler detailUserRegisterHandler = applicationContext.getBean("detailUserRegisterHandler", AbstractUserRegisterHandler.class);
AbstractUserRegisterHandler btUserRegisterHandler = applicationContext.getBean("btUserRegisterHandler", AbstractUserRegisterHandler.class);
AbstractUserRegisterHandler smsUserRegisterHandler = applicationContext.getBean("smsUserRegisterHandler", AbstractUserRegisterHandler.class);
AbstractUserRegisterHandler mqUserRegisterHandler = applicationContext.getBean("mqUserRegisterHandler", AbstractUserRegisterHandler.class);
AbstractUserRegisterHandler addressUserRegisterHandler = applicationContext.getBean("addressUserRegisterHandler", AbstractUserRegisterHandler.class);
AbstractUserRegisterHandler contactUserRegisterHandler = applicationContext.getBean("contactUserRegisterHandler", AbstractUserRegisterHandler.class);
baseUserRegisterHandler.setSuccessor(detailUserRegisterHandler);
detailUserRegisterHandler.setSuccessor(btUserRegisterHandler);
btUserRegisterHandler.setSuccessor(addressUserRegisterHandler);
addressUserRegisterHandler.setSuccessor(contactUserRegisterHandler);
contactUserRegisterHandler.setSuccessor(smsUserRegisterHandler);
smsUserRegisterHandler.setSuccessor(mqUserRegisterHandler);
userRegisterHandlerMap.put(USER_REGISTER_HANDLER_EXT_KEY, baseUserRegisterHandler);
return baseUserRegisterHandler;
}
/**
* 获取默认注册流程
* @return
*/
protected AbstractUserRegisterHandler getDefaultUserRegisterHandler(){
AbstractUserRegisterHandler curUserRegisterHandler = userRegisterHandlerMap.get(USER_REGISTER_HANDLER_DEFAULT_KEY);
if (curUserRegisterHandler == null){
synchronized (USER_REGISTER_HANDLER_DEFAULT_KEY){
curUserRegisterHandler = userRegisterHandlerMap.get(USER_REGISTER_HANDLER_DEFAULT_KEY);
if (curUserRegisterHandler == null){
curUserRegisterHandler = createDefaultUserRegisterHandler(ApplicationContextHolder.getApplicationContext());
}
}
}
return curUserRegisterHandler;
}
/**
* 获取扩展注册流程
* @return
*/
protected AbstractUserRegisterHandler getExtUserRegisterHandler(){
AbstractUserRegisterHandler curUserRegisterHandler = userRegisterHandlerMap.get(USER_REGISTER_HANDLER_EXT_KEY);
if (curUserRegisterHandler == null){
synchronized (USER_REGISTER_HANDLER_EXT_KEY){
curUserRegisterHandler = userRegisterHandlerMap.get(USER_REGISTER_HANDLER_EXT_KEY);
if (curUserRegisterHandler == null){
curUserRegisterHandler = createExtUserRegisterHandler(ApplicationContextHolder.getApplicationContext());
}
}
}
return curUserRegisterHandler;
}
}
package cn.quantgroup.xyqb.service.register;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.UserRegisterParam;
/**
* Created by liqing on 2017/12/4 0004.
*/
public interface IUserRegisterService {
/**
* 以默认流程注册
* @param userRegisterParam
* @return
* @throws Exception
*/
User registerDefault(UserRegisterParam userRegisterParam);
/**
* 以扩展流程注册
* @param userRegisterParam
* @return
* @throws Exception
*/
User registerExt(UserRegisterParam userRegisterParam);
/**
* 替换AppController.register
* /app/login,/app/login_super
* @param registerFrom
* @param phoneNo
* @param idNo
* @param name
* @param channelId
* @param btRegisterChannelId
* @return
*/
User register(Long registerFrom, String phoneNo, String idNo, String name, Long channelId, Long btRegisterChannelId);
/**
* 替换InnerController里的userService.registerAndReturn
* /innerapi/user/register
* @param phoneNo
* @param password
* @param registerFrom
* @return
*/
User register(String phoneNo, String password, Long registerFrom);
/**
* 替换UserController.register里的userService.register
* /user/register
* @param phoneNo
* @param password
* @param registerFrom
* @param ip
* @param channelId
* @param btRegisterChannelId
* @param dimension
* @return
*/
boolean register(String phoneNo, String password, Long registerFrom, String ip, Long channelId, Long btRegisterChannelId,String dimension);
/**
* 替换UserController.loginFast里的registerFastWhenLogin
* /user/login/fast
* @param phoneNo
* @param channelId
* @param registerFrom
* @param appChannel
* @param btRegisterChannelId
* @param dimension
* @return
*/
User register(String phoneNo, Long channelId, Long registerFrom, String appChannel, Long btRegisterChannelId,String dimension);
/**
* 替换InnerController.saveMulti里的userService.registerAndReturn
* /innserapi/user/save_multi
* @param registeredFrom
* @param channelId
* @param phoneNo
* @param name
* @param idNo
* @param provinceCode
* @param province
* @param cityCode
* @param city
* @param districtCode
* @param district
* @param address
* @param contacts
* @return
*/
User register(Long registeredFrom, Long channelId, String phoneNo, String name, String idNo, String provinceCode, String province, String cityCode, String city, String districtCode, String district, String address, String contacts);
/**
* 替换MotanUserServiceImpl.appLoginAndFetchLoginInfo和MotanUserServiceImpl.appLogin里的register
* @param registerFrom
* @param phoneNo
* @param idNo
* @param name
* @param channelId
* @return
*/
User register(Long registerFrom, String phoneNo, String idNo, String name, Long channelId);
}
package cn.quantgroup.xyqb.service.register.handler;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.UserRegisterParam;
/**
* Created by liqing on 2017/12/4 0004.
*/
public abstract class AbstractUserRegisterHandler {
protected AbstractUserRegisterHandler successor;
public void setSuccessor(AbstractUserRegisterHandler successor) {
this.successor = successor;
}
public abstract User handleRegister(UserRegisterParam userRegisterParam);
}
package cn.quantgroup.xyqb.service.register.handler.impl;
import cn.quantgroup.xyqb.entity.Address;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.repository.IAddressRepository;
import cn.quantgroup.xyqb.service.register.handler.AbstractUserRegisterHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import java.sql.Timestamp;
/**
* Created by liqing on 2017/12/5 0005.
* 注册 - 地址信息
* 失败影响注册流程
*/
@Component("addressUserRegisterHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Slf4j
public class AddressUserRegisterHandler extends AbstractUserRegisterHandler {
@Autowired
private IAddressRepository addressRepository;
@Override
public User handleRegister(UserRegisterParam userRegisterParam) {
Address address = userRegisterParam.getAddress();
User user = userRegisterParam.getUser();
address.setUserId(user.getId());
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
address.setCreatedAt(currentTime);
address.setUpdateAt(currentTime);
addressRepository.save(address);
if (successor != null){
return successor.handleRegister(userRegisterParam);
}
return userRegisterParam.getUser();
}
}
package cn.quantgroup.xyqb.service.register.handler.impl;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.exception.PushUserToLkbException;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.service.register.handler.AbstractUserRegisterHandler;
import cn.quantgroup.xyqb.service.user.ILkbUserService;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.util.JsonUtil;
import cn.quantgroup.xyqb.util.PasswordUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import java.sql.Timestamp;
import java.util.UUID;
/**
* Created by liqing on 2017/12/4 0004.
* 注册 - 基本信息
* 失败影响注册流程
*/
@Component("baseUserRegisterHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Slf4j
public class BaseUserRegisterHandler extends AbstractUserRegisterHandler {
@Autowired
private ILkbUserService lkbUserService;
@Autowired
private IUserService userService;
@Override
public User handleRegister(UserRegisterParam userRegisterParam) {
String uuid = UUID.randomUUID().toString();
// 保存user信息
User user = saveUser(uuid, userRegisterParam);
// user保存成功后同步用户信息到Lkb
pushUserToLkb(uuid, userRegisterParam);
userRegisterParam.setUser(user);
if (successor != null){
return successor.handleRegister(userRegisterParam);
}
return userRegisterParam.getUser();
}
/**
* 保存用户user信息
* @param uuid
* @param userRegisterParam
* @return
*/
private User saveUser(String uuid, UserRegisterParam userRegisterParam) {
User user = new User();
user.setUuid(uuid);
user.setEnable(true);
user.setPhoneNo(userRegisterParam.getPhoneNo());
Long registerFrom = userRegisterParam.getRegisterFrom();
if (null == registerFrom) {
registerFrom = 1L;
}
Long channelId = userRegisterParam.getChannelId();
if (channelId == 222L) {
user.setRegisteredFrom(channelId);
} else {
user.setRegisteredFrom(registerFrom);
}
String password = StringUtils.defaultString(userRegisterParam.getPassword(), "");
if (userRegisterParam.isGenerateRandomPwd()){ // 如果需要生成随机密码
password = PasswordUtil.generateRandomPwd(Constants.RANDOM_PWD_LEN);
}
user.setPassword(PasswordUtil.MD5(password.toLowerCase() + Constants.PASSWORD_SALT));
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
user.setUpdatedAt(currentTime);
user.setCreatedAt(currentTime);
userService.saveUser(user);
return user;
}
/**
* 同步用户信息到Lkb,失败影响注册流程
* @param uuid
* @param userRegisterParam
*/
private void pushUserToLkb(String uuid, UserRegisterParam userRegisterParam) {
log.info("[pushUserToLkb]同步用户信息到Lkb,phoneNo : {}", userRegisterParam.getPhoneNo());
boolean pushResult = lkbUserService.pushUser(uuid, userRegisterParam.getPhoneNo(),
userRegisterParam.getName(), userRegisterParam.getIdNo());
if (!pushResult){
log.error("[userRegisterHandler][baseUserRegisterHandler]同步用户至Lkb出错,userRegisterParam:{}", JsonUtil.toJson(userRegisterParam));
throw new PushUserToLkbException("同步用户至Lkb出错");
}
}
}
package cn.quantgroup.xyqb.service.register.handler.impl;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserBtRegister;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.service.register.handler.AbstractUserRegisterHandler;
import cn.quantgroup.xyqb.service.user.IUserBtRegisterService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import java.sql.Timestamp;
/**
* Created by liqing on 2017/12/4 0004.
* 用户注册 - 白条
* 失败影响注册流程
*/
@Component("btUserRegisterHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Slf4j
public class BtUserRegisterHandler extends AbstractUserRegisterHandler {
@Autowired
private IUserBtRegisterService userBtRegisterService;
@Override
public User handleRegister(UserRegisterParam userRegisterParam) {
Long channelId = userRegisterParam.getChannelId();
User user = userRegisterParam.getUser();
Long btRegisterChannelId = userRegisterParam.getBtRegisterChannelId();
if(null != user && channelId == 222L){
UserBtRegister userBtRegister = new UserBtRegister();
userBtRegister.setUserId(user.getId());
if(null == btRegisterChannelId){
userBtRegister.setRegisterBtMerchantId(0L);
}else{
userBtRegister.setRegisterBtMerchantId(btRegisterChannelId);
}
userBtRegister.setIsActive(true);
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
userBtRegister.setCreatedAt(currentTime);
userBtRegister.setUpdatedAt(currentTime);
userBtRegisterService.save(userBtRegister);
}
if (successor != null){
return successor.handleRegister(userRegisterParam);
}
return userRegisterParam.getUser();
}
}
package cn.quantgroup.xyqb.service.register.handler.impl;
import cn.quantgroup.user.enums.Relation;
import cn.quantgroup.xyqb.entity.Contact;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.repository.IContactRepository;
import cn.quantgroup.xyqb.service.register.handler.AbstractUserRegisterHandler;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import java.sql.Timestamp;
import java.util.List;
/**
* Created by liqing on 2017/12/5 0005.
* 注册 - 联系人信息
* 失败影响注册流程
*/
@Component("contactUserRegisterHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Slf4j
public class ContactUserRegisterHandler extends AbstractUserRegisterHandler {
@Autowired
private IContactRepository contactRepository;
@Override
public User handleRegister(UserRegisterParam userRegisterParam) {
String contact_str = userRegisterParam.getContacts();
User user = userRegisterParam.getUser();
if (StringUtils.isNotBlank(contact_str)) {
List<Contact> contactList = JSONObject.parseObject(contact_str, new TypeReference<List<Contact>>() {});
if (CollectionUtils.isNotEmpty(contactList)) {
convertContactList(user.getId(), contactList, 2);
contactRepository.save(contactList);
}
}
if (successor != null){
return successor.handleRegister(userRegisterParam);
}
return userRegisterParam.getUser();
}
/**
* 转换联系人信息
* @param userId 用户id
* @param contacts 联系人列表
* @param number 允许的联系人数量
*/
private void convertContactList(Long userId, List<Contact> contacts,int number) {
Timestamp now = new Timestamp(System.currentTimeMillis());
int count = 1;
for (Contact c : contacts) {
if (count > number) {
break;
}
c.setId(null);
c.setUserId(userId);
c.setRelation(c.getRelation() == null ? Relation.OTHER : c.getRelation());
c.setCreatedAt(now);
c.setUpdateAt(now);
count++;
}
}
}
package cn.quantgroup.xyqb.service.register.handler.impl;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.model.IdCardInfo;
import cn.quantgroup.xyqb.model.IdType;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.service.auth.IIdCardService;
import cn.quantgroup.xyqb.service.register.handler.AbstractUserRegisterHandler;
import cn.quantgroup.xyqb.service.user.IUserDetailService;
import cn.quantgroup.xyqb.util.JsonUtil;
import cn.quantgroup.xyqb.util.ValidationUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import java.sql.Timestamp;
/**
* Created by liqing on 2017/12/4 0004.
* 注册 - 用户详情
* 失败不影响注册流程
*/
@Component("detailUserRegisterHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Slf4j
public class DetailUserRegisterHandler extends AbstractUserRegisterHandler {
@Autowired
private IIdCardService idCardService;
@Autowired
private IUserDetailService userDetailService;
@Override
public User handleRegister(UserRegisterParam userRegisterParam) {
try {
doHandleUserDetailRegister(userRegisterParam);
} catch (Exception e) {
// 用户详情注册失败不影响注册流程
log.error("[exception][detailUserRegisterHandler_exception]userRegisterParam={},error={}",
JsonUtil.toJson(userRegisterParam), e);
}
if (successor != null){
return successor.handleRegister(userRegisterParam);
}
return userRegisterParam.getUser();
}
/**
* 执行用户详情注册
* @param userRegisterParam
*/
private void doHandleUserDetailRegister(UserRegisterParam userRegisterParam) throws Exception {
if (StringUtils.isAnyBlank(userRegisterParam.getIdNo(), userRegisterParam.getName()) ||
!ValidationUtil.validateChinese(userRegisterParam.getName())) {
return;
}
String phoneNo = userRegisterParam.getPhoneNo();
String name = userRegisterParam.getName();
String idNo = userRegisterParam.getIdNo();
IdCardInfo cardInfo = idCardService.getIdCardInfoWithExceptions(idNo);
UserDetail userDetail = new UserDetail();
userDetail.setIdNo(cardInfo.getIdNo());
userDetail.setPhoneNo(phoneNo);
userDetail.setName(name);
userDetail.setIdType(IdType.ID_CARD);
Timestamp currentTime = new Timestamp(System.currentTimeMillis());
userDetail.setCreatedAt(currentTime);
userDetail.setUpdatedAt(currentTime);
User user = userRegisterParam.getUser();
userDetail.setUserId(user.getId());
userDetail.setGender(cardInfo.getGender());
userDetailService.saveUserDetail(userDetail);
}
}
package cn.quantgroup.xyqb.service.register.handler.impl;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.service.register.handler.AbstractUserRegisterHandler;
import cn.quantgroup.xyqb.util.JsonUtil;
import cn.quantgroup.xyqb.util.MqUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/**
* Created by liqing on 2017/12/4 0004.
* 注册 - 发送mq
* 失败不影响注册流程
*/
@Component("mqUserRegisterHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Slf4j
public class MqUserRegisterHandler extends AbstractUserRegisterHandler {
@Override
public User handleRegister(UserRegisterParam userRegisterParam) {
try {
doHandleMqUserRegister(userRegisterParam);
} catch (Exception e) {
// 发送Mq失败不影响注册流程
log.error("[exception][mqUserRegisterHandler_exception]userRegisterParam={},error={}",
JsonUtil.toJson(userRegisterParam), e);
}
if (successor != null){
return successor.handleRegister(userRegisterParam);
}
return userRegisterParam.getUser();
}
/**
* 执行注册发送mq
* @param userRegisterParam
*/
private void doHandleMqUserRegister(UserRegisterParam userRegisterParam) {
if (!userRegisterParam.isSendSuccessMq()){
return;
}
Long channelId = userRegisterParam.getChannelId();
String dimension = userRegisterParam.getDimension();
User user = userRegisterParam.getUser();
if (user != null){
MqUtils.sendRegisterMessage(channelId, dimension, user);
}
}
}
package cn.quantgroup.xyqb.service.register.handler.impl;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.service.register.handler.AbstractUserRegisterHandler;
import cn.quantgroup.xyqb.service.sms.ISmsService;
import cn.quantgroup.xyqb.util.JsonUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
/**
* Created by liqing on 2017/12/4 0004.
* 注册 - 发送短信
* 失败不影响注册流程
*/
@Component("smsUserRegisterHandler")
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
@Slf4j
public class SmsUserRegisterHandler extends AbstractUserRegisterHandler {
@Autowired
private ISmsService smsService;
@Override
public User handleRegister(UserRegisterParam userRegisterParam) {
try {
doHandleSmsUserRegister(userRegisterParam);
} catch (Exception e) {
// 发送短信失败不影响注册流程
log.error("[exception][smsUserRegisterHandler_exception]userRegisterParam={},error={}",
JsonUtil.toJson(userRegisterParam), e);
}
if (successor != null){
return successor.handleRegister(userRegisterParam);
}
return userRegisterParam.getUser();
}
/**
* 执行发送短信
* @param userRegisterParam
*/
private void doHandleSmsUserRegister(UserRegisterParam userRegisterParam) {
// 发送注册成功短信
try {
doHandleSendSuccessSms(userRegisterParam);
} catch (Exception e) {
// 发送短信失败不影响注册流程
log.error("[exception][smsUserRegisterHandler_doHandleSendSuccessSms_exception]userRegisterParam={},error={}",
JsonUtil.toJson(userRegisterParam), e);
}
// 发送推送app短信
try {
doHandleSendAppSms(userRegisterParam);
} catch (Exception e) {
// 发送短信失败不影响注册流程
log.error("[exception][smsUserRegisterHandler_doHandleSendAppSms_exception]userRegisterParam={},error={}",
JsonUtil.toJson(userRegisterParam), e);
}
}
/**
* 执行发送推送app短信 TODO
* @param userRegisterParam
*/
private void doHandleSendAppSms(UserRegisterParam userRegisterParam) {
if (!userRegisterParam.isSendAppSms()){
return;
}
}
/**
* 执行发送注册成功短信
* @param userRegisterParam
*/
private void doHandleSendSuccessSms(UserRegisterParam userRegisterParam) {
if (!userRegisterParam.isSendSuccessSms()){
return;
}
Long registerFrom = userRegisterParam.getRegisterFrom();
String phoneNo = userRegisterParam.getPhoneNo();
if (registerFrom != 645L && registerFrom != 900L && registerFrom != 158412L) {
smsService.sendAfterRegister(phoneNo);
log.info("第三方登录用户注册成功,registerFrom:{}, phoneNo:{},并且已发送短信通知", registerFrom, phoneNo);
}else if(registerFrom == 900L){
smsService.sendAfterRegister(phoneNo, "123");
log.info("第三方(聚美)登录用户注册成功,registerFrom:{},phoneNo:{},并且已发送短信通知", registerFrom, phoneNo);
}
}
}
package cn.quantgroup.xyqb.service.register.impl;
import cn.quantgroup.xyqb.entity.Address;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.UserRegisterParam;
import cn.quantgroup.xyqb.service.register.AbstractUserRegisterService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* Created by liqing on 2017/12/4 0004.
*/
@Service("userRegisterService")
@Slf4j
public class UserRegisterServiceImpl extends AbstractUserRegisterService {
@Transactional(rollbackFor = Exception.class)
@Override
public User registerDefault(UserRegisterParam userRegisterParam) {
return getDefaultUserRegisterHandler().handleRegister(userRegisterParam);
}
@Transactional(rollbackFor = Exception.class)
@Override
public User registerExt(UserRegisterParam userRegisterParam) {
return getExtUserRegisterHandler().handleRegister(userRegisterParam);
}
@Transactional(rollbackFor = Exception.class)
@Override
public User register(Long registerFrom, String phoneNo, String idNo, String name, Long channelId, Long btRegisterChannelId) {
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom).phoneNo(phoneNo).idNo(idNo).name(name)
.channelId(channelId).btRegisterChannelId(btRegisterChannelId)
.generateRandomPwd(true).sendSuccessSms(true).sendAppSms(true)
.sendSuccessMq(true)
.build();
return registerDefault(userRegisterParam);
}
@Transactional(rollbackFor = Exception.class)
@Override
public User register(String phoneNo, String password, Long registerFrom) {
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom).phoneNo(phoneNo).password(password)
.generateRandomPwd(false).sendSuccessSms(true).sendAppSms(true)
.sendSuccessMq(true)
.build();
return registerDefault(userRegisterParam);
}
@Transactional(rollbackFor = Exception.class)
@Override
public boolean register(String phoneNo, String password, Long registerFrom, String ip, Long channelId, Long btRegisterChannelId, String dimension) {
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom).phoneNo(phoneNo).password(password)
.channelId(channelId).btRegisterChannelId(btRegisterChannelId)
.dimension(dimension)
.generateRandomPwd(false).sendSuccessSms(true).sendAppSms(true)
.sendSuccessMq(true)
.build();
User user = registerDefault(userRegisterParam);
return user != null;
}
@Transactional(rollbackFor = Exception.class)
@Override
public User register(String phoneNo, Long channelId, Long registerFrom, String appChannel, Long btRegisterChannelId, String dimension) {
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom).phoneNo(phoneNo)
.channelId(channelId).btRegisterChannelId(btRegisterChannelId)
.dimension(dimension)
.generateRandomPwd(true).sendSuccessSms(true).sendAppSms(true)
.sendSuccessMq(true)
.build();
return registerDefault(userRegisterParam);
}
@Transactional(rollbackFor = Exception.class)
@Override
public User register(Long registeredFrom, Long channelId, String phoneNo, String name, String idNo, String provinceCode, String province, String cityCode, String city, String districtCode, String district, String address, String contacts) {
Address addressObj = new Address();
addressObj.setProvinceCode(Long.valueOf(provinceCode));
addressObj.setProvince(province);
addressObj.setCityCode(Long.valueOf(cityCode));
addressObj.setCity(city);
addressObj.setDistrictCode(Long.valueOf(districtCode));
addressObj.setDistrict(district);
addressObj.setAddress(address);
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registeredFrom).phoneNo(phoneNo).idNo(idNo).name(name)
.channelId(channelId)
.address(addressObj).contacts(contacts)
.generateRandomPwd(true).sendSuccessSms(true).sendAppSms(true)
.sendSuccessMq(true)
.build();
return registerExt(userRegisterParam);
}
@Transactional(rollbackFor = Exception.class)
@Override
public User register(Long registerFrom, String phoneNo, String idNo, String name, Long channelId) {
UserRegisterParam userRegisterParam = UserRegisterParam.builder()
.registerFrom(registerFrom).phoneNo(phoneNo).idNo(idNo).name(name)
.channelId(channelId)
.generateRandomPwd(true).sendSuccessSms(true).sendAppSms(true)
.sendSuccessMq(true)
.build();
return registerDefault(userRegisterParam);
}
}
......@@ -23,4 +23,13 @@ public interface ILkbUserService {
* @param idNo
*/
void userUpdate(String uuid, String name, String idNo);
/**
* 同步用戶信息
* @param uuid
* @param phoneNo
* @param name
* @param idNo
*/
boolean pushUser(String uuid, String phoneNo, String name, String idNo);
}
......@@ -14,10 +14,6 @@ public interface IUserService {
User findByUuidWithCache(String uuid);
boolean register(String phoneNo, String password, Long registerFrom, String userIp, Long channelId);
User registerAndReturn(String phoneNo, String password, Long registerFrom);
boolean exist(String phoneNo);
boolean resetPassword(String phoneNo, String password);
......@@ -32,42 +28,8 @@ public interface IUserService {
User findById(Long userId);
boolean register(String phoneNo, String password, Long registerFrom, String ip, Long channelId, Long btRegisterChannelId,String dimension);
List<User> findByPhones(List<String> phones);
User registerAndReturn(String phoneNo, String password, Long registerFrom, Long btRegisterChannelId);
/**
* 用户、联系人、地址信息注册
* @param registeredFrom
* @param channelId
* @param phoneNo
* @param name
* @param idNo
* @param provinceCode
* @param province
* @param cityCode
* @param city
* @param districtCode
* @param district
* @param address
* @param contacts
* @return
*/
User registerAndReturn( Long registeredFrom,
Long channelId,
String phoneNo,
String name,
String idNo,
String provinceCode,
String province,
String cityCode,
String city,
String districtCode,
String district,
String address,
String contacts);
List<User> findRegisterUserByTime(String beginTime,String endTime);
/**
......
......@@ -3,9 +3,13 @@ package cn.quantgroup.xyqb.service.user.impl;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.service.http.IHttpService;
import cn.quantgroup.xyqb.service.user.ILkbUserService;
import cn.quantgroup.xyqb.util.JsonUtil;
import cn.quantgroup.xyqb.util.PasswordUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -14,6 +18,7 @@ import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.Optional;
/**
......@@ -21,60 +26,89 @@ import java.util.Map;
* @time 2015-08-19 18:20
*/
@Service
@Slf4j
public class LkbUserviceImpl implements ILkbUserService {
private static final Logger LOGGER = LoggerFactory.getLogger(LkbUserviceImpl.class);
private static final Logger LOGGER = LoggerFactory.getLogger(LkbUserviceImpl.class);
private static final String TOKEN_PATTERN = "timeunit=%sappkey=lkb010203#$%%";
private static final String TOKEN_PATTERN = "timeunit=%sappkey=lkb010203#$%%";
@Autowired
private IHttpService httpService;
@Autowired
private IHttpService httpService;
@Value("${lkb.client.url}")
private String clientUrl;
@Value("${lkb.client.url}")
private String clientUrl;
@Value("${lkb.client.user.register.app}")
private String registerApp;
@Value("${lkb.client.user.register.app}")
private String registerApp;
@Value("${lkb.client.user.update}")
private String userUpdate;
@Value("${lkb.client.user.update}")
private String userUpdate;
@Override
public String registerApp(String phoneNo, String password) {
String timeunit = System.currentTimeMillis() + "";
String token = PasswordUtil.MD5(String.format(TOKEN_PATTERN, timeunit));
@Value("${lkb.client.user.push}")
private String userPushPath;
Map<String, String> parameters = ImmutableMap.<String, String>builder()
.put("appId", Constants.Channel.LKB_CODE)
.put("timeunit", timeunit)
.put("token", token)
.put("userName", phoneNo)
.put("password", password)
.build();
@Override
public String registerApp(String phoneNo, String password) {
String timeunit = System.currentTimeMillis() + "";
String token = PasswordUtil.MD5(String.format(TOKEN_PATTERN, timeunit));
String response = httpService.get(clientUrl + registerApp, parameters);
Map<String, String> result = JSONObject.parseObject(response, Map.class);
if (result == null || "0".equals(result.get("flag"))) {
LOGGER.warn("向LKB注册用户失败, phoneNo:{}, password:{}", phoneNo, password);
return "";
Map<String, String> parameters = ImmutableMap.<String, String>builder()
.put("appId", Constants.Channel.LKB_CODE)
.put("timeunit", timeunit)
.put("token", token)
.put("userName", phoneNo)
.put("password", password)
.build();
String response = httpService.get(clientUrl + registerApp, parameters);
Map<String, String> result = JSONObject.parseObject(response, Map.class);
if (result == null || "0".equals(result.get("flag"))) {
LOGGER.warn("向LKB注册用户失败, phoneNo:{}, password:{}", phoneNo, password);
return "";
}
return result.get("uid");
}
return result.get("uid");
}
@Override
@Async
public void userUpdate(String uuid, String name, String idNo) {
Map<String, String> parameters = ImmutableMap.<String, String>builder()
.put("userId", uuid)
.put("realName", name)
.put("idcard", idNo)
.build();
String response = httpService.get(clientUrl + userUpdate, parameters);
//Map<String, String> result = GSON.fromJson(response, Map.class);
Map<String, String> result = JSONObject.parseObject(response, Map.class);
if (result == null || "false".equals(result.get("flag"))) {
LOGGER.warn("向LKB-Client同步用户信息失败, result: {}", result);
@Override
@Async
public void userUpdate(String uuid, String name, String idNo) {
Map<String, String> parameters = ImmutableMap.<String, String>builder()
.put("userId", uuid)
.put("realName", name)
.put("idcard", idNo)
.build();
String response = httpService.get(clientUrl + userUpdate, parameters);
//Map<String, String> result = GSON.fromJson(response, Map.class);
Map<String, String> result = JSONObject.parseObject(response, Map.class);
if (result == null || "false".equals(result.get("flag"))) {
LOGGER.warn("向LKB-Client同步用户信息失败, result: {}", result);
}
}
@Override
public boolean pushUser(String uuid, String phoneNo, String name, String idNo) {
String timeunit = System.currentTimeMillis() + "";
String token = PasswordUtil.MD5(String.format(TOKEN_PATTERN, timeunit));
Map<String, String> parameters = Maps.newHashMap();
parameters.put("appId", Constants.Channel.LKB_CODE);
parameters.put("timeunit", timeunit);
parameters.put("token", token);
parameters.put("userId", uuid);
parameters.put("loginName", phoneNo);
if (StringUtils.isNotBlank(name)){
parameters.put("realName", name);
}
if (StringUtils.isNotBlank(idNo)){
parameters.put("idCardNo", idNo);
}
String response = httpService.post(clientUrl + userPushPath, parameters);
Optional<Map> resultOptional = JsonUtil.fromJson(response, Map.class);
if (!resultOptional.isPresent() || !"0000".equals(resultOptional.get().get("code"))) {
LOGGER.error("[lkb_user_push]向LKB同步用户失败,phoneNo:{},response={}", phoneNo, response);
return false;
}
return true;
}
}
}
package cn.quantgroup.xyqb.util;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import java.util.Optional;
/**
* Created by liqing on 2017/12/4 0004.
*/
@Slf4j
public class JsonUtil {
/**
* 转换json为对象
* @param jsonStr
* @param clazz
* @param <T>
* @return
*/
public static <T> Optional<T> fromJson(String jsonStr, Class<T> clazz) {
try {
return Optional.ofNullable(JSONObject.parseObject(jsonStr, clazz));
} catch (Exception e) {
log.error("[exception][fromJson_exception]error={}", e);
}
return Optional.empty();
}
/**
* 将对象转成json字符串
* @param object
* @return
*/
public static String toJson(Object object) {
return JSONObject.toJSONString(object);
}
}
package cn.quantgroup.xyqb.util;
import com.google.common.base.Preconditions;
import java.security.MessageDigest;
import java.util.concurrent.ThreadLocalRandom;
/**
* Created by Miraculous on 15/7/5.
*/
public class PasswordUtil {
private static final char[] HEX_DIGITS = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
public final static String MD5(String s) {
try {
byte[] strTemp = s.getBytes("utf-8");
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char[] str = new char[j << 1];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = HEX_DIGITS[byte0 >>> 4 & 0xf];
str[k++] = HEX_DIGITS[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
private static final char[] HEX_DIGITS = {
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
private static final char[] PWD_BASE = {
'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'
};
public final static String MD5(String s) {
try {
byte[] strTemp = s.getBytes("utf-8");
MessageDigest mdTemp = MessageDigest.getInstance("MD5");
mdTemp.update(strTemp);
byte[] md = mdTemp.digest();
int j = md.length;
char[] str = new char[j << 1];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
str[k++] = HEX_DIGITS[byte0 >>> 4 & 0xf];
str[k++] = HEX_DIGITS[byte0 & 0xf];
}
return new String(str);
} catch (Exception e) {
return null;
}
}
/**
* 生成随机密码
* @param pwdLen 密码长度,必须大于0
* @return
*/
public static String generateRandomPwd(int pwdLen) {
Preconditions.checkArgument(pwdLen > 0);
int pwdMax = PWD_BASE.length;
int i; // 生成的随机数
int count = 0; // 生成的密码的长度
StringBuffer pwd = new StringBuffer();
while (count < pwdLen) {
i = ThreadLocalRandom.current().nextInt(pwdMax); // 生成的数最大为36-1
if (i >= 0 && i < PWD_BASE.length) {
pwd.append(PWD_BASE[i]);
count++;
}
}
return pwd.toString();
}
}
}
......@@ -31,9 +31,10 @@ xyqb.redis.sentinel3.port=0
sms.is.debug=1
# LKB client
lkb.client.url=http://192.168.4.193:8083/LKBClient/openapi
lkb.client.url=http://192.168.4.193:8082/LKBClient/openapi
lkb.client.user.register.app=/new/register/registerApp.json
lkb.client.user.update=/new/register/updateUser.json
lkb.client.user.push=/user/push.json
# LKB import
......
......@@ -21,6 +21,7 @@ sms.is.debug=0
lkb.client.url=http://openapi.quantgroup.cn/LKBClient/openapi
lkb.client.user.register.app=/new/register/registerApp.json
lkb.client.user.update=/new/register/updateUser.json
lkb.client.user.push=/user/push.json
# LKB import
lkb.import.url=http://spider.quantgroup.cn
# LKB
......
......@@ -24,6 +24,7 @@ sms.is.debug=1
lkb.client.url=http://192.168.192.251:8082/LKBClient/openapi
lkb.client.user.register.app=/new/register/registerApp.json
lkb.client.user.update=/new/register/updateUser.json
lkb.client.user.push=/user/push.json
# LKB import
lkb.import.url=http://spider.quantgroup.cn
# LKB
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment