From 5a714918d158113c1a76a9a6620e101b4310a83e Mon Sep 17 00:00:00 2001
From: admin <weikou2014>
Date: 星期二, 16 七月 2019 16:08:33 +0800
Subject: [PATCH] 防止微信号与手机号重复注册

---
 fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java |  185 ++++++++++++++++++++++++++++-----------------
 1 files changed, 114 insertions(+), 71 deletions(-)

diff --git a/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java b/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java
index f1568d3..8919295 100644
--- a/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java
+++ b/fanli/src/main/java/com/yeshi/fanli/service/impl/user/UserAccountServiceImpl.java
@@ -57,6 +57,9 @@
 import com.yeshi.fanli.util.wx.WXLoginUtil;
 
 import net.sf.json.JSONObject;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.Transaction;
 
 @Service
 public class UserAccountServiceImpl implements UserAccountService {
@@ -66,7 +69,7 @@
 
 	@Resource
 	private UserInfoMapper userInfoMapper;
-	
+
 	@Resource
 	private UserInfoService userInfoService;
 
@@ -99,10 +102,12 @@
 
 	@Resource
 	private UserAccountBindingHistoryService userAccountBindingHistoryService;
-	
+
 	@Resource
 	private UserInfoDeleteRecordService userInfoDeleteRecordService;
-	
+
+	@Resource
+	private JedisPool jedisPool;
 
 	@Transactional
 	@Override
@@ -548,8 +553,7 @@
 		int addCount = 0;
 
 		userAccountMsgNotificationService.connectSuccess(mainUser.getId(), lessUser.getId());
-		
-		
+
 		userInfoDeleteRecordService.addDeleteRecord(lessUser.getId(), UserInfo.STATE_DELETE, "鍒犻櫎锛氳处鍙疯鎵撻�氬垹闄�");
 	}
 
@@ -671,6 +675,7 @@
 
 	@Override
 	public void addUser(UserInfo user) {
+
 		Long maxUid = userInfoMapper.getMaxUid();
 		if (maxUid == null)
 			maxUid = 100000L;
@@ -698,7 +703,6 @@
 		} catch (Exception e) {
 			e.printStackTrace();
 		}
-
 	}
 
 	@Override
@@ -952,6 +956,8 @@
 			if (!Constant.IS_TEST)
 				if (StringUtil.isNullOrEmpty(oldVcode) || !oldVcode.equalsIgnoreCase(vcode)) {
 					throw new UserAccountException(1, "楠岃瘉鐮侀敊璇紝閲嶆柊杈撳叆");
+				} else {// 楠岃瘉鐮佽緭鍏ユ纭�
+					redisManager.clearSMSVCode(phone, SMSHistory.TYPE_LOGIN);
 				}
 		}
 
@@ -973,31 +979,51 @@
 		// 娓呯悊娆℃暟
 		redisManager.removeCommonString("sendMSNLoginCount" + phone);
 
