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
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值