MyKtv项目  S1293 安孟阳    指导老师 :原玉明

 

  My ktv 项目需要实现的功能有:

显示点歌模式(歌手点歌、分类点歌、拼音点歌、排行榜、字数点歌),显示示系统功能(当前播放、下一首、重唱、切歌、播放列表、服务、退出)。

1.1.1. KTV主界面

显示点歌模式(歌手点歌、分类点歌、拼音点歌、排行榜、字数点歌),显示示系统功能(当前播放、下一首、重唱、切歌、播放列表、服务、退出)。

1.1.2. 歌手点歌

首先选择歌手性别(男、女、组合),然后显示歌手分类(大陆、香港、台湾、欧美、日韩),选择一个歌手分类,显示这个分类下的所选性别的所有歌手的名字和照片。选择一个歌手,列表显示该名歌手的所遇歌曲,点击一首歌曲,可以进行点播,并把歌曲添加到播放列表中。

1.1.3. 拼音点歌

输入歌曲的名称或歌曲的拼音,点击查找,可以进行模糊查询,并列表显示查询到的歌曲信息(歌曲名、歌手),点击一首歌曲,可以进行点播,并把歌曲添加到播放列表中。

1.1.4. 分类点歌

提供歌曲的分类列表(热门流行、经典老歌、影视金曲、游戏动漫、戏曲、儿歌),选择其中过一个,在窗口中显示这个分类下的所有歌曲。点击一首歌曲,可以进行点播,并把歌曲添加到播放列表中。

1.1.5. 排行榜点歌

将歌曲按点播过的次数,降序排列,作为点播排行榜,在排行榜中显示歌曲的名称和歌手姓名,点击一首歌曲,可以进行点播,并把歌曲添加到播放列表中。

1.1.6. 字数点歌

可以按歌曲名的字数点播(1个字、2个字、3个字等,最多12个字),在查找的歌曲列表中显示歌曲的名称和歌手姓名,点击一首歌曲,可以进行点播,并把歌曲添加到播放列表中。

1.2.  歌曲播放

1.2.1. 播放歌曲

在播放窗口中依次播放点播的歌曲。

1.2.2. 已点歌曲

在窗口中显示已歌曲的列表,列表中显示歌曲的名称、播放状态(已播放、未播放)。

1.2.3. 重播

提供重播功能,点击“重播”按钮,可以重复播放当前正在播放的歌曲。

1.2.4. 切歌

提供切歌功能,如果没有选择播放列表中的歌曲而点击“切歌”按钮,就删除当前播放的歌曲,继续播放下一首。如果选择了播放列表中的一首歌曲,点击“切歌”按钮,就删除选中的歌曲。

1.3.  后台管理

1.3.1. 登录

系统管理员可以登录后台管理系统,管理歌手信息、歌曲信息。必须输入正确的用户名和密码才能登录。

1.3.2. 添加歌手

在一个窗口中,填写歌手的姓名、选择性别、歌手分类、填写歌手描述、选择歌手照片,将歌手信息添加到数据库中。

1.3.3. 查询歌手

在一个窗口中,通过歌手姓名或歌手分类进行查找,在窗口中显示歌手的列表。显示的信息包括:歌手姓名、歌手类别、歌手性别、歌手描述。

1.3.4. 修改歌手信息

在查询到的歌手中,点击鼠标右键,选择“修改”,打开修改信息窗口,在窗口中显示歌手的当前信息(歌手的姓名、性别、分类、歌手描述、歌手照片),修改后,点击“修改”按钮,把修改后的信息保存到数据库。

1.3.5. 删除歌手信息

在查询到的歌手中,点击鼠标右键,选择“删除”,将歌手从数据库中删除。

 

以下主要分析

点歌

首先要实现的便是放歌功能只有能够放歌,才会有其他功能要实现的作用

1:我们要对数据库中所有的歌曲以及所对应的歌手进行查询,

这个时候便要创建一个查询窗体,将查询的内容打印到小窗体上:

如下图:

 

2:当查询完成后,便要将我们想要听的歌曲给便利到一个数组当中

 

将选中的歌曲对象加入到playlist类中

的数组songs.

那么我们便要创建个类名称为PlayList

  class Playlist

    {   //定义一个长度为50的数组

        public static Song[] songlist = new Song[50];

        public static int songIndex = 0;//当前播放的歌曲在数组中的索引

        //没点击一次歌曲时,便是将歌曲对象放在数组中

        public static bool addsong(Song song)

        {

            bool success = false;//记录添加歌曲是否成功

            for (int i = 0; i < songlist.Length; i++)

            {//找到数组第一个为null的位置2

                if (songlist[i] == null)

                {

                    songlist[i] = song;

 

                    success = true;

                    break;

                }

            }

            return success;

        }

 

        //获取当前播放的窗体返回值是song类型

        public static Song GetPlaysSong()

        {

            if (songlist[songIndex] != null )

            {

                return songlist[songIndex];

            }

            else

            {

                return null;

            }

        }

        //播放下一首

        public static void Moveon()

        {

 

            if (songlist[songIndex] != null && songlist[songIndex].PlayState == SongplayState.again)

            {

                songlist[songIndex].setplayagaun();

            }

            else

            {

                songIndex++;

            }

切歌功能:

当我们点击切歌按钮时,变会播放下一首歌曲

 

       

        }

    }

