本期教程投稿一篇实用性的基于邮箱登陆注册找回于一体的系统,在日常的开发和软件应用中非常常见,并且也使用了逻辑与界面分离的写法,那这个文章将详细的为大家介绍整个流程,但是细节的话还需要大家自己去完善,也欢迎大家把完善好的代码给我,我继续深入为大家进行讲解!
项目界面


邮件样式

项目流程

数据库中包含两张表:count(存放账号信息),code(存放验证码信息)
目录结构

[db文件夹] 存放数据库
[debug文件夹] 存放逻辑代码
[gui文件夹] 存放页面代码
[img文件夹] 存放图片
[ui文件夹] 存放ui文件
[uilt文件夹] 存放数据库位置文件
在实际的应用开发中,这种格式的存放会非常常见,但是如果是内置的data文件,使用pyinstall打包会有许多问题!(可以解决的)
注册-逻辑代码
在用户注册过程中,为了确保用户的邮箱是有效的,我们需要生成一个验证码并发送到用户的邮箱。以下是如何实现的关键点:
- def get_code(self):
- code = ""
- for _ in range(4):
- code += str(random.randint(0, 9))
- return code
'运行
发送邮件的主要步骤包括设置SMTP服务器信息,创建邮件内容,并发送邮件:
需要一个邮件服务器的SMTP信息和发送邮件的账户。例如,我们可以使用Gmail的SMTP服务器来发送邮件。
首先,导入smtplib和其他需要的模块。
- import smtplib
- from email.mime.text import MIMEText
- from email.mime.multipart import MIMEMultipart
'运行
创建一个MIME对象,用于构建邮件的主题、发件人、收件人和正文。
- sender_email = "your_email@gmail.com"
- receiver_email = "receiver_email@example.com"
- password = "your_app_password"
-
- # 创建MIME对象
- message = MIMEMultipart()
- message["From"] = sender_email
- message["To"] = receiver_email
- message["Subject"] = "这是一个测试邮件"
-
- # 邮件正文
- body = "这是一封通过Python发送的测试邮件。"
- message.attach(MIMEText(body, "plain"))
使用smtplib.SMTP_SSL或者smtplib.SMTP连接到SMTP服务器,并发送邮件。
- smtp_server = "smtp.gmail.com"
- smtp_port = 465 # 对于SSL
-
- try:
- # 连接到SMTP服务器
- server = smtplib.SMTP_SSL(smtp_server, smtp_port)
- server.login(sender_email, password) # 登录到SMTP服务器
- server.sendmail(sender_email, receiver_email, message.as_string()) # 发送邮件
- print("邮件发送成功")
- except Exception as e:
- print(f"邮件发送失败: {e}")
- finally:
- server.quit() # 关闭连接
在用户输入验证码后,我们需要校验验证码的有效性。这包括检查验证码是否匹配,以及是否在有效期内。
校验验证码的主要逻辑如下:
核心校验逻辑如下:
- def check_code(self):
- timenow = datetime.datetime.now().strftime("%Y-%m-%d %H:%M")
- code_input = self.lineEdit_4.text()
- result = self.select_code()
-
- if not code_input:
- QMessageBox.warning(self, '失败', '请输入验证码!!')
- return
-
- if result is None:
- QMessageBox.warning(self, '失败', '未找到验证码记录!')
- return
-
- code, expiry_time = result
-
- if code_input == code and expiry_time >= timenow:
- self.insert_count(email, password)
- else:
- QMessageBox.warning(self, '失败', '验证码错误或已过期!')
'运行
为了管理验证码和用户数据,我们需要与SQLite数据库进行交互。主要操作包括插入和查询验证码、删除过期验证码、以及插入用户数据。
插入验证码:将生成的验证码及其过期时间存入数据库。
查询验证码:从数据库中检索当前用户的验证码记录。
删除验证码:在验证码过期或使用后将其删除。
插入用户数据:在用户注册成功后,将用户信息存入数据库。
- def insert_code(self):
- # 插入验证码到数据库
-
- def select_code(self):
- # 从数据库查询验证码
-
- def delete_code(self):
- # 删除数据库中的验证码
登陆-逻辑代码
使用PyQt5来创建图形用户界面,并且结合SQLite数据库来存储和验证用户信息。项目的关键部分:
在Login类的初始化方法中,设置了两个按钮的点击事件,分别用于显示创建账户窗口和检查登录信息。
- class Login(QtWidgets.QWidget, Ui_Form):
- def __init__(self, parent=None):
- super(Login, self).__init__(parent)
- self.setupUi(self)
- self.main_window = MainWindow()
- self.pushButton_2.clicked.connect(self.show_create_count)
- self.pushButton.clicked.connect(self.login_check)
setupUi(self): 初始化UI界面。pushButton_2 和 pushButton:分别连接到 show_create_count 和 login_check 方法。当用户点击“创建账户”按钮时,显示创建账户的窗口:
- def show_create_count(self):
- self.createcount = CreatCount()
- self.createcount.show()
'运行
登录检查前,需要从数据库中查询用户信息:
- def login_count_select(self):
- count = self.lineEdit.text()
- try:
- conn = sqlite3.connect(f'{data_path}')
- c = conn.cursor()
- query_sql = "SELECT email, password FROM count WHERE email=?"
- c.execute(query_sql, (count,))
- result = c.fetchone()
- return result
- except Exception as e:
- print(f"Error selecting row from database: {e}")
- conn.rollback()
- finally:
- conn.close()
'运行
sqlite3.connect(f'{data_path}'): 连接到SQLite数据库。SELECT email, password FROM count WHERE email=?: 查询用户的email和password。- def login_check(self):
- result = self.login_count_select()
- count = self.lineEdit.text()
- pwd = self.lineEdit_2.text()
- if result and result[0] == count and result[1] == pwd:
- self.main_window.show()
- self.main_window.set_label(count)
- self.close()
- else:
- QMessageBox.warning(self, '错误', '账号或密码错误!')
'运行
result[0] == count 和 result[1] == pwd: 验证用户输入的邮箱和密码。self.main_window.show(): 如果验证通过,显示主窗口。self.main_window.set_label(count): 设置主窗口的标签为用户邮箱。QMessageBox.warning(self, '错误', '账号或密码错误!'): 如果验证失败,显示错误提示。案例代码需要的可以私信我!记得留下你的CSDN号和vx号哦!
最后给大家留一个小问题:找回的功能该怎么写?(欢迎大家留言投稿!)