You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

226 lines
8.0 KiB

import string
import sys
from PySide6.QtCore import Signal
from PySide6.QtGui import Qt
from PySide6.QtWidgets import QLabel, QFrame, QPushButton, QVBoxLayout, QHBoxLayout, QApplication
from app.common.Manager import UserManager
from qfluentwidgets import FluentStyleSheet, PrimaryPushButton, TextWrap, LineEdit, InfoBar, InfoBarPosition, ComboBox
from qfluentwidgets.components.dialog_box.dialog import Ui_MessageBox
from qframelesswindow import FramelessDialog
class AddUserInstance:
yesSignal = Signal()
cancelSignal = Signal()
def __init__(self, *args, **kwargs):
pass
def _setUpUi(self, title, parent):
self.titleLabel = QLabel(title, parent)
self.user = LineEdit()
self.userBox = QHBoxLayout()
self.user_text = QLabel('用户ID', parent)
self.userBox.addWidget(self.user_text)
self.userBox.addWidget(self.user)
self.userPassword = LineEdit()
self.userPasswordBox = QHBoxLayout()
self.userPassword_text = QLabel('用户密码', parent)
self.userPasswordBox.addWidget(self.userPassword_text)
self.userPasswordBox.addWidget(self.userPassword)
self.userPermissionBox = QHBoxLayout()
self.userPermission_text = QLabel('用户权限', parent)
self.userPermission = ComboBox(self)
self.userPermission.addItem('管理员')
self.userPermission.addItem('用户')
self.userPermissionBox.addWidget(self.userPermission_text)
self.userPermissionBox.addWidget(self.userPermission)
self.buttonGroup = QFrame(parent)
self.yesButton = PrimaryPushButton(self.tr('OK'), self.buttonGroup)
self.cancelButton = QPushButton(self.tr('Cancel'), self.buttonGroup)
self.vBoxLayout = QVBoxLayout(parent)
self.textLayout = QVBoxLayout()
self.buttonLayout = QHBoxLayout(self.buttonGroup)
self.__initWidget()
def __initWidget(self):
self.__setQss()
self.__initLayout()
# fixes https://github.com/zhiyiYo/PyQt-Fluent-Widgets/issues/19
self.yesButton.setAttribute(Qt.WA_LayoutUsesWidgetRect)
self.cancelButton.setAttribute(Qt.WA_LayoutUsesWidgetRect)
self.yesButton.setFocus()
self.buttonGroup.setFixedHeight(81)
self._adjustText()
#self.yesButton.clicked.connect(self.__onYesButtonClicked)
self.cancelButton.clicked.connect(self.__onCancelButtonClicked)
def _adjustText(self):
if self.isWindow():
if self.parent():
w = max(self.titleLabel.width(), self.parent().width())
chars = max(min(w / 9, 140), 30)
else:
chars = 100
else:
w = max(self.titleLabel.width(), self.window().width())
chars = max(min(w / 9, 100), 30)
#self.contentLabel.setText(TextWrap.wrap(self.content, chars, False)[0])
def __initLayout(self):
self.vBoxLayout.setSpacing(0)
self.vBoxLayout.setContentsMargins(0, 0, 0, 0)
self.vBoxLayout.addLayout(self.textLayout, 1)
self.vBoxLayout.addLayout(self.userBox)
self.vBoxLayout.addLayout(self.userPasswordBox)
self.vBoxLayout.addLayout(self.userPermissionBox)
self.vBoxLayout.addWidget(self.buttonGroup, 0, Qt.AlignBottom)
self.vBoxLayout.setSizeConstraint(QVBoxLayout.SetMinimumSize)
self.textLayout.setSpacing(12)
self.textLayout.setContentsMargins(24, 24, 24, 24)
self.textLayout.addWidget(self.titleLabel, 0, Qt.AlignTop)
self.userBox.setContentsMargins(24, 24, 24, 24)
self.userPasswordBox.setContentsMargins(24, 24, 24, 24)
self.userPermissionBox.setContentsMargins(24, 24, 24, 24)
self.buttonLayout.setSpacing(12)
self.buttonLayout.setContentsMargins(24, 24, 24, 24)
self.buttonLayout.addWidget(self.yesButton, 1, Qt.AlignVCenter)
self.buttonLayout.addWidget(self.cancelButton, 1, Qt.AlignVCenter)
def __onCancelButtonClicked(self):
self.reject()
self.cancelSignal.emit()
def __onYesButtonClicked(self):
self.accept()
self.yesSignal.emit()
def __setQss(self):
self.titleLabel.setObjectName("titleLabel")
self.buttonGroup.setObjectName('buttonGroup')
self.cancelButton.setObjectName('cancelButton')
FluentStyleSheet.DIALOG.apply(self)
self.yesButton.adjustSize()
self.cancelButton.adjustSize()
class AddUserDialog(FramelessDialog, AddUserInstance):
yesSignal = Signal()
cancelSignal = Signal()
def __init__(self, parent=None):
super().__init__(parent=parent)
self._setUpUi("人员登记", self)
self.windowTitleLabel = QLabel("人员登记", self)
self.setResizeEnabled(False)
self.resize(540, 192)
self.titleBar.hide()
self.vBoxLayout.insertWidget(0, self.windowTitleLabel, 0, Qt.AlignTop)
self.windowTitleLabel.setObjectName('windowTitleLabel')
FluentStyleSheet.DIALOG.apply(self)
self.setFixedSize(self.size())
self.yesButton.clicked.connect(self.createUser)
def setTitleBarVisible(self, isVisible: bool):
self.windowTitleLabel.setVisible(isVisible)
def createUser(self):
user = self.user.text()
password = self.userPassword.text()
permission = None
if self.userPermission.text() == '管理员':
permission = 'Admin'
else:
permission = 'User'
if user == '' or password == '' or permission == '':
InfoBar.error(
title='数据缺失',
content="请检查您填写的数据是否完整",
orient=Qt.Horizontal,
isClosable=True,
position=InfoBarPosition.BOTTOM_RIGHT,
duration=-1, # won't disappear automatically
parent=self
)
elif not self.validate_password(password):
InfoBar.warning(
title='密码简单',
content="您的密码过于简单, 请重新输入并包含至少一个小写字母、一个大写字母、一个数字和一个特殊字符!",
orient=Qt.Horizontal,
isClosable=False, # disable close button
position=InfoBarPosition.TOP_LEFT,
duration=2000,
parent=self
)
else:
UserManager.addUser(user, password, permission)
InfoBar.success(
title='用户添加成功',
content="你已经成功添加了用户 "+ user + " 您可以进行操作或退出",
orient=Qt.Horizontal,
isClosable=True,
position=InfoBarPosition.TOP,
duration=2000,
parent=self
)
def validate_password(self, password):
"""Validate a password with common requirements."""
errors = []
# Check password length
if len(password) < 8:
errors.append("Password must be at least 8 characters.")
# Check for lowercase letter
if not any(char in string.ascii_lowercase for char in password):
errors.append("Password must contain at least one lowercase letter.")
# Check for uppercase letter
if not any(char in string.ascii_uppercase for char in password):
errors.append("Password must contain at least one uppercase letter.")
# Check for digit
if not any(char.isdigit() for char in password):
errors.append("Password must contain at least one digit.")
# Check for special character
special_characters = string.punctuation
if not any(char in special_characters for char in password):
errors.append("Password must contain at least one special character.")
# If no errors, the password is valid
if not errors:
return True, "Password is valid."
# If there are errors, the password is invalid
else:
return False, errors