From 08f1b1f1804a8bd833d42f257908d80e88387b55 Mon Sep 17 00:00:00 2001
From: mitao <2763622819@qq.com>
Date: 星期五, 14 三月 2025 11:27:47 +0800
Subject: [PATCH] 3.5增加登录验证、修改密码、人员列表调整

---
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/api/SystemUserController.java |   83 +++++++++++++++++++++++++++++++----------
 1 files changed, 63 insertions(+), 20 deletions(-)

diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/api/SystemUserController.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/api/SystemUserController.java
index 834a67b..49e23eb 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/api/SystemUserController.java
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/api/SystemUserController.java
@@ -12,6 +12,7 @@
 import com.panzhihua.sangeshenbian.model.entity.SystemRoleMenu;
 import com.panzhihua.sangeshenbian.model.entity.SystemUser;
 import com.panzhihua.sangeshenbian.model.vo.RegionVO;
+import com.panzhihua.sangeshenbian.model.vo.UpdatePasswordDTO;
 import com.panzhihua.sangeshenbian.service.ISystemMenuService;
 import com.panzhihua.sangeshenbian.service.ISystemRoleMenuService;
 import com.panzhihua.sangeshenbian.service.ISystemUserService;
@@ -27,9 +28,11 @@
 import org.springframework.beans.BeanUtils;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.util.ObjectUtils;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
+import javax.validation.Valid;
 import java.time.LocalDateTime;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
@@ -41,6 +44,7 @@
  */
 @Api
 @Slf4j
+@Valid
 @RestController
 @RequestMapping("/systemUser")
 public class SystemUserController extends BaseController {
@@ -54,7 +58,10 @@
 	@Resource
 	private TokenService tokenService;
 	
-	private final Integer max_err = 5;
+	// 添加错误次数和冻结时间常量
+	private static final Integer LOCK_ERR = 5;      // 锁定账号的错误次数
+	private static final Integer FREEZE_ERR = 3;    // 冻结账号的错误次数
+	private static final Integer FREEZE_MINUTES = 3; // 冻结时间(分钟)
 	
 	@Resource
 	private ISystemRoleMenuService systemRoleMenuService;
@@ -71,31 +78,60 @@
 	@OperLog(operModul = "三个身边后台",operType = 0,businessType = "登录")
 	public R<TokenVo> login(@RequestBody LoginVo vo){
 		String key = "login:" + vo.getPhone();
-		Integer size = (Integer) redisTemplate.opsForValue().get(key);
-		if(null != size && max_err.equals(size)){
-			return R.fail("连续登录失败,请稍后重试。");
-		}
-		if(null == size){
-			size = 0;
-		}
+		
 		SystemUser systemUser = systemUserService.getOne(new LambdaQueryWrapper<SystemUser>()
-				.eq(SystemUser::getPhone, vo.getPhone()).ne(SystemUser::getStatus, 3));
+				.eq(SystemUser::getPhone, vo.getPhone())
+				.ne(SystemUser::getStatus, 3));
+				
 		if(null == systemUser){
-			size++;
-			redisTemplate.opsForValue().set(key, size, 5, TimeUnit.MINUTES);
 			return R.fail("登录失败,手机号/密码错误。");
 		}
-		if(!vo.getPassword().equals(systemUser.getPassword())){
-			size++;
-			redisTemplate.opsForValue().set(key, size, 5, TimeUnit.MINUTES);
-			return R.fail("登录失败,手机号/密码错误。");
+		
+		// 检查用户是否已被锁定
+		if(4 == systemUser.getStatus()){
+			return R.fail("密码连续输入错误五次,账号已被锁定,请联系管理员解锁。");
 		}
+		
+		// 检查用户是否已被冻结
 		if(2 == systemUser.getStatus()){
 			return R.fail("当前账号已冻结。");
 		}
-		//创建token
+		
+		// 检查是否在临时冻结期
+		Integer errorCount = (Integer) redisTemplate.opsForValue().get(key);
+		if(null != errorCount && FREEZE_ERR <= errorCount && errorCount < LOCK_ERR){
+			return R.fail("密码连续输入错误三次,账号已被冻结" + FREEZE_MINUTES + "分钟。");
+		}
+		
+		if(null == errorCount){
+			errorCount = 0;
+		}
+		
+		if(!vo.getPassword().equals(systemUser.getPassword())){
+			errorCount++;
+			
+			// 达到锁定次数,更新用户状态为锁定
+			if(errorCount >= LOCK_ERR) {
+				systemUser.setStatus(4);  // 4表示账号锁定
+				systemUserService.updateById(systemUser);
+				redisTemplate.delete(key);  // 清除redis中的错误计数
+				return R.fail("密码连续输入错误五次,账号已被锁定,请联系管理员解锁。");
+			} 
+			// 达到冻结次数
+			else if(errorCount == FREEZE_ERR) {
+				redisTemplate.opsForValue().set(key, errorCount, FREEZE_MINUTES, TimeUnit.MINUTES);
+				return R.fail("密码连续输入错误三次,账号已被冻结" + FREEZE_MINUTES + "分钟。");
+			} 
+			// 普通错误
+			else {
+				redisTemplate.opsForValue().set(key, errorCount, 5, TimeUnit.MINUTES);
+				return R.fail("登录失败,手机号/密码错误。");
+			}
+		}
+		
+		//登录成功,创建token
 		R<LoginReturnVO> reult = tokenService.loginThreeAround(systemUser.getId());
-		redisTemplate.delete(key);
+		redisTemplate.delete(key);  // 清除错误计数
 		LoginReturnVO loginReturnVO = reult.getData();
 		TokenVo tokenVo = new TokenVo();
 		BeanUtils.copyProperties(loginReturnVO, tokenVo);
@@ -273,14 +309,14 @@
 	
 	
 	@PutMapping("/unfreeze/{id}")
-	@ApiOperation(value = "解冻账号", tags = {"三个身边后台-人员管理"})
-	@OperLog(operModul = "三个身边后台",operType = 2,businessType = "解冻账号")
+	@ApiOperation(value = "解冻/解锁账号", tags = {"三个身边后台-人员管理"})
+	@OperLog(operModul = "三个身边后台",operType = 2,businessType = "解冻/解锁账号")
 	public R unfreeze(@PathVariable("id") Integer id){
 		SystemUser systemUser = systemUserService.getById(id);
 		if(1 == systemUser.getStatus()){
 			return R.fail("不能重复操作");
 		}
-		systemUser.setStatus(1);
+		systemUser.setStatus(1);  // 将冻结(2)或锁定(4)状态恢复为正常状态(1)
 		systemUserService.updateById(systemUser);
 		return R.ok();
 	}
@@ -333,4 +369,11 @@
 		log.info("获取行政区划层级联动数据:{}", list);
 		return R.ok(list);
 	}
+	@ApiOperation(value = "修改密码",tags = {"三个身边后台-人员管理"})
+	@PostMapping("/updatePassword")
+	public R<?> updatePassword(@RequestBody @Validated UpdatePasswordDTO dto) {
+		SystemUserVo loginUserInfoSanGeShenBian = getLoginUserInfoSanGeShenBian();
+		systemUserService.updatePassword(dto,loginUserInfoSanGeShenBian);
+		return R.ok();
+	}
 }

--
Gitblit v1.7.1