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

news2025/1/17 2:53:02

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

项目界面

邮件样式

项目流程

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

注意事项

  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, '失败', '请输入验证码!!')
        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, '失败', '验证码错误或已过期!')

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 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号哦!

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

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

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

相关文章

景源畅信数字:抖音直播人气品类有哪些?

随着短视频平台的兴起,抖音成为了人们日常生活中不可或缺的娱乐方式之一。而抖音直播作为平台的重要组成部分,吸引了大量的观众和主播参与。那么,在抖音直播中,哪些品类能够吸引更多的人气,成为观众们关注的焦点呢?接…

C++笔试强训day39

目录 1.神奇的字母&#xff08;二&#xff09; 2.字符编码 3.最少的完全平方数 1.神奇的字母&#xff08;二&#xff09; 链接https://ac.nowcoder.com/acm/problem/205832 看输出描述即可知输出次数最多的那个字母即可。 哈希表直接秒了&#xff1a; #include <iostre…

网络安全快速入门(十五)(中)用户的文件属性及用户相关文件详解

15.4 序言 我们之前已经了解了关于用户管理的一些基础命令&#xff0c;本章节我们就来了解一下关于文件权限的一些小知识以及基于某些文件来手动创建一个用户&#xff0c;话不多说&#xff0c;我们开始吧&#xff01; 15.5 文件权限 在linux中&#xff0c;文件都是通过查看属主…

基于深度学习YOLOv8\YOLOv5的骨科骨折诊断检测系统设计

本文将介绍基于深度学习YOLOv8\YOLOv5PySide6SQLite的骨折检测识别骨科诊断系统&#xff0c;该系统基于YOLOv8算法&#xff0c;并与YOLOv5版本进行比较&#xff0c;该系统不仅实现了对骨折骨损伤的识别&#xff0c;还提供了包括用户认证管理、模型快速切换及界面个性化定制在内…

我成功创建了一个Electron应用程序

1.创建electron项目命令&#xff1a; npm create quick-start/electron electron-memo 2选择&#xff1a;√ Select a framework: vue √ Add TypeScript? ... No √ Add Electron updater plugin? ... Yes √ Enable Electron download mirror proxy? ... Yes 3.命令&am…

【Qt知识】disconnect

在Qt框架中&#xff0c;disconnect函数用于断开信号与槽之间的连接。当不再需要某个信号触发特定槽函数时&#xff0c;或者为了防止内存泄漏和重复执行问题&#xff0c;你可以使用disconnect来取消这种关联。disconnect函数的基本用法可以根据不同的需求采用多种形式&#xff0…

JAVA:浅谈Stream流

在阅读本文章之前请了解什么叫 Lambda表达式 以及 如何使用 一、Stream流 Stream流的使用步骤&#xff1a; 获得一条Stream流&#xff0c;并且将数据放上去 单列集合获取Stream流 // 1. 单列集合获取Stream ArrayList<String> list new ArrayList<String>()…

YOLO10:手把手安装教程与使用说明

目录 前言一、YOLO10检测模型二、YOLO安装过程1.新建conda的环境 yolo10安装依赖包测试 总结 前言 v9还没整明白&#xff0c;v10又来了。而且还是打败天下无敌手的存在&#xff0c;连最近很火的RT-DETR都被打败了。那么&#xff0c;笑傲目标检测之林的v10又能持续多久呢&#…

【CTF Web】BUUCTF BUU LFI COURSE 1 Writeup(代码审计+PHP+文件包含漏洞)

BUU LFI COURSE 1 1 点击启动靶机。 解法 <?php /*** Created by PhpStorm.* User: jinzhao* Date: 2019/7/9* Time: 7:07 AM*/highlight_file(__FILE__);if(isset($_GET[file])) {$str $_GET[file];include $_GET[file]; }如果GET请求中接收到file参数&#xff0c;就会…

【vue实战项目】通用管理系统:作业列表

