Triển khai Đăng Ký Người Dùng Sử dụng PyQt5

Dự án này dựa trên PyQt5 nhằm tái tạo các chức năng của ứng dụng nhắn tin tức QQ, bao gồm đăng ký người dùng mới, đăng nhập, tự động đăng nhập, nhớ nhiều tài khoản người dùng, tìm kiếm người dùng, thêm bạn bè, trò chuyện giữa bạn bè (lưu trữ và đồng bộ hóa tin nhắn).

Công nghệ sử dụng:

  • PyQt5: Giao diện người dùng được xây dựng bằng PyQt5.
  • MySQL: Các bảng dữ liệu như thông tin người dùng, lịch sử trò chuyện, danh sách bạn bè được quản lý bởi MySQL.
  • SQLite: Lưu trữ tên đăng nhập và mật khẩu người dùng trên máy cục bộ để thực hiện tính năng tự động đăng nhập.
  • WebSocket: Sử dụng WebSocket cho chức năng trò chuyện.
  • FastAPI: Triển khai dịch vụ WebSocket lên máy chủ bằng FastAPI để cho phép giao tiếp giữa các IP khác nhau.
  • RabbitMQ: Sử dụng hàng đợi RabbitMQ để đảm bảo tin nhắn được lưu trữ lâu dài và gửi ngay khi người nhận trực tuyến.
  • Minio: Lưu trữ hình ảnh đại diện, ảnh, tệp, video trong cuộc trò chuyện của người dùng trên máy chủ lưu trữ Minio.

Đăng ký Người Dùng

Nhận thông tin người dùng từ giao diện người dùng (tên hiển thị, mật khẩu, số điện thoại), kiểm tra thông tin đầu vào. Sau đó, tạo một số tài khoản QQ ngẫu nhiên, mã hóa mật khẩu người dùng và gửi số tài khoản qua tin nhắn SMS để hoàn thành quá trình đăng ký.

Mã nguồn Giao diện Đăng ký

# -*- coding: utf-8 -*-

from PyQt5 import QtCore, QtGui, QtWidgets

class RegistrationForm(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Đăng ký")
        self.resize(1200, 700)
        self.main_frame = QtWidgets.QFrame(self)
        self.main_frame.setStyleSheet("background-image: url(:/img/register_bg.webp);")
        self.main_frame.setGeometry(0, 0, 1200, 700)

        self.register_button = QtWidgets.QPushButton("Đăng ký", self.main_frame)
        self.register_button.setGeometry(900, 500, 150, 50)
        self.register_button.setStyleSheet("color: white; font: 9pt 'Agency FB'; border-radius: 60px;")

        self.back_button = QtWidgets.QPushButton("Quay lại", self.main_frame)
        self.back_button.setGeometry(740, 510, 120, 50)
        self.back_button.setStyleSheet("color: white; border-radius: 60px;")

        self.username_input = QtWidgets.QLineEdit(self.main_frame)
        self.username_input.setGeometry(700, 200, 360, 60)
        self.username_input.setStyleSheet("border-radius:15px;")

        self.password_input = QtWidgets.QLineEdit(self.main_frame)
        self.password_input.setGeometry(700, 300, 360, 60)
        self.password_input.setStyleSheet("border-radius:15px;")
        self.password_input.setEchoMode(QtWidgets.QLineEdit.Password)

        self.phone_input = QtWidgets.QLineEdit(self.main_frame)
        self.phone_input.setGeometry(700, 410, 360, 60)
        self.phone_input.setStyleSheet("border-radius:15px;")

        self.close_button = QtWidgets.QPushButton(self.main_frame)
        self.close_button.setGeometry(1150, 10, 30, 30)
        self.close_button.setStyleSheet("border-image: url(:/img/close.png); border-radius:50px;")
        self.close_button.clicked.connect(self.close)

        layout = QtWidgets.QVBoxLayout()
        layout.addWidget(self.main_frame)
        self.setLayout(layout)

        self.register_button.clicked.connect(self.handle_registration)
        self.back_button.clicked.connect(self.go_back)

    def handle_registration(self):
        username = self.username_input.text()
        password = self.password_input.text()
        phone = self.phone_input.text()
        if not all([username, password, phone]):
            QtWidgets.QMessageBox.warning(self, "Lỗi", "Vui lòng điền đầy đủ thông tin!")
        else:
            # Xử lý đăng ký ở đây
            pass

    def go_back(self):
        self.parent().show()
        self.close()

Mã nguồn Logic Đăng ký

import random
from PyQt5.QtWidgets import QMessageBox
from hashlib import sha256
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
from models import User  # Giả sử bạn có một mô hình User

engine = create_engine('mysql+pymysql://user:password@localhost/dbname')
Session = sessionmaker(bind=engine)
session = Session()

def generate_random_qq():
    return random.randint(100000000, 999999999)

def encrypt_password(password):
    return sha256(password.encode()).hexdigest()

def send_sms(phone_number, qq_number):
    # Thực hiện việc gửi tin nhắn SMS
    pass

def register_user(username, password, phone):
    if session.query(User).filter_by(phone=phone).first():
        QMessageBox.warning(None, "Lỗi", "Số điện thoại đã được đăng ký!")
        return
    new_qq = generate_random_qq()
    hashed_password = encrypt_password(password)
    new_user = User(qq=new_qq, password=hashed_password, username=username, phone=phone)
    session.add(new_user)
    session.commit()
    send_sms(phone, new_qq)
    QMessageBox.information(None, "Thành công", f"Tài khoản của bạn là {new_qq}. Đã gửi đến số điện thoại của bạn.")

Thẻ: PyQt5 mysql SQLite WebSocket FastAPI

Đăng vào ngày 25 tháng 5 lúc 21:24