Files
leonpan-pc/app/view/login_window.py
2025-10-30 15:50:40 +08:00

267 lines
8.9 KiB
Python

# coding:utf-8
from loguru import logger
from PyQt6.QtCore import Qt, QTimer, pyqtSignal
from PyQt6.QtGui import (
QColor,
QIcon,
)
from PyQt6.QtWidgets import QApplication, QHBoxLayout, QVBoxLayout, QWidget
from qfluentwidgets import (
ImageLabel,
InfoBar,
InfoBarPosition,
isDarkTheme,
MSFluentTitleBar,
Pivot,
PopUpAniStackedWidget,
setThemeColor,
VerticalSeparator
)
from qframelesswindow import FramelessWindow as Window
from app.core import LoginThread, RegisterThread
from app.view.widgets.login_widget import LoginWidget
from app.view.widgets.register_widget import RegisterWidget
class RegisterWindow(Window):
"""登录注册页面"""
loginSignal = pyqtSignal()
def __init__(self, parent=None):
logger.info("初始化注册窗口")
super().__init__(parent=parent)
setThemeColor("#1976d2")
self.setTitleBar(MSFluentTitleBar(self))
self.verificationCode = ""
self.hBoxLayout = QHBoxLayout(self)
self.loginLayout = QVBoxLayout()
self.promotionalImageLabel = ImageLabel(self)
self.logoImage = ImageLabel(self)
self.pivot = Pivot(self)
self.stackedWidget = PopUpAniStackedWidget(self)
self.loginWidget = LoginWidget(self)
self.registerWidget = RegisterWidget(self)
self.__initWidgets()
logger.info("注册窗口初始化完成")
def __initWidgets(self):
logger.debug("初始化注册窗口组件")
self.titleBar.maxBtn.hide()
self.titleBar.setDoubleClickEnabled(False)
self.__initLayout()
color = QColor(25, 33, 42) if isDarkTheme() else QColor(240, 244, 249)
self.setStyleSheet(f"RegisterWindow{{background: {color.name()}}}")
self.setWindowIcon(QIcon(":app/images/logo.png"))
self.setFixedSize(690, 470)
# self.promotionalImageLabel.setImage(":app/images/background.png")
# self.promotionalImageLabel.scaledToWidth(300)
self.logoImage.setImage(":app/images/logolong.png")
self.logoImage.scaledToWidth(130)
self
self.pivot.addItem("LoginWidget", "登录", icon=":app/icons/login.svg")
# TODO: 内测版本隐藏注册页面
self.pivot.addItem("RegisterWidget", "注册", icon=":app/icons/register.svg")
self.pivot.setCurrentItem("LoginWidget")
self.pivot.currentItemChanged.connect(
lambda routeKey: self.stackedWidget.setCurrentWidget(
self.findChild(QWidget, routeKey)
)
)
self.loginWidget.loginButton.clicked.connect(self.login)
self.registerWidget.registerButton.clicked.connect(self.register)
self.stackedWidget.setMaximumWidth(300)
self.stackedWidget.addWidget(self.loginWidget)
self.stackedWidget.addWidget(self.registerWidget)
self.titleBar.titleLabel.setStyleSheet(
"""
QLabel{
background: transparent;
font: 14px 'Segoe UI', 'Microsoft YaHei', 'PingFang SC';
padding: 0 4px;
color: black
}
"""
)
desktop = QApplication.screens()[0].availableGeometry()
w, h = desktop.width(), desktop.height()
self.move(w // 2 - self.width() // 2, h // 2 - self.height() // 2)
self.titleBar.raise_()
logger.debug("注册窗口组件初始化完成")
def __initLayout(self):
logger.debug("初始化注册窗口布局")
self.loginLayout.setContentsMargins(10, 40, 10, 40)
self.hBoxLayout.setContentsMargins(25, 30, 15, 0)
self.loginLayout.addWidget(
self.logoImage, 0, Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignCenter,
)
self.loginLayout.addWidget(
self.pivot, 0, Qt.AlignmentFlag.AlignTop | Qt.AlignmentFlag.AlignCenter,
)
self.loginLayout.addSpacing(10)
self.loginLayout.addWidget(self.stackedWidget)
# self.hBoxLayout.addWidget(
# self.promotionalImageLabel, 0, Qt.AlignmentFlag.AlignBottom
# )
self.hBoxLayout.addSpacing(10)
# self.hBoxLayout.addWidget(VerticalSeparator(self))
self.hBoxLayout.addSpacing(10)
self.hBoxLayout.addLayout(self.loginLayout)
logger.debug("注册窗口布局初始化完成")
def keyPressEvent(self, event):
if event.key() == Qt.Key.Key_Return or event.key() == Qt.Key.Key_Enter:
if self.stackedWidget.currentWidget() == self.loginWidget:
self.login()
elif self.stackedWidget.currentWidget() == self.registerWidget:
self.register()
else:
super().keyPressEvent(event)
def login(self):
"""登录"""
self.loginWidget.loginButton.setEnabled(False)
userName = self.loginWidget.emailLineEdit.text()
password = self.loginWidget.passwordLineEdit.text()
captcha = self.loginWidget.verificationCodeLineEdit.text()
if not userName or not password or not captcha:
InfoBar.warning(
"提示",
"你需要填写所有项",
Qt.Orientation.Horizontal,
True,
2000,
InfoBarPosition.TOP_RIGHT,
self.window(),
)
return
self.loginThread = LoginThread(userName, password, captcha)
self.loginThread.successLogin.connect(self._loginSuccess)
self.loginThread.errorLogin.connect(self._loginFailed)
self.loginThread.start()
def _loginSuccess(self):
InfoBar.success(
"成功",
"登录成功,正在跳转",
Qt.Orientation.Horizontal,
True,
1000,
InfoBarPosition.TOP_RIGHT,
self.window(),
)
QTimer.singleShot(500, self.loginSignal.emit)
def _loginFailed(self, msg):
InfoBar.error(
"失败",
msg,
Qt.Orientation.Horizontal,
True,
1000,
InfoBarPosition.TOP_RIGHT,
self.window(),
)
self.loginWidget.refreshVerificationCode()
self.loginWidget.verificationCodeLineEdit.clear()
self.loginWidget.loginButton.setEnabled(True)
def register(self):
"""注册"""
self.registerWidget.registerButton.setEnabled(False)
userName = self.registerWidget.emailLineEdit.text()
password = self.registerWidget.passwordLineEdit.text()
confirmPassword = self.registerWidget.confirmPasswordLineEdit.text()
captchaCode = self.registerWidget.verificationCodeLineEdit.text()
if not userName or not password or not confirmPassword:
InfoBar.warning(
"提示",
"你需要填写所有项",
Qt.Orientation.Horizontal,
True,
2000,
InfoBarPosition.TOP_RIGHT,
self.window(),
)
self.registerWidget.registerButton.setEnabled(True)
return
if password != confirmPassword:
InfoBar.warning(
"提示",
"两次输入的密码不一致",
Qt.Orientation.Horizontal,
True,
2000,
InfoBarPosition.TOP_RIGHT,
self.window(),
)
self.registerWidget.confirmPasswordLineEdit.clear()
self.registerWidget.registerButton.setEnabled(True)
return
self.registerThread = RegisterThread(userName, password, captchaCode)
self.registerThread.successRegister.connect(self._registerSuccess)
self.registerThread.errorRegister.connect(self._registerFailed)
self.registerThread.start()
def _registerSuccess(self):
InfoBar.info(
"成功",
"注册成功,请前往邮箱激活账号",
Qt.Orientation.Horizontal,
True,
-1,
InfoBarPosition.TOP_RIGHT,
self.window(),
)
self.stackedWidget.setCurrentWidget(self.loginWidget)
self.loginWidget.emailLineEdit.setText(self.registerWidget.emailLineEdit.text())
self.registerWidget.emailLineEdit.clear()
self.registerWidget.passwordLineEdit.clear()
self.registerWidget.confirmPasswordLineEdit.clear()
self.registerWidget.registerButton.setEnabled(True)
def _registerFailed(self, msg):
InfoBar.error(
"失败",
msg,
Qt.Orientation.Horizontal,
True,
1000,
InfoBarPosition.TOP_RIGHT,
self.window(),
)
self.registerWidget.refreshVerificationCode()
self.registerWidget.verificationCodeLineEdit.clear()
self.registerWidget.passwordLineEdit.clear()
self.registerWidget.confirmPasswordLineEdit.clear()
self.registerWidget.emailLineEdit.clear()
self.registerWidget.registerButton.setEnabled(True)