当前位置: 首页 > news >正文

基于MySQL有用户管理的音乐播放器

基于MySQL的音乐器

  • 带有用户登录功能
  • 验证用户身份,用户注册等操作
  • 还有用户音乐列表,以及增删查改操作

INSERT into users(username,passwd,phone_number,created_time,role) VALUES(‘张三’,‘123456’,‘123’,‘2025-3-11’,‘1’)

三张表,users表,存放用户信息

musiclibrary表存放音乐信息

user_favorites表放用户id和音乐id,就是用户的个人喜好。所有用户的个人喜好都在这个表里面

关于音乐下载的,可以看我以前的爬虫文章,复制源代码,运行就是一个音乐下载器了。再配合这个音乐播放器,非常好用,安利一下。链接:
https://blog.csdn.net/FZ51111/article/details/143540349?spm=1011.2415.3001.5331

  • 第一次,手搓这个音乐播放器,有很多可以优化的地方
"""
基于MySQL的音乐器
有用户登录功能
还要用户注册
用户个人的音乐列表,还有对应的增删查
"""
import re
import threading

import pygame
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox, QStackedWidget, QVBoxLayout, QFileDialog
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtGui import QIcon
import pymysql
from datetime import datetime
from playsound import playsound


class Ui_denglu(QWidget):
    def setupUi(self, denglu):
        denglu.setObjectName("denglu")
        denglu.resize(420, 281)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        denglu.setFont(font)
        self.verticalLayout = QtWidgets.QVBoxLayout(denglu)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(denglu)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(denglu)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(denglu)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.lineEdit_2 = QtWidgets.QLineEdit(denglu)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
        self.horizontalLayout_2.addWidget(self.lineEdit_2)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem)
        self.pushButton = QtWidgets.QPushButton(denglu)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_3.addWidget(self.pushButton)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_3.addItem(spacerItem1)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_3 = QtWidgets.QLabel(denglu)
        self.label_3.setStyleSheet("color:\'#EEB422\'")
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_4.addWidget(self.label_3)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_4.addItem(spacerItem2)
        self.pushButton_2 = QtWidgets.QPushButton(denglu)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout_4.addWidget(self.pushButton_2)
        self.verticalLayout.addLayout(self.horizontalLayout_4)
        self.retranslateUi(denglu)

    def retranslateUi(self, denglu):
        _translate = QtCore.QCoreApplication.translate
        denglu.setWindowTitle(_translate("denglu", "音乐播放器"))
        self.label.setText(_translate("denglu", "账号"))
        self.label_2.setText(_translate("denglu", "密码"))
        self.pushButton.setText(_translate("denglu", "登录"))
        self.label_3.setText(_translate("denglu", "没有账号请先注册>>>>>"))
        self.pushButton_2.setText(_translate("denglu", "注册"))

class Ui_zhuce(QWidget):
    def setupUi(self, zhuce):
        zhuce.setObjectName("zhuce")
        zhuce.resize(378, 230)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        zhuce.setFont(font)
        self.verticalLayout = QtWidgets.QVBoxLayout(zhuce)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(zhuce)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(zhuce)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.label_2 = QtWidgets.QLabel(zhuce)
        self.label_2.setObjectName("label_2")
        self.horizontalLayout_2.addWidget(self.label_2)
        self.lineEdit_2 = QtWidgets.QLineEdit(zhuce)
        self.lineEdit_2.setObjectName("lineEdit_2")
        self.lineEdit_2.setEchoMode(QtWidgets.QLineEdit.Password)
        self.horizontalLayout_2.addWidget(self.lineEdit_2)
        self.verticalLayout.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_4 = QtWidgets.QLabel(zhuce)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_3.addWidget(self.label_4)
        self.lineEdit_4 = QtWidgets.QLineEdit(zhuce)
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.lineEdit_4.setEchoMode(QtWidgets.QLineEdit.Password)
        self.horizontalLayout_3.addWidget(self.lineEdit_4)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_3 = QtWidgets.QLabel(zhuce)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_4.addWidget(self.label_3)
        self.lineEdit_3 = QtWidgets.QLineEdit(zhuce)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.horizontalLayout_4.addWidget(self.lineEdit_3)
        self.verticalLayout.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_5.addItem(spacerItem)
        self.pushButton = QtWidgets.QPushButton(zhuce)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_5.addWidget(self.pushButton)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_5.addItem(spacerItem1)
        self.pushButton_2 = QtWidgets.QPushButton(zhuce)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout_5.addWidget(self.pushButton_2)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_5.addItem(spacerItem2)
        self.verticalLayout.addLayout(self.horizontalLayout_5)

        self.retranslateUi(zhuce)
        QtCore.QMetaObject.connectSlotsByName(zhuce)

    def retranslateUi(self, zhuce):
        _translate = QtCore.QCoreApplication.translate
        zhuce.setWindowTitle(_translate("zhuce", "注册"))
        self.label.setText(_translate("zhuce", "账号    "))
        self.label_2.setText(_translate("zhuce", "密码    "))
        self.label_4.setText(_translate("zhuce", "确认密码"))
        self.label_3.setText(_translate("zhuce", "手机号  "))
        self.pushButton.setText(_translate("zhuce", "确定"))
        self.pushButton_2.setText(_translate("zhuce", "取消"))

