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<SysUser>()
|
.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<String> roles = sysUserMapper.listRoleCodesByUserId(user.getId());
|
List<String> 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();
|
}
|
}
|