前言

本文是我学MySQL后,做的一个小项目,因为初学,没有做的很高大上,代码方面也一般般,但是总归是自己做的,还是有点小小成就感的,在这里和大家分享下,喜欢的点个赞,一起冲冲冲。
这个项目主要是想锻炼下我个人的能力,加深对数据库的理解,所以文章可能会有点赘余(就是有点长的意思,哈哈哈),大家不要介意哈
我会从数据库的建立,到用python tkinter库做界面一一的进行简述。

建立数据库

建立数据库,我使用Navicat对MySQL进行管理,图形化界面操作真的很简单,但是为了能更好的加强自己对SQL语句的理解,我用SQL语句进行创建数据库及其相对应的表。
这里我们创建一个新的库并将其命名为play_music_test

create database play_music_test

因为我要做的是一个音乐播放器,每个用户都拥有自己的一个歌单(数据库),这就要求我们需要建立一个用户表,还有一个音乐表,同时还要有一个关系表,这样进行数据管理的时候才不会混乱
用户表:我们需要有个用户名还有登录密码,同时还要有一个id,id是为了让每个用户不会因为用户名重复,或者是其他方面造成歌单混乱,所以需要有有一个唯一的身份标识,也就是id是一个主键,同时为了方便还应该是一个自增的id

create table t_user(id int primary key auto_increment,uname varchar(20),passwords varchar(20)
);

音乐表:需要有音乐名称和音乐路径,同时还要有一个独立id,毕竟用户那么多,肯定会有重复的音乐,所以唯一的id也是需要的,语法与用户表是一样的

create table t_music(id int primary key auto_increment,music_name varchar(255),path varchar(255)
);

关系表:这是本次项目的关键点,靠着这个表,我们才能知道哪个用户有哪些歌曲,不至于出现混乱
所以这张表不但需要独立的id,还需要两个外键和用户表,音乐表建立连接

create table t_list(id int primary key auto_increment,mid int,uid int,constraint foreign key(mid) references t_music(id),constraint foreign key(uid) references t_user(id)
);

我们建立好三个表后,可以用下面这个语句查看下已经创建的表

show tables;

同时还可以利用desc table_name查看表的基本结构,tabel_name是表名,desc是关键字

到这里我们就建立好我们的项目的基础了,接下来我们需要向数据库存入用户数据,先建立用户数据,是因为本次项目主要目的还是以熟悉MySQL为主,就直接点开始先建立好数据

insert t_user(uname,passwords) values('zs',123),('lisi',123);

通过**select * from t_user;**我们可以看到已经插入了两条用户数据,我们没有对id字段进行插入,但id却有值,这就是我们的主键约束和自增约束起的作用

DBUtil类

我们通过已经建立好的相应的表,接下来将是利用python对MySQL数据库建立交互,这样我们才能通过我们写的代码对数据库做出相应的操作,DBUtil是我封装的一个类主要是简化我们代码对数据库的操作。
我们需要在我们的python中导入PyMySQL库,PyMySQL是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中使用mysqldb。利用PyMySQL我们可以连接数据库,并实现简单的增删改查
在进行下面这一步时,需要保证已经安装了最新版的PyMySQL库,并且设置好了数据库,否则会连接失败。

# 获取连接
connection = pymysql.connect(host='localhost', user='root',password='root',db='play_music_test',charset='utf8')
# 创建cursor对象
cursor = connection.cursor()

connect()方法是pymysql提供与数据库建立连接的方法,具体的使用可以参考一位大牛的文章

https://blog.csdn.net/XC_SunnyBoy/article/details/108546128

这样我们就可以与数据库建立了连接了
建立连接后,我们用sql语言进行操作,并进行相应的提交事务(commit),回滚事务(rollback),开始事务(begin)。
如我们的插入数据,由于执行cursor.execute(sql)会打开一个事务,所以需要我们提交,数据库才能进行记录

music_name = '七元 - If'
pash = 'D:\music_file\cloud_music\七元 - If.mp3'
# 编写sql
sql = "insert into t_music(music_name,path) value(%s,%s)"
# 执行sql
count = cursor.execute(sql, music_name, pash)
# 执行DML时候,会开启一个事务,需要我们主动提交
connection.commit()

回滚事务则是我们操作错误了,但是事务已经开始了,我们必须得将刚才得错误撤回,这时候我们就可以回滚事务,如