class Ui_management(QWidget):
    def setupUi(self, management):
        management.setObjectName("management")
        management.resize(666, 555)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        management.setFont(font)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(management)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(management)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.listWidget = QtWidgets.QListWidget(management)
        self.listWidget.setObjectName("listWidget")
        self.verticalLayout.addWidget(self.listWidget)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.pushButton = QtWidgets.QPushButton(management)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        self.pushButton_2 = QtWidgets.QPushButton(management)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout.addWidget(self.pushButton_2)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_3.addLayout(self.verticalLayout)
        self.frame = QtWidgets.QFrame(management)
        self.frame.setFrameShape(QtWidgets.QFrame.VLine)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.horizontalLayout_3.addWidget(self.frame)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout()
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.label_2 = QtWidgets.QLabel(management)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.verticalLayout_2.addWidget(self.label_2)
        self.listWidget_2 = QtWidgets.QListWidget(management)
        self.listWidget_2.setObjectName("listWidget_2")
        self.verticalLayout_2.addWidget(self.listWidget_2)
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.pushButton_4 = QtWidgets.QPushButton(management)
        self.pushButton_4.setObjectName("pushButton_4")
        self.horizontalLayout_2.addWidget(self.pushButton_4)
        self.pushButton_5 = QtWidgets.QPushButton(management)
        self.pushButton_5.setObjectName("pushButton_5")
        self.horizontalLayout_2.addWidget(self.pushButton_5)
        self.pushButton_6 = QtWidgets.QPushButton(management)
        self.pushButton_6.setObjectName("pushButton_6")
        self.horizontalLayout_2.addWidget(self.pushButton_6)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
        self.horizontalLayout_3.addLayout(self.verticalLayout_2)

        self.retranslateUi(management)
        QtCore.QMetaObject.connectSlotsByName(management)

    def retranslateUi(self, management):
        _translate = QtCore.QCoreApplication.translate
        management.setWindowTitle(_translate("management", "数据库管理"))
        self.label.setText(_translate("management", "用户管理"))
        self.pushButton.setText(_translate("management", "增加用户"))
        self.pushButton_2.setText(_translate("management", "删除用户"))
        self.label_2.setText(_translate("management", "音乐管理"))
        self.pushButton_4.setText(_translate("management", "增加音乐"))
        self.pushButton_5.setText(_translate("management", "删除音乐"))
        self.pushButton_6.setText(_translate("management", "刷新页面"))

