Pyqt5实现简单的登录和注册

功能

1,注册

用户输入手机号和密码,对手机号进行检验,检验成功,则保存下来,注册功能还可以检验防止多次注册,一个手机号只能注册一次

2,登录

用户输入手机号和密码,进入”数据库“进行查找,若有且二者都正确正确,则返回登录成功的信息,如果密码输错,则提示密码错误

3,说明

手机号的检验

用的是python的第三方库phone,

具体操作可看链接

可能检验并不是很严谨。😂😂😂

保存

保存的时候,可以保存到数据库中,我一次保存想用json保存,会报错,不好解决。又不想打开数据库,就随便用个txt保存,意思意思一下,输入的手机号经过AES加密,密码使用的是MD5加密,32位小写加密。(使用第三方库hashlib和Crypto),没有可以pip一下。

操作

选择页面

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from init import picturepath
# picturepath是图片路径,自己封装的
from login import Login,Register
class a(QWidget):
    def __init__(self):
        super().__init__()
        self.initui()
        self.resize(600,800)
        self.login=Login()
        self.register=Register()

    def initui(self):
        self.label1 = QLabel()
        self.label1.setAlignment(Qt.AlignCenter)
        self.label1.setPixmap(QPixmap(f'{picturepath}/99675346_p0.jpg').scaled(self.label1.width(),self.label1.height()))  # 加载图片
        self.label1.setScaledContents(True)
        self.bt1 = QPushButton('注册')
        self.bt1.clicked.connect(self.a)
        self.bt2 = QPushButton('登录')
        self.bt2.clicked.connect(self.a)
        self.setWindowTitle('登录系统')
        h = QVBoxLayout()
        h.addWidget(self.label1)
        h.addWidget(self.bt1)
        h.addWidget(self.bt2)
        self.setLayout(h)
#简单的垂直布局,从上到下方label,button,button,三个控件。
    def a(self):
        btn=self.sender()
        if btn.text()=='注册':
            self.register.setWindowModality(Qt.ApplicationModal)
            self.register.exec_()

        elif btn.text()=='登录':
            self.login.setWindowModality(Qt.ApplicationModal)
            self.login.exec_()
# 注册和登录的具体操作
if __name__ == '__main__':
    app = QApplication(sys.argv)
    a = a()
    a.show()
    sys.exit(app.exec_())


#如图

注册

import os
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from js逆向.加密的实现 import jm
from phone import Phone
class Register(QDialog):
    def __init__(self):
        super().__init__()
        self.btn2 = None
        self.btn1 = None
        self.qe2 = None
        self.qe1 = None
        self.resize(700, 100)
        self.initui()
#整体布局
    def initui(self):
        self.setWindowTitle('注册页面')
        v = QVBoxLayout()
        v.addLayout(self.phone())
        v.addLayout(self.password())
        v.addLayout(self.sure_lose())
        self.setLayout(v)
#手机号
    def phone(self):
        h = QHBoxLayout()
        label1 = QLabel('手机号')
        self.qe1 = QLineEdit()
        reg = QRegExp('[0-9]+$')
        #只能输入数字
        c = QRegExpValidator(self)
        c.setRegExp(reg)

        self.qe1.setValidator(c)
        self.qe1.setClearButtonEnabled(True)
        self.qe1.setEchoMode(QLineEdit.PasswordEchoOnEdit)
        # 回显模式的设置
        h.addWidget(label1)
        h.addWidget(self.qe1)
        return h
#密码
    def password(self):
        h = QHBoxLayout()
        label1 = QLabel('密码  ')
        self.qe2 = QLineEdit()
        self.qe2.setClearButtonEnabled(True)
        self.qe2.setEchoMode(QLineEdit.Password)
        #回显模式的设置
        h.addWidget(label1)
        h.addWidget(self.qe2)
        return h
#按钮的初始化
    def sure_lose(self):
        h = QHBoxLayout()
        self.btn1 = QPushButton('确定')
        self.btn1.clicked.connect(self.jm)
        self.btn2 = QPushButton('取消')
        self.btn2.clicked.connect(self.click)
        #连接槽
        h.addWidget(self.btn1)
        h.addWidget(self.btn2)
        return h