在这个类中我们要保存的是数组有二个方法

3:我们查询出的结果添加到数组当中;定义一个索引名称为index

它用来说明当前播放的歌曲在数组当中的位置

4:

5:定义一个Timer空间将Enabled属性改为ture,意思是可用状态

用来记录现在没有播放歌曲时,我们便获取到歌曲路径进行播放和当前歌曲播放完成后,进行下一手歌曲的播放

  if (song == null)

            {

                PlaySong();

            }

            if (playan.playState ==WMPLib.WMPPlayState.wmppsStopped)//播放器为停止状态

            {

                song = null;

                Playlist.Moveon();//继续播放下一首

            }

 

6:当我们点完歌曲后,便要将其状态也要发生改变

正在播放的便将状态改为已播放,未播放的状态改为未播放

代码在查询窗体中写如下:

 

        private void Bofangzt()//播放歌曲的状态

        {

            lvlist.Items.Clear();//清空原列表

            for (int i = 0; i <Playlist.songlist.Length; i++)//小于数组的长度

            {

                if (Playlist.songlist[i]!=null)

                {

                    ListViewItem item = new ListViewItem();

                    item.Text = Playlist.songlist[i].songName;

                    item.Tag = i;

                    string playStste = Playlist.songlist[i].playState == SongplayState.unplayed ? "未播放" : "已播放";

                    item.SubItems.Add(playStste);

                    lvlist.Items.Add(item);

         }

            }

   }

这变可用将状态进行改变了

切歌功能:我们需要将歌曲的状态进行改变,当点击切歌按钮时,自动切换下一首歌曲

我们可以再playlist类中邪一个切歌的方法:

public static void bofang1()

       {

          

           if (FrmMain.song != null)

           {

 

               FrmMain.song = null;//歌曲为空

 

               Playlist.Moveon();//继续播放下一首了

           }

       }

按钮调用该方法便可以进行切歌的操作

重唱也是改变歌曲的状态,

public static void chongchuang()

       {

 

 

           FrmMain.song.setplayagain();

           if (FrmMain.song != null && FrmMain.song.playState == SongplayState.again)

           {

               FrmMain.song = null;

           }

       }

使用与上面方法一样

已点列表当用户点击已点列表按钮时,自动跳转到已点窗口

 

在已点列表的DGV控件我们要做的便是在click中

/创建一个对象来保持歌曲路径和歌曲名字

            Song song = new Song();

            song.SongName = dgvgequ.SelectedRows[0].Cells["SongName"].Value.ToString();//songname是lvtgequ中的名称

            song.SongURl = dgvgequ.SelectedRows[0].Cells["SongURl"].Value.ToString();//songurl是歌曲的路径

            //将选择的歌曲放在数组中

            Playlist.addsong(song);

当我们每点击一个按钮变自动增加到已点列表和并且获取到他的状态

类型选择点歌

 

 

在类型选择点歌中,想要实现如上的效果我们要用到二种控件

Picturebox和label或者用listview控件均可实现上面效果

我们每点击一次歌曲,便调用一次已点列表,并将所点击控件的歌曲添加到已点列表

只要调用已点列表,更改where控件便可实现

拼音点歌

 

用户在文本控件输入歌曲的缩写, 便可以进行查询了

查询完成后,点击歌曲添加到播放列表

SqlConnection con = new SqlConnection(Sqlhelper.str);

            DataSet ds = new DataSet();

            //Select             Singer_name,song_name from singer_info,song_info where Song_ab like '%" + txtsx.Text + "%'

          

            string sql = "select song_name,Singer_name,Song_url from singer_info,song_info where singer_info.singer_id=song_info.singer_id ";

            SqlDataAdapter da = new SqlDataAdapter(sql, con);

            da.Fill(ds, "SONG_INFO");

            this.dgvgequ.DataSource = ds.Tables["SONG_INFO"];

字数点歌

 

在这里我用的一张图片,运用代码将10个控件添加到窗体中,并对其位置,隐藏添加的文字