class Ui_MusicLibrary(QWidget):
    def setupUi(self, MusicLibrary):
        MusicLibrary.setObjectName("MusicLibrary")
        MusicLibrary.resize(651, 481)
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(MusicLibrary)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.label = QtWidgets.QLabel(MusicLibrary)
        self.label.setObjectName("label")
        self.verticalLayout.addWidget(self.label)
        self.listWidget = QtWidgets.QListWidget(MusicLibrary)
        self.listWidget.setObjectName("listWidget")
        self.verticalLayout.addWidget(self.listWidget)
        self.horizontalLayout_2.addLayout(self.verticalLayout)
        self.frame = QtWidgets.QFrame(MusicLibrary)
        self.frame.setFrameShape(QtWidgets.QFrame.VLine)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.horizontalLayout_2.addWidget(self.frame)
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.label_3 = QtWidgets.QLabel(MusicLibrary)
        self.label_3.setObjectName("label_3")
        self.verticalLayout_3.addWidget(self.label_3)
        self.listWidget_2 = QtWidgets.QListWidget(MusicLibrary)
        self.listWidget_2.setObjectName("listWidget_2")
        self.verticalLayout_3.addWidget(self.listWidget_2)
        self.horizontalLayout_2.addLayout(self.verticalLayout_3)
        self.verticalLayout_2.addLayout(self.horizontalLayout_2)
        self.frame_2 = QtWidgets.QFrame(MusicLibrary)
        self.frame_2.setFrameShape(QtWidgets.QFrame.HLine)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")
        self.verticalLayout_2.addWidget(self.frame_2)
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem)
        self.pushButton_3 = QtWidgets.QPushButton(MusicLibrary)
        self.pushButton_3.setObjectName("pushButton_3")
        self.horizontalLayout.addWidget(self.pushButton_3)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem1)
        self.pushButton = QtWidgets.QPushButton(MusicLibrary)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout.addWidget(self.pushButton)
        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem2)
        self.pushButton_2 = QtWidgets.QPushButton(MusicLibrary)
        self.pushButton_2.setObjectName("pushButton_2")
        self.horizontalLayout.addWidget(self.pushButton_2)
        spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem3)
        self.pushButton_4 = QtWidgets.QPushButton(MusicLibrary)
        self.pushButton_4.setObjectName("pushButton_4")
        self.horizontalLayout.addWidget(self.pushButton_4)
        spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout.addItem(spacerItem4)
        self.verticalLayout_2.addLayout(self.horizontalLayout)

        self.retranslateUi(MusicLibrary)
        QtCore.QMetaObject.connectSlotsByName(MusicLibrary)

    def retranslateUi(self, MusicLibrary):
        _translate = QtCore.QCoreApplication.translate
        MusicLibrary.setWindowTitle(_translate("MusicLibrary", "音乐播放"))
        self.label.setText(_translate("MusicLibrary", "音乐库"))
        self.label_3.setText(_translate("MusicLibrary", "个人喜欢"))
        self.pushButton_3.setText(_translate("MusicLibrary", "播放"))
        self.pushButton.setText(_translate("MusicLibrary", "添加"))
        self.pushButton_2.setText(_translate("MusicLibrary", "移除"))
        self.pushButton_4.setText(_translate("MusicLibrary", "刷新"))

class Ui_Form(QWidget):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(254, 285)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        Form.setFont(font)
        self.verticalLayout = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout.setObjectName("verticalLayout")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.label = QtWidgets.QLabel(Form)
        self.label.setObjectName("label")
        self.horizontalLayout.addWidget(self.label)
        self.lineEdit = QtWidgets.QLineEdit(Form)
        self.lineEdit.setObjectName("lineEdit")
        self.horizontalLayout.addWidget(self.lineEdit)
        self.verticalLayout.addLayout(self.horizontalLayout)
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.label_3 = QtWidgets.QLabel(Form)
        self.label_3.setObjectName("label_3")
        self.horizontalLayout_3.addWidget(self.label_3)
        self.lineEdit_3 = QtWidgets.QLineEdit(Form)
        self.lineEdit_3.setObjectName("lineEdit_3")
        self.horizontalLayout_3.addWidget(self.lineEdit_3)
        self.verticalLayout.addLayout(self.horizontalLayout_3)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.label_4 = QtWidgets.QLabel(Form)
        self.label_4.setObjectName("label_4")
        self.horizontalLayout_4.addWidget(self.label_4)
        self.lineEdit_4 = QtWidgets.QLineEdit(Form)
        self.lineEdit_4.setObjectName("lineEdit_4")
        self.horizontalLayout_4.addWidget(self.lineEdit_4)
        self.verticalLayout.addLayout(self.horizontalLayout_4)
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.label_5 = QtWidgets.QLabel(Form)
        self.label_5.setObjectName("label_5")
        self.horizontalLayout_5.addWidget(self.label_5)
        self.lineEdit_5 = QtWidgets.QLineEdit(Form)
        self.lineEdit_5.setObjectName("lineEdit_5")
        self.horizontalLayout_5.addWidget(self.lineEdit_5)
        self.verticalLayout.addLayout(self.horizontalLayout_5)
        self.horizontalLayout_7 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_7.setObjectName("horizontalLayout_7")
        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_7.addItem(spacerItem)
        self.pushButton = QtWidgets.QPushButton(Form)
        font = QtGui.QFont()
        font.setBold(True)
        font.setWeight(75)
        self.pushButton.setFont(font)
        self.pushButton.setObjectName("pushButton")
        self.horizontalLayout_7.addWidget(self.pushButton)
        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)
        self.horizontalLayout_7.addItem(spacerItem1)
        self.verticalLayout.addLayout(self.horizontalLayout_7)

        self.retranslateUi(Form)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "管理员增加用户"))
        self.label.setText(_translate("Form", "用户名"))
        self.label_3.setText(_translate("Form", "密码  "))
        self.label_4.setText(_translate("Form", "手机号"))
        self.label_5.setText(_translate("Form", "权限  "))
        self.pushButton.setText(_translate("Form", "确定"))

class AddPeopleWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.ui = Ui_Form()
        self.ui.setupUi(self)
        self.ui.pushButton.clicked.connect(self.queding)

    def queding(self):
        username0 = self.ui.lineEdit.text()
        passwd0 = self.ui.lineEdit_3.text()
        phone0 = self.ui.lineEdit_4.text()
        role0 = self.ui.lineEdit_5.text()
        now = datetime.now()
        formatted_now = now.strftime("%Y-%m-%d %H:%M:%S")

        if all([username0, passwd0, phone0]):

            connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root',db='music_project', charset='utf8')
            cursor = connection.cursor()
            sql0 = "SELECT * FROM users WHERE username = %s AND passwd = %s AND phone_number = %s"
            cursor.execute(sql0, (username0, passwd0, phone0))
            records = cursor.fetchall()

            if not records:
                sql1 = "INSERT INTO users(username, passwd, phone_number, created_time, role) VALUES(%s, %s, %s, %s, %s)"
                cursor.execute(sql1, (username0, passwd0, phone0, formatted_now, '1'))
                connection.commit()
                QMessageBox.information(None, '注册成功', f'用户 {username0} 注册成功', QMessageBox.Ok)
                cursor.close()
                connection.close()
                return
            else:
                text1 = '用户已存在'
        else:
            text1 = '有空选项'

        QMessageBox.information(self, '提示', text1, QMessageBox.Ok)

