使用微信小程序实现我的音乐播放平台node
一,效果展现git
二,实现的功能github
1,音乐播放,暂停,切换,歌词同步展现。sql
2,音乐收藏,根据搜索和播放历史推荐,播放排行榜展现。数据库
三,数据库设计小程序
1,基于功能需求,设计概念模型微信小程序
2,概念模型向逻辑关系模型转化微信
转化的通常原则:数据库设计
1) 一个1:1联系能够转换为一个独立的关系模式,也能够与任意的一端对应的关系模式合并。ide
2)一个1:n的联系能够转换为一个独立的关系模式,也能够与n端对应的关系模式合并。
3) 一个n:m联系转化为一个关系模式,与该联系相连的各实体的码以及联系自己的属性均转换为关系的属性。
4)具备相同码的关系模式合并。
为避免关系模式出现如下问题:数据冗余,更新异常,插入异常,删除异常等。关系模式须要符合一些基本的条件。
1) 每个份量必须是不可分割的数据项(1NF)
2) 且,每个非主属性彻底依赖于任何一个候选码(2NF)
3) 且每个决定因素都包含码(BCNF)
转换结果以下:
四,实际开发总结
一)提取音乐信息
后台语言使用nodejs,使用jsmediatags模块提取音乐封面,歌手,专辑等信息。
二)歌词编码类型转换
nodejs读取非utf8编码类型的歌词出现乱码,须要把gb2312的歌词转换成utf8格式。
使用.net core读取音乐文件夹,生成音乐资源脚本文件(sql),并把编码格式gb2312歌词文件转换成utf8格式。
using System; using System.IO; using System.Text; namespace readmysic { class Program { //生成音乐sql脚本 static void Main(string[] args) { // string path = "G:\\ftpmusic"; // string path2 = "G:\\已上传\\"; string path = "G:\\ftpmusic"; //本地音乐文件路径 int musicid = 1;//插入数据库表(music)主键开始id string sql = ""; DirectoryInfo filepath = new DirectoryInfo(path); FileInfo[] files = filepath.GetFiles(); foreach(FileInfo f in files){ string tex = f.Extension; string name = f.Name; if(tex == ".mp3"){ string temp = name.Split('.')[0]; string title = ""; string songer = ""; if(temp.IndexOf('-') > 0){ songer = temp.Split('-')[0]; title = temp.Split('-')[1]; }else{ title = temp; } string temsql = "insert into music(id,name,title,songer,totalPlay) VALUES ({0},'{1}','{2}','{3}',0);\n"; temsql = string.Format(temsql,musicid,name,title,songer); sql+=temsql; musicid++; } //删除重复文件 /* string filetem = path2 + name; if(File.Exists(filetem)){ Console.WriteLine(name); File.Delete(filetem); } */ //编码格式转换 if(f.Extension == ".lrc"){ FileStream fs = new FileStream(f.FullName,FileMode.Open); Encoding tr = GetType(fs); Console.WriteLine(name+tr.BodyName); if(tr.BodyName == "gb2312"){ gb2312toutf8(f.FullName); } } } Console.Write(sql); string sqlname = "G:\\ftpmusic\\temsql.txt";//生成的脚本文件地址 Writesql(sqlname,sql); } /// <summary> /// 给定文件的路径,读取文件的二进制数据,判断文件的编码类型 /// </summary> /// <param name="FILE_NAME">文件路径</param> /// <returns>文件的编码类型</returns> public static System.Text.Encoding GetType(string FILE_NAME) { FileStream fs = new FileStream(FILE_NAME, FileMode.Open, FileAccess.Read); Encoding r = GetType(fs); fs.Close(); return r; } /// <summary> /// 经过给定的文件流,判断文件的编码类型 /// </summary> /// <param name="fs">文件流</param> /// <returns>文件的编码类型</returns> public static System.Text.Encoding GetType(FileStream fs) { byte[] Unicode = new byte[] { 0xFF, 0xFE, 0x41 }; byte[] UnicodeBIG = new byte[] { 0xFE, 0xFF, 0x00 }; byte[] UTF8 = new byte[] { 0xEF, 0xBB, 0xBF }; //带BOM Encoding reVal = Encoding.Default; BinaryReader r = new BinaryReader(fs, System.Text.Encoding.Default); int i; int.TryParse(fs.Length.ToString(), out i); byte[] ss = r.ReadBytes(i); if (IsUTF8Bytes(ss) || (ss[0] == 0xEF && ss[1] == 0xBB && ss[2] == 0xBF)) { reVal = Encoding.UTF8; } else if (ss[0] == 0xFE && ss[1] == 0xFF && ss[2] == 0x00) { reVal = Encoding.BigEndianUnicode; } else if (ss[0] == 0xFF && ss[1] == 0xFE && ss[2] == 0x41) { reVal = Encoding.Unicode; } else if(ss[0] == 91 && ss[1] == 116 && ss[2] == 105){ System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance); reVal = Encoding.GetEncoding("GB2312"); } r.Close(); return reVal; } /// <summary> /// 判断是不是不带 BOM 的 UTF8 格式 /// </summary> /// <param name="data"></param> /// <returns></returns> private static bool IsUTF8Bytes(byte[] data) { int charByteCounter = 1; //计算当前正分析的字符应还有的字节数 byte curByte; //当前分析的字节. for (int i = 0; i < data.Length; i++) { curByte = data[i]; if (charByteCounter == 1) { if (curByte >= 0x80) { //判断当前 while (((curByte <<= 1) & 0x80) != 0) { charByteCounter++; } //标记位首位若为非0 则至少以2个1开始 如:110XXXXX...........1111110X if (charByteCounter == 1 || charByteCounter > 6) { return false; } } } else { //如果UTF-8 此时第一位必须为1 if ((curByte & 0xC0) != 0x80) { return false; } charByteCounter--; } } if (charByteCounter > 1) { throw new Exception("非预期的byte格式"); } return true; } /// <summary> /// 实现gb2312歌词转utf8 /// </summary> /// <param name="path">歌词路径</param> private static void gb2312toutf8(string path) { var data = File.ReadAllBytes(path); System.Text.Encoding.RegisterProvider (System.Text.CodePagesEncodingProvider.Instance); data = Encoding.UTF8.GetBytes(Encoding.GetEncoding("GB2312").GetString(data)); File.WriteAllBytes(path, data); } //生成脚本文件 public static void Writesql(string path,string sql) { FileStream fs = new FileStream(path, FileMode.Create); StreamWriter sw = new StreamWriter(fs); //开始写入 sw.Write(sql); //清空缓冲区 sw.Flush(); //关闭流 sw.Close(); fs.Close(); } } }
五,体验小程序
微信搜索 :DB小阳光
扫码体验:
登陆小程序后,发送token至电子邮箱353227876@qq.com
代码已在Gitee开源。
感谢阅读。