init
This commit is contained in:
166
app/core/services/login_thread.py
Normal file
166
app/core/services/login_thread.py
Normal file
@@ -0,0 +1,166 @@
|
||||
import base64
|
||||
|
||||
from loguru import logger
|
||||
from PyQt6.QtCore import Qt, QThread, pyqtSignal
|
||||
from PyQt6.QtGui import (QColor, QPainter, QPainterPath, QPen, QPixmap)
|
||||
|
||||
from ..api import miaoStarsBasicApi
|
||||
from ...core import cfg, qconfig, userConfig
|
||||
|
||||
|
||||
class CaptchaThread(QThread):
|
||||
captchaReady = pyqtSignal(QPixmap)
|
||||
captchaFailed = pyqtSignal(str)
|
||||
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
|
||||
@staticmethod
|
||||
def _createRoundedPixmap(pixmap, radius=10):
|
||||
"""创建圆角图片"""
|
||||
try:
|
||||
# 获取原始图片尺寸
|
||||
if pixmap.isNull():
|
||||
logger.error("原始图片为空,无法创建圆角图片")
|
||||
return pixmap
|
||||
size = pixmap.size()
|
||||
# 创建透明背景的图片
|
||||
rounded_pixmap = QPixmap(size)
|
||||
rounded_pixmap.fill(Qt.GlobalColor.transparent)
|
||||
# 创建对象
|
||||
painter = QPainter(rounded_pixmap)
|
||||
painter.setRenderHints(
|
||||
QPainter.RenderHint.Antialiasing
|
||||
| QPainter.RenderHint.SmoothPixmapTransform
|
||||
)
|
||||
# 创建圆角矩形路径
|
||||
path = QPainterPath()
|
||||
path.addRoundedRect(0, 0, size.width(), size.height(), radius, radius)
|
||||
# 设置裁剪区域
|
||||
painter.setClipPath(path)
|
||||
# 绘制原始图片
|
||||
painter.drawPixmap(0, 0, pixmap)
|
||||
# 绘制边框
|
||||
pen = QPen(QColor(200, 200, 200)) # 浅灰色边框
|
||||
pen.setWidth(1)
|
||||
painter.setPen(pen)
|
||||
painter.drawRoundedRect(
|
||||
0, 0, size.width() - 1, size.height() - 1, radius, radius
|
||||
)
|
||||
|
||||
painter.end()
|
||||
return rounded_pixmap
|
||||
except Exception as e:
|
||||
logger.error(f"创建圆角图片失败:{e}")
|
||||
return pixmap # 如果出错,返回原始图片
|
||||
|
||||
def run(self):
|
||||
try:
|
||||
logger.debug("开始获取验证码")
|
||||
response = miaoStarsBasicApi.getCaptcha()
|
||||
logger.debug(f"验证码API返回响应: {response}")
|
||||
|
||||
if response["code"] == 0:
|
||||
# 确保data字段存在且为字符串
|
||||
if "data" in response and isinstance(response["data"], str):
|
||||
# 分割base64前缀和实际数据
|
||||
try:
|
||||
captchaImageData = response["data"].split(",")[1]
|
||||
logger.debug(f"成功提取base64数据,长度: {len(captchaImageData)}")
|
||||
|
||||
# 解码base64数据
|
||||
captchaImage = base64.b64decode(captchaImageData)
|
||||
logger.debug(f"成功解码base64数据,长度: {len(captchaImage)} bytes")
|
||||
|
||||
# 加载图片
|
||||
pixmap = QPixmap()
|
||||
load_success = pixmap.loadFromData(captchaImage)
|
||||
|
||||
if load_success:
|
||||
logger.debug(f"成功加载图片,尺寸: {pixmap.width()}x{pixmap.height()}")
|
||||
# 创建圆角图片
|
||||
pixmap = self._createRoundedPixmap(pixmap, radius=10)
|
||||
self.captchaReady.emit(pixmap)
|
||||
else:
|
||||
logger.error("图片加载失败")
|
||||
self.captchaFailed.emit("验证码图片加载失败")
|
||||
self.captchaReady.emit(QPixmap(":app/images/loadFailure.png"))
|
||||
except (IndexError, ValueError, TypeError) as e:
|
||||
logger.error(f"验证码数据格式错误: {e}")
|
||||
self.captchaFailed.emit(f"验证码数据格式错误: {str(e)}")
|
||||
self.captchaReady.emit(QPixmap(":app/images/loadFailure.png"))
|
||||
else:
|
||||
logger.error("验证码响应中缺少有效的data字段")
|
||||
self.captchaFailed.emit("验证码数据无效")
|
||||
self.captchaReady.emit(QPixmap(":app/images/loadFailure.png"))
|
||||
else:
|
||||
error_msg = response.get("msg", "获取验证码失败")
|
||||
logger.error(f"获取验证码失败: {error_msg}")
|
||||
self.captchaFailed.emit(error_msg)
|
||||
self.captchaReady.emit(QPixmap(":app/images/loadFailure.png"))
|
||||
except Exception as e:
|
||||
logger.exception(f"获取验证码过程中发生异常: {e}")
|
||||
self.captchaFailed.emit(str(e))
|
||||
self.captchaReady.emit(QPixmap(":app/images/loadFailure.png"))
|
||||
|
||||
|
||||
class LoginThread(QThread):
|
||||
successLogin = pyqtSignal()
|
||||
errorLogin = pyqtSignal(str)
|
||||
|
||||
def __init__(self, email: str, password: str, captchaCode: str):
|
||||
super().__init__()
|
||||
logger.debug(f"初始化许可证服务线程 - 邮箱: {email}")
|
||||
self.email = email
|
||||
self.password = password
|
||||
self.captchaCode = captchaCode
|
||||
|
||||
def run(self):
|
||||
logger.info(f"开始验证用户登录 - 邮箱: {self.email}")
|
||||
try:
|
||||
loginResponse = miaoStarsBasicApi.login(
|
||||
self.email, self.password, self.captchaCode
|
||||
)
|
||||
if loginResponse["code"] == 0:
|
||||
self.successLogin.emit()
|
||||
qconfig.set(cfg.email, self.email)
|
||||
qconfig.set(cfg.activationCode, self.password)
|
||||
userConfig.userData = loginResponse
|
||||
# 从登录响应中提取token并保存
|
||||
# 在basicApi的login方法中已经处理了token的设置,这里保存到userConfig中以便程序启动时恢复
|
||||
token = miaoStarsBasicApi.token
|
||||
if token:
|
||||
userConfig.setToken(token)
|
||||
else:
|
||||
self.errorLogin.emit(loginResponse["msg"])
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"登录验证过程中发生异常: {e}")
|
||||
self.errorLogin.emit("系统错误,请稍后重试")
|
||||
|
||||
|
||||
class RegisterThread(QThread):
|
||||
successRegister = pyqtSignal()
|
||||
errorRegister = pyqtSignal(str)
|
||||
|
||||
def __init__(self, email: str, password: str, captchaCode: str):
|
||||
super().__init__()
|
||||
logger.debug(f"初始化许可证服务线程 - 邮箱: {email}")
|
||||
self.email = email
|
||||
self.password = password
|
||||
self.captchaCode = captchaCode
|
||||
|
||||
def run(self):
|
||||
logger.info(f"开始验证用户注册 - 邮箱: {self.email}")
|
||||
try:
|
||||
registerRespond = miaoStarsBasicApi.register(
|
||||
self.email, self.password, self.captchaCode
|
||||
)
|
||||
if registerRespond["code"] == 203:
|
||||
self.successRegister.emit()
|
||||
else:
|
||||
logger.error(f"注册失败: {registerRespond['msg']}")
|
||||
self.errorRegister.emit(registerRespond["msg"])
|
||||
except Exception as e:
|
||||
logger.error(f"登录验证过程中发生异常: {e}")
|
||||
self.errorRegister.emit("系统错误,请稍后重试")
|
||||
Reference in New Issue
Block a user