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("系统错误,请稍后重试")