try:# 执行sqlcount = self.cursor.execute(sql,args)# 提交事务self.connection.commit()return count
except Exception as e:print(e)if self.connection:self.connection.rollback()
finally:self.close_file()

close_file()是我封装的一个方法,用来释放建立的游标资源

    def close_file(self):if self.cursor:self.cursor.close()if self.connection:self.connection.close()

因为每次进行操作都要进行提交事务,关闭游标资源等操作,在我们的项目中需要对数据库进行大量的操作,所以这里就需要将这些方法封装进我们的DBUtl工厂类中。
那么接下来,我们需要做的就是创建我们的DBUtil类,并把连接方法,数据库操作的方法都放入这个类中,做一个工具类
直接贴代码

__init__方法中是我们的实例属性,将连接通道和游标对象都获取了,那接下来,便不用再一次次去写这些代码了

import pymysql
class DBUtil:config={'host': 'localhost','user': 'root','password': 'root','db': 'play_music_test','charset': 'utf8'}def __init__(self):self.connection = pymysql.connect(**DBUtil.config)self.cursor = self.connection.cursor()def close_file(self):if self.cursor:self.cursor.close()if self.connection:self.connection.close()# 插入 修改 删除调用def exeDML(self,sql,*args):try:# 执行sqlcount = self.cursor.execute(sql,args)# 提交事务self.connection.commit()return countexcept Exception as e:print(e)if self.connection:self.connection.rollback()finally:self.close_file()# 单句查询def query_one(self,sql,*args):try:# 执行sqlself.cursor.execute(sql,args)# 获取结果集return self.cursor.fetchone()except Exception as e:print(e)finally:self.close_file()# 多句查询def query_all(self,sql,*args):try:# 执行sqlself.cursor.execute(sql,args)# 获取结果集return self.cursor.fetchall()except Exception as e:print(e)finally:self.close_file()

为了编写,下面代码时不会太长,也便于日后修改调用,这里将DBUtil类单独做一个.py文件,当成一个库来调用

主程序的搭建

那接下来我们需要写我们的主程序,一步一步来搭建我们的音乐播放器。
首先我们需要知道我们的音乐播放器有什么功能

  1. 必须有不同用户,且每个用户都拥有自己的歌单,
  2. 音乐播放器要能导入音乐,这样用户才能选择自己喜欢的音乐导入,形成自己的歌单
  3. 删除功能,用户导错歌了,或者不喜欢某首歌了,那么就必须把歌曲从自己的歌单中删除
  4. 播放功能,身为音乐播放器,不能播放音乐,那还叫什么音乐播放器呀
    大体就是以上四个功能,还有其他的一些功能可以加,但是项目周期也会越长,所以这里就先加这些了

注:我把不同的类封装在不同的.py文件中,一是方便修改,二是容易找出出错的地方,本次项目中我封装了三个类,分别是DBUtil(工具类), MyService(功能类),PlayWindow(界面类)

实现登录功能

实现第一要求,不同的用户要有不同的歌单,也就是在t_user表中的每个用户都可以进行登录,而不在t_user表中的用户,则无法操作,我们需要输入用户名和密码,然后去t_user表中查询
这里我偷一下懒,没有用GUI,编写登录界面,只是通过简单的input语句进行操作

    uname = input('请输入用户名:')password = input('请输入密码:')

获取完我们的用户名后,我们需要去到t_user表中对比下,这个用户是否存在,如果存在则进入我们的用户界面,也就是我们的音乐播放器
在MyService类中我们将用户登录的代码封装成一个类方法,如果用户存在,返回True,不存在,则返回False

    # 用户登录def login(self,uname,password):sql = 'select * from t_user where uname=%s and password=%s'self.user = DBUtil().query_one(sql,uname,password)if self.user:return Trueelse:return False

得到用户是否存在的结果后,我们就可以进行相应的操作

    # 判断用户是否存在if myserbise.login(uname,password):print('登录成功')# 进入用户界面playwindow.showWindow()else:print('登录失败')

这样第一个要求,我们基本实现了,接下来登录后,就该看到我们的用户界面了

用户界面

