1.添加 web 端扫码登录功能
This commit is contained in:
@@ -3,28 +3,41 @@ package vvpkassistant.User.service;
|
||||
import cn.dev33.satoken.stp.StpUtil;
|
||||
import cn.dev33.satoken.temp.SaTempUtil;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.lang.UUID;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import com.github.benmanes.caffeine.cache.Cache;
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.google.zxing.WriterException;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Service;
|
||||
import vvpkassistant.Data.WxChatParam;
|
||||
import vvpkassistant.Tools.BcryptUtils;
|
||||
import vvpkassistant.Tools.QRCodeUtil;
|
||||
import vvpkassistant.Tools.VVTools;
|
||||
import vvpkassistant.User.mapper.UserDao;
|
||||
import vvpkassistant.User.model.*;
|
||||
import vvpkassistant.User.model.DTO.LoginInfoDTO;
|
||||
import vvpkassistant.User.model.DTO.ScanInfoDTO;
|
||||
import vvpkassistant.User.model.DTO.UserModelDTO;
|
||||
import vvpkassistant.User.model.UserModel;
|
||||
import vvpkassistant.User.model.UserModelVO;
|
||||
import vvpkassistant.User.model.enumeration.LoginStatusEnum;
|
||||
import vvpkassistant.common.ErrorCode;
|
||||
import vvpkassistant.exception.BusinessException;
|
||||
import vvpkassistant.mail.service.MailService;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.io.IOException;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
/*
|
||||
* @author: ziin
|
||||
* @date: 2025/8/4 16:19
|
||||
*/
|
||||
@Service
|
||||
@Slf4j
|
||||
public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements UserService {
|
||||
|
||||
@Resource
|
||||
@@ -35,6 +48,11 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements
|
||||
@Autowired
|
||||
private MailService mailService;
|
||||
|
||||
|
||||
private final Cache<String, LoginInfoDTO> qrcodeCache = Caffeine.newBuilder()
|
||||
.expireAfterWrite(2, TimeUnit.MINUTES)
|
||||
.build();
|
||||
|
||||
@Override
|
||||
public UserModelVO loginWithMail(UserModelDTO model) {
|
||||
|
||||
@@ -164,4 +182,74 @@ public class UserServiceImpl extends ServiceImpl<UserDao, UserModel> implements
|
||||
}
|
||||
throw new BusinessException(ErrorCode.SYSTEM_ERROR,"邮箱验证失败");
|
||||
}
|
||||
|
||||
@Override
|
||||
public QrcodeVO generatedQrcode() {
|
||||
String uuid = UUID.randomUUID().toString();
|
||||
QrcodeEntity qrcodeEntity = new QrcodeEntity();
|
||||
qrcodeEntity.setUuid(uuid);
|
||||
qrcodeEntity.setType("qrcdoe");
|
||||
String base64QR = null;
|
||||
try {
|
||||
base64QR = QRCodeUtil.generateQRCode(JSONUtil.toJsonStr(qrcodeEntity), 200, 200);
|
||||
} catch (WriterException | IOException e) {
|
||||
log.error(e.getMessage());
|
||||
throw new BusinessException(ErrorCode.SYSTEM_ERROR,"二维码生成失败");
|
||||
}
|
||||
|
||||
LoginInfoDTO loginInfoDTO = new LoginInfoDTO();
|
||||
loginInfoDTO.setStatus(LoginStatusEnum.UNSCANNED.name());
|
||||
loginInfoDTO.setUuid(uuid);
|
||||
|
||||
// 二维码uuid绑定,存入缓存
|
||||
qrcodeCache.put(uuid,loginInfoDTO);
|
||||
// 返回生成的二维码信息
|
||||
QrcodeVO vo = QrcodeVO.builder().uuid(uuid).qrcode("data:image/png;base64," + base64QR).build();
|
||||
log.info("-------生成二维码成功:{}-------", uuid);
|
||||
return vo;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object checkQrcode(String uuid) {
|
||||
LoginInfoDTO loginInfoDTO = qrcodeCache.getIfPresent(uuid);
|
||||
if (loginInfoDTO == null) {
|
||||
throw new BusinessException(ErrorCode.QRCODE_EXPIRED);
|
||||
}
|
||||
if (Objects.equals(loginInfoDTO.getStatus(), LoginStatusEnum.SCANNED.name())) {
|
||||
return loginInfoDTO;
|
||||
}
|
||||
if (LoginStatusEnum.CONFIRMED.name().equals(loginInfoDTO.getStatus())) {
|
||||
UserModel userModel = userDao.selectById(loginInfoDTO.getUserId());
|
||||
StpUtil.login(userModel.getId());
|
||||
UserModelVO userModelVO = BeanUtil.copyProperties(userModel, UserModelVO.class);
|
||||
userModelVO.setToken(StpUtil.getTokenValue());
|
||||
userModelVO.setChatInfo(wxChatParam);
|
||||
return userModelVO;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void scanQrcode(ScanInfoDTO scanInfoDTO) {
|
||||
LoginInfoDTO loginInfoDTO = qrcodeCache.getIfPresent(scanInfoDTO.getUuid());
|
||||
if (loginInfoDTO != null) {
|
||||
loginInfoDTO.setStatus(LoginStatusEnum.SCANNED.name());
|
||||
}
|
||||
if (loginInfoDTO != null) {
|
||||
qrcodeCache.put(scanInfoDTO.getUuid(),loginInfoDTO);
|
||||
}
|
||||
|
||||
log.info("-------扫码成功uuid:{}-------", scanInfoDTO.getUuid());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void confirm(ScanInfoDTO scanInfoDTO) {
|
||||
LoginInfoDTO loginInfoDTO = qrcodeCache.getIfPresent(scanInfoDTO.getUuid());
|
||||
if (loginInfoDTO != null) {
|
||||
loginInfoDTO.setStatus(LoginStatusEnum.CONFIRMED.name());
|
||||
loginInfoDTO.setUserId(scanInfoDTO.getUserId());
|
||||
qrcodeCache.put(scanInfoDTO.getUuid(),loginInfoDTO);
|
||||
}
|
||||
log.info("-------确认登录成功uuid:{}-------", scanInfoDTO.getUuid());
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user