init
This commit is contained in:
117
app/view/widgets/login_widget.py
Normal file
117
app/view/widgets/login_widget.py
Normal file
@@ -0,0 +1,117 @@
|
||||
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()
|
||||
Reference in New Issue
Block a user