# 加密
    def jm(self):
        phone_number = self.qe1.text()
        exist = self.check(phone_number)
        if exist:
            password = self.qe2.text()
            phone = jm(phone_number).aes_encrypt('0102030405060708')
            phone = phone.replace('\n', '')
            with open('1.txt', 'r', encoding='utf-8') as f:
                data = f.readlines()
            for i in data:
                i = i.replace('\n', '')
                i = i.split(',')
                if i == ['']:
                    continue
                if i:
                    p=i[0]
                    if p==phone:
                        QMessageBox.information(self, '消息', '已经注册过了', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
                        return
                else:
                    pass
            password = jm(password).md_5()
            data = phone + ',' + password
            if not self.btn1.isChecked():
                with open('1.txt', 'a', encoding='utf-8') as f:
                    f.write(data)
                    f.write('\n')
                self.close()
            else:
                return
        else:
            return
#退出
    def click(self):
        self.close()
# 检验手机号
    def check(self, a: str):
        if 7 <=len(a)<= 11:
            info = Phone().find(a)
            if info:
                return info['city'], info['phone_type']
            else:
                QMessageBox.warning(self, '警告', '电话号码不正确或不存在', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
        else:
            QMessageBox.information(self, '消息', '电话号码在7-11之间', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)

注册整体布局是垂直布局,在其中有三个水平布局,第一个和第二个水平布局有一个Qlabel和QlineEdit,用于用户输入,第三个水平布局中有两个按钮,一个确定,一个取消,简单

加密的代码

class jm:
    def __init__(self, data):
        self.data = data
    def add_to_16(f):
        def inner(self, value,*args):
            while len(value) % 16 != 0:
                value += '\0'
            # noinspection PyCallingNonCallable
            return f(self,str.encode(value),*args)
        return inner    
    @add_to_16
    def aes_encrypt(self, key):
        aes = AES.new(key, AES.MODE_ECB)
        while len(self.data) % 16 != 0:
            self.data += '\0'
        encrypt = aes.encrypt(self.data.encode('utf-8'))
        miwen = str(base64.encodebytes(encrypt), encoding='utf-8')
        return miwen
    def md_5(self):
        m = hashlib.md5()
        m.update(self.data.encode('utf-8'))
        return m.hexdigest()

登录

和注册差不多,几乎一模一样,有一点变化。

class Login(QDialog):
    def __init__(self):
        super().__init__()
        self.resize(700, 100)
        self.initui()

    def initui(self):
        self.setWindowTitle('登录页面')
        v = QVBoxLayout()
        v.addLayout(self.phone())
        v.addLayout(self.password())
        v.addLayout(self.sure_lose())
        self.setLayout(v)

    def phone(self):
        h = QHBoxLayout()
        label1 = QLabel('手机号')
        self.qe1 = QLineEdit()
        self.qe1.setClearButtonEnabled(True)
        self.qe1.setEchoMode(QLineEdit.PasswordEchoOnEdit)
        h.addWidget(label1)
        h.addWidget(self.qe1)
        return h

    def password(self):
        h = QHBoxLayout()
        label1 = QLabel('密码  ')
        self.qe2 = QLineEdit()
        self.qe2.setClearButtonEnabled(True)
        self.qe2.setEchoMode(QLineEdit.Password)
        h.addWidget(label1)
        h.addWidget(self.qe2)
        return h

    def sure_lose(self):
        h = QHBoxLayout()
        self.btn1 = QPushButton('确定')

        self.btn1.clicked.connect(self.jm)
        self.btn2 = QPushButton('取消')
        self.btn2.clicked.connect(self.click)
        h.addWidget(self.btn1)
        h.addWidget(self.btn2)
        return h

    def jm(self):
        phone = self.qe1.text()
        password = self.qe2.text()
        phone = jm(phone).aes_encrypt('0102030405060708')
        phone = phone.replace('\n', '')
        password = jm(password).md_5()
        if not self.btn1.isChecked():
            with open('1.txt', 'r', encoding='utf-8') as f:
                data = f.readlines()
            for i in data:
                i = i.replace('\n', '')
                i = i.split(',')
                if i == ['']:
                    pass
                else:
                    p = i[0]
                    pa = i[1]
                    if p == phone:
                        if pa == password:
                            QMessageBox.information(self, '消息', '登陆成功', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
                        else:
                            QMessageBox.warning(self, '警告', '密码错误', QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)
                    else:
                        pass

    def click(self):
        self.close()

二者都是用的对话框

txt文件

长这样的。


j3huQRSZQiS9h3NO6GqlBA==,202cb962ac59075b964b07152d234b70
GQFnr8k/sbyjA6oBpBEcJA==,202cb962ac59075b964b07152d234b70

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会给您提供一个简单PyQt5 实现用户登录注册的例子。以下是一个简单的示例代码: ```python import sys from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit, QPushButton class Login(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(300, 300, 300, 200) self.setWindowTitle('Login') self.username_label = QLabel('Username:', self) self.username_label.move(20, 20) self.username = QLineEdit(self) self.username.move(100, 20) self.password_label = QLabel('Password:', self) self.password_label.move(20, 60) self.password = QLineEdit(self) self.password.setEchoMode(QLineEdit.Password) self.password.move(100, 60) self.login_btn = QPushButton('Login', self) self.login_btn.move(20, 100) self.login_btn.clicked.connect(self.login) self.register_btn = QPushButton('Register', self) self.register_btn.move(120, 100) self.register_btn.clicked.connect(self.register) def login(self): # 在这里实现登录逻辑 username = self.username.text() password = self.password.text() print(f"Login with username {username} and password {password}") def register(self): # 在这里实现注册逻辑 username = self.username.text() password = self.password.text() print(f"Register with username {username} and password {password}") if __name__ == '__main__': app = QApplication(sys.argv) login = Login() login.show() sys.exit(app.exec_()) ``` 这个例子实现了一个简单登录注册界面,用户可以在界面中输入用户名和密码,然后点击“登录”或“注册”按钮。当用户点击“登录”按钮时,程序会输出登录信息,当用户点击“注册”按钮时,程序会输出注册信息。您可以根据自己的需求修改这个例子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值