class MyWindow(QStackedWidget):
    def __init__(self):
        super().__init__()

        # 创建页面
        self.denglu_page = Ui_denglu()
        self.zhuce_page = Ui_zhuce()
        self.musiclibrary_page=Ui_MusicLibrary()
        self.managerment_page=Ui_management()

        # 设置页面的 UI
        self.denglu_widget = QWidget()
        self.denglu_page.setupUi(self.denglu_widget)

        self.zhuce_widget = QWidget()
        self.zhuce_page.setupUi(self.zhuce_widget)

        self.musiclibrary_widget = QWidget()
        self.musiclibrary_page.setupUi(self.musiclibrary_widget)

        self.managerment_widget = QWidget()
        self.managerment_page.setupUi(self.managerment_widget)

        # 添加页面到 QStackedWidget
        self.addWidget(self.denglu_widget)
        self.addWidget(self.zhuce_widget)
        self.addWidget(self.musiclibrary_widget)
        self.addWidget(self.managerment_widget)

        # 绑定按钮的点击事件
        self.denglu_page.pushButton_2.clicked.connect(self.show_registration_page)
        self.zhuce_page.pushButton.clicked.connect(self.show_login_page)
        self.zhuce_page.pushButton_2.clicked.connect(self.zhuce_cancel)
        self.denglu_page.pushButton.clicked.connect(self.login)
        self.managerment_page.pushButton.clicked.connect(self.add_people)
        self.managerment_page.pushButton_2.clicked.connect(self.rm_people)
        self.managerment_page.pushButton_4.clicked.connect(self.add_music)
        self.managerment_page.pushButton_5.clicked.connect(self.rm_music)
        self.managerment_page.pushButton_6.clicked.connect(self.set_music)
        self.musiclibrary_page.pushButton_3.clicked.connect(self.play_music)
        self.musiclibrary_page.pushButton.clicked.connect(self.add_music_to_people)
        self.musiclibrary_page.pushButton_2.clicked.connect(self.rm_music_from_peole)
        self.musiclibrary_page.pushButton_4.clicked.connect(self.flush_list)

        # 初始页面
        self.setCurrentIndex(0)
        self.data={'username8':'','passwd8':'','id':''}

    def flush_list1(self):
        connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='music_project',
                                     charset='utf8')
        cursor = connection.cursor()
        sql = f"select * from user_favorites where uid = '{self.data['id']}' order by mid"
        cursor.execute(sql)
        list1 = cursor.fetchall()
        self.musiclibrary_page.listWidget_2.clear()
        row_str = '歌曲\t歌手\tid'
        self.musiclibrary_page.listWidget_2.addItem(row_str)
        for row in list1:
            sql1 = f"select * from music_library where id = '{row[1]}'"
            cursor.execute(sql1)
            list0 = cursor.fetchall()
            for row0 in list0:
                row_str = f'{row0[1]}\t{row0[2]}\t{row0[0]}'
                self.musiclibrary_page.listWidget_2.addItem(row_str)
        cursor.close()
        connection.close()

    def flush_list(self):
        self.flush_list1()
        connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='music_project',charset='utf8')
        cursor = connection.cursor()
        sql = 'select * from music_library order by id'
        cursor.execute(sql)
        list1 = cursor.fetchall()
        self.musiclibrary_page.listWidget.clear()
        row_str = '歌曲\t歌手\tid'
        self.musiclibrary_page.listWidget.addItem(row_str)
        for row in list1:
            row_str = f'{row[1]}\t{row[2]}\t{row[0]}'
            self.musiclibrary_page.listWidget.addItem(row_str)
        cursor.close()
        connection.close()

    def play_music(self):
        self.music_item0 = self.musiclibrary_page.listWidget_2.selectedItems()
        self.music_item1 = self.musiclibrary_page.listWidget.selectedItems()
        if not self.music_item0 and not self.music_item1:
            return
        self.music_item = self.music_item0 if self.music_item0 else self.music_item1
        connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='music_project',charset='utf8')
        cursor = connection.cursor()
        for item in self.music_item:
            text = item.text()
            parts = text.split()
            mid = parts[-1] if parts else None
            sql = f"select * from music_library where id = '{mid}'"
            cursor.execute(sql)
            connection.commit()
            result_list = cursor.fetchall()
            print(result_list[0][-1])
            path = result_list[0][-1]
            print(path)
            music_thread = threading.Thread(target=self.music_start, args=(path,))
            music_thread.daemon = True
            music_thread.start()

        cursor.close()
        connection.close()

    def music_start(self,path):
        pygame.mixer.init()
        pygame.mixer.music.load(path)
        pygame.mixer.music.play()
        while pygame.mixer.music.get_busy():  # 等待音频播放完成
            pass

    def add_music_to_people(self):
        self.music_item = self.musiclibrary_page.listWidget.selectedItems()
        if not self.music_item:
            return

        connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='music_project',charset='utf8')
        cursor = connection.cursor()
        for item in self.music_item:
            text = item.text()
            parts = text.split()
            mid = parts[-1]
            sql1 = f"select * from user_favorites where mid = '{mid}' and uid = '{self.data['id']}'"
            cursor.execute(sql1)
            result_list = cursor.fetchall()
            if not result_list:
                sql = f"insert into user_favorites(mid,uid) values('{mid}','{self.data['id']}')"
                cursor.execute(sql)
                connection.commit()

        cursor.close()
        connection.close()

    def rm_music_from_peole(self):
        self.music_item = self.musiclibrary_page.listWidget_2.selectedItems()
        if not self.music_item:
            return

        connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='music_project',charset='utf8')
        cursor = connection.cursor()
        for item in self.music_item:
            text = item.text()
            parts = text.split()
            mid = parts[-1]
            print(id)
            sql = f"DELETE FROM user_favorites WHERE mid = '{mid}' and uid = '{self.data['id']}'"
            cursor.execute(sql)
            connection.commit()

        cursor.close()
        connection.close()

    def add_people(self):
        self.second_window = AddPeopleWindow()
        self.second_window.show()

    def rm_people(self):
        self.music_item = self.managerment_page.listWidget.selectedItems()
        for item in self.music_item:
            template1 = item.text()
            parts = template1.split()
            id = parts[2]
            connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='music_project',charset='utf8')
            cursor = connection.cursor()
            sql = f"delete from users where id='{id}'"
            cursor.execute(sql)
            connection.commit()
            cursor.close()
            connection.close()

    def add_music(self):
        options = QFileDialog.Options()
        file_path, _ = QFileDialog.getOpenFileName(self, "选择音乐文件", "", "音乐 (*.mp3)", options=options)

        if file_path:
            match = re.search(r'([^\\/]+)-([^\\/]+)-\d+\.mp3$', file_path)
            if match:
                singer = match.group(1)
                song_name = match.group(2)
                connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root',db='music_project', charset='utf8')
                cursor = connection.cursor()
                sql0 = f"SELECT * FROM music_library WHERE artist='{singer}' AND title='{song_name}' AND file_path='{file_path}'"
                cursor.execute(sql0)
                result0 = cursor.fetchall()
                if not result0:
                    sql = f"INSERT INTO music_library(artist, title, file_path) VALUES('{singer}', '{song_name}', '{file_path}')"
                    cursor.execute(sql)
                    connection.commit()
                    cursor.close()
                    connection.close()
                    return
                else:
                    text3='歌曲已存在'
            else:
                text3 = "没有匹配到歌手和歌名"
        else:
            text3 = '没有选中歌曲'
        QMessageBox.information(self, '提示', text3, QMessageBox.Ok)

    def rm_music(self):
        self.music_item = self.managerment_page.listWidget_2.selectedItems()
        if not self.music_item:
            return

        connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='music_project',charset='utf8')
        cursor = connection.cursor()

        for item in self.music_item:
            text = item.text()
            parts = text.split()
            id = parts[-1]
            print(id)
            sql = "DELETE FROM music_library WHERE id = %s"
            cursor.execute(sql, (id,))
            connection.commit()

        cursor.close()
        connection.close()

    def set_list1(self):
        connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='music_project',
                                     charset='utf8')
        cursor = connection.cursor()
        sql = 'select * from users order by id'
        cursor.execute(sql)
        list1 = cursor.fetchall()
        self.managerment_page.listWidget.clear()
        row_str = '用户名\t密码\tid\t手机号\t创建时间\t\t\t最近登录\t\t\t权限'
        self.managerment_page.listWidget.addItem(row_str)
        for row in list1:
            row_str = f'{row[0]}\t{row[1]}\t{row[2]}\t{row[3]}\t{row[4]}\t{row[5]}\t{row[6]}'
            self.managerment_page.listWidget.addItem(row_str)
        cursor.close()
        connection.close()

    def set_music(self):
        self.set_list1()
        connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root', db='music_project',
                                     charset='utf8')
        cursor = connection.cursor()
        sql = 'select * from music_library order by id'
        cursor.execute(sql)
        list1 = cursor.fetchall()
        self.managerment_page.listWidget_2.clear()
        row_str = '歌曲\t歌手\tid'
        self.managerment_page.listWidget_2.addItem(row_str)
        for row in list1:
            row_str = f'{row[1]}\t{row[2]}\t{row[0]}'
            self.managerment_page.listWidget_2.addItem(row_str)
        cursor.close()
        connection.close()

    # 登录后跳转用户界面/管理员界面
    def login(self):
        username2 = self.denglu_page.lineEdit.text()
        password2 = self.denglu_page.lineEdit_2.text()
        if username2:
            if password2:
                connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root',db='music_project', charset='utf8')
                cursor = connection.cursor()
                sql = f"select * from users where username='{username2}' and passwd='{password2}'"
                cursor.execute(sql)
                count = cursor.fetchall()
                self.data['username8'] = username2
                self.data['passwd8'] = password2
                self.data['id'] = count[0][2]
                if count:
                    if count[0][6] == 1:
                        self.setCurrentIndex(2)
                        self.resize(666, 555)
                    else:
                        self.setCurrentIndex(3)
                        self.resize(555, 444)
                    return
                else:
                    text2='账户或密码错误'
            else:
                text2 = '密码为空'
        else:
            text2 = '用户名为空'
        QMessageBox.information(None, '登录失败', text2, QMessageBox.Ok)
        return
    # 注册取消,返回登录页面
    def zhuce_cancel(self):
        self.setCurrentIndex(0)
        self.resize(500, 300)
    # 登录跳转注册页面
    def show_registration_page(self):
        self.setCurrentIndex(1)
        self.resize(600, 400)
    # 注册完,跳转登录页面
    def show_login_page(self):
        # 获取注册信息
        usernames=self.zhuce_page.lineEdit.text()
        passwds=self.zhuce_page.lineEdit_2.text()
        passwds2=self.zhuce_page.lineEdit_4.text()
        sign=self.zhuce_page.lineEdit_3.text()
        now = datetime.now()
        formatted_now = now.strftime("%Y-%m-%d %H:%M:%S")
        # 验证注册信息
        if usernames:
            if passwds:
                if passwds2:
                    if passwds2==passwds:
                        if sign:
                            # 数据库信息验证
                            connection = pymysql.connect(host='localhost', port=3306, user='root', passwd='root',db='music_project', charset='utf8')
                            cursor = connection.cursor()
                            sql = f"select * from users where phone_number='{sign}'"
                            cursor.execute(sql)
                            count = cursor.fetchall()
                            if not count:
                                sql1 = f"INSERT into users(username,passwd,phone_number,created_time,role) VALUES('{usernames}','{passwds}','{sign}','{formatted_now}','1')"
                                cursor.execute(sql1)
                                list=cursor.fetchall()
                                print(list)
                                connection.commit()
                                QMessageBox.information(None, '注册成功', '注册成功,请返回登录', QMessageBox.Ok)
                                self.setCurrentIndex(0)
                                self.resize(500, 300)
                                return
                            else:
                                text1='用户已存在,不可重复创建,注册失败'
                        else:
                            text1 ='手机号不能为空'
                    else:
                        text1 ='两次密码不一致,请重新输入'
                else:
                    text1 ='确认密码不能为空'
            else:
                text1 ='密码不能为空'
        else:
            text1 ='用户名为空'
        QMessageBox.information(None, '注册失败', text1, QMessageBox.Ok)
        self.setCurrentIndex(1)
        self.resize(600, 400)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = MyWindow()
    window.setWindowIcon(QIcon('E:\杂物\音乐图标.ico'))
    window.setWindowTitle("音乐播放器")
    window.resize(500, 300)
    window.show()
    sys.exit(app.exec_())

