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 +++++++++++++++++++++------
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/warpper/SystemUserListVo.java           |    4 +
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/resources/mapper/SystemUserMapper.xml                                    |    7 ++
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/model/vo/UpdatePasswordDTO.java         |   24 ++++++++
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/ISystemUserService.java         |    9 +++
 springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/impl/SystemUserServiceImpl.java |   39 +++++++++++-
 6 files changed, 140 insertions(+), 26 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();
+	}
 }
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/model/vo/UpdatePasswordDTO.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/model/vo/UpdatePasswordDTO.java
new file mode 100644
index 0000000..f81933f
--- /dev/null
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/model/vo/UpdatePasswordDTO.java
@@ -0,0 +1,24 @@
+package com.panzhihua.sangeshenbian.model.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+
+/**
+ * @author mitao
+ * @date 2025/3/14
+ */
+@Data
+@ApiModel("管理后台修改密码数据传输对象")
+public class UpdatePasswordDTO {
+
+    @ApiModelProperty("旧密码")
+    @NotBlank(message = "旧密码不能为空")
+    private String oldPassword;
+
+    @ApiModelProperty("新密码")
+    @NotBlank(message = "新密码不能为空")
+    private String newPassword;
+}
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/ISystemUserService.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/ISystemUserService.java
index b306477..c5272ef 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/ISystemUserService.java
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/ISystemUserService.java
@@ -2,8 +2,10 @@
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.panzhihua.common.model.vos.sangeshenbian.SystemUserVo;
 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.warpper.SystemUserList;
 import com.panzhihua.sangeshenbian.warpper.SystemUserListVo;
 
@@ -54,4 +56,11 @@
 	 * @return
 	 */
 	List<RegionVO> getCommunity(String streetId);
+
+	/**
+	 * 修改密码
+	 * @param dto
+	 * @param systemUserVo
+	 */
+    void updatePassword(UpdatePasswordDTO dto, SystemUserVo systemUserVo);
 }
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/impl/SystemUserServiceImpl.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/impl/SystemUserServiceImpl.java
index 4ae36d2..cbde55b 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/impl/SystemUserServiceImpl.java
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/service/impl/SystemUserServiceImpl.java
@@ -3,10 +3,14 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.panzhihua.common.exceptions.ServiceException;
+import com.panzhihua.common.model.vos.R;
+import com.panzhihua.common.model.vos.sangeshenbian.SystemUserVo;
 import com.panzhihua.common.utlis.StringUtils;
 import com.panzhihua.sangeshenbian.dao.SystemUserMapper;
 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.ISystemUserService;
 import com.panzhihua.sangeshenbian.warpper.SystemUserList;
 import com.panzhihua.sangeshenbian.warpper.SystemUserListVo;
@@ -42,7 +46,7 @@
 	 * @return
 	 */
 	@Override
-	public Optional<SystemUser> getSystemUserByPhone(String phone) {
+	public Optional<SystemUser> getSystemUserAdminByPhone(String phone) {
 		if (StringUtils.isBlank(phone)) {
 			return Optional.empty();
 		}
@@ -50,10 +54,16 @@
 				.eq(SystemUser::getPhone, phone).ne(SystemUser::getStatus, 3)
 				.eq(SystemUser::getIsAdmin, 1).last("LIMIT 1").oneOpt();
 	}
-	
-	
-	
-	
+
+	@Override
+	public Optional<SystemUser> getSystemUserByPhone(String phone) {
+		if (StringUtils.isBlank(phone)) {
+			return Optional.empty();
+		}
+		return this.lambdaQuery()
+				.eq(SystemUser::getPhone, phone).ne(SystemUser::getStatus, 3).last("LIMIT 1").oneOpt();
+	}
+
 	/**
 	 * 获取行政区划数据
 	 *
@@ -88,4 +98,23 @@
 	public List<RegionVO> getCommunity(String streetId) {
 		return this.baseMapper.getCommunity(streetId);
 	}
+
+	/**
+	 * 修改密码
+	 * @param dto
+	 * @param systemUserVo
+	 */
+	@Override
+	public void updatePassword(UpdatePasswordDTO dto, SystemUserVo systemUserVo) {
+		if (systemUserVo == null) {
+			throw new ServiceException("用户不存在");
+		}
+		if (systemUserVo.getPassword().equals(dto.getNewPassword())) {
+			throw new ServiceException("新密码不能与旧密码相同");
+		}
+		if (!systemUserVo.getPassword().equals(dto.getOldPassword())) {
+			throw new ServiceException("旧密码错误");
+		}
+		this.lambdaUpdate().set(SystemUser::getPassword, dto.getNewPassword()).eq(SystemUser::getId, systemUserVo.getId()).update();
+	}
 }
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/warpper/SystemUserListVo.java b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/warpper/SystemUserListVo.java
index 660d5c8..226f016 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/warpper/SystemUserListVo.java
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/java/com/panzhihua/sangeshenbian/warpper/SystemUserListVo.java
@@ -25,6 +25,8 @@
 	private String systemRoleName;
 	@ApiModelProperty(value = "账号层级(1=市级账号,2=区县账号,3=街道账号,4=社区账号)")
 	private Integer accountLevel;
-	@ApiModelProperty("账号状态(1=使用中,2=已冻结)")
+	@ApiModelProperty(value = "账号所属层级")
+	private String accountLevelStr;
+	@ApiModelProperty("账号状态(1=使用中,2=已冻结4=已锁定)")
 	private Integer status;
 }
diff --git a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/resources/mapper/SystemUserMapper.xml b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/resources/mapper/SystemUserMapper.xml
index d9b69f0..2872b5a 100644
--- a/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/resources/mapper/SystemUserMapper.xml
+++ b/springcloud_k8s_panzhihuazhihuishequ/service_sangeshenbian/src/main/resources/mapper/SystemUserMapper.xml
@@ -14,6 +14,13 @@
 			f.`name` as systemPostName,
 			g.`name` as systemRoleName,
 			a.account_level as accountLevel,
+			CASE 
+				WHEN a.account_level = 1 THEN '市'
+				WHEN a.account_level = 2 THEN CONCAT('区县-', a.districts)
+				WHEN a.account_level = 3 THEN CONCAT('街道-', a.districts, '-', a.street)
+				WHEN a.account_level = 4 THEN CONCAT('社区-', a.districts, '-', a.street, '-', a.community)
+				ELSE ''
+			END as accountLevelStr,
 			a.`status`
 		from sgsb_system_user a
 		left join sgsb_department b on (a.one_department_id = b.id)

--
Gitblit v1.7.1