From 6f24891b1d3f42ce318fa11ab716c718c3e6715b Mon Sep 17 00:00:00 2001 From: liulin <lin.liu@88.com> Date: 星期四, 10 七月 2025 10:56:50 +0800 Subject: [PATCH] 初始化项目 --- src/main/java/com/gansu/water/service/AdminService.java | 99 +++++++++++++++++++++++++++++++++++-------------- 1 files changed, 70 insertions(+), 29 deletions(-) diff --git a/src/main/java/com/gansu/water/service/AdminService.java b/src/main/java/com/gansu/water/service/AdminService.java index 68f992e..422a898 100644 --- a/src/main/java/com/gansu/water/service/AdminService.java +++ b/src/main/java/com/gansu/water/service/AdminService.java @@ -28,11 +28,14 @@ import com.gansu.water.service.convert.AdminRoleConvert; import com.gansu.water.service.convert.AdminUserConvert; import com.gansu.water.service.dto.ResAdminDetail; +import com.wf.captcha.SpecCaptcha; import org.apache.commons.lang3.BooleanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Service; import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; @Service @@ -64,7 +67,8 @@ @Autowired private AdminPowerService adminPowerService; - + @Autowired + private StringRedisTemplate redisTemplate; // 添加后台管理员 public ExecutedResult<Long> createAdmin(ReqCreateAdminUser request) { @@ -130,36 +134,73 @@ } return ExecutedResult.success(result); } - - // 管理员登录 - public ExecutedResult<ResAdminLogin> adminLogin(ReqAdminLogin request) { - AdminUserPO user = dao.get4Name(request.getUserName()); - if(Objects.isNull(user)){ - return ExecutedResult.failed("用户名或密码错误。"); - } - if(BooleanUtils.isFalse(Objects.equals(user.getStatus(), EState.NORMAL.getValue()))) { - return ExecutedResult.failed("账号已锁定,请联系管理员。"); - } - if(BooleanUtils.isFalse(MD5Util.encrypt(request.getPassword() + ConstantFactory.KEY_PASSWORD).equals(user.getPassword()))) { - return ExecutedResult.failed("用户名或密码错误。"); - } - // 构建登录用户 - LoginUserDTO loginUser = new LoginUserDTO(); - loginUser.setUserId(user.getId().toString()); - loginUser.setUserType(user.getUserType()); - loginUser.setNickName(user.getNickName()); - loginUser.setPhone(user.getContact()); - - // 保存用户信息到jwt - String token = JWTUtil.getToken(loginUser); - - ResAdminLogin result = this.getListPower4Admin(user); - result.setName(user.getNickName()); - result.setToken(token); - - return ExecutedResult.success(result); + /** + * 生成验证码图片并返回其 Base64 编码字符串 + * + * @param uuid 用于标识验证码的唯一标识符 + * @return 包含验证码图片 Base64 编码的响应结果 + */ + public ExecutedResult<String> generate(String uuid) { + SpecCaptcha specCaptcha = new SpecCaptcha(100, 30, 4); + // captcha.setCharType(Captcha.TYPE_DEFAULT); + String code = specCaptcha.text().toLowerCase(); + // 缓存验证码 + redisTemplate.opsForValue().set(uuid, code); + // 设置验证码3分钟后过期 + redisTemplate.expire(uuid, 3, TimeUnit.MINUTES); + return ExecutedResult.success(specCaptcha.toBase64()); } + // 管理员登录 + public ExecutedResult<ResAdminLogin> adminLogin(ReqAdminLogin request) throws Exception { + Integer maxNumber = 3; + AdminUserPO user = dao.get4Name(request.getUserName()); + //获取缓存中的验证码 + String realCode = redisTemplate.opsForValue().get(request.getUuid()); + if (realCode == null) { + return ExecutedResult.failed("验证码已失效,请重新获取~"); + } + // 验证码校验 + if (!request.getCode().equalsIgnoreCase(realCode)) { + return ExecutedResult.failed("验证码错误"); + } + //获取缓存中设备码 + String machineCode = redisTemplate.opsForValue().get(request.getMachineCode()); + if (StringUtil.isNotNullOrEmpty(machineCode) && Integer.valueOf(machineCode) >= maxNumber) { + return ExecutedResult.failed("登录次数限制,请10分钟后重新登录!"); + } + if (checkPassword(user, request.getPassword())) { + // 构建登录用户 + LoginUserDTO loginUser = new LoginUserDTO(); + loginUser.setUserId(user.getId().toString()); + loginUser.setUserType(user.getUserType()); + loginUser.setNickName(user.getNickName()); + loginUser.setPhone(user.getContact()); + // 保存用户信息到jwt + String token = JWTUtil.getToken(loginUser); + ResAdminLogin result = this.getListPower4Admin(user); + result.setName(user.getNickName()); + result.setToken(token); + return ExecutedResult.success(result); + } else { + Integer newAttempts = StringUtil.isNullOrEmpty(machineCode) ? 1 : Integer.valueOf(machineCode) + 1; + redisTemplate.opsForValue().set(request.getMachineCode(), newAttempts.toString()); + redisTemplate.expire(request.getMachineCode(), 10, TimeUnit.MINUTES); + } + return ExecutedResult.failed("账号或密码错误!"); + } + private static boolean checkPassword(AdminUserPO user, String passWord) throws Exception { + if (Objects.isNull(user)) { + return false; + } + if (BooleanUtils.isFalse(Objects.equals(user.getStatus(), EState.NORMAL.getValue()))) { + return false; + } + if (BooleanUtils.isFalse(MD5Util.encrypt(passWord + ConstantFactory.KEY_PASSWORD).equals(user.getPassword()))) { + return false; + } + return true; + } // 获取管理员权限列表 public ExecutedResult<ResAdminPower> getPower(Long adminId) { ResAdminPower result = new ResAdminPower(); -- Gitblit v1.9.3