pom.xml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/gansu/water/entity/request/adminuser/ReqAdminLogin.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/gansu/water/host/ApplicationStarter.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/gansu/water/host/controller/admin/AdminUserController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/java/com/gansu/water/service/AdminService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application-test.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main/resources/application.yml | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
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> 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; } src/main/java/com/gansu/water/host/ApplicationStarter.java
@@ -9,7 +9,7 @@ import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.cache.annotation.EnableCaching; @SpringBootApplication(scanBasePackages = { "com.lunhan" }) @SpringBootApplication(scanBasePackages = { "com.gansu" }) @ServletComponentScan @MapperScan("com.gansu.water.repository.mapper") // 开启缓存 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); } /** * 重置管理员密码 * 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(); src/main/resources/application-test.yml
@@ -1,12 +1,12 @@ server: port: 8088 port: 8039 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss datasource: driver-class-name: org.postgresql.Driver url: jdbc:postgresql://113.250.189.120:57654/test_db1 url: jdbc:postgresql://113.250.189.120:57654/gansu_water_system username: lunhan password: lunhan.20240330 druid: @@ -34,10 +34,15 @@ path: ./logs level: root: info com.gansu.water.host: DEBUG com.gansu.water.service: DEBUG com.gansu.water: info # mybatis-plus 配置: mybatis-plus: configuration: ### 开启打印sql配置 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # quartz定时任务配置 quartz: # 是否启用 enable: true enable: true src/main/resources/application.yml
@@ -17,7 +17,7 @@ host: smtp.qq.com default-encoding: UTF-8 redis: keyPrefix: xxx_yyy_ # redis缓存key统一加上前缀 keyPrefix: gansu_water_ # redis缓存key统一加上前缀 jwt: token_header: Token #JWT存储的请求头