给 PyQt5 忘记密码页,添加逻辑,实现密码找回

使用 PyQt5(PySide2)+SQLAlchemy 做一个登录注册页(六)

本文将介绍自己用 PyQt5+SQLAlchemy 做的一个登录注册页,使用邮箱接收验证码本文介绍是前后端未分离的实现方式,后续将出一个前后端分离的,你可以将 PyQt5 改为 PySide2 以获得更宽松的开源协议

本文由于涉及到的代码较多,将会是一个系列,会有多篇文章

系列文章索引

  1. 设计登录注册页面
  2. 添加代码运行登录注册页,并为其添加一些样式,和调用资源文件
  3. 使用 SQLAlchemy 实现用户数据库管理
  4. 为登录页,添加登录逻辑代码,实现登录
  5. 给注册页,添加注册逻辑代码,实现用户的注册验证
  6. 给忘记密码页,添加逻辑,实现密码找回
  7. 给登录添加记住用户密码功能,并优化一些内容

必要说明

  • 使用的环境 requirements.txt
# Python3.8.10 x32
# Windows10 x64
PyQt5
pyqt5-tools
PyMySQL~=1.1.0
sqlalchemy~=2.0.25
bcrypt~=4.1.2
email-validator
pydantic
yagmail
  • 项目结构(无新增)

给忘记密码页,添加逻辑,实现密码找回

第1步

修改crud/crud.py,实现用户表更新

class CRUDUser(CRUD):

    def update(self, db: Session, email: str, update_data: dict):
        """更新"""
        db_user = db.query(models.User).filter(
            and_(models.User.email == email, models.User.deleted == 0)).update(update_data)
        return self._commit(db, db_user)


第2步

添加忘记登录

  1. 初始化 GitHub完整代码
# 在 init_ui 方法中,添加忘记密码页绑定信号
self.lineEdit_7.textEdited.connect(lambda: self.check_password(self.lineEdit_7, self.lineEdit_8, self.label_14, self.pushButtonForgetOk))
self.lineEdit_8.textEdited.connect(lambda: self.check_password(self.lineEdit_7, self.lineEdit_8, self.label_14, self.pushButtonForgetOk))
self.pushButtonSend2.clicked.connect(lambda: self.send_captcha(self.lineEdit_6, self.pushButtonSend2))
self.pushButtonForgetOk.clicked.connect(self.forget_password)

  1. 添加必填校验 GitHub完整代码
def forget_password_required(self):
    self.email = self.lineEdit_6.text()
    self.password = self.lineEdit_7.text()
    self.captcha = self.lineEdit_9.text()
    if not self.email.strip():
        self.basic_function.info_message("邮箱地址不能为空")
        return False
    elif not self.password.strip():
        self.basic_function.info_message("用户密码不能为空")
        return False
    elif not self.repeat_password.strip():
        self.basic_function.info_message("重复密码不能为空")
        return False
    elif not self.captcha.strip():
        self.basic_function.info_message("邮箱验证码不能为空")
        return False
    return True
  1. 检查邮箱是否是已经注册的用户 GitHub完整代码
def forget_password_check_email_exist(self):
    """检查邮箱是否注册"""
    with session_factory() as db:
        get_email = self.user.get_user_by_email(db, self.email)
    if not get_email:
        self.basic_function.info_message("邮箱地址系统中不存在")
        return
    return True

  1. 实现忘记密码 GitHub完整代码
def forget_password(self):
    """忘记密码动作"""
    if (not self.forget_password_required() or
            not self.forget_password_check_email_exist() or
            not self.check_email_format() or
            not self.check_captcha()):  # 数据校验
        return
    bytes_my_password = bytes(self.password, encoding="utf-8")
    bytes_my_hash_password = bcrypt.hashpw(bytes_my_password, bcrypt.gensalt(rounds=13))
    str_my_hash_password = bytes.decode(bytes_my_hash_password)
    with session_factory() as db:
        self.user.update(db, self.email, {models.User.password: str_my_hash_password})
    # 判断是否选中找回密码后直接登录,若未选中,则切换会登录页
    if self.checkBox_3.isChecked():
        self.accept()
    else:
        self.stackedWidget.setCurrentIndex(0)

GitHub完整代码
本文章的原文地址
GitHub主页

posted @ 2024-02-20 16:56  星尘的博客  阅读(56)  评论(0编辑  收藏  举报