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