解读代码

首先要掌握MySQL数据库的操作方式,最基本的增删查改

这是存储数据的地方,需要使用SQL语言与数据库交互

然后是pyqt5的知识,知道如何设计界面,还有信号与槽函数

本身并不是很复杂,大部分的逻辑代码都在处理信息方面,比如,注册用户的时候,用户名不能为空,密码不能为空,还需要手机号不同。我设计的是通过手机号排除用户,这样就避免了用户取名的烦恼。在当今这个时代,一个身份证下面手机号的数量是有限的,通过手机号作为唯一标识就跟大数据时代使用身份证作为人的唯一依据。

一开始还想给用户也设计增删查改操作,后来发现改操作,需要再设计一个页面,还不能直接使用注册的页面。

页面的数量又增加一个。

目前的页面有:登录界面,注册界面,用户听歌界面,管理员界面,管理员添加用户界面。

我知道,有很多可以优化的地方,但是目前没必要优化,我只是联系MySQL+pyqt5仅此而已。

如果,你们想要让我优化一下,可以在评论区评论,或者私信,我会尝试一下。

难点

思路很简单,但是遇到的问题一个比一个难解决。

  • qt界面跳转功能

一开始想的是一次只展示一个界面,但是还想跳转一下界面,比如在登录界面,我们可以点击注册按钮,跳转到注册界面。注册结束之后,我们点击确定,后台进行数据库比对,返回对应的信息。然后再去登录界面。我不知道如何展示不同的界面,之前我设计的软件都是一个界面用到结束。比如,音乐下载器,打开就是一个音乐下载界面,输入信息,找歌。然后双击下载,还有翻页什么的。都是在一个界面进行的。