利用tkinter库,我们可以做一个简单的用户界面,首先是我们的三个剩下的三个功能,播放、导入、删除,那我们可以把他们封装成一个个按钮,那做完按钮后,我们还需要一个可以显示歌单的控件,这样用户才能查看自己的歌单进行相应的操作。
在PlayWindow类中

    # 用户登录成功显示界面def showWindow(self):# 主窗口显示top = tkinter.Tk()top.title('音乐播放插件')# 组件插入self.createWidget(top)# 将音乐名插入到label01上self.insert_mname()top.mainloop()# 组件方法def createWidget(self,top):# 按扭设置btn01 = tkinter.Button(top, text='播放音乐')btn02 = tkinter.Button(top, text='导入音乐')btn03 = tkinter.Button(top, text='删除音乐')btn01.grid(row=0, column=0, padx=3)btn02.grid(row=0, column=3, padx=3)btn03.grid(row=0, column=6, padx=3)# 音乐列表self.label01 = tkinter.Listbox(top)self.label01.grid(row=1, column=0, columnspan=10)# 事件方法btn01.bind('<Button-1>', self.play_music)btn02.bind('<Button-1>', self.import_music)btn03.bind('<Button-1>', self.del_music)

完成了用户登录界面后,我们需要给相对应的按钮添加对应得方法,如上面的代码,最后便是使用鼠标左键触发事件的
那我们可以先将这三个方法名写出,然后慢慢完善

导入音乐

导入音乐方法为什么最先写呢,因为用户刚开始登录的时候歌单肯定是空的,这时候我们要进行删除或者播放都是比较困难的,而且即使写出来了也无法进行调试,所以这里先写导入音乐方法。
导入音乐需要用到tkinter中的askopenfilenames方法(这个方法可以返回多个文件名列表)对文件进行操作,
为什么只导入文件名呢,因为,数据库是对数据进行管理的,而不是储存文件的地方,所以存入相对应的文件名和路径,可以找到文件,进行操作。

from tkinter.filedialog import askopenfilenames

PlayWindow导入音乐的方法是调用了功能类MyService中的方法

    # 导入音乐def import_music(self,event):print('导入音乐')music_file = askopenfilenames(title='导入的音乐',initialdir='D:\music_file\cloud_music',filetypes=[("音乐文件",".mp3")])# 将音乐名及路径存入数据库self.myserbise.add_music(music_file)# 导入音乐后更新音乐列表self.insert_mname()

在接收导入的文件名后,将其传入MyService类中的add_music()方法中
在add_music()方法中,我们需要对数据库进行相应的查询插入操作,首先我们需要对传回来的音乐名进行切边操作,提取出我们需要的信息

        for f in files:start = f.rfind('/')+1end = f.rfind('.mp3')music_name = f[start:end]path = f

将传来的文件名分为音乐名和路径两,接下来我们是不是可以将音乐插入数据库了

                sql = 'insert into t_music(music_name,path) values(%s,%s)'DBUtil().exeDML(sql,music_name,path)

可是,直接插入,是不是有点不妥,我们要求音乐表里每首音乐都是唯一的,也就是不能有重复的音乐,所以我们插入前应该先检查音乐库中是不是已经有这首歌了

            sql = "select * from t_music where music_name=%s"music = DBUtil().query_one(sql,music_name)

是不是有了,我们不知道,但是可以肯定的是,如果音乐表中没有这首歌,我们是必须将这首歌插入音乐表中,同时这也表明,我们登录的用户,自己的歌单没有这首歌,所以我们需要将该用户添加了这首歌的记录,写入关系表中。

                # 导入音乐库没有的音乐print('音乐库里没有这首歌,写入开始')sql = 'insert into t_music(music_name,path) values(%s,%s)'DBUtil().exeDML(sql,music_name,path)print('写入结束,开始写入关系表')# 导入关系表,用户添加记录music = self.music_id(music_name)sql = 'insert into t_list(mid,uid) values(%s,%s)'DBUtil().exeDML(sql, music[0], self.user[0])print('结束')

不存在的情况比较好想点,存在的情况下,我们也需要进行判断,该用户是不是有这首歌了呢,如果他有的话,我们就没必要进行数据插入了,那如何知道呢,这时候就可以查询关系表,我们关系的mid和uid字段可是和音乐表和用户表的id有关联的

                print('音乐库已经有这首歌啦')sql = 'select * from t_list where mid=%s and uid=%s't_list = DBUtil().query_one(sql, music[0], self.user[0])if not t_list:print('该用户还没有这首歌')sql = 'insert into t_list(mid,uid) values(%s,%s)'DBUtil().exeDML(sql, music[0], self.user[0])

