给 PyQt5 忘记密码页,添加逻辑,实现密码找回
使用 PyQt5(PySide2)+SQLAlchemy 做一个登录注册页(六)
本文将介绍自己用 PyQt5+SQLAlchemy 做的一个登录注册页,使用邮箱接收验证码,本文介绍是前后端未分离的实现方式,后续将出一个前后端分离的,你可以将 PyQt5 改为 PySide2 以获得更宽松的开源协议
本文由于涉及到的代码较多,将会是一个系列,会有多篇文章
系列文章索引
- 设计登录注册页面
- 添加代码运行登录注册页,并为其添加一些样式,和调用资源文件
- 使用 SQLAlchemy 实现用户数据库管理
- 为登录页,添加登录逻辑代码,实现登录
- 给注册页,添加注册逻辑代码,实现用户的注册验证
- 给忘记密码页,添加逻辑,实现密码找回
- 给登录添加记住用户密码功能,并优化一些内容
必要说明
- 使用的环境
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步
添加忘记登录
- 初始化 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)
- 添加必填校验 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
- 检查邮箱是否是已经注册的用户 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
- 实现忘记密码 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)
本文来自博客园作者:星尘的博客,转载请注明出处:https://www.cnblogs.com/yqbaowo/p/18023328