目录 目录 1.前言 2.后端API 3.前端API 4.组件 5.分页 6.封装组件 1.前言 本文是博主前端Vue实战系列中的一篇文章&#xff0c;本系列将会带大家一起从0开始一步步完整的做完一个小项目&#xff0c;让你找到Vue实战的技巧和感觉。 专栏地址&#xff1a; https://blog…

python ---requests

python包管理工具 pip 若发现报错&#xff0c;则可以通过 -i 命令指定软件源 requests库安装 通过 pip &#xff0c;如上 或通过 pycharm 搜索 requests &#xff0c;并安装即可 下载成功的证明 requests库使用 模拟 http 重要参数如下 如何模拟发包 支持模拟各种 http meth…

【机器学习-09】 | Scikit-Learn工具包进阶指南:Scikit-Learn工具包之高斯混合sklearn.mixture模块研究

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

智能监测,无忧续航!Battery Indicator for Mac,让电池状态尽在掌握

Battery Indicator for Mac 是一款设计精良的电池状态监测软件&#xff0c;它极大地增强了Mac用户对电池使用情况的感知和管理能力。 首先&#xff0c;Battery Indicator for Mac 能够实时显示电池电量百分比。这意味着&#xff0c;无论你是在处理文件、浏览网页还是观看视频&…

JL-8B/1111电流继电器 带板前接线附件 约瑟JOSEF

JL-8系列继电器型号&#xff1a; 电流继电器JL-8GB/11 电流继电器JL-8GA/21 过电流继电器JL-8GB/1 电流继电器JL-8B/521DK 电流继电器JL-8B/222DK 电流继电器JL-8B/1121 电流继电器JL-8B/12 电流继电器JL-8B/3211 电流继电器JL-8B/E2 电流继电器JL-8B/E3 过电流继电器JL-…

双向链表的讲解与实现

双向链表的讲解与实现 一、双向链表的结构二、顺序表和双向链表的优缺点分析三、双向链表的实现(使用VS2022)1.初始化、销毁、打印、判空2.尾插尾删、头插头删3.查找、指定插入、指定删除 四、代码优化五、完整 List.c 源代码 一、双向链表的结构 带头”跟前面我们说的“头节点…

DNS解析与Bond

一、DNS 1、DNS概念 DNS是域名系统的简称&#xff1a;域名和ip地址之间的映射关系互联网中IP地址是通信的唯一标识&#xff0c;逻辑地址访问网站&#xff0c;有域名&#xff0c;ip地址不好记&#xff0c;域名朗朗上口&#xff0c;好记。 域名解析的目的&#xff1a;实现访问…

Ivy优化算法-2024年7月SCI一区顶刊新算法!公式原理详解与性能测评 Matlab代码免费获取

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 原理简介 一、初始化 二、协调有序的种群增…

李廉洋:6.5黄金原油亚盘震荡,美盘行情分析及最新策略。

黄金消息面分析&#xff1a;黄金价格周二下跌超过1%&#xff0c;原因是美元在本周晚些时候美国就业数据公布前趋于稳定&#xff0c;该数据可能为美联储的利率策略定下基调。另外&#xff0c;中东达成停火协议的可能性增加&#xff0c;也打压黄金的避险需求。不过&#xff0c;隔…

【Postman接口测试】第五节.Postman接口测试项目实战(下)

文章目录 前言七、课程添加接口postman测试 7.1 课程添加接口文档 7.2 针对课程添加设计接口测试用例 7.2.1 提取测试点 7.2.2 设计测试用例 7.2.2 使用Postman进行接口测试八、查询课程列表接口postman测试 8.1 查询…

七天进阶elasticsearch

elasticSearch 概述 Elasticsearch是一个近实时的搜索平台。这意味着&#xff0c;从索引一个文档直到这个文档能够被搜索到有一个很小的延迟&#xff08;通常是一秒&#xff09; 集群 一个集群就是由一个或多个节点组织在一起&#xff0c; 它们共同持有你全部的数据&#x…