PyQt5+SQLlite3基于邮箱验证的登陆注册找回系统

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

项目界面

邮件样式

项目流程

数据库中包含两张表: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()  # 关闭连接

注意事项

  1. 安全性:为了安全起见,建议使用应用专用密码而不是直接使用邮箱密码。应用专用密码可以在Gmail账户的安全设置中生成。
  2. 邮箱设置:确保你的发送邮箱允许通过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号哦!

最后给大家留一个小问题:找回的功能该怎么写?(欢迎大家留言投稿!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/23136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人工智能的兴起和发展

人工智能的兴起 人工智能,artificial intelligence,缩写为AI。 它是随着计算机技术的发展才逐步产生并发展起来的一门学科。关于AI的定义有很多种,通俗一点说,它企图了解智能的实质,并生产出一种新的,能以…

ekho 编译安装

ekho 编译安装 ekho 编译安装ekho 介绍源码下载源码编译编译依赖编译 测试 参考文献 ekho 编译安装 ekho 介绍 Ekho(余音)是一个免费、开源的中文语音合成软件。它是eGuideDog project.项目的一部分。 它目前支持粤语、普通话(国语&#xf…

【无人机协同】基于改进灰狼算法实现多峰环境下的多无人机协同路径规划附matlab代码

% 初始化算法参数 num_drones 5; % 无人机数量 num_iterations 100; % 迭代次数 num_wolves 20; % 灰狼数量 alpha 0.5; % 狼群更新参数 beta 0.8; % 狼个体更新参数 delta 0.5; % 灰狼群体更新参数 lb [0 0]; % 路径范围下限 ub [100 100]; % 路径范围上限 % 初始化无…

Transformer学习(2)

这是Transformer的第二篇文章,上篇文章中我们了解了分词算法BPE,本文我们继续了解Transformer中的位置编码和核心模块——多头注意力。下篇文章就可以实现完整的Transformer架构。 位置编码 我们首先根据BPE算法得到文本切分后的子词标记,然…

拿捏红黑树(C++)

文章目录 前言一、红黑树介绍二、插入操作三、验证红黑树四、红黑树与AVL性能比较与应用五、总体代码总结 前言 我们之前介绍了一种AVL的高阶数据结构,在本篇文章中,我们将会介绍一种与AVL旗鼓相当的数据结构–红黑树。 我们并且会对它的部分接口进行模…

C语言面试题30至39题

30. 用变量a给出下面定义 由于题目没有提供具体的定义,这里给出几个常见的变量定义示例: 整数变量:int a;字符变量:char a;浮点变量:float a;双精度浮点变量:double a;指针变量:int *a; 31. …

Mongo 地理位置查询:海量密集点转换成聚合信息

通俗来说:将地图上的海量密集点通过网格分割的方式实现聚合; 需求:用mongo实现设备地理位置聚合查询 :多边形,矩形查询; 背景:上万设备数据量 目的:分享Mongo地理位置查询,以及文…

zdppy_amauth 实现给角色批量绑定权限

新增接口 api.resp.post("/auth/role_auth", amauth.role.add_auths)如何测试 如何测试能不能给指定的角色批量的添加权限呢? 1、需要新建一个角色2、需要拿到这个角色的ID3、需要新增三个权限4、需要拿到新增的三个权限的ID5、拿着角色ID和权限ID列表…

SSL代码签名最佳实践

代码签名就是软件发布者使用全球可信的证书颁发机构CA颁发的代码签名证书对软件代码进行签名,由此来验证软件开发者的真实身份,确保软件代码的完整性和可信任性。然而,攻击者一直试图渗透代码签名,意将恶意软件嵌入可信代码中。由…

【二叉树】Leetcode 637. 二叉树的层平均值【简单】

二叉树的层平均值 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:[3.00000,14.50000,11.00000] 解释&#xff1a…

前端 JS 经典:如何实现私有字段

前言:方法有很多,但是我们需要择优选择。 1. 命名规范 我们可以通过命名规范实现私有字段,如:下划线 缺点:没有强约束力,我们用了也就用了 class A {_key 1; }const a new A(); a._key; // 1 2. Sym…

深入探讨5种单例模式

文章目录 一、对比总览详细解释 二、代码1. 饿汉式2. 饱汉式3. 饱汉式-双检锁4. 静态内部类5. 枚举单例 三、性能对比 一、对比总览 以下是不同单例模式实现方式的特性对比表格。表格从线程安全性、延迟加载、实现复杂度、反序列化安全性、防反射攻击性等多个方面进行考量。 …

必应bing国内广告怎样开户投放呢?

企业都在寻找高效、精准的营销渠道以扩大品牌影响力,提升市场占有率,作为全球第二大搜索引擎,微软旗下的必应Bing凭借其卓越的搜索技术和庞大的用户基础,成为了众多企业拓展市场的首选广告平台。在中国,必应Bing广告以…

Day33

Day33 SQL-续 数据类型 tinyint、int、unsigned、float、double、decimal、char、varchar、BLOB、LONGBLOB、TEXT、LONGTEXT、date、time、datetime、timestamp、year # 数据类型# 整数类型 ------------------------------------------------------------- # tinyint - 1字节…

vuInhub靶场实战系列-DC-6实战

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置二、信息收集2.1 主机发现2.1.1 nmap扫描存活主机2.1.2 arp-scan扫描存活主机 2.2 端口扫描2.3 指纹识别2.3.1 尝试指纹识别2.3.…

【LC刷题】DAY01:704. 二分查找、27. 移除元素

【LC刷题】DAY01:704. 二分查找、27. 移除元素 文章目录 【LC刷题】DAY01:704. 二分查找、27. 移除元素704. 二分查找 [link](https://leetcode.cn/problems/binary-search/description/)第一思路:优化思路 27. 移除元素 [link](https://leet…

解决Mac无法上网/网络异常的方法,重置网络

解放方法 1、前往文件夹:/Library/Preferences/SystemConfiguration 2 、在弹窗中输入上边的地址 3 、把文件夹中除了下图未选中的文件全部删掉,删除时需要输入密码 4 、重启mac 电脑就搞定了。

python的一种集成开发工具:PyCharm开发工具

一. 简介 本文简单了解两种 python语言所使用的 集成开发环境: PyCharm、vscode。 python语言学习中,可以任意选中这两个集成开发环境的一种就可以。本文先来简单学习 PyCharm开发工具安装与使用。 二. python的一种集成开发工具:PyChar…

【LeetCode】40. 组合总和 II

组合总和 II 题目描述: 给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例…

数据更新后Ant Design Table组件界面未刷新怎么解决?

在使用Ant Design的Table组件时,我们时常需要动态更新表格数据以满足应用需求。然而,有时即使数据已经更新,界面却没有进行相应的刷新。这种情况可能由多种因素导致,其中之一就是关于key属性的使用问题。本文将重点讨论key属性在解…