本期教程投稿一篇实用性的基于邮箱登陆注册找回于一体的系统,在日常的开发和软件应用中非常常见,并且也使用了逻辑与界面分离的写法,那这个文章将详细的为大家介绍整个流程,但是细节的话还需要大家自己去完善,也欢迎大家把完善好的代码给我,我继续深入为大家进行讲解!
项目界面
邮件样式
项目流程
数据库中包含两张表:count(存放账号信息),code(存放验证码信息)
目录结构
[db文件夹] 存放数据库
[debug文件夹] 存放逻辑代码
[gui文件夹] 存放页面代码
[img文件夹] 存放图片
[ui文件夹] 存放ui文件
[uilt文件夹] 存放数据库位置文件
在实际的应用开发中,这种格式的存放会非常常见,但是如果是内置的data文件,使用pyinstall打包会有许多问题!(可以解决的)
注册-逻辑代码
1. 验证码生成与发送
在用户注册过程中,为了确保用户的邮箱是有效的,我们需要生成一个验证码并发送到用户的邮箱。以下是如何实现的关键点:
- 生成验证码:使用随机数生成四位数的验证码。
- 发送邮件:利用SMTP协议,通过邮件服务器将验证码发送到用户的邮箱。
def get_code(self):code = ""for _ in range(4):code += str(random.randint(0, 9))return code
发送邮件的主要步骤包括设置SMTP服务器信息,创建邮件内容,并发送邮件:
1. 准备工作
需要一个邮件服务器的SMTP信息和发送邮件的账户。例如,我们可以使用Gmail的SMTP服务器来发送邮件。
- SMTP服务器:smtp.gmail.com
- SMTP端口:465(SSL)或587(TLS)
- 发送邮箱:你的Gmail邮箱地址
- 邮箱密码:你的Gmail密码或应用专用密码(推荐使用应用专用密码)
2. 基本步骤
2.1 导入必要模块
首先,导入smtplib
和其他需要的模块。
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart
2.2 创建邮件内容
创建一个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"))
2.3 发送邮件
使用smtplib.SMTP_SSL
或者smtplib.SMTP
连接到SMTP服务器,并发送邮件。
smtp_server = "smtp.gmail.com"
smtp_port = 465 # 对于SSLtry:# 连接到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() # 关闭连接
注意事项
- 安全性:为了安全起见,建议使用应用专用密码而不是直接使用邮箱密码。应用专用密码可以在Gmail账户的安全设置中生成。
- 邮箱设置:确保你的发送邮箱允许通过SMTP发送邮件。对于Gmail,需要开启“允许不太安全的应用”的设置,或者使用应用专用密码。
3. 验证码校验
在用户输入验证码后,我们需要校验验证码的有效性。这包括检查验证码是否匹配,以及是否在有效期内。
校验验证码的主要逻辑如下:
- 获取当前时间:确保验证码在有效期内。
- 匹配验证码:比较用户输入的验证码与数据库中的验证码。
- 处理结果:根据验证码的状态(有效、过期、不匹配)给出不同的反馈。
核心校验逻辑如下:
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, '失败', '请输入验证码!!')returnif result is None:QMessageBox.warning(self, '失败', '未找到验证码记录!')returncode, expiry_time = resultif code_input == code and expiry_time >= timenow:self.insert_count(email, password)else:QMessageBox.warning(self, '失败', '验证码错误或已过期!')
4. 数据库操作
为了管理验证码和用户数据,我们需要与SQLite数据库进行交互。主要操作包括插入和查询验证码、删除过期验证码、以及插入用户数据。
插入验证码:将生成的验证码及其过期时间存入数据库。
查询验证码:从数据库中检索当前用户的验证码记录。
删除验证码:在验证码过期或使用后将其删除。
插入用户数据:在用户注册成功后,将用户信息存入数据库。
def insert_code(self):# 插入验证码到数据库def select_code(self):# 从数据库查询验证码def delete_code(self):# 删除数据库中的验证码
登陆-逻辑代码
1. 项目结构
使用PyQt5来创建图形用户界面,并且结合SQLite数据库来存储和验证用户信息。项目的关键部分:
- login_ui.py: 包含登录界面的UI设计。
- creat_count_logic.py: 包含创建账户的逻辑。
- main_logic.py: 包含主窗口的逻辑。
- db.py: 包含数据库路径和相关设置。
2. 登录界面的初始化
在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
方法。
3. 显示创建账户窗口
当用户点击“创建账户”按钮时,显示创建账户的窗口:
def show_create_count(self):self.createcount = CreatCount()self.createcount.show()
4. 查询用户信息
登录检查前,需要从数据库中查询用户信息:
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 resultexcept 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号哦!
最后给大家留一个小问题:找回的功能该怎么写?(欢迎大家留言投稿!)