Files
leonpan-pc/app/view/widgets/login_widget.py

118 lines
4.7 KiB
Python
Raw Normal View History

2025-10-29 22:20:21 +08:00
from loguru import logger
from PyQt6.QtCore import QRegularExpression, Qt, pyqtSignal
from PyQt6.QtGui import (
QRegularExpressionValidator,
)
from PyQt6.QtWidgets import QHBoxLayout, QLabel, QVBoxLayout, QWidget
from qfluentwidgets import (
CheckBox,
LineEdit,
PasswordLineEdit,
PushButton,
)
from app.core import CaptchaThread,cfg, qconfig
class LoginWidget(QWidget):
loginSignal = pyqtSignal(dict)
def __init__(self, parent=None):
logger.debug("初始化登录组件")
super().__init__(parent)
self.setObjectName("LoginWidget")
self.setWindowTitle("LeonPan")
self.emailLineEdit = LineEdit(self)
self.emailLineEdit.setPlaceholderText("请输入邮箱")
self.passwordLineEdit = PasswordLineEdit(self)
self.passwordLineEdit.setPlaceholderText("请输入密码")
self.rememberMeCheckBox = CheckBox("记住我", self)
self.rememberMeCheckBox.checkStateChanged.connect(
lambda: qconfig.set(cfg.rememberMe, self.rememberMeCheckBox.isChecked())
)
self.loginButton = PushButton("登录", self)
self.loginButton.setDisabled(False)
self.verificationCodeLabel = QLabel(self)
self.verificationCodeLabel.setFixedSize(120, 35)
self.verificationCodeLabel.setScaledContents(True) # 设置图片自适应
self.verificationCodeLabel.mousePressEvent = (
self.refreshVerificationCode
) # 绑定点击事件
self.verificationCodeLineEdit = LineEdit(self)
self.verificationCodeLineEdit.setPlaceholderText("请输入验证码")
self.verificationLayout = QHBoxLayout()
self.verificationLayout.setAlignment(Qt.AlignmentFlag.AlignVCenter)
self.verificationLayout.addWidget(self.verificationCodeLineEdit)
self.verificationLayout.addWidget(self.verificationCodeLabel)
self.vBoxLayout = QVBoxLayout(self)
self.vBoxLayout.setAlignment(Qt.AlignmentFlag.AlignTop)
self.vBoxLayout.addSpacing(10)
self.vBoxLayout.addWidget(self.emailLineEdit)
self.vBoxLayout.addSpacing(15)
self.vBoxLayout.addWidget(self.passwordLineEdit)
self.vBoxLayout.addSpacing(15)
self.vBoxLayout.addLayout(self.verificationLayout)
self.vBoxLayout.addSpacing(15)
self.vBoxLayout.addWidget(
self.rememberMeCheckBox, 0, Qt.AlignmentFlag.AlignLeft
)
self.vBoxLayout.addSpacing(15)
self.vBoxLayout.addWidget(self.loginButton)
email_regex = QRegularExpression(
r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$"
)
# TODO: 内测时用的邮箱匹配
# email_regex = QRegularExpression(r"^[a-zA-Z0-9_.+-]+@miaostars\.cn$")
validator = QRegularExpressionValidator(email_regex, self)
self.emailLineEdit.setValidator(validator)
self.emailLineEdit.textChanged.connect(self.checkEmail)
self.refreshVerificationCode()
self.rememberMe()
logger.debug("登录组件初始化完成")
def rememberMe(self):
logger.debug("检查记住我选项")
if qconfig.get(cfg.rememberMe):
logger.debug("已启用记住我功能,填充保存的邮箱和密码")
self.emailLineEdit.setText(qconfig.get(cfg.email))
self.passwordLineEdit.setText(qconfig.get(cfg.activationCode))
self.rememberMeCheckBox.setChecked(True)
else:
logger.debug("已禁用记住我功能,清空保存的邮箱和密码")
self.emailLineEdit.clear()
self.passwordLineEdit.clear()
def checkEmail(self, text):
# 检查当前输入是否通过验证器
state, _, _ = self.emailLineEdit.validator().validate(text, 0)
if state == QRegularExpressionValidator.State.Acceptable:
logger.debug("邮箱格式验证通过")
self.loginButton.setDisabled(False)
else:
self.loginButton.setDisabled(True)
def refreshVerificationCode(self, event=None):
logger.debug("刷新验证码")
self.verificationCodeLabel.setEnabled(False)
self.captchaThread = CaptchaThread()
self.captchaThread.captchaReady.connect(self._showVerificationCode)
self.captchaThread.captchaFailed.connect(self._showCaptchaFailed)
self.captchaThread.start()
def _showVerificationCode(self, pixmap):
logger.debug("显示验证码")
self.verificationCodeLabel.setEnabled(True)
self.verificationCodeLabel.setPixmap(pixmap)
def _showCaptchaFailed(self, message):
logger.debug(f"验证码刷新失败:{message}")
self.verificationCodeLabel.setEnabled(True)
self.verificationCodeLineEdit.clear()