MyService类中完整的add_music方法

    # 加入音乐def add_music(self,files):print(files)for f in files:start = f.rfind('/')+1end = f.rfind('.mp3')music_name = f[start:end]path = fsql = "select * from t_music where music_name=%s"music = DBUtil().query_one(sql,music_name)if music:print('音乐库已经有这首歌啦')sql = 'select * from t_list where mid=%s and uid=%s't_list = DBUtil().query_one(sql, music[0], self.user[0])if not t_list:print('该用户还没有这首歌')sql = 'insert into t_list(mid,uid) values(%s,%s)'DBUtil().exeDML(sql, music[0], self.user[0])else:# 导入音乐库没有的音乐print('音乐库里没有这首歌,写入开始')sql = 'insert into t_music(music_name,path) values(%s,%s)'DBUtil().exeDML(sql,music_name,path)print('写入结束,开始写入关系表')# 导入关系表,用户添加记录music = self.music_id(music_name)sql = 'insert into t_list(mid,uid) values(%s,%s)'DBUtil().exeDML(sql, music[0], self.user[0])print('结束')print('结束 ')

在进入下一步之前,我们先思考下,用户怎么知道自己的歌单有哪些歌呢?
肯定不是直接打开数据库查看,这时候我们可以用之前设置的Listbox组件,将音乐表中属于该用户的歌曲插入到Listbox组件上,那这时候就要用到我们的多表查询了
MyService类

 # 扫描t_music,将音乐名全部导出def find_mname(self):sql = "select m.music_name from t_music m,t_list t where m.id=t.mid and t.uid=%s"return DBUtil().query_all(sql,self.user[0])

PlayWindow类

    # 插入音乐名至列表def insert_mname(self):self.label01.delete(0,tkinter.END)music_name = self.myserbise.find_mname()for mname in music_name:self.label01.insert(tkinter.END, mname)

接下来我们只需要在合适的地方调用这些方法就可以了

删除音乐

前面将音乐插入到Listbox组件,这时候就可以发挥作用了,用户刚好想删除某些歌曲,那不是正好可以利用Listbox组件的功能,获取音乐名,然后用SQL进行删除
PlayWindow类中获取音乐名字,然后到MyService中进行操作

    def del_music(self,event):try:print('删除音乐')# 查询选中音乐名字# 获取音乐列表的选中的索引insert = self.label01.curselection()# 获取音乐名mname = self.label01.get(insert)# 从关系表中删除用户与音乐行self.myserbise.del_list(mname)# 导入音乐后更新音乐列表self.insert_mname()except:print('没有选择项')

MyService类:想要删除音乐,我们先得获得要删除音乐名的id,因为id才是与关系表关联的,然后再删除关系表,这样就算该用户删除了这首歌,也不会影响别的用户的歌单,音乐音乐表中这首歌还存在,当然为了节省资源,我们在删除用户关系表时可以再查询一下其他用户是不是也有这首歌,如果都没有,我们就把音乐库中的音乐信息也一起删除了

    # 删除音乐def del_list(self, mname):# 查询要删除的音乐sql = "select * from t_music where music_name=%s"music =  DBUtil().query_one(sql,mname)# 删除用户关系表sql = 'delete from t_list where mid=%s and uid=%s'DBUtil().exeDML(sql, music[0], self.user[0])sql = 'select mid from t_list where mid=%s'mid = DBUtil().query_one(sql,music[0])print('删除',mid) if mid == None:print('已无用户拥有这首歌,删除音乐表中该音乐')sql = 'delete from t_music where id=%s'DBUtil().exeDML(sql, music[0])

删除完音乐后,是不是还少个功能呢,那就是刷新列表,让用户知道自己刚才那首歌已经删除了,也就是再调用一次insert_mname()方法,这就是代码复用的好处

播放音乐

终于到最后一个功能啦,播放音乐我们需要引入一个新的库,那就是pygame,大家都知道pygame可以用来做游戏,我就曾经用pygame写过一个坦克大战的小游戏,那如今再用pygame,可不是为了做游戏,而是为了调用它里面的音乐播放方法
pygame.mixer.music.load(),需要我们传入文件路径,才能调用播放,所以这里还要再调用之前获取音乐名的方法,不过我好像没有把那段代码单独封装一下,所以这里就把他单独封装一下
PlayWinow类

   def get_mname(self):# 获取音乐列表的选中的索引insert = self.label01.curselection()# 获取音乐名mname = self.label01.get(insert)return mname

