Files
cangku/login_dialog.py
2025-12-23 00:30:36 +08:00

162 lines
6.1 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
登录对话框模块 - 处理用户登录和密码管理
"""
from PyQt5.QtWidgets import (
QDialog, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit,
QPushButton, QMessageBox, QInputDialog
)
from PyQt5.QtCore import Qt
from database import get_db_connection
class LoginDialog(QDialog):
def __init__(self, db_path):
super().__init__()
self.db_path = db_path
self.is_admin = False
self.setWindowTitle("选择模式并登录")
self.resize(450, 350)
self.setModal(True)
self.setup_ui()
def setup_ui(self):
"""设置用户界面"""
layout = QVBoxLayout(self)
layout.addWidget(QLabel("<b>请选择登录模式(默认密码均为 123456</b>"))
# 管理员登录区域
admin_layout = QHBoxLayout()
admin_layout.addWidget(QLabel("管理员模式密码:"))
self.admin_input = QLineEdit()
self.admin_input.setEchoMode(QLineEdit.Password)
self.admin_input.setPlaceholderText("默认 123456")
admin_layout.addWidget(self.admin_input)
admin_login = QPushButton("登录管理员模式")
admin_login.clicked.connect(lambda: self.login_mode(True))
admin_layout.addWidget(admin_login)
admin_change = QPushButton("修改管理员密码")
admin_change.clicked.connect(self.change_admin_password)
admin_layout.addWidget(admin_change)
layout.addLayout(admin_layout)
# 普通用户登录区域
user_layout = QHBoxLayout()
user_layout.addWidget(QLabel("普通用户模式密码:"))
self.user_input = QLineEdit()
self.user_input.setEchoMode(QLineEdit.Password)
self.user_input.setPlaceholderText("默认 123456")
user_layout.addWidget(self.user_input)
user_login = QPushButton("登录普通用户模式")
user_login.clicked.connect(lambda: self.login_mode(False))
user_layout.addWidget(user_login)
user_change = QPushButton("修改普通用户密码")
user_change.clicked.connect(self.change_user_password)
user_layout.addWidget(user_change)
layout.addLayout(user_layout)
layout.addStretch()
# 退出按钮
exit_btn = QPushButton("退出程序")
exit_btn.clicked.connect(self.reject)
layout.addWidget(exit_btn)
def get_conn(self):
"""获取数据库连接"""
return get_db_connection(self.db_path)
def get_stored_password(self, password_type):
"""获取存储的密码"""
try:
with self.get_conn() as conn:
cursor = conn.execute("SELECT value FROM admin_settings WHERE key = ?", (f"{password_type}_password",))
row = cursor.fetchone()
return row[0] if row else "123456"
except:
return "123456"
def set_password(self, password_type, new_password):
"""设置新密码"""
try:
with self.get_conn() as conn:
conn.execute("INSERT OR REPLACE INTO admin_settings (key, value) VALUES (?, ?)",
(f"{password_type}_password", new_password))
conn.commit()
return True
except Exception as e:
QMessageBox.critical(self, "错误", f"密码保存失败: {str(e)}")
return False
def change_admin_password(self):
"""修改管理员密码"""
old_pwd = self.get_stored_password("admin")
old_input, ok1 = QInputDialog.getText(
self, "修改管理员密码", "请输入当前管理员密码:", QLineEdit.Password
)
if not ok1 or old_input != old_pwd:
QMessageBox.warning(self, "错误", "当前密码错误!")
return
new_pwd1, ok2 = QInputDialog.getText(
self, "新密码", "请输入新管理员密码:", QLineEdit.Password
)
if not ok2 or len(new_pwd1) < 4:
QMessageBox.warning(self, "错误", "新密码至少4位")
return
new_pwd2, ok3 = QInputDialog.getText(
self, "确认新密码", "请再次输入新管理员密码:", QLineEdit.Password
)
if not ok3 or new_pwd1 != new_pwd2:
QMessageBox.warning(self, "错误", "两次输入的密码不一致!")
return
if self.set_password("admin", new_pwd1):
QMessageBox.information(self, "成功", "管理员密码修改成功!")
def change_user_password(self):
"""修改普通用户密码"""
old_pwd = self.get_stored_password("user")
old_input, ok1 = QInputDialog.getText(
self, "修改普通用户密码", "请输入当前普通用户密码:", QLineEdit.Password
)
if not ok1 or old_input != old_pwd:
QMessageBox.warning(self, "错误", "当前密码错误!")
return
new_pwd1, ok2 = QInputDialog.getText(
self, "新密码", "请输入新普通用户密码:", QLineEdit.Password
)
if not ok2 or len(new_pwd1) < 4:
QMessageBox.warning(self, "错误", "新密码至少4位")
return
new_pwd2, ok3 = QInputDialog.getText(
self, "确认新密码", "请再次输入新普通用户密码:", QLineEdit.Password
)
if not ok3 or new_pwd1 != new_pwd2:
QMessageBox.warning(self, "错误", "两次输入的密码不一致!")
return
if self.set_password("user", new_pwd1):
QMessageBox.information(self, "成功", "普通用户密码修改成功!")
def login_mode(self, is_admin):
"""登录验证"""
password_type = "admin" if is_admin else "user"
input_pwd = self.admin_input.text().strip() if is_admin else self.user_input.text().strip()
correct_pwd = self.get_stored_password(password_type)
if input_pwd == correct_pwd:
self.is_admin = is_admin
self.accept()
else:
QMessageBox.warning(self, "错误", "密码错误,请重试!")