功能
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