接下来就是

    # 播放音乐def play_music(self,event):print('播放音乐')# 查询选中音乐名字mname = self.get_mname()# 查询音乐地址self.myserbise.play_music(mname)

下一个就是MyService类中真正的播放方法

    # 播放音乐def play_music(self,mname):# 查询音乐路径sql = 'select path from t_music where music_name=%s'path = DBUtil().query_one(sql, mname)print(path)# 播放音乐pygame.mixer.init()pygame.mixer.music.load(path[0])pygame.mixer.music.play()

到这里我们的程序基本写完了,接下来就是将代码里多余的代码封装后去掉,实现模块化,简化代码

代码

PlayWindow类

from MyService import MyService
import tkinter
from tkinter.filedialog import askopenfilenamesclass PlayWindow:def __init__(self, myserbise):self.myserbise = myserbise# 用户登录成功显示界面def showWindow(self):# 主窗口显示top = tkinter.Tk()top.title('音乐播放插件')# 组件插入self.createWidget(top)# 将音乐名插入到label01上self.insert_mname()top.mainloop()def createWidget(self,top):# 按扭设置btn01 = tkinter.Button(top, text='播放音乐')btn02 = tkinter.Button(top, text='导入音乐')btn03 = tkinter.Button(top, text='删除音乐')btn01.grid(row=0, column=0, padx=3)btn02.grid(row=0, column=3, padx=3)btn03.grid(row=0, column=6, padx=3)# 音乐列表self.label01 = tkinter.Listbox(top)self.label01.grid(row=1, column=0, columnspan=10)# 事件方法btn01.bind('<Button-1>', self.play_music)btn02.bind('<Button-1>', self.import_music)btn03.bind('<Button-1>', self.del_music)# 插入音乐名至列表def insert_mname(self):self.label01.delete(0,tkinter.END)music_name = self.myserbise.find_mname()for mname in music_name:self.label01.insert(tkinter.END, mname)def get_mname(self):# 获取音乐列表的选中的索引insert = self.label01.curselection()# 获取音乐名mname = self.label01.get(insert)return mname# 播放音乐def play_music(self,event):print('播放音乐')# 查询选中音乐名字mname = self.get_mname()# 查询音乐地址self.myserbise.play_music(mname)# 导入音乐def import_music(self,event):print('导入音乐')music_file = askopenfilenames(title='导入的音乐',initialdir='D:\music_file\cloud_music',filetypes=[("音乐文件",".mp3")])# 将音乐名及路径存入数据库self.myserbise.add_music(music_file)# 导入音乐后更新音乐列表self.insert_mname()# 删除音乐def del_music(self,event):try:print('删除音乐')# 查询选中音乐名字mname = self.get_mname()# 从关系表中删除用户与音乐行self.myserbise.del_list(mname)# 导入音乐后更新音乐列表self.insert_mname()except:print('没有选择项')if __name__ == '__main__':uname = input('请输入用户名:')password = input('请输入密码:')myserbise = MyService()playwindow = PlayWindow(myserbise)# 判断用户是否存在if myserbise.login(uname,password):print('登录成功')# 进行用户界面playwindow.showWindow()else:print('登录失败')

MyService类

