Commit 21c69f37 authored by oole's avatar oole

Merge remote-tracking branch 'origin/phoneNoModify' into feature/modify_phone_no

parents 1d15ec9d be19cd09
...@@ -15,6 +15,7 @@ import cn.quantgroup.xyqb.exception.VerificationCodeErrorException; ...@@ -15,6 +15,7 @@ import cn.quantgroup.xyqb.exception.VerificationCodeErrorException;
import cn.quantgroup.xyqb.model.JsonResult; import cn.quantgroup.xyqb.model.JsonResult;
import cn.quantgroup.xyqb.model.LoginProperties; import cn.quantgroup.xyqb.model.LoginProperties;
import cn.quantgroup.xyqb.model.UserModel; import cn.quantgroup.xyqb.model.UserModel;
import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.service.merchant.IMerchantService; import cn.quantgroup.xyqb.service.merchant.IMerchantService;
import cn.quantgroup.xyqb.service.register.IUserRegisterService; import cn.quantgroup.xyqb.service.register.IUserRegisterService;
import cn.quantgroup.xyqb.service.session.ISessionService; import cn.quantgroup.xyqb.service.session.ISessionService;
...@@ -24,6 +25,7 @@ import cn.quantgroup.xyqb.service.user.IUserDetailService; ...@@ -24,6 +25,7 @@ import cn.quantgroup.xyqb.service.user.IUserDetailService;
import cn.quantgroup.xyqb.service.user.IUserService; import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.service.user.UserCenterService; import cn.quantgroup.xyqb.service.user.UserCenterService;
import cn.quantgroup.xyqb.service.wechat.IWechatService; import cn.quantgroup.xyqb.service.wechat.IWechatService;
import cn.quantgroup.xyqb.session.XyqbSessionContextHolder;
import cn.quantgroup.xyqb.util.IpUtil; import cn.quantgroup.xyqb.util.IpUtil;
import cn.quantgroup.xyqb.util.MqUtils; import cn.quantgroup.xyqb.util.MqUtils;
import cn.quantgroup.xyqb.util.PasswordUtil; import cn.quantgroup.xyqb.util.PasswordUtil;
...@@ -414,6 +416,28 @@ public class UserController implements IBaseController { ...@@ -414,6 +416,28 @@ public class UserController implements IBaseController {
return JsonResult.buildSuccessResult("token valid", exist); return JsonResult.buildSuccessResult("token valid", exist);
} }
@RequestMapping("/token")
public JsonResult token(@RequestParam String token) {
Map<String, Object> result = new HashMap<>();
result.put("exist", false);
if (StringUtils.isEmpty(token)) {
return JsonResult.buildSuccessResult(null, result);
}
if (token.contains(Constants.TOKEN_MASTER)) {
return JsonResult.buildSuccessResult(null, result);
}
SessionStruct sessionStruct = XyqbSessionContextHolder.getXSessionFromRedis(token);
if (sessionStruct == null || sessionStruct.getValues() == null) {
return JsonResult.buildSuccessResult(null, result);
}
User user = sessionStruct.getValues().getUser();
String phoneNo = user.getPhoneNo();
result.put("phoneNo", phoneNo);
result.put("userId", user.getId());
result.put("exist", true);
return JsonResult.buildSuccessResult(null, result);
}
/** /**
* 用户中心首页,显示用户头像、昵称、姓名 * 用户中心首页,显示用户头像、昵称、姓名
* *
...@@ -423,6 +447,7 @@ public class UserController implements IBaseController { ...@@ -423,6 +447,7 @@ public class UserController implements IBaseController {
@RequestMapping("/center/index") @RequestMapping("/center/index")
@ApiOperation(value = "用户中心首页", notes = "用户中心首页显示头像, 昵称, 姓名", httpMethod = "POST") @ApiOperation(value = "用户中心首页", notes = "用户中心首页显示头像, 昵称, 姓名", httpMethod = "POST")
public JsonResult userCenterIndex() { public JsonResult userCenterIndex() {
String phoneNo = getCurrentUserFromRedis().getPhoneNo();
Long userId = getCurrentUserFromRedis().getId(); Long userId = getCurrentUserFromRedis().getId();
UserAttached userAttached = userCenterService.searchUserAttachedByUserId(userId); UserAttached userAttached = userCenterService.searchUserAttachedByUserId(userId);
Map<String, String> result = new HashMap<>(); Map<String, String> result = new HashMap<>();
......
package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.session.SessionStruct;
import cn.quantgroup.xyqb.model.session.SessionValue;
import cn.quantgroup.xyqb.service.session.ISessionService;
import cn.quantgroup.xyqb.service.user.IUserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import java.util.List;
@Slf4j
@Component
public class CacheEvictPhoneNoUpdateEventListener implements ApplicationListener<PhoneNoUpdateEvent> {
@Autowired
private IUserService userService;
@Autowired
private ISessionService sessionService;
@Override
public void onApplicationEvent(PhoneNoUpdateEvent event) {
String oldPhoneNo = event.getOldPhoneNo();
User user = event.getUser();
List<SessionStruct> sessionStructList = sessionService.findByUserId(user.getId());
for (SessionStruct sessionStruct : sessionStructList) {
SessionValue values = sessionStruct.getValues();
User sessionUser = values.getUser();
//修改 session 中的手机号
sessionUser.setPhoneNo(user.getPhoneNo());
values.setUser(sessionUser);
}
sessionService.persistSession(sessionStructList);
userService.userCacheEvict(user.getUuid(), oldPhoneNo);
}
}
package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.entity.User;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
/**
* @author 徐小光
*/
@Getter
public class PhoneNoUpdateEvent extends ApplicationEvent {
private User user;
private String oldPhoneNo;
/**
* Create a new ApplicationEvent.
*
* @param source the object on which the event initially occurred (never {@code null})
*/
public PhoneNoUpdateEvent(Object source) {
super(source);
}
public PhoneNoUpdateEvent(Object source, User user, String oldPhoneNo) {
super(source);
this.user = user;
this.oldPhoneNo = oldPhoneNo;
}
}
...@@ -5,7 +5,6 @@ import cn.quantgroup.xyqb.entity.UserHashMapping; ...@@ -5,7 +5,6 @@ import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository; import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.util.encrypt.Md5Util; import cn.quantgroup.xyqb.util.encrypt.Md5Util;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
...@@ -16,14 +15,13 @@ import javax.persistence.PersistenceException; ...@@ -16,14 +15,13 @@ import javax.persistence.PersistenceException;
/** /**
* userDetail 更新时, 保存 hashMapping 数据 * userDetail 更新时, 保存 hashMapping 数据
*/ */
@Component
@Slf4j @Slf4j
@Component
public class UserDetailHashEventListener implements ApplicationListener<UserDetailUpdateEvent> { public class UserDetailHashEventListener implements ApplicationListener<UserDetailUpdateEvent> {
@Autowired @Autowired
private IUserHashMappingRepository userHashMappingRepository; private IUserHashMappingRepository userHashMappingRepository;
@Override @Override
public void onApplicationEvent(UserDetailUpdateEvent event) { public void onApplicationEvent(UserDetailUpdateEvent event) {
UserDetail userDetail = event.getUserDetail(); UserDetail userDetail = event.getUserDetail();
...@@ -33,27 +31,19 @@ public class UserDetailHashEventListener implements ApplicationListener<UserDeta ...@@ -33,27 +31,19 @@ public class UserDetailHashEventListener implements ApplicationListener<UserDeta
//如果不存在, 我先保存一下 //如果不存在, 我先保存一下
if (userHashMapping == null) { if (userHashMapping == null) {
userHashMapping = new UserHashMapping(userDetail.getUserId()); userHashMapping = new UserHashMapping(userDetail.getUserId());
String phoneNo = userDetail.getPhoneNo();
userHashMapping.setPhoneNoMd5(Md5Util.build(phoneNo));
} }
String idNoMd5 = userHashMapping.getIdNoMd5(); //可能存在手机号修改. 搞一下.
String phoneNo = userDetail.getPhoneNo();
userHashMapping.setPhoneNoMd5(Md5Util.build(phoneNo));
//可能存在身份证号修改. 搞一下.
String idNo = userDetail.getIdNo().toUpperCase(); String idNo = userDetail.getIdNo().toUpperCase();
userHashMapping.setIdNoMd5(Md5Util.build(idNo));
String idNoMd5New = Md5Util.build(idNo);
//新旧相同, 直接跳过
if (StringUtils.equals(idNoMd5, idNoMd5New)) {
return;
}
userHashMapping.setIdNoMd5(idNoMd5New);
try { try {
userHashMappingRepository.save(userHashMapping); userHashMappingRepository.save(userHashMapping);
} catch (PersistenceException e){ } catch (PersistenceException e) {
log.error("保存userHashMapping重复, 无需再保存, userId:{}", userDetail.getUserId()); log.error("保存userHashMapping重复, 无需再保存, userId:{}", userDetail.getUserId());
} }
} }
} }
package cn.quantgroup.xyqb.event;
import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.WechatUserInfo;
import cn.quantgroup.xyqb.service.wechat.IWechatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
import java.util.Objects;
@Component
public class WechatPhoneNoUpdateEventListener implements ApplicationListener<PhoneNoUpdateEvent> {
@Autowired
private IWechatService wechatService;
@Override
public void onApplicationEvent(PhoneNoUpdateEvent event) {
String oldPhoneNo = event.getOldPhoneNo();
User user = event.getUser();
WechatUserInfo userInfo = wechatService.findWechatUserInfoByPhoneNo(oldPhoneNo);
if (Objects.isNull(userInfo)) {
return;
}
if (Objects.isNull(userInfo.getPhoneNo())) {
return;
}
userInfo.setPhoneNo(user.getPhoneNo());
wechatService.saveWechatUserInfo(userInfo);
}
}
...@@ -6,6 +6,8 @@ import cn.quantgroup.xyqb.model.LoginProperties; ...@@ -6,6 +6,8 @@ import cn.quantgroup.xyqb.model.LoginProperties;
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 java.util.List;
/** /**
* Created by 11 on 2016/12/28. * Created by 11 on 2016/12/28.
*/ */
...@@ -29,4 +31,9 @@ public interface ISessionService { ...@@ -29,4 +31,9 @@ public interface ISessionService {
void deleteByUserId(long userId); void deleteByUserId(long userId);
void deleteUserCatch(User user); void deleteUserCatch(User user);
List<SessionStruct> findByUserId(long userId);
void persistSession(List<SessionStruct> sessionStructList);
} }
...@@ -9,14 +9,12 @@ import cn.quantgroup.xyqb.model.session.SessionStruct; ...@@ -9,14 +9,12 @@ 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;
import cn.quantgroup.xyqb.service.session.aspect.UserBtRegisterFill; import cn.quantgroup.xyqb.service.session.aspect.UserBtRegisterFill;
import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.util.MqUtils; import cn.quantgroup.xyqb.util.MqUtils;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Caching; import org.springframework.cache.annotation.Caching;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -35,10 +33,6 @@ public class SessionServiceImpl implements ISessionService { ...@@ -35,10 +33,6 @@ public class SessionServiceImpl implements ISessionService {
@Resource @Resource
private RedisTemplate<String, String> stringRedisTemplate; private RedisTemplate<String, String> stringRedisTemplate;
@Resource
private IUserService userService;
@Resource
private ApplicationEventPublisher applicationEventPublisher;
/** /**
* 更新session * 更新session
...@@ -101,7 +95,8 @@ public class SessionServiceImpl implements ISessionService { ...@@ -101,7 +95,8 @@ public class SessionServiceImpl implements ISessionService {
/** /**
* 每个渠道都有不同的 session * 每个渠道都有不同的 session
* @param userId 用户 ID *
* @param userId 用户 ID
* @param properties baitiao/xyqb/vcc ... + 用户注册来源 * @param properties baitiao/xyqb/vcc ... + 用户注册来源
* @return redisKey. 用来标识这个渠道的用户 Session 是否存在 * @return redisKey. 用来标识这个渠道的用户 Session 是否存在
*/ */
...@@ -227,6 +222,31 @@ public class SessionServiceImpl implements ISessionService { ...@@ -227,6 +222,31 @@ public class SessionServiceImpl implements ISessionService {
} }
@Override
public List<SessionStruct> findByUserId(long userId) {
List<SessionStruct> sessionStructList = new ArrayList<>();
String setKey = getUserSessionSetKey(userId);
Set<String> userIdKeys = stringRedisTemplate.opsForSet().members(setKey);
if (CollectionUtils.isEmpty(userIdKeys)) {
return sessionStructList;
}
for (String userIdKey : userIdKeys) {
String sessionId = stringRedisTemplate.opsForValue().get(userIdKey);
SessionStruct sessionStruct = findSessionBySessionId(sessionId);
sessionStructList.add(sessionStruct);
}
return sessionStructList;
}
@Override
public void persistSession(List<SessionStruct> sessionStructList) {
for (SessionStruct sessionStruct : sessionStructList) {
String sid = sessionStruct.getSid();
SessionValue values = sessionStruct.getValues();
persistSession(sid, values);
}
}
/** /**
* 获取用户的会话缓存Set的Redis-Key * 获取用户的会话缓存Set的Redis-Key
* *
......
...@@ -52,4 +52,19 @@ public interface IUserService { ...@@ -52,4 +52,19 @@ public interface IUserService {
List<UserInfo> findUserInfosByPhones(List<String> phones); List<UserInfo> findUserInfosByPhones(List<String> phones);
User findByMd5(Integer type, String md5Value); User findByMd5(Integer type, String md5Value);
/**
* 修改手机号码.
* @param oldPhoneNo 旧手机号
* @param newPhoneNo 新手机号
* @return 返回用户信息
*/
User modifyPhoneNo(String oldPhoneNo, String newPhoneNo);
/**
* 删除这个用户相关缓存
* @param uuid 根据 uuid
* @param phoneNo 根据手机号
*/
void userCacheEvict(String uuid, String phoneNo);
} }
...@@ -4,6 +4,7 @@ import cn.quantgroup.xyqb.Constants; ...@@ -4,6 +4,7 @@ import cn.quantgroup.xyqb.Constants;
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.entity.UserHashMapping; import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.event.PhoneNoUpdateEvent;
import cn.quantgroup.xyqb.model.UserInfo; import cn.quantgroup.xyqb.model.UserInfo;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository; import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.repository.IUserRepository; import cn.quantgroup.xyqb.repository.IUserRepository;
...@@ -19,14 +20,18 @@ import org.apache.commons.lang.StringUtils; ...@@ -19,14 +20,18 @@ import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable; import org.springframework.cache.annotation.Cacheable;
import org.springframework.cache.annotation.Caching;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
/** /**
...@@ -47,6 +52,9 @@ public class UserServiceImpl implements IUserService { ...@@ -47,6 +52,9 @@ public class UserServiceImpl implements IUserService {
@Autowired @Autowired
private IUserDetailService userDetailService; private IUserDetailService userDetailService;
@Autowired
private ApplicationEventPublisher applicationEventPublisher;
@Override @Override
@Cacheable(value = "usercache", key = "'xyqbuser' + #phone", unless = "#result == null", cacheManager = "cacheManager") @Cacheable(value = "usercache", key = "'xyqbuser' + #phone", unless = "#result == null", cacheManager = "cacheManager")
...@@ -139,7 +147,6 @@ public class UserServiceImpl implements IUserService { ...@@ -139,7 +147,6 @@ public class UserServiceImpl implements IUserService {
user = userRepository.save(user); user = userRepository.save(user);
stringRedisTemplate.expire("usercache:xyqbuser" + phoneNo, 1L, TimeUnit.MILLISECONDS); stringRedisTemplate.expire("usercache:xyqbuser" + phoneNo, 1L, TimeUnit.MILLISECONDS);
return PasswordUtil.validatePassword(password, user.getPassword()); return PasswordUtil.validatePassword(password, user.getPassword());
} }
@Override @Override
...@@ -200,4 +207,43 @@ public class UserServiceImpl implements IUserService { ...@@ -200,4 +207,43 @@ public class UserServiceImpl implements IUserService {
return userRepository.findById(userId); return userRepository.findById(userId);
} }
@Override
@Transactional(rollbackFor = Exception.class)
public User modifyPhoneNo(String oldPhoneNo, String newPhoneNo) {
//1. 判断新手机号是否存在
User newPhoneUser = userRepository.findByPhoneNo(newPhoneNo);
if (Objects.nonNull(newPhoneUser)) {
//新手机号已存在
return null;
}
User oldPhoneUser = userRepository.findByPhoneNo(oldPhoneNo);
if (Objects.isNull(oldPhoneUser)) {
//这不是扯了.旧手机号不存在.
return null;
}
//2. 执行修改
//2.1 修改 user 表
oldPhoneUser.setPhoneNo(newPhoneNo);
User user = userRepository.saveAndFlush(oldPhoneUser);
//2.2 修改 user_detail 表
UserDetail oldPhoneUserDetail = userDetailService.findByPhoneNo(oldPhoneNo);
oldPhoneUserDetail.setPhoneNo(newPhoneNo);
userDetailService.saveUserDetail(oldPhoneUserDetail);
//3. 发送事件
PhoneNoUpdateEvent phoneNoUpdateEvent = new PhoneNoUpdateEvent(this, user, oldPhoneNo);
applicationEventPublisher.publishEvent(phoneNoUpdateEvent);
return oldPhoneUser;
}
@Override
@Caching(evict = {
@CacheEvict(value = "usercache", key = "'xyqbuser' + #phoneNo", cacheManager = "cacheManager"),
@CacheEvict(value = "usercache", key = "'xyqbuser' + #uuid", cacheManager = "cacheManager")
})
public void userCacheEvict(String uuid, String phoneNo) {
log.info("清理用户缓存成功,uuid:{},phoneNo:{}", uuid, phoneNo);
}
} }
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