liulin
2025-07-03 fb2f11d7d502ceacbe7fbed176bea4ab0f152f69
src/main/java/com/lunhan/water/service/AdminService.java
@@ -28,11 +28,14 @@
import com.lunhan.water.service.convert.AdminRoleConvert;
import com.lunhan.water.service.convert.AdminUserConvert;
import com.lunhan.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();