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/entity/request/adminuser/ReqAdminLogin.java    |   13 ++++
 src/main/java/com/gansu/water/service/AdminService.java                      |   99 +++++++++++++++++++++++---------
 pom.xml                                                                      |    7 ++
 src/main/java/com/gansu/water/host/controller/admin/AdminUserController.java |   31 +++++++++
 4 files changed, 118 insertions(+), 32 deletions(-)

diff --git a/pom.xml b/pom.xml
index 8497d9c..40b4cac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -236,7 +236,12 @@
             <artifactId>spring-boot-starter-quartz</artifactId>
             <version>2.0.3.RELEASE</version>
         </dependency>
-
+        <!--生成验证码工具-->
+        <dependency>
+            <groupId>com.github.whvcse</groupId>
+            <artifactId>easy-captcha</artifactId>
+            <version>1.6.2</version>
+        </dependency>
         <!--************************************************** 单元测试相关 **************************************************-->
         <dependency>
             <groupId>org.springframework.boot</groupId>
diff --git a/src/main/java/com/gansu/water/entity/request/adminuser/ReqAdminLogin.java b/src/main/java/com/gansu/water/entity/request/adminuser/ReqAdminLogin.java
index c59c81a..b93efa8 100644
--- a/src/main/java/com/gansu/water/entity/request/adminuser/ReqAdminLogin.java
+++ b/src/main/java/com/gansu/water/entity/request/adminuser/ReqAdminLogin.java
@@ -5,6 +5,15 @@
 @Data
 public class ReqAdminLogin {
     /**
+     * uuid:随机字符串
+     */
+
+    private String uuid;
+    /**
+     * 验证码
+     */
+    private String code;
+    /**
      * 登录账户
      * @required
      */
@@ -14,4 +23,8 @@
      * @required
      */
     private String password;
+    /**
+     * 登录设备码
+     */
+    private String machineCode;
 }
diff --git a/src/main/java/com/gansu/water/host/controller/admin/AdminUserController.java b/src/main/java/com/gansu/water/host/controller/admin/AdminUserController.java
index dbaab94..34ab112 100644
--- a/src/main/java/com/gansu/water/host/controller/admin/AdminUserController.java
+++ b/src/main/java/com/gansu/water/host/controller/admin/AdminUserController.java
@@ -1,5 +1,6 @@
 package com.gansu.water.host.controller.admin;
 
+import com.gansu.water.common.util.IPUtils;
 import com.gansu.water.host.BasicController;
 import com.gansu.water.host.api.MustAdmin;
 import com.gansu.water.host.api.NonLogin;
@@ -25,6 +26,8 @@
 import com.gansu.water.service.dto.ResAdminDetail;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
 
 /**
  * 40.管理员用户相关接口
@@ -146,7 +149,7 @@
      */
     @PostMapping("login")
     @NonLogin
-    public ExecutedResult<ResAdminLogin> adminLogin(@RequestBody ReqAdminLogin request) {
+    public ExecutedResult<ResAdminLogin> adminLogin(@RequestBody ReqAdminLogin request) throws Exception {
         //#region 参数验证
         ParameterValidator validator = new ParameterValidator()
                 .addNotNullOrEmpty(ParameterUtil.named("用户名"), request.getUserName())
@@ -194,7 +197,31 @@
         LoginUserDTO user = super.getTokenUser();
         return service.changePassword(user, request);
     }
-
+    /**
+     * 获取登录设备ip地址
+     *
+     * @param request 获取登录设备ip地址
+     * @author lin.liu
+     * @date 2023/02/17
+     */
+    @GetMapping("/getIpAddress")
+    @NonLogin
+    public ExecutedResult<String> getIpAddress(HttpServletRequest request) {
+        return ExecutedResult.success(IPUtils.getIpAddress(request));
+    }
+    /**
+     * 保存前端登录验证码
+     *
+     * @param uuid 请求参数
+     * @author lin.liu
+     * @date 2023/02/17
+     */
+    @GetMapping("/generate")
+    @NonLogin
+    public ExecutedResult<String> generate(@RequestParam String uuid) {
+        //#endregion
+        return  service.generate(uuid);
+    }
     /**
      * 重置管理员密码
      *
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