-		// 鏌ヨ鏄惁瀛樺湪璇ョ數璇濆巻鍙茬敤鎴�
-		UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByPhone(phone);
-		if (userInfo != null) {
-			// 鏇存柊璐︽埛鐧诲綍淇℃伅
-			updateLonginInfo(userInfo, loginType, request);
-		} else {
-			userInfo = new UserInfo();
-			userInfo.setAppId(appId);
-			userInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName());
-			userInfo.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
-			userInfo.setPhone(phone);
-			userInfo.setLoginType(loginType);
-			userInfo.setState(UserInfo.STATE_NORMAL);
-			// 鍒涘缓鐢ㄦ埛
-			addUser(userInfo);
+		// 閲囩敤redis浜嬪姟闃叉涓�涓墜鏈哄彿澶氭娉ㄥ唽闂
+		String watchKey = StringUtil.Md5("REGISTER:" + phone);
+		Jedis jedis = jedisPool.getResource();
+		try {
+			jedis.watch(watchKey);
+			if (jedis.get(watchKey) != null && Integer.parseInt(jedis.get(watchKey)) > 1)
+				throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
+			Transaction tran = jedis.multi();
+			tran.incr(watchKey);
+			List<Object> exec = tran.exec();
+			if (exec == null || exec.size() == 0) {
+				throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
+			} else {
+				// 鏌ヨ鏄惁瀛樺湪璇ョ數璇濆巻鍙茬敤鎴�
+				UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByPhone(phone);
+				if (userInfo != null) {
+					// 鏇存柊璐︽埛鐧诲綍淇℃伅
+					updateLonginInfo(userInfo, loginType, request);
+				} else {
+					userInfo = new UserInfo();
+					userInfo.setAppId(appId);
+					userInfo.setNickName(Constant.systemCommonConfig.getDefaultNickName());
+					userInfo.setPortrait(Constant.systemCommonConfig.getDefaultPortrait());
+					userInfo.setPhone(phone);
+					userInfo.setLoginType(loginType);
+					userInfo.setState(UserInfo.STATE_NORMAL);
+					// 鍒涘缓鐢ㄦ埛
+					addUser(userInfo);
 
-			try {
-				// 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
-				userInfoExtraService.createUserInfoExtra(userInfo.getId());
-			} catch (Exception e) {
-				e.printStackTrace();
+					try {
+						// 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
+						userInfoExtraService.createUserInfoExtra(userInfo.getId());
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+				return userInfo;
 			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			jedis.unwatch();
+			jedisPool.returnResource(jedis);
 		}
-
-		return userInfo;
+		throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
 	}
 
 	@Transactional
@@ -1025,39 +1051,61 @@
 			throw new UserAccountException(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC);
 		}
 
-		UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
-		// 鐩存帴鐢ㄧ殑寰俊鐧诲綍
-		if (userInfo != null) {
-			LogHelper.test("寰俊unionID瀛樺湪:" + weiXinUser.getUnionid());
-			// 鏇存柊璐︽埛鐧诲綍淇℃伅
-			updateLonginInfo(userInfo, loginType, request);
-			// 鍒犻櫎閭�璇峰垎浜浘
-			spreadUserImgService.deleteImgUrl(userInfo.getId());
-		} else {
-			LogHelper.test("寰俊unionID涓嶅瓨鍦�:" + weiXinUser.getUnionid());
-			// 鍒涘缓鏂拌处鎴�
-			userInfo = new UserInfo();
-			userInfo.setPortrait(weiXinUser.getHeadimgurl());
-			userInfo.setAppId(appId);
-			userInfo.setNickName(weiXinUser.getNickname());
-			userInfo.setWxName(weiXinUser.getNickname());
-			userInfo.setWxOpenId(weiXinUser.getOpenid());
-			userInfo.setWxUnionId(weiXinUser.getUnionid());
-			userInfo.setWxPic(weiXinUser.getHeadimgurl());
-			userInfo.setLastLoginTime(System.currentTimeMillis());
-			userInfo.setLoginType(loginType);
-			userInfo.setLastLoginIp(request.getRemoteHost());
-			userInfo.setState(UserInfo.STATE_NORMAL);
-			addUser(userInfo);
+		// 閲囩敤redis浜嬪姟闃叉涓�涓井淇″彿澶氭娉ㄥ唽闂
+		String watchKey = StringUtil.Md5("REGISTER:" + weiXinUser.getUnionid());
+		Jedis jedis = jedisPool.getResource();
+		try {
+			jedis.watch(watchKey);
+			if (jedis.get(watchKey) != null && Integer.parseInt(jedis.get(watchKey)) > 1)
+				throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
+			Transaction tran = jedis.multi();
+			tran.incr(watchKey);
+			List<Object> exec = tran.exec();
+			if (exec == null || exec.size() == 0) {
+				throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
+			} else {
 
-			try {
-				// 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
-				userInfoExtraService.createUserInfoExtra(userInfo.getId());
-			} catch (Exception e) {
-				e.printStackTrace();
+				UserInfo userInfo = userInfoMapper.getEffectiveUserInfoByWXUnionId(weiXinUser.getUnionid());
+				// 鐩存帴鐢ㄧ殑寰俊鐧诲綍
+				if (userInfo != null) {
+					LogHelper.test("寰俊unionID瀛樺湪:" + weiXinUser.getUnionid());
+					// 鏇存柊璐︽埛鐧诲綍淇℃伅
+					updateLonginInfo(userInfo, loginType, request);
+					// 鍒犻櫎閭�璇峰垎浜浘
+					spreadUserImgService.deleteImgUrl(userInfo.getId());
+				} else {
+					LogHelper.test("寰俊unionID涓嶅瓨鍦�:" + weiXinUser.getUnionid());
+					// 鍒涘缓鏂拌处鎴�
+					userInfo = new UserInfo();
+					userInfo.setPortrait(weiXinUser.getHeadimgurl());
+					userInfo.setAppId(appId);
+					userInfo.setNickName(weiXinUser.getNickname());
+					userInfo.setWxName(weiXinUser.getNickname());
+					userInfo.setWxOpenId(weiXinUser.getOpenid());
+					userInfo.setWxUnionId(weiXinUser.getUnionid());
+					userInfo.setWxPic(weiXinUser.getHeadimgurl());
+					userInfo.setLastLoginTime(System.currentTimeMillis());
+					userInfo.setLoginType(loginType);
+					userInfo.setLastLoginIp(request.getRemoteHost());
+					userInfo.setState(UserInfo.STATE_NORMAL);
+					addUser(userInfo);
+
+					try {
+						// 绗竴娆$櫥褰曟椂鍒涘缓鐢ㄦ埛棰濆淇℃伅
+						userInfoExtraService.createUserInfoExtra(userInfo.getId());
+					} catch (Exception e) {
+						e.printStackTrace();
+					}
+				}
+				return userInfo;
 			}
+		} catch (Exception e) {
+			e.printStackTrace();
+		} finally {
+			jedis.unwatch();
+			jedisPool.returnResource(jedis);
 		}
-		return userInfo;
+		throw new UserAccountException(10, "璇风◢鍚庡啀璇�");
 	}
 
 	/**
@@ -1182,8 +1230,6 @@
 		userAccountMsgNotificationService.bindingSuccess(uid, MsgAccountDetailFactory.TYPE_WX);
 	}
 
-	
-	
 	@Override
 	public void forbiddenUserAll(Long uid, String reason) {
 		UserInfo currentInfo = userInfoService.selectByPKey(uid);
@@ -1197,7 +1243,7 @@
 		currentInfo.setState(UserInfo.STATE_FORBIDDEN);
 		currentInfo.setStateDesc(reason);
 		userInfoService.updateByPrimaryKeySelective(currentInfo);
-		
+
 		// 鎻掑叆璁板綍
 		userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_FORBIDDEN, reason);
 
@@ -1251,15 +1297,14 @@
 			}
 		}
 	}
-	
-	
+
 	@Override
 	public void forbiddenUser(Long uid, String reason) {
 		UserInfo currentInfo = userInfoService.selectByPKey(uid);
 		if (currentInfo == null) {
 			return;
 		}
-		
+
 		if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
 			return;
 		}
@@ -1267,19 +1312,18 @@
 		currentInfo.setState(UserInfo.STATE_FORBIDDEN);
 		currentInfo.setStateDesc(reason);
 		userInfoService.updateByPrimaryKeySelective(currentInfo);
-		
+
 		// 鎻掑叆璁板綍
 		userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_FORBIDDEN, reason);
 	}
-	
-	
+
 	@Override
 	public void DeleteUser(Long uid, String reason) {
 		UserInfo currentInfo = userInfoService.selectByPKey(uid);
 		if (currentInfo == null) {
 			return;
 		}
-		
+
 		if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
 			return;
 		}
@@ -1290,15 +1334,14 @@
 		// 鎻掑叆璁板綍
 		userInfoDeleteRecordService.addDeleteRecord(uid, UserInfo.STATE_DELETE, reason);
 	}
-	
-	
+
 	@Override
 	public void DeleteUserOutOfDate(Long uid, String reason) {
 		UserInfo currentInfo = userInfoService.selectByPKey(uid);
 		if (currentInfo == null) {
 			return;
 		}
-		
+
 		if (currentInfo.getState() != UserInfo.STATE_NORMAL) {
 			return;
 		}

--
Gitblit v1.8.0