总线通信架构整改完成
This commit is contained in:
		@@ -1,19 +1,23 @@
 | 
			
		||||
import sys
 | 
			
		||||
from pathlib import Path
 | 
			
		||||
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QListWidget, QStackedWidget, QCheckBox, QSpinBox, QToolBox, QLineEdit, QTableWidget, QTreeWidget, QCalendarWidget, QMessageBox, QToolBar, QSizePolicy
 | 
			
		||||
from PySide6.QtCore import Qt, QTime, QSize, QRect,QEvent, QThread
 | 
			
		||||
from PySide6.QtGui import QCursor, QFont, QIcon, QImage, QPixmap, QShortcut
 | 
			
		||||
from PySide6.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel, QTabWidget, QLineEdit, QMessageBox, QSizePolicy
 | 
			
		||||
from PySide6.QtCore import Qt, QSize
 | 
			
		||||
from PySide6.QtGui import QFont, QIcon, QPixmap, QShortcut
 | 
			
		||||
from codes.common import clibs, db_operation
 | 
			
		||||
from codes.common.secure_encrypt import PassCipher
 | 
			
		||||
from codes.ui import main_ui
 | 
			
		||||
from codes.common.exception_handler import handle_exception
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class LoginWindow(QWidget):
 | 
			
		||||
    def __init__(self):
 | 
			
		||||
        super().__init__()
 | 
			
		||||
        self.predos()
 | 
			
		||||
        self.init_ui()
 | 
			
		||||
        self.setup_slot()
 | 
			
		||||
        self.predos()
 | 
			
		||||
        self.le_username.setFocus()
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
        db_operation.db_init()
 | 
			
		||||
        db_operation.db_conn()
 | 
			
		||||
 | 
			
		||||
    def init_ui(self):
 | 
			
		||||
        self.setMinimumSize(420, 200)
 | 
			
		||||
@@ -23,21 +27,21 @@ class LoginWindow(QWidget):
 | 
			
		||||
        self.setWindowIcon(QIcon(f"{clibs.base_path}/assets/media/icon.ico"))
 | 
			
		||||
        self.setFont(QFont("Consolas", 14))
 | 
			
		||||
 | 
			
		||||
        self.layout_outter = QHBoxLayout()
 | 
			
		||||
        self.layout_outer = QHBoxLayout()
 | 
			
		||||
        self.lb_logo = QLabel()
 | 
			
		||||
        self.lb_logo.setAlignment(Qt.AlignmentFlag.AlignCenter)
 | 
			
		||||
        self.lb_logo.setSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred)
 | 
			
		||||
        self.lb_logo.setPixmap(QPixmap(f"{clibs.base_path}/assets/media/logo.png"))
 | 
			
		||||
        self.lb_logo.setFixedSize(QSize(120, 120))
 | 
			
		||||
        self.lb_logo.setScaledContents(True)
 | 
			
		||||
        self.layout_outter.addWidget(self.lb_logo)
 | 
			
		||||
        self.layout_outer.addWidget(self.lb_logo)
 | 
			
		||||
 | 
			
		||||
        self.tabW_login = QTabWidget()
 | 
			
		||||
        self.tab_login = QWidget()
 | 
			
		||||
        self.tabW_login.addTab(self.tab_login, "登录")
 | 
			
		||||
        self.tab_register = QWidget()
 | 
			
		||||
        self.tabW_login.addTab(self.tab_register, "注册")
 | 
			
		||||
        self.layout_outter.addWidget(self.tabW_login)
 | 
			
		||||
        self.layout_outer.addWidget(self.tabW_login)
 | 
			
		||||
 | 
			
		||||
        # 登陆页面
 | 
			
		||||
        self.layout_H_username = QHBoxLayout()
 | 
			
		||||
@@ -110,7 +114,8 @@ class LoginWindow(QWidget):
 | 
			
		||||
        self.layout_V_user_pass_reg.addLayout(self.layout_H_button_reg)
 | 
			
		||||
        self.tab_register.setLayout(self.layout_V_user_pass_reg)
 | 
			
		||||
 | 
			
		||||
        self.setLayout(self.layout_outter)
 | 
			
		||||
        self.setLayout(self.layout_outer)
 | 
			
		||||
        self.le_username.setFocus()
 | 
			
		||||
 | 
			
		||||
    def setup_slot(self):
 | 
			
		||||
        self.tabW_login.currentChanged.connect(self.onChange_tabW)
 | 
			
		||||