当用户点击上面数字时便可以查询到对应数字的歌曲,以及进行播放

   int num1 = 1;

        private void Form1_Load(object sender, EventArgs e)

        {

 

            int num2 = 1;//用来显示字数

            for (int i = 0; i <2; i++)

            { 

                for (int j = 0; j <4; j++)

                {

                

                    Label label = new Label();

                   

                    num2++;

                    label.Tag = num1;

                    num1++;

                   

                   label.Size = new Size(60, 60);

                   label.Location = new Point(60+(150)*j, 80+(125)*i);

                    label.BackColor=Color.Transparent;

                

                    this.Controls.Add(label);

                    label.Click += label_Click;

                }

                Console.ReadLine();

                 

            }

          前台便是这些功能,

Ktv后台运用`

   我在主页面下的Toolstrip控件中添加了一个管理员登陆按钮

当点击按钮时便可以展现出登陆页面

 

 

登陆成功之后便进入了后台主页面

 

 

这个功能很简单,

当我们点击歌手管理后,下面会有二个子菜单一个是添加歌手一个是查询歌手

 

 

 

private void Frmgeshou_Load(object sender, EventArgs e)

        {

         

           chaaddress();//查询歌手的地区

          

        }

 

        private void chaaddress()

        {

            SqlConnection con = new SqlConnection(Sqlhelper.str);

            string sql = "select singertype_name from singer_type ";

            SqlCommand cmd = new SqlCommand(sql, con);

            try

            {

                con.Open();

                SqlDataReader dr = cmd.ExecuteReader();

                if (dr != null)

                {

                    if (dr.HasRows)

                    {

                       while(dr.Read())

                        {

                            string address = dr["singertype_name"].ToString();

                            cmbaddresss.Items.Add(address);

                           

                        }

                       dr.Close();

                       cmbaddresss.SelectedIndex = 0;

                       

                    }

                  

                }

            }

            catch (Exception ex)

            {

 

                MessageBox.Show("连接失败",ex.Message);

            }

            finally {

                con.Close();

            }

 

           这些代码主要作用是将数据库中歌手的type拉到下拉框,供用户进行选择

 

public void xinzeng()

        {

            SqlConnection con = new SqlConnection(Sqlhelper.str);

            //新增歌手的姓名性别地区和照片组合

            //singer_name, singertype_id, singer_sex, singer_photo_url, Singer_miaoshu

            string name = txtname.Text;

            string gender = string.Empty;

            if (rbtnan.Checked)

            {

 

                gender = "男";

            }

            else if (rbtnv.Checked)

            {

                gender = "女";

            }

            else

            {

                gender = "组合";

            }

            //string类型的addressname于窗口中相应的文本关联,

            //i在数据库中增加的是id所以要查询id并返回

            string addressname=cmbaddresss.Text;

            int address = singertype_idByName(addressname);//insert

            string miaoshu = txtmiaosu.Text;

            //singer_id, singer_name, singertype_id, singer_sex, singer_photo_url, Singer_miaoshu

      

            string sql = "insert into singer_info values ('"+name+"',"+address+",'"+gender+"','"+Pasd+"','"+miaoshu+"')  ";

            SqlCommand cmd = new SqlCommand(sql, con);

            try

            {

                con.Open();

                int count = cmd.ExecuteNonQuery();

                if (count>0)

                {

                    MessageBox.Show("添加成功");

 

                }

            }

            catch (Exception ex)

            {

 

                MessageBox.Show("连接失败", ex.Message);

            }

            finally

            {

                con.Close();

 

            }

       

        }

        private void chaxunzuhe()

        {

 

       

       

        }

 

 

        private int singertype_idByName(string name)

        {

            SqlConnection con = new SqlConnection(Sqlhelper.str);

            string sql = "select singertype_id from singer_type where singertype_name='" + name + "'";

            SqlCommand cmd = new SqlCommand(sql, con);

            con.Open();

            int gradeid = Convert.ToInt32(cmd.ExecuteScalar());

            con.Close();

            return gradeid; //返回gradeid  int 类型

        }

 

       

 

        private void textBox1_TextChanged(object sender, EventArgs e)

        {

 

        }

 

        private void button1_Click(object sender, EventArgs e)

        {

            openFileDialog1.ShowDialog();

 

        }

         string Pasd;

 

        private void openFileDialog1_FileOk(object sender, CancelEventArgs e)

        {

            Pasd = openFileDialog1.SafeFileName;

            pictureBox1.Image = Image.FromFile(openFileDialog1.FileName);

 

        }

这些代码主要将歌手的所有信息添加到数据库中

搜索歌手信息和歌曲便是对数据库进行连接查询

设置资源路径

 

 

当前路基是搜索数据库中我们在path中所添加的歌曲路径

新路径浏览是打开本地磁盘,进行浏览

而最重要的修改水平有限,没做出来

在KTV整个项目中有很多遗漏的有BUG的,这些都是平常没学好,