From 8e6897d54300642f35827548eed664dd95df0834 Mon Sep 17 00:00:00 2001
From: liulin <lin.liu@88.com>
Date: 星期四, 10 七月 2025 14:34:04 +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