| | |
| | | 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; |
| | |
| | | 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; |
| | |
| | | */ |
| | | @Api |
| | | @Slf4j |
| | | @Valid |
| | | @RestController |
| | | @RequestMapping("/systemUser") |
| | | public class SystemUserController extends BaseController { |
| | |
| | | @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; |
| | |
| | | @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); |
| | |
| | | |
| | | |
| | | @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(); |
| | | } |
| | |
| | | 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(); |
| | | } |
| | | } |