用的比较高级的操作就是页面刷新,就是多线程操作。还有动态控件设置。基本上都是基于一个界面实现的。

第一次写多界面的软件。才知道要使用QStackedWidget方法,把页面缓存到堆栈,通过setCurrentIndex(1)这个方法可以跳转到对应的界面。比如这里的5个界面,前四个都是使用页面缓存的方式实现的。下标从0开始,对应不同的页面。

在创建多界面的时候,还有很多要注意的地方:

  1. 主窗口需要继承类QStackedWidget
  2. 子界面类需要继承类QWidget
  3. 跳转界面的时候,要使用setCurrentIndex
  4. 界面需要先实例化界面,再给每一个界面创建一个QWidget对象,界面类里面还要接收这个QWidget对象。
  5. 然后添加页面到 QStackedWidget,把刚刚的QWidget对象在添加到QStackedWidget,使用addwidget方法。就像多行文本框一样。也就是后续使用下标跳转页面的缘由。

如果你本来就会界面跳转,那就没什么难点了

写到后面,又发现可以使用多窗口,也就是创建多个主窗口的方式,创建多个界面,也就是后来的管理员添加用户界面

  • 界面设计

在设计界面的时候,一开始就想设计三个界面,一个登录,一个注册,一个音乐器本体。

后来没想起来如何动态添加组件。之前使用uniapp的时候,有一个动态更新组件的方法,记混了,设计了好久,没实现。。。

