liulin
2025-07-10 6f24891b1d3f42ce318fa11ab716c718c3e6715b
初始化项目
已修改4个文件
116 ■■■■ 文件已修改
pom.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gansu/water/entity/request/adminuser/ReqAdminLogin.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gansu/water/host/controller/admin/AdminUserController.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/gansu/water/service/AdminService.java 65 ●●●● 补丁 | 查看 | 原始文档 | 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/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);
    }
    /**
     * 生成验证码图片并返回其 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) {
    public ExecutedResult<ResAdminLogin> adminLogin(ReqAdminLogin request) throws Exception {
        Integer maxNumber = 3;
        AdminUserPO user = dao.get4Name(request.getUserName());
        if(Objects.isNull(user)){
            return ExecutedResult.failed("用户名或密码错误。");
        //获取缓存中的验证码
        String realCode = redisTemplate.opsForValue().get(request.getUuid());
        if (realCode == null) {
            return ExecutedResult.failed("验证码已失效,请重新获取~");
        }
        if(BooleanUtils.isFalse(Objects.equals(user.getStatus(), EState.NORMAL.getValue()))) {
            return ExecutedResult.failed("账号已锁定,请联系管理员。");
        // 验证码校验
        if (!request.getCode().equalsIgnoreCase(realCode)) {
            return ExecutedResult.failed("验证码错误");
        }
        if(BooleanUtils.isFalse(MD5Util.encrypt(request.getPassword() + ConstantFactory.KEY_PASSWORD).equals(user.getPassword()))) {
            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();