from dbutil import DBUtil
import pygame
class MyService:def __init__(self):self.user = None# 用户登录def login(self,uname,password):sql = 'select * from t_user where uname=%s and password=%s'self.user = DBUtil().query_one(sql,uname,password)if self.user:return Trueelse:return False    # 查询音乐iddef music_id(self,music_name):sql = "select * from t_music where music_name=%s"return DBUtil().query_one(sql,music_name)# 扫描t_music,将音乐名全部导出def find_mname(self):sql = "select m.music_name from t_music m,t_list t where m.id=t.mid and t.uid=%s"return DBUtil().query_all(sql,self.user[0])# 播放音乐def play_music(self,mname):# 查询音乐路径sql = 'select path from t_music where music_name=%s'path = DBUtil().query_one(sql, mname)print(path)# 播放音乐pygame.mixer.init()pygame.mixer.music.load(path[0])pygame.mixer.music.play()# 加入音乐def add_music(self,files):# print('123')print(files)for f in files:start = f.rfind('/')+1end = f.rfind('.mp3')music_name = f[start:end]path = f# sql = "select * from t_music where music_name=%s"# music = DBUtil().query_one(sql,music_name)music = self.music_id(music_name)if music:print('音乐库已经有这首歌啦')sql = 'select * from t_list where mid=%s and uid=%s't_list = DBUtil().query_one(sql, music[0], self.user[0])if not t_list:print('该用户还没有这首歌')sql = 'insert into t_list(mid,uid) values(%s,%s)'DBUtil().exeDML(sql, music[0], self.user[0])else:# 导入音乐库没有的音乐print('音乐库里没有这首歌,写入开始')sql = 'insert into t_music(music_name,path) values(%s,%s)'DBUtil().exeDML(sql,music_name,path)print('写入结束,开始写入关系表')# 导入关系表,用户添加记录music = self.music_id(music_name)sql = 'insert into t_list(mid,uid) values(%s,%s)'DBUtil().exeDML(sql, music[0], self.user[0])print('结束')print('结束 ') # 删除音乐def del_list(self, mname):# 查询要删除的音乐music = self.music_id(mname)# 删除用户关系表sql = 'delete from t_list where mid=%s and uid=%s'DBUtil().exeDML(sql, music[0], self.user[0])sql = 'select mid from t_list where mid=%s'mid = DBUtil().query_one(sql,music[0])print('删除',mid) if mid == None:print('已无用户拥有这首歌,删除音乐表中该音乐')sql = 'delete from t_music where id=%s'DBUtil().exeDML(sql, music[0])

DBUtil类

import pymysql
class DBUtil:config={'host': 'localhost','user': 'root','password': 'root','db': 'play_music_test','charset': 'utf8'}def __init__(self):self.connection = pymysql.connect(**DBUtil.config)self.cursor = self.connection.cursor()def close_file(self):if self.cursor:self.cursor.close()if self.connection:self.connection.close()# 插入 修改 删除调用def exeDML(self,sql,*args):try:# 执行sqlcount = self.cursor.execute(sql,args)# 提交事务self.connection.commit()return countexcept Exception as e:print(e)if self.connection:self.connection.rollback()finally:self.close_file()# 单句查询def query_one(self,sql,*args):try:# 执行sqlself.cursor.execute(sql,args)# 获取结果集return self.cursor.fetchone()except Exception as e:print(e)finally:self.close_file()# 多句查询def query_all(self,sql,*args):try:# 执行sqlself.cursor.execute(sql,args)# 获取结果集return self.cursor.fetchall()except Exception as e:print(e)finally:self.close_file()if __name__ == '__main__':dbutil = DBUtil()# sql = 'insert into emp (empno, ename, sal)values(%s,%s,%s)'# count = dbutil.exeDML(sql,9999,'xiaoxiao',12000)# print(count)# sql = 'select * from emp where empno=%s'# emp = dbutil.query_one(sql,7788)# print(emp)sql = 'select * from emp'emps = dbutil.query_all(sql)for e in emps:print(e, end='\n')

结果

我们需要注意自己写的.py文件当第三方库存入,最后是放在一个工作文件夹下,不然调用可能会出错。

我们登录成功后,效果如下,这时我们就可以进行一些相应的操作,真的和播放器差不多,就是丑了点,简单了点,功能少了点,哈哈哈

总结

音乐播放器告一段落了,后续还要更加努力的学习更多知识,将其更好的应用出来,在这个项目中,最大的收获不是学到了什么,而是不断解决代码bug的快乐感,还有刚开始对项目一些逻辑关系理解错了,想了许久,一步一步探索,解决问题,这样才是最好的,这也是我花一晚上写了这篇文章的原因,这真的很有成就感,哈哈哈,15211了,手快酸了,该休息啦
不过文章写得不够好,感觉太多赘余了,各位大佬不喜勿喷哈,但要是有发现我有哪些地方写错了,或者是哪些地方理解不好,请不要手软,一起加油!!!

