package com.sinata.appointment.service; import cn.dev33.satoken.stp.StpUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.sinata.appointment.constants.BizErrorCode; import com.sinata.appointment.dto.LoginRequest; import com.sinata.appointment.dto.LoginResponse; import com.sinata.appointment.entity.SysUser; import com.sinata.appointment.exception.BizException; import com.sinata.appointment.mapper.SysUserMapper; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; /** * 平台管理后台登录(sys_user 用户名+密码,BCrypt)。与小程序 {@link MiniAuthApplicationService} 无密码共用关系。 */ @Service @RequiredArgsConstructor public class AuthApplicationService { private final SysUserMapper sysUserMapper; private final BCryptPasswordEncoder bcrypt; private final CaptchaService captchaService; private final AdminLoginCryptoService adminLoginCryptoService; public LoginResponse login(LoginRequest req) { captchaService.validateAndConsume(req.getCaptchaId(), req.getCaptchaCode()); String username = adminLoginCryptoService.decryptLoginField(req.getUsername(), "用户名"); String password = adminLoginCryptoService.decryptLoginField(req.getPassword(), "密码"); SysUser user = sysUserMapper.selectOne( new LambdaQueryWrapper() .eq(SysUser::getUsername, username) .eq(SysUser::getDelFlag, 0)); if (user == null || user.getStatus() == null || user.getStatus() != 1) { throw new BizException(BizErrorCode.AUTH_INVALID_CREDENTIALS, "用户名或密码错误"); } if (!bcrypt.matches(password, user.getPasswordHash())) { throw new BizException(BizErrorCode.AUTH_INVALID_CREDENTIALS, "用户名或密码错误"); } StpUtil.login(user.getId()); List roles = sysUserMapper.listRoleCodesByUserId(user.getId()); List permissions = sysUserMapper.listPermissionCodesByUserId(user.getId()); return LoginResponse.builder() .token(StpUtil.getTokenValue()) .userId(user.getId()) .displayName(user.getRealName() != null ? user.getRealName() : user.getUsername()) .roles(roles) .permissions(permissions) .avatarUrl(user.getAvatarUrl()) .build(); } public void logout() { StpUtil.logout(); } }