118 lines
4.7 KiB
Python
118 lines
4.7 KiB
Python
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,
|
|
PrimaryPushButton,
|
|
)
|
|
|
|
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 = PrimaryPushButton("登录", 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()
|