Commit 26ab629e authored by lee_mingzhu's avatar lee_mingzhu

Merge remote-tracking branch 'origin/master'

parents c4195364 4222d919
...@@ -45,11 +45,19 @@ public interface IBaseController { ...@@ -45,11 +45,19 @@ public interface IBaseController {
return 0L; return 0L;
} }
default void setChannelId(Long channelId) { default void setNumber(String name, Long value) {
SessionStruct session = getSessionStruct(); SessionStruct session = getSessionStruct();
if (session != null) { if (session != null) {
session.setAttribute("channleId", channelId.toString()); session.setAttribute(name, String.valueOf(value));
}
}
default void setCreatedFrom(Long createdFrom) {
setNumber("createdFrom", createdFrom);
} }
default void setChannelId(Long channelId) {
setNumber("channelId", channelId);
} }
default String getAppChannel() { default String getAppChannel() {
......
package cn.quantgroup.xyqb.controller.external.user; package cn.quantgroup.xyqb.controller.external.user;
import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.controller.IBaseController; import cn.quantgroup.xyqb.controller.IBaseController;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.exception.NullUserException; import cn.quantgroup.xyqb.exception.NullUserException;
import cn.quantgroup.xyqb.model.AuthBean; import cn.quantgroup.xyqb.model.*;
import cn.quantgroup.xyqb.model.JsonResult; import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.repository.IUserDetailRepository;
import cn.quantgroup.xyqb.repository.IUserRepository;
import cn.quantgroup.xyqb.service.auth.IIdCardService;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.sms.ISmsService;
import cn.quantgroup.xyqb.service.user.ILkbUserService;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.util.IPUtil;
import cn.quantgroup.xyqb.util.PasswordUtil;
import cn.quantgroup.xyqb.util.Utils;
import cn.quantgroup.xyqb.util.ValidationUtil;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.web.PagedResourcesAssembler;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import java.security.Principal; import java.security.Principal;
import java.sql.Timestamp;
import java.util.Random;
/** /**
* @author mengfan.feng * @author mengfan.feng
...@@ -22,23 +42,113 @@ public class AppController implements IBaseController { ...@@ -22,23 +42,113 @@ public class AppController implements IBaseController {
private static final Logger LOGGER = LoggerFactory.getLogger(AppController.class); private static final Logger LOGGER = LoggerFactory.getLogger(AppController.class);
@Autowired
private ISessionService sessionService;
@Autowired
private IUserService userService;
@Autowired
private ILkbUserService lkbUserService;
@Autowired
private IUserRepository userRepository;
@Autowired
private ISmsService smsService;
@Autowired
private IUserDetailRepository userDetailRepository;
@Autowired
private IIdCardService idCardService;
private final static Random random = new Random();
/** /**
* 第三方用户登录 * 第三方用户登录
* *
* @param user
* @return
*/ */
@RequestMapping("/login") @RequestMapping("/login")
public JsonResult login(Principal user, HttpServletRequest request) { public JsonResult login(
String phoneNo,
@RequestParam(required = false, defaultValue = "0") Long registerFrom,
String idNo, String name, HttpServletRequest request
) {
if (!ValidationUtil.validatePhoneNo(phoneNo)) {
return JsonResult.buildErrorStateResult("该用户名不存在,<br/>请重新输入或注册新账号。", null);
}
String requestIp = IPUtil.getRemoteIP(request);
LOGGER.info("第三方用户登录, loginFrom:{}, requestIp:{}", registerFrom, requestIp);
User user = userService.findByPhone(phoneNo);
if (user == null) {
user = register(registerFrom, phoneNo, idNo, name);
}
if (user == null) { if (user == null) {
throw new NullUserException(); return JsonResult.buildErrorStateResult("该用户名不存在,<br/>请重新输入或注册新账号。", null);
} }
SessionStruct sessionStruct = sessionService.createSessionAndPersist(user, session -> {
session.setAttribute("channelId", "1");
session.setAttribute("createdFrom", String.valueOf(registerFrom));
});
AuthBean bean = new AuthBean(getRequest().getSession().getId(), user);
AuthBean bean = new AuthBean();
bean.setToken(sessionStruct.getSid());
bean.setPhoneNo(phoneNo);
LOGGER.info("第三方用户登录成功, loginFrom:{}, phoneNo:{},appChannel:{}", request.getParameter("registerFrom"), request.getParameter("phoneNo"), getAppChannel()); LOGGER.info("第三方用户登录成功, loginFrom:{}, phoneNo:{},appChannel:{}", request.getParameter("registerFrom"), request.getParameter("phoneNo"), getAppChannel());
return new JsonResult(bean); return new JsonResult(bean);
} }
/**
* 注册新用户
*
* @return
*/
private User register(Long registerFrom, String phoneNo, String idNo, String name) {
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();
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);
smsService.sendAfterRegister(phoneNo);
LOGGER.info("第三方登录用户注册成功, registerFrom:{}, phoneNo:{}, 并且已发送短信通知", registerFrom, phoneNo);
if (StringUtils.isNotEmpty(idNo) && StringUtils.isNotEmpty(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());
userDetailRepository.saveAndFlush(userDetail);
lkbUserService.userUpdate(user.getUuid(), name, idNo);
} catch (Exception e) {
LOGGER.error("保存 UserDetail 出现异常", e);
}
}
return user;
}
} }
...@@ -4,6 +4,7 @@ import cn.quantgroup.xyqb.Constants; ...@@ -4,6 +4,7 @@ import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.controller.IBaseController; import cn.quantgroup.xyqb.controller.IBaseController;
import cn.quantgroup.xyqb.entity.User; import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail; import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.exception.UserNotExistException;
import cn.quantgroup.xyqb.model.AuthBean; import cn.quantgroup.xyqb.model.AuthBean;
import cn.quantgroup.xyqb.model.JsonResult; import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.UserModel; import cn.quantgroup.xyqb.model.UserModel;
...@@ -61,14 +62,6 @@ public class UserController implements IBaseController { ...@@ -61,14 +62,6 @@ public class UserController implements IBaseController {
@Qualifier("stringRedisTemplate") @Qualifier("stringRedisTemplate")
private RedisTemplate<String, String> stringRedisTemplate; private RedisTemplate<String, String> stringRedisTemplate;
@Autowired
@Qualifier("redisConnectionFactory")
private RedisConnectionFactory redisConnectionFactory;
@Autowired
@Qualifier("redisTemplate")
private RedisTemplate redisTemplate;
@Autowired @Autowired
private ISmsService smsService; private ISmsService smsService;
...@@ -113,7 +106,7 @@ public class UserController implements IBaseController { ...@@ -113,7 +106,7 @@ public class UserController implements IBaseController {
return JsonResult.buildErrorStateResult("用户名或密码不正确", null); return JsonResult.buildErrorStateResult("用户名或密码不正确", null);
} }
//找到用户 //找到用户
SessionStruct sessionStruct = sessionService.createSession(user); SessionStruct sessionStruct = sessionService.createSessionAndPersistInCache(user);
LOGGER.info("用户登录成功, loginFrom:{}, phoneNo:{},appChannel:{}", getCreatedFrom(), user.getPhoneNo(), getAppChannel()); LOGGER.info("用户登录成功, loginFrom:{}, phoneNo:{},appChannel:{}", getCreatedFrom(), user.getPhoneNo(), getAppChannel());
AuthBean authBean = new AuthBean(); AuthBean authBean = new AuthBean();
authBean.setPhoneNo(user.getPhoneNo()); authBean.setPhoneNo(user.getPhoneNo());
...@@ -164,7 +157,9 @@ public class UserController implements IBaseController { ...@@ -164,7 +157,9 @@ public class UserController implements IBaseController {
}*/ }*/
@RequestMapping("/login/fast") @RequestMapping("/login/fast")
public JsonResult loginFast(HttpServletRequest request){ public JsonResult loginFast(
@RequestParam(required = false, defaultValue = "1") Long channelId, String appChannel,
@RequestParam(required = false, defaultValue = "1") Long createdFrom, HttpServletRequest request){
String verificationHeader = "Verification "; String verificationHeader = "Verification ";
String credential = request.getHeader("authorization"); String credential = request.getHeader("authorization");
if(StringUtils.isBlank(credential)){ if(StringUtils.isBlank(credential)){
...@@ -187,38 +182,30 @@ public class UserController implements IBaseController { ...@@ -187,38 +182,30 @@ public class UserController implements IBaseController {
} }
String phoneNo = credentialArr[0]; String phoneNo = credentialArr[0];
String verificationCode = credentialArr[1]; String verificationCode = credentialArr[1];
if(!matchPhoneNo(phoneNo)){ LOGGER.info("用户快速登录,phoneNo:{} , verificationCode:{}", phoneNo, verificationCode);
if(!ValidationUtil.validatePhoneNo(phoneNo)){
return JsonResult.buildErrorStateResult("登录失败", null); return JsonResult.buildErrorStateResult("登录失败", null);
} }
if(!validateVerificationCode(phoneNo, verificationCode)){ if(!validateVerificationCode(phoneNo, verificationCode)){
return JsonResult.buildErrorStateResult("登录失败", null); LOGGER.info("用户快速登录,验证码校验失败,phoneNo:{} , verificationCode:{}", phoneNo, verificationCode);
return JsonResult.buildErrorStateResult("验证码错误", null);
} }
User user = userService.findByPhone(phoneNo); User user = userService.findByPhone(phoneNo);
if(user == null){ if(user == null){
return JsonResult.buildErrorStateResult("登录失败", null); user = registerFastWhenLogin(phoneNo, channelId, createdFrom, appChannel);
if (user == null) {
throw new UserNotExistException("用户未找到");
}
} }
String sessionId = sessionService.findSessionIdByUserId(user.getId()); String sessionId = sessionService.findSessionIdByUserId(user.getId());
if(StringUtils.isBlank(sessionId)){ if(StringUtils.isBlank(sessionId)){
return JsonResult.buildErrorStateResult("登录失败", null); return JsonResult.buildErrorStateResult("登录失败", null);
} }
SessionStruct sessionStruct = null; SessionStruct sessionStruct = sessionService.createSessionAndPersist(user, (session) -> {
if(sessionId.length() == 36){ session.setAttribute("channelId", String.valueOf(channelId));
String value = sessionService.findSessionValueBySessionId(sessionId); session.setAttribute("createdFrom", String.valueOf(createdFrom));
if(StringUtils.isBlank(value)){ session.setAttribute("appChannel", String.valueOf(appChannel));
sessionStruct = sessionService.newSession(user); });
SessionValue sessionValue = new SessionValue();
sessionValue.setUser(user);
sessionValue.setLastAccessTime(new Timestamp(System.currentTimeMillis()));
sessionValue.setCreatedAt(new Timestamp(System.currentTimeMillis()));
Map<String, String> values = new HashMap();
sessionValue.setValues(values);
sessionService.persistSession(sessionStruct.getSid(), sessionValue);
}
sessionStruct.setSid(sessionId);
}else {
sessionStruct = sessionService.newSession(user);
sessionService.persistSession(sessionStruct.getSid(), sessionService.newSession(user).getValues());
}
AuthBean authBean = new AuthBean(); AuthBean authBean = new AuthBean();
authBean.setPhoneNo(user.getPhoneNo()); authBean.setPhoneNo(user.getPhoneNo());
authBean.setToken(sessionStruct.getSid()); authBean.setToken(sessionStruct.getSid());
...@@ -245,15 +232,6 @@ public class UserController implements IBaseController { ...@@ -245,15 +232,6 @@ public class UserController implements IBaseController {
return false; return false;
} }
private boolean matchPhoneNo(String phoneNo){
String patternString = "1\\d{10}";
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(phoneNo);
if(matcher.matches()){
return true;
}
return false;
}
/** /**
* 用户快速注册 * 用户快速注册
...@@ -484,4 +462,20 @@ public class UserController implements IBaseController { ...@@ -484,4 +462,20 @@ public class UserController implements IBaseController {
return JsonResult.buildSuccessResult("token校验成功", userModel); return JsonResult.buildSuccessResult("token校验成功", userModel);
} }
public User registerFastWhenLogin(String phoneNo, Long channelId, Long registerFrom, String appChannel) {
String password = genRandomPwd();
LOGGER.info("用户快速注册, phoneNo:{}, verificationCode:{}, channelId:{}, registerFrom:{},appChannel:{}", phoneNo, channelId, registerFrom, appChannel);
if (!ValidationUtil.validatePhoneNo(phoneNo)) {
LOGGER.info("用户快速注册失败,手机号错误, registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
throw new UserNotExistException("手机号错误");
}
if (null == registerFrom) {
registerFrom = 1L;
}
LOGGER.info("用户快速注册成功, registerFrom:{}, phoneNo:{}", registerFrom, phoneNo);
return userService.registerAndReturn(phoneNo, password, registerFrom);
}
} }
package cn.quantgroup.xyqb.function;
/**
* Created by Miraculous on 2016/12/29.
*/
public interface NonArgFunction {
void apply();
}
package cn.quantgroup.xyqb.function;
/**
* Created by Miraculous on 2016/12/29.
*/
public interface OneArgFunction<S> {
void apply(S t);
}
package cn.quantgroup.xyqb.service.session; package cn.quantgroup.xyqb.service.session;
import cn.quantgroup.xyqb.entity.User; import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.JsonResult; import cn.quantgroup.xyqb.function.OneArgFunction;
import cn.quantgroup.xyqb.model.session.SessionStruct; import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.model.session.SessionValue; import cn.quantgroup.xyqb.model.session.SessionValue;
...@@ -9,7 +9,10 @@ import cn.quantgroup.xyqb.model.session.SessionValue; ...@@ -9,7 +9,10 @@ import cn.quantgroup.xyqb.model.session.SessionValue;
* Created by 11 on 2016/12/28. * Created by 11 on 2016/12/28.
*/ */
public interface ISessionService { public interface ISessionService {
SessionStruct createSession(User user); SessionStruct createSessionAndPersistInCache(User user);
SessionStruct createSessionAndPersist(User user, OneArgFunction<SessionStruct> function);
String findSessionIdByUserId(Long userId); String findSessionIdByUserId(Long userId);
String findSessionValueBySessionId(String sessionId); String findSessionValueBySessionId(String sessionId);
SessionStruct newSession(User user); SessionStruct newSession(User user);
......
...@@ -2,6 +2,7 @@ package cn.quantgroup.xyqb.service.session.impl; ...@@ -2,6 +2,7 @@ package cn.quantgroup.xyqb.service.session.impl;
import cn.quantgroup.xyqb.Constants; import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.entity.User; import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.function.OneArgFunction;
import cn.quantgroup.xyqb.model.session.SessionStruct; import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.model.session.SessionValue; import cn.quantgroup.xyqb.model.session.SessionValue;
import cn.quantgroup.xyqb.service.session.ISessionService; import cn.quantgroup.xyqb.service.session.ISessionService;
...@@ -29,7 +30,12 @@ public class SessionServiceImpl implements ISessionService{ ...@@ -29,7 +30,12 @@ public class SessionServiceImpl implements ISessionService{
private RedisTemplate<String, String> stringRedisTemplate; private RedisTemplate<String, String> stringRedisTemplate;
@Override @Override
public SessionStruct createSession(User user) { public SessionStruct createSessionAndPersistInCache(User user) {
return createSessionAndPersist(user, null);
}
@Override
public SessionStruct createSessionAndPersist(User user, OneArgFunction<SessionStruct> beforPersist) {
SessionStruct sessionStruct; SessionStruct sessionStruct;
//获取sessionid //获取sessionid
String sessionId = findSessionIdByUserId(user.getId()); String sessionId = findSessionIdByUserId(user.getId());
...@@ -38,11 +44,17 @@ public class SessionServiceImpl implements ISessionService{ ...@@ -38,11 +44,17 @@ public class SessionServiceImpl implements ISessionService{
String sessionValue = findSessionValueBySessionId(sessionId); String sessionValue = findSessionValueBySessionId(sessionId);
if(StringUtils.isEmpty(sessionValue)) { if(StringUtils.isEmpty(sessionValue)) {
sessionStruct = newSession(user); sessionStruct = newSession(user);
if (beforPersist != null) {
beforPersist.apply(sessionStruct);
}
persistSession(sessionStruct.getSid(), sessionStruct.getValues()); persistSession(sessionStruct.getSid(), sessionStruct.getValues());
} }
sessionStruct.setSid(sessionId); sessionStruct.setSid(sessionId);
}else { }else {
sessionStruct = newSession(user); sessionStruct = newSession(user);
if (beforPersist != null) {
beforPersist.apply(sessionStruct);
}
persistSession(sessionStruct.getSid(), sessionStruct.getValues()); persistSession(sessionStruct.getSid(), sessionStruct.getValues());
} }
return sessionStruct; return sessionStruct;
......
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