其实是能实现,但是特别麻烦。我们根据用户的权限role,判断是管理员还是普通用户。然后在设计界面的逻辑部分,判断权限。权限不同就显示不同界面。

可能是我设计的界面不够华丽,我感觉与其进行逻辑判断动态更新界面,不如就直接设计两个界面,在登录的时候,从数据库验证身份后,直接就打开对应的界面。也不用逻辑判断了。

也许,如果管理员和用户的界面功能设计的很复杂,又很接近的情况,我会重新考虑这个部分。

  • SQL语言设计

因为涉及大量的SQL语言,也是第一次实操,避免不了遗漏或语句错误

为了逻辑代码的严谨,每一个可能出错的地方都要预先模拟一下。其实完全没必要,目前的需求不在界面设计,我听的课也就设计了一个播放界面,只有三个按钮,对应,播放,添加,删除功能,甚至用户登录都是在python的控制台输入的。我是实在看不下去,但也浪费了好多时间。

废话不多说,MySQL板块,到此为止。

下一章NoSQL数据库—Redis数据库。

http://www.dtcms.com/a/67337.html

相关文章:

  • Java 虚拟机优化指南:CMS垃圾回收器参数调优与性能监控工具详解
  • obeaver 连接oracle 库 模式乱码
  • XXE-labs靶场通关攻略
  • 【菜鸟飞】通过vsCode用python访问公网deepseek-r1等模型(Tocken模式)
  • cs224w课程学习笔记-第7课
  • Harmony OS:用户文件操作——图片选择与渲染使用
  • Docker根目录迁移与滚动日志设置
  • leetcode日记(96)有序链表转换二叉搜索树
  • 记录致远OA服务器硬盘升级过程
  • Android第二次面试总结(项目拷打理论篇)
  • Gone v2 中 Gone-Gin 性能测试报告
  • kotlin与MVVM的结合使用总结(二)
  • hackme靶机通关攻略
  • Java数组详解(一)
  • IDE 使用技巧与插件推荐:全面提升开发效率
  • vue3+ts+vite环境中使用json-editor-vue3,记录遇到的奇奇怪怪问题!!!
  • 三格电子Modbus TCP转CANOpen网关相关问答
  • 【vscode-01】vscode不同项目不同语言扩展插件隔离方案
  • 智算新纪元,腾讯云HAI-CPU助力法律援助
  • 提升工地安全:视觉分析助力挖掘机作业监控
  • 夜莺监控 v8.0 新版通知规则 | 对接企微告警
  • 前端面试:如何实现预览 PDF 文件?
  • PostgreSQL 日常SQL语句查询记录--空间查询
  • 单体架构、微服务组件与解决方案
  • 开VR大空间体验馆,如何最低成本获取最大收入?
  • RabbitMQ 实现原理及流程
  • 多线程--参数传递之间的关系
  • react和vue 基础使用对比
  • Docker文件夹上传秘籍Windows下的高效传输之道
  • hcia华为路由器静态路由实验配置