第一章-用户注册
Author: Daydreamer
项目简介
本项目基于PyQt5仿照目前流行的即时通信软件QQ,实现了新用户注册、用户登录、自动登录、记住多用户账号、用户搜索、添加好友、好友间聊天(消息持久化、同步化)等功能。
项目技术栈
- PyQt5: 本项目界面基于PyQt5实现。
- MySQL: 项目中的用户个人信息表、好友聊天记录表、好友表均由MySQL实现。
- SQLite: 使用SQLite将用户的账号密码存储于本地,实现了自动登录功能。
- WebSocket: 项目聊天功能基于WebSocket实现。
- FastAPI: 使用FastAPI将WebSocket服务部署到服务器,实现了任意IP间的通信。
- RabbitMQ: 基于RabbitMQ消息队列实现了消息真正的持久化(不存在好友离线接收不到消息),当用户一上线立刻会收到新消息。
- Minio: 基于Minio云存储服务器存储用户的头像、聊天记录中的图片、问价、视频等资源。
注册功能的实现
接收界面用户输入的用户信息(昵称、密码、手机号),对用户输入的信息进行初步判断。然后生成随机的QQ号,并对用户的密码进行加密存储,最后通过短信的方式将QQ号发送给用户完成注册。
数据库表结构
注册UI界面代码
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'registered_ui.ui'
#
# Created by: PyQt5 UI code generator 5.15.7
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(1185, 693)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
self.verticalLayout.setObjectName("verticalLayout")
self.frame_main = QtWidgets.QFrame(Form)
self.frame_main.setStyleSheet("#frame_main{border-image: url(:/img/registered.webp);}\n"
"\n"
"\n"
"")
self.frame_main.setFrameShape(QtWidgets.QFrame.StyledPanel)
self.frame_main.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame_main.setObjectName("frame_main")
self.register_pbt = QtWidgets.QPushButton(self.frame_main)
self.register_pbt.setGeometry(QtCore.QRect(922, 520, 161, 51))
self.register_pbt.setStyleSheet("color: rgb(248, 248, 248);\n"
"font: 9pt \"Agency FB\";\n"
"border-radius: 60px;")
self.register_pbt.setObjectName("register_pbt")
self.retur_pbt = QtWidgets.QPushButton(self.frame_main)
self.retur_pbt.setGeometry(QtCore.QRect(760, 530, 121, 51))
self.retur_pbt.setStyleSheet("color: rgb(248, 248, 248);\n"
"border-radius: 60px;")
self.retur_pbt.setText("")
self.retur_pbt.setObjectName("retur_pbt")
self.name_edit = QtWidgets.QLineEdit(self.frame_main)
self.name_edit.setGeometry(QtCore.QRect(720, 220, 372, 59))
self.name_edit.setStyleSheet("border-radius:15px;")
self.name_edit.setObjectName("name_edit")
self.pwd_line = QtWidgets.QLineEdit(self.frame_main)
self.pwd_line.setGeometry(QtCore.QRect(720, 320, 372, 59))
self.pwd_line.setStyleSheet("border-radius:15px;")
self.pwd_line.setObjectName("pwd_line")
self.phone_line = QtWidgets.QLineEdit(self.frame_main)
self.phone_line.setGeometry(QtCore.QRect(720, 430, 372, 59))
self.phone_line.setStyleSheet("border-radius:15px;")
self.phone_line.setObjectName("phone_line")
self.close_re_pbt = QtWidgets.QPushButton(self.frame_main)
self.close_re_pbt.setGeometry(QtCore.QRect(1122, 7, 31, 31))
self.close_re_pbt.setStyleSheet("border-image: url(:/img/close.png);\n"
"border-radius:50px;\n"
"border-width:2px;\n"
"border-style:soild;\n"
"border:none;\n"
"")
self.close_re_pbt.setText("")
self.close_re_pbt.setObjectName("close_re_pbt")
self.verticalLayout.addWidget(self.frame_main)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.register_pbt.setText(_translate("Form", "注册 "))
import ui.img_rc
注册逻辑代码
这里的用户注册相关的SQL操作我是基于ORM的,大家可以自己实现。
import random
from PyQt5 import QtGui, QtWidgets, QtCore
from PyQt5.QtGui import QColor
from PyQt5.QtWidgets import QApplication, QGraphicsDropShadowEffect, QMessageBox
from PyQt5.QtCore import Qt
from db.mysql_orm.crud import Register_new_user
from lib.encrypted import encrypted_pwd
from lib.new_account import create_new_account
from lib.sent_account import message_sent_account
from lib.sql_command import is_exists
from ui.registered_ui import Ui_Form
class registered_ui(QtWidgets.QWidget, Ui_Form):
# registered_window = QtCore.pyqtSignal() # 跳转信号
def __init__(self, login_page):
super(registered_ui, self).__init__()
self.setupUi(self) # 初始化Ui函数
self.login_page = login_page # 接收登录界面对象
self.init_ui() # 初始化界面
self.init_slots() # 初始化槽函数
def init_slots(self):
self.register_pbt.clicked.connect(self.register) # 连接注册按钮槽函数
self.close_re_pbt.clicked.connect(self.return_main) # 连接关闭注册界面槽函数
self.retur_pbt.clicked.connect(self.return_main) # 连接已有账号返回登录槽函数
def init_ui(self):
print("初始化界面")
self.setAttribute(Qt.WA_TranslucentBackground) # 窗体背景透明
shadow = QGraphicsDropShadowEffect() # 设定一个阴影,半径为10,颜色为#444444,定位为0,0
shadow.setBlurRadius(10)
shadow.setColor(QColor("#444444"))
shadow.setOffset(0, 0)
self.setWindowFlags(Qt.WindowStaysOnTopHint | Qt.FramelessWindowHint | Qt.Tool) # 窗口置顶,无边框,在任务栏不显示图标
def get_avatar_url(self):
"""
# Author: Daydreamer
# 获取随机头像url
:return: 头像url
"""
avatar_url = ['http://4x.143.2x9.40:9000/blog/dog1.jpg', 'http://4x.143.2x9.40:9000/blog/dog2.jpg',
'http://4x.143.2x9.40:9000/blog/dog3.jpg',
'http://4x.143.2x9.40:9000/blog/dog4.jpg', 'http://4x.143.2x9.40:9000/blog/dog5.jpg',
'http://4x.143.2x9.40:9000/blog/dog6.jpg']
return random.choice(avatar_url)
def register(self):
"""
Author: Daydreamer
# 注册账号功能
:return: 无
"""
if self.pwd_line.text() == '' or self.name_edit.text() == '' or self.phone_line.text() == '': # 判断是否输入注册信息
print("请输入完整信息!!!")
QMessageBox.about(self, "Error", "请输入完整信息!!!")
else:
name = self.name_edit.text() # 接收新用户名
pwd = self.pwd_line.text() # 接收新用户密码
phone = self.phone_line.text() # 接收新用户手机
if is_exists(phone): # 判断该手机号是否注册过账号
print("开始注册账号")
encrypted_user_input = encrypted_pwd(str(pwd)) # 调用sha-256进行加密函数,将用户输入的密码进行加密
new_account = create_new_account() # 系统随机获取一个账号
Register_new_user(str(new_account), str(encrypted_user_input), str(name), "男", self.get_avatar_url(), str(phone)) # 传入新用户信息进行用户注册
message_sent_account(str(phone), str(new_account)) # 通过手机短信发送新注册的QQ账号
print('您的账号:{}'.format(new_account))
QMessageBox.about(self, "Successfully", "账号注册成功,已发送至您的手机,请注意接收!")
print("注册成功!!!")
else:
print("用户已存在!!!")
QMessageBox.about(self, "Error", "该手机号已经注册过账号!!!")
def return_main(self):
"""
Author: Daydreamer
# 返回主界面函数
:return:
"""
self.login_page.show() # 显示登录界面
self.close() # 关闭注册界面
def closeEvent(self, QCloseEvent):
# Author: Daydreamer
# 注册界面关闭函数,并手动退出进程
# print('关闭注册界面,返回登录界面')
self.close()
手机短信发送QQ号代码
我们需要去这个平台注册一个账号。
def message_sent_account(new_phone: str, new_account: str):
statusStr = {
'0': '短信发送成功',
'-1': '参数不全',
'-2': '服务器空间不支持,请确认支持curl或者fsocket,联系您的空间商解决或者更换空间',
'30': '密码错误',
'40': '账号不存在',
'41': '余额不足',
'42': '账户已过期',
'43': 'IP地址限制',
'50': '内容含有敏感词'
}
smsapi = "http://api.smsbao.com/"
# 短信平台账号
user = '_' # 这里填入你的短信平台账号
# 短信平台密码
password = md5('3fb252f77d004c959d1f404f18973a0c') # 使用md5进行加密
# 要发送的短信内容
content = "我们已为您生成了一个账号。请查看以下信息:\n账号:{}".format(
new_account)
# 要发送短信的手机号码
phone = new_phone
data = urllib.parse.urlencode({'u': user, 'p': password, 'm': phone, 'c': content})
send_url = smsapi + 'sms?' + data
response = urllib.request.urlopen(send_url)
the_page = response.read().decode('utf-8')
print(statusStr[the_page])
最终效果
项目源码在这里,可以的话就给个小星星吧!QQ源码
特别鸣谢:LoadingCreate ҈҉҈҉҈҉҈ 对我的帮助!