基于PyQt5实现仿QQ-第一章-用户注册

第一章-用户注册

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 ҈҉҈҉҈҉҈ 对我的帮助!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值