简单应用MySQL的音乐播放器小项目相关推荐

  1. (附源码)springboot音乐播放器小程序 毕业设计 170900

    Springboot音乐播放器小程序 摘 要 本文设计了一种音乐播放器小程序,系统为人们提供了方便快捷.即用即搜的音乐搜索播放服务,包括音乐资讯.音乐搜索.新歌榜单.注册登录.论坛发表等,用户不仅能够 ...

  2. (附源码)小程序 音乐播放器小程序 毕业设计 170900

    Springboot音乐播放器小程序 摘 要 本文设计了一种音乐播放器小程序,系统为人们提供了方便快捷.即用即搜的音乐搜索播放服务,包括音乐资讯.音乐搜索.新歌榜单.注册登录.论坛发表等,用户不仅能够 ...

  3. Vue实现仿音乐播放器3-将项目托管到git以及github

    Github新建项目 1.登录github,点击右上角新建仓库 2.输入仓库名以及描述等,点击Create resposity 3.新建仓库完成后,右边有个clone or download,复制SS ...

  4. 树莓派瞎折腾[1]-实现简单的命令行音乐播放器

    声明: 树莓派采用树莓派3B. 音乐源来自网易云音乐. 正文: 根据整个树莓派折腾的经历,该项目主要沿着如下的路线递进:听歌->在线听歌->在线自由听歌->远程操控树莓派播放. 首先 ...

  5. springboot +uniapp 音乐播放器 小程序+app

    加qq:1576634877 获取源码 音乐播放器主要包括: 后台管理系统+uniapp小程序或app,后台上传音乐,mv,app播放 主要技术: springboot+mybatis+mysql+s ...

  6. 计算机实战项目、毕业设计、课程设计之含论文+辩论PPT+源码等]微信小程序音乐播放器小程序+后台管理系统

    音乐播放器平台+后台管理系统|前后分离VUE>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序前台和Java做的后台管理系统,该后台采用前后台前后分离 ...

  7. HTML:给自己设计一个简单的专属网页音乐播放器

    Hello,大家好,我是wangzirui32,今天我们来学习如何给自己设计一个简单的网页音乐播放器. 开始学习吧! 学习目录 1. 项目架构 2. player.html 编写 3. style.c ...

  8. H5音乐播放器(小清新版)

    你是否因为需要一个网页音乐播放器而苦苦翻阅百度?而且你搜索到的播放器无论在UI交互还是功能方面都差强人意?也许你曾用过网易云或者QQ音乐等网页插件,但还是发现有一些问题,比如:不能展示歌词,不能维护自 ...

  9. 后端实体类接收数组_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目...

    项目名称:vue-fds_music 项目作者:符道胜 开源许可协议:Apache-2.0 项目地址:https://gitee.com/fudaosheng/vue-fds_music 项目简介 V ...

最新文章

  1. 多实例gpu_MIG技术快速提高AI生产率
  2. 全网最详细的Windows里Anaconda-Navigator启动后闪退的解决方案(图文详解)
  3. java 发送附件_Java 基于javaMail的邮件发送(支持附件)
  4. JTextField类(单行文本框)/JPasswordFiel(密码框)/JTextArea(多行文本框)常用方法
  5. windows使用git时出现:warning: LF will be replaced by CR
  6. 对于一些作用域自己的理解,望能帮助某人
  7. 链表的简单操作-----删除,添加,查找(Xcode)
  8. 在ubuntu 16.04中安装source insight 4.0破解版
  9. Matt Speake
  10. matlab 2018 ccs,Matlab2018a 与ccs7生成tms320F2812代码调试记录
  11. [POJ2406]字符串的幂
  12. WEB前端性能优化及应用服务器性能优化和存储性能优化
  13. 第一行代码(Android)第二版PDF和源码
  14. 从pdf简历中提取信息——BiLSTM-CRF
  15. 排列组合数计算公式及性质
  16. 电脑服务器删除的文件如何复原,电脑怎么恢复文件_彻底删除的文件如何恢复...
  17. Express中Router的使用
  18. 微信公众号申请流程整理
  19. 通俗易懂的Kafka零拷贝机制
  20. Matlab中图像剪裁命令——imcrop()

热门文章

  1. nodejs 安装node-sass
  2. 计算机公式怎么计算合计,word中如何实现表格自动求和等公式运算
  3. moble slider
  4. c++各类变量的生存周期、初始化和消亡顺序(复合、委托、构造)
  5. 山寨版360安全卫士 腾讯电脑管家开源(.NET实现)
  6. 清除字符串中所有空格
  7. Scratch(四十二):飞行猫
  8. LaTeX系列|1、LaTeX中表格过宽解决方案
  9. 老文新看:一口气说透中台--给你架构师的视角
  10. 怎么开启MIUI9系统的Root权限