@@ -118,15 +123,9 @@ class LoginWindow(QWidget):
 | 
			
		||||
        self.btn_cancel.clicked.connect(self.close)
 | 
			
		||||
        self.btn_login_reg.clicked.connect(self.register_check)
 | 
			
		||||
        self.btn_cancel_reg.clicked.connect(self.close)
 | 
			
		||||
        QShortcut("Esc", self).activated.connect(self.close)
 | 
			
		||||
        self.le_password.returnPressed.connect(self.login_check)
 | 
			
		||||
        self.le_password_reg_confirm.returnPressed.connect(self.register_check)
 | 
			
		||||
 | 
			
		||||
    def predos(self):
 | 
			
		||||
        self.m = Path(__file__).stem
 | 
			
		||||
        db_file = clibs.base_path / "assets/database/toolbox.db"
 | 
			
		||||
        if not db_file.exists():
 | 
			
		||||
            db_operation.db_init(db_file)
 | 
			
		||||
        QShortcut("Esc", self).activated.connect(self.close)
 | 
			
		||||
 | 
			
		||||
    def onChange_tabW(self):
 | 
			
		||||
        text = self.tabW_login.tabText(self.tabW_login.currentIndex())
 | 
			
		||||
@@ -139,26 +138,25 @@ class LoginWindow(QWidget):
 | 
			
		||||
            self.le_password_reg.clear()
 | 
			
		||||
            self.le_password_reg_confirm.clear()
 | 
			
		||||
            self.le_username_reg.setFocus()
 | 
			
		||||
        else:
 | 
			
		||||
            raise Exception(f"Unknown TabWidget Name: {text}")
 | 
			
		||||
 | 
			
		||||
    @handle_exception()
 | 
			
		||||
    def login_check(self):
 | 
			
		||||
        def login_failed(exception: bool = False):
 | 
			
		||||
        def login_failed(flag: int = 0):
 | 
			
		||||
            reason = {-1: "用户名或密码为空", 0: "用户名未注册", 1: "解迷成功,密码错误", 2: "解迷失败,密码错误", 3: "数据库中有重复的用户名"}
 | 
			
		||||
            self.le_username.clear()
 | 
			
		||||
            self.le_password.clear()
 | 
			
		||||
            self.le_username.setFocus()
 | 
			
		||||
            if not exception:
 | 
			
		||||
                QMessageBox.critical(self, "错误", "账号或密码错误,请重新输入!")
 | 
			
		||||
            else:
 | 
			
		||||
                QMessageBox.critical(self, "错误", "账号重复,需检查数据库,更正后再尝试登录!")
 | 
			
		||||
            QMessageBox.critical(self, "错误", "账号或密码错误,请重新输入!")
 | 
			
		||||
            raise Exception(f"username:{username} login failed, reason: {reason[flag]}")
 | 
			
		||||
 | 
			
		||||
        def validate_login():
 | 
			
		||||
            nonlocal username, password
 | 
			
		||||
            clibs.conn, clibs.cursor = db_operation.db_conn()
 | 
			
		||||
            record = db_operation.db_query_users(username)
 | 
			
		||||
            if username == "" or password == "":
 | 
			
		||||
                login_failed(flag=-1)
 | 
			
		||||
 | 
			
		||||
            if len(record) == 0:
 | 
			
		||||
                login_failed()
 | 
			
		||||
                return False
 | 
			
		||||
                login_failed(flag=0)
 | 
			
		||||
            elif len(record) == 1:
 | 
			
		||||
                keys = ["id", "timestamp", "username", "password", "salt"]
 | 
			
		||||
                login_info = dict(zip(keys, record[0]))
 | 
			
		||||
@@ -167,52 +165,46 @@ class LoginWindow(QWidget):
 | 
			
		||||
                try:
 | 
			
		||||
                    decrypt_password = cipher.decrypt(login_info["password"])
 | 
			
		||||
                    if password != decrypt_password:
 | 
			
		||||
                        login_failed()
 | 
			
		||||
                        return False
 | 
			
		||||
                        login_failed(flag=1)
 | 
			
		||||
                    else:
 | 
			
		||||
                        self.mainWindow = main_ui.MainWindow()
 | 
			
		||||
                        self.mainWindow.show()
 | 
			
		||||
                        db_operation.db_close()
 | 
			
		||||
                        clibs.username = username
 | 
			
		||||
                        clibs.password = password
 | 
			
		||||
                        self.close()
 | 
			
		||||
                        return True
 | 
			
		||||
                        db_operation.db_write_logs(f"username:{username} 登录成功!")
 | 
			
		||||
                        db_operation.db_close()
 | 
			
		||||
                        self.deleteLater()
 | 
			
		||||
                except ValueError:
 | 
			
		||||
                    login_failed()
 | 
			
		||||
                    return False
 | 
			
		||||
                    login_failed(flag=2)
 | 
			
		||||
            else:
 | 
			
		||||
                db_operation.db_write_logs(f"username duplicated: {username}", self.m, "error")
 | 
			
		||||
                login_failed(exception=True)
 | 
			
		||||
                return False
 | 
			
		||||
                login_failed(flag=3)
 | 
			
		||||
 | 
			
		||||
        username = self.le_username.text()
 | 
			
		||||
        password = self.le_password.text()
 | 
			
		||||
        validate_login()
 | 
			
		||||
 | 
			
		||||
    @handle_exception()
 | 
			
		||||
    def register_check(self):
 | 
			
		||||
        def register_failed(flag: int = 0):
 | 
			
		||||
            reason = {-1: "用户名或密码为空", 0: "两次密码不一致", 1: "密码长度不合规", 2: "用户名已存在", 3: "数据库中有重复的用户名"}
 | 
			
		||||
            self.le_username_reg.clear()
 | 
			
		||||
            self.le_password_reg.clear()
 | 
			
		||||
            self.le_password_reg_confirm.clear()
 | 
			
		||||
            self.le_username_reg.setFocus()
 | 
			
		||||
            if flag == 0:
 | 
			
		||||
                QMessageBox.critical(self, "错误", "账号已存在,或两次输入密码不一致,请重新输入!")
 | 
			
		||||
            elif flag == 1:
 | 
			
		||||
                QMessageBox.critical(self, "错误", "密码长度不符合要求,请重新输入!")
 | 
			
		||||
            elif flag == 2:
 | 
			
		||||
                QMessageBox.critical(self, "错误", "账号重复,需检查数据库,更正后再尝试登录!")
 | 
			
		||||
            QMessageBox.critical(self, "错误", "账号错误,密码长度(>8)不合规,或两次输入密码不一致,请确认后重新输入!")
 | 
			
		||||
            raise Exception(f"register failed, reason: {reason[flag]}")
 | 
			
		||||
 | 
			
		||||
        def validate_register():
 | 
			
		||||
            nonlocal username, password, password_confirm
 | 
			
		||||
            clibs.conn, clibs.cursor = db_operation.db_conn()
 | 
			
		||||
            record = db_operation.db_query_users(username)
 | 
			
		||||
            if password != password_confirm:
 | 
			
		||||
                register_failed()
 | 
			
		||||
                return False
 | 
			
		||||
            if username == "" or password == "" or password_confirm == "":
 | 
			
		||||
                register_failed(flag=-1)
 | 
			
		||||
 | 
			
		||||
            if len(password) < clibs.account["minimum_password_length"]:
 | 
			
		||||
            if password != password_confirm:
 | 
			
		||||
                register_failed(flag=0)
 | 
			
		||||
 | 
			
		||||
            if len(password) < clibs.config["minimum_password_length"]:
 | 
			
		||||
                register_failed(flag=1)
 | 
			
		||||
                return False
 | 
			
		||||
 | 
			
		||||
            if len(record) == 0:
 | 
			
		||||
                salt = PassCipher.gen_salt("@".join([username, password]))
 | 
			
		||||
@@ -221,20 +213,20 @@ class LoginWindow(QWidget):
 | 
			
		||||
                db_operation.db_write_users(username, password_encrypted, salt)
 | 
			
		||||
                QMessageBox.information(self, "成功", "注册成功,切换至登录窗口进行登录!")
 | 
			
		||||
                self.tabW_login.setCurrentIndex(self.tabW_login.indexOf(self.tab_login))
 | 
			
		||||
                return True
 | 
			
		||||
            elif len(record) == 1:
 | 
			
		||||
                register_failed()
 | 
			
		||||
                return False
 | 
			
		||||
            else:
 | 
			
		||||
                db_operation.db_write_logs(f"username duplicated: {username}", self.m, "error")
 | 
			
		||||
                register_failed(flag=2)
 | 
			
		||||
                return False
 | 
			
		||||
            else:
 | 
			
		||||
                register_failed(flag=3)
 | 
			
		||||
 | 
			
		||||
        username = self.le_username_reg.text()
 | 
			
		||||
        password = self.le_password_reg.text()
 | 
			
		||||
        password_confirm = self.le_password_reg_confirm.text()
 | 
			
		||||
        validate_register()
 | 
			
		||||
 | 
			
		||||
    def closeEvent(self, event):
 | 
			
		||||
        db_operation.db_close()
 | 
			
		||||
        event.accept()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
if __name__ == '__main__':
 | 
			
		||||
    app = QApplication(sys.argv)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user