代码实现部分
1.数据库文件
import pymysql
class DBUtil:
config={
"host":"localhost",
"user":"root",
"password":"123456",
"db":"da_1",
"charset":"utf8"
}
def __init__(self):
self.connection = pymysql.connect(**DBUtil.config)
self.cursor= self.connection.cursor()
def close(self):
if self.cursor:
self.cursor.close()
if self.connection:
self.connection.close()
#插入 修改 删除调用
def execute_1(self,sql,*args):
try:
#执行sql
self.cursor.execute(sql,args)
#提交事务
self.connection.commit()
except Exception as e:
print(e)
if self.connection:
self.connection.rollback()
finally:
self.close()
# 返回id
def execute_1_back_id(self,sql,*args):
try:
#执行sql
self.cursor.execute(sql,args)
# 获取id
id=self.connection.insert_id()
#提交事务
self.connection.commit()
# return count
return id
except Exception as e:
print(e)
if self.connection:
self.connection.rollback()
finally:
self.close()
#查询 一条数据
def query_one(self,sql,*args):
try:
#执行sql
self.cursor.execute(sql,args)
#获取结果集
return self.cursor.fetchone()
except Exception as e:
print(e)
finally:
self.close()
def query_all(self,sql,args):
try:
#执行sql
self.cursor.execute(sql,args)
#获取结果集
return self.cursor.fetchall()
except Exception as e:
print(e)
finally:
self.close()
2.服务端代码部分代码
from tools import DBUtil
import pygame
class MusicSerice:
def __init__(self):
self.user = None
#用户登录功能,传入名字和密码进行登录
def login(self,uname:str,password:str):
# 查询用户的sql
sql = 'select id,uname from t_user where uname=%s and password=%s'
# 执行查询
user = DBUtil().query_one(sql,uname,password)
# 判断返回结果,如果user空,登录失败,有值代表查询到了
if user:
# 记录用户信息
self.user=user
return True
else:
return False
def add_music(self, files: tuple[str]) -> None:
'''
增加音乐功能
:param files: 音乐文件路径,默认是多个,里面的元素是字符串
:return: None
'''
sql = 'select m.path from t_play_list p left join t_music m on p.m_id = m.id where u_id = %s and m.name=%s'
# 执行sql
path =DBUtil().query_one(sql, self.user[0], music_name)[0]
# 调用播放器播放音乐
# 初始化-加载音乐的混合器
pygame.mixer.init()
# 加载音乐
pygame.mixer.music.load(path)
# 播放音乐
pygame.mixer.music.play()
def delete_music(self, music_name: str):
'''
删除音乐
:param music_name: 音乐名称
'''
# 编写sql,查询要删除的音乐的id
get_id_sql = 'select m.id from t_play_list p left join t_music m on p.m_id = m.id where u_id = %s and m.name=%s'
# 执行sql
rs = DBUtil().query_one(get_id_sql, self.user[0], music_name)[0]
# 编写sql,删除播放列表
delte_play_list_sql = 'delete from t_play_list where m_id = %s and u_id = %s'
DBUtil().execute_1(delte_play_list_sql, rs, self.user[0])
# 编写sql,删除音乐表
delete_music_sql = 'delete from t_music where id = %s'
DBUtil().execute_1(delete_music_sql, rs)
3.客户端代码部分代码
import tkinter
from serice import MusicSerice
from tkinter.filedialog import askopenfilenames
class PlayerWindows:
def __init__(self):
# self.service = ser
top = tkinter.Tk()
# 创建播放按钮
btn1 = tkinter.Button(top,width=20, text="播放")
# 创建导入音乐按钮
btn2 = tkinter.Button(top,width=20, text="导入音乐")
print('导入音乐')
# 弹出文件选择框
filenames = askopenfilenames(filetype=[('mp3', '.mp3'), ('ncm', '.ncm')],initialdir="E:/python_code/全栈课程/06数据库/音乐播放器/music/")
# 调用添加音乐函数
ms.add_music(filenames)
# 获取播放列表
self.load_music()
def load_music(self):
# 调用获取播放列表功能
m_list = ms.find_user_music()
# 清空列表
self.listbox.delete(0, tkinter.END)
# 重新加载
for m in m_list:
self.listbox.insert(0, m[0])