总线通信架构整改完成

This commit is contained in:
2025-09-27 19:03:05 +08:00
parent c7c0d15545
commit 1c47497fc2
272 changed files with 592 additions and 304 deletions

View File

@@ -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)