PyQt5 - 04 逻辑与界面分离并用sqlite3+hashlib实现登陆界面

使用pyqt5+sqlite3+hashlib模块实现带数据库的加密登陆界面,并使逻辑和界面分离。


数据库生成

生成一个sqlite数据库,这里使用sqlite的原因是简单、无需部署,大家可以根据自己的情况酌情替换数据库和相应的模块
生成代码如下:

import sqlite3

conn = sqlite3.connect("user.db")  # 在此文件所在的文件夹打开或创建数据库文件

c = conn.cursor()  # 设置游标

# 创建一个含有id,name,password字段的表
c.execute('''CREATE TABLE user
      (id INTEGER PRIMARY KEY AUTOINCREMENT , 
       name TEXT NOT NULL , 
       password TEXT NOT NULL )''')

conn.commit()  # python连接数据库默认开启事务,所以需先提交
conn.close()  # 关闭连接

界面代码编写

先编写界面代码:
PyQt5 - 04 逻辑与界面分离并用sqlite3+hashlib实现登陆界面_第1张图片

  • 文件命名:login_ui.py
from PyQt5 import QtWidgets
import sys


class LoginUi(QtWidgets.QDialog):
    def __init__(self):
        super(LoginUi, self).__init__()
        self.label_user = QtWidgets.QLabel()
        self.label_password = QtWidgets.QLabel()
        self.lineEdit_user = QtWidgets.QLineEdit()
        self.lineEdit_password = QtWidgets.QLineEdit()
        self.pussButton_signin = QtWidgets.QPushButton()
        self.pussButton_signup = QtWidgets.QPushButton()

        self.h_layout_user = QtWidgets.QHBoxLayout()
        self.h_layout_password = QtWidgets.QHBoxLayout()
        self.h_layout_button = QtWidgets.QHBoxLayout()
        self.v_layout_all = QtWidgets.QVBoxLayout()

        self.h_layout_user.addWidget(self.label_user)
        self.h_layout_user.addWidget(self.lineEdit_user)
        self.h_layout_password.addWidget(self.label_password)
        self.h_layout_password.addWidget(self.lineEdit_password)
        self.h_layout_button.addWidget(self.pussButton_signin)
        self.h_layout_button.addWidget(self.pussButton_signup)
        self.v_layout_all.addLayout(self.h_layout_user)
        self.v_layout_all.addLayout(self.h_layout_password)
        self.v_layout_all.addLayout(self.h_layout_button)

        self.setLayout(self.v_layout_all)

        self.setWindowTitle("登陆界面")
        self.label_user.setText("用户名:")
        self.label_password.setText("   密码:")
        self.pussButton_signin.setText("登陆")
        self.pussButton_signup.setText("注册")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ui = LoginUi()
    ui.show()
    sys.exit(app.exec_())

界面程序代码编写方法详见上一篇《PyQt5 - 03 使用代码编写基于pyqt5的gui程序》

逻辑代码编写

from login_ui import LoginUi
from PyQt5 import QtWidgets
import sys
import sqlite3
import hashlib
import time

# 继承界面
class LoginLogic(LoginUi):
    def __init__(self):
        super(LoginLogic, self).__init__()
        self.conn = sqlite3.connect("user.db")  # 使用其他数据库的话此处和import模块需要修改

        # 此处改变密码输入框lineEdit_password的属性,使其不现实密码
        self.lineEdit_password.setEchoMode(QtWidgets.QLineEdit.Password)

        # qt的信号槽机制,连接按钮的点击事件和相应的方法
        self.pussButton_signin.clicked.connect(lambda: self.sign_in())
        self.pussButton_signup.clicked.connect(lambda: self.sign_up())

    @staticmethod
    def hash(src):
        """
        哈希md5加密方法
        :param src: 字符串str
        :return:
        """
        src = (src + "请使用私钥加密").encode("utf-8")
        m = hashlib.md5()
        m.update(src)
        return m.hexdigest()

    def sign_in(self):
        """
        登陆方法
        :return:
        """
        c_sqlite = self.conn.cursor()
        user_name = self.lineEdit_user.text()
        user_password = self.lineEdit_password.text()
        if user_name == "" or user_password == "":
            self.lineEdit_user.setText("请输入用户名和密码")
        else:
            c_sqlite.execute("""SELECT password FROM user WHERE name = ?""", (user_name,))
            password = c_sqlite.fetchall()
            if not password:
                self.lineEdit_user.setText("此用户未注册")
            else:
                if self.hash(user_password) == password[0][0]:
                    self.lineEdit_user.setText("登陆成功")
                    time.sleep(1)
                    self.open_main_window()
                    self.close()
                else:
                    self.lineEdit_user.setText("密码不正确")

    def sign_up(self):
        """
        注册方法
        :return:
        """
        c_sqlite = self.conn.cursor()
        user_name = self.lineEdit_user.text()
        user_password = self.lineEdit_password.text()
        if user_name == "" or user_password == "":
            self.lineEdit_user.setText("请输入用户名和密码")
        else:
            user_password = self.hash(user_password)
            c_sqlite.execute("""SELECT password FROM user WHERE name = ?""", (user_name,))
            if not c_sqlite.fetchall():
                c_sqlite.execute("""INSERT INTO user VALUES (NULL ,?,?)""", (user_name, user_password))
                self.conn.commit()
                self.lineEdit_user.setText("注册成功")
            else:
                self.lineEdit_user.setText("用户名重复")

    def open_main_window(self):
        """
        此处添加打开另一个窗口的程序
        :return:
        """
        下方注释的代码根据自己的情况更改
        # ui = Ui_Dialog()
        # ui.show()
        print("打开另一个窗口")


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    ui = LoginLogic()
    ui.show()
    sys.exit(app.exec_())

直接运行逻辑代码,既可看到登陆界面:

PyQt5 - 04 逻辑与界面分离并用sqlite3+hashlib实现登陆界面_第2张图片

部分注册登陆逻辑还不够完美,大家酌情修改

你可能感兴趣的:(pyqt5,mysql)