使用微信小程序实现个人音乐播放平台

 

一,效果展示

微信音乐小程序开发实践_微信音乐小程序开发           微信音乐小程序开发实践_微信音乐小程序开发_02          微信音乐小程序开发实践_微信音乐小程序开发_03        微信音乐小程序开发实践_微信音乐小程序开发_04

二,实现的功能

1,音乐播放,暂停,切换,歌词同步展示。

2,音乐收藏,根据搜索和播放历史推荐,播放排行榜展示。

 

三,数据库设计

1,基于功能需求,设计概念模型

微信音乐小程序开发实践_微信音乐小程序开发_05

2,概念模型向逻辑关系模型转化

转化的一般原则:

1) 一个1:1联系可以转换为一个独立的关系模式,也可以与任意的一端对应的关系模式合并。

2)一个1:n的联系可以转换为一个独立的关系模式,也可以与n端对应的关系模式合并。

3) 一个n:m联系转化为一个关系模式,与该联系相连的各实体的码以及联系本身的属性均转换为关系的属性。

4)具有相同码的关系模式合并。

为避免关系模式出现以下问题:数据冗余,更新异常,插入异常,删除异常等。关系模式需要符合一些基本的条件。

1) 每一个分量必须是不可分割的数据项(1NF)

2) 且,每一个非主属性完全依赖于任何一个候选码(2NF)

3) 且每一个决定因素都包含码(BCNF)

转换结果如下:

微信音乐小程序开发实践_微信音乐小程序开发_06

 

四,实际开发总结

一)提取音乐信息

后台语言使用nodejs,使用jsmediatags模块提取音乐封面,歌手,专辑等信息。

二)歌词编码类型转换

nodejs读取非utf8编码类型的歌词出现乱码,需要把gb2312的歌词转换成utf8格式。

使用.net core读取音乐文件夹,生成音乐资源脚本文件(sql),并把编码格式gb2312歌词文件转换成utf8格式。

微信音乐小程序开发实践_微信音乐小程序开发_07微信音乐小程序开发实践_微信音乐小程序开发_08

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)主键开始idstring 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();
        }
   
    }

  


}

View Code

 

五,体验小程序

微信搜索 :DB小阳光

登录小程序后,发送token至电子邮箱353227876@qq.com

代码已在Gitee开源。

感谢阅读。