音乐播放器管理系统

音乐播放器管理系统

项目名称

音乐播放器管理系统

需求分析

在这里插入图片描述

需要完成的需求:

  • 身份验证
  • 管理用户
  • 管理音乐
  • 登录
  • 注册
  • 音乐播放器

页面规划

在这里插入图片描述

  • 9个窗口

    • 主界面窗口:管理员 用户

      • 管理员身份验证:登录 刷新 返回

        • 管理窗口:用户管理 音乐管理 注册 返回

          • 用户管理:分栏列表 查看 删除 返回

          • 音乐管理:分栏列表 查看 删除 增加 返回

          • 注册窗口:账号 文本框 密码 文本框 注册 刷新 返回

      • 用户登录:账号 文本框 密码 文本框 验证码 文本框 登录 刷新 注册 返回

        • 音乐播放器:播放/暂停 切歌 声音调节 切换用户
        • 注册窗口:账号 文本框 手机号 文本框 密码 文本框 注册 刷新 返回

流程规划

在这里插入图片描述

  • 9个窗口
    • 主界面窗口:管理员 用户
    • 点击主界面中的管理员按钮——跳转到管理员身份验证
      • 管理员身份验证:登录 刷新 返回
      • 点击管理员身份验证中的登录按钮——验证成功跳转到管理窗口
        • 管理窗口:用户管理 音乐管理 注册 返回
        • 点击管理窗口中的用户管理按钮——跳转到用户管理窗口
          • 用户管理:分栏列表 查看 删除 返回
        • 点击管理窗口中的音乐管理按钮——跳转到音乐管理窗口
          • 音乐管理:分栏列表 查看 删除 增加 返回
        • 点击管理窗口中的注册按钮——跳转到注册窗口
          • 注册窗口:账号 文本框 密码 文本框 注册 刷新 返回
        • 点击管理窗口中的返回按钮——跳转到主界面
      • 点击管理员身份验证中的登录按钮——验证失败还在当前页
      • 点击管理员身份验证中的返回按钮——跳转到主界面
    • 点击主界面的用户按钮——跳转到用户登陆界面
      • 用户登录界面:登录 刷新 注册 返回
        • 点击管理员身份验证中的登录按钮——验证成功跳转到音乐播放器
          • 音乐播放器:播放/暂停 切歌 声音调节 切换用户
        • 点击用户登录窗口中的注册按钮——跳转到注册窗口
          • 注册窗口:账号 文本框 手机号 文本框 密码 文本框 注册 刷新 返回
        • 点击管理员身份验证中的登录按钮——验证失败还在当前页
        • 点击管理员身份验证中的返回按钮——跳转到主界面

功能

  • 5个文件
    • main.c
      • 编写各种调用功能的主函数
    • login_dl.c
      • 编写窗口界面设计等
    • login_dl.h
      • 将login_dl.c中自定义的函数在此声明,定义全局变量
    • other.c
      • 编写数据库控制函数和回调函数的定义
    • other.h
      • 编写other.c中回调函数的声明

代码

main.c

#include <stdio.h>
#include <gtk/gtk.h>
#include <pthread.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <semaphore.h>
#include "login_dl.h"
#include "other.h"

int main(int argc, char *argv[])
{

	my_sql_init();				/* 数据库初始化 */
	
	gtk_init(&argc, &argv);		/* gtk环境初始化 */

	window_main_init();			/* 主界面初始化 */
	
	window_gl_logintest_init();	/* 管理员登录界面初始化 */
	window_gl_cd_init();		/* 管理员界面初始化 */
	window_gl_yh_init();		/* 用户管理界面初始化 */
	window_gl_music_init();		/* 音乐管理界面初始化 */
	window_gl_reg_init();		/* 管理员注册界面初始化 */

	window_yh_login_init();		/* 用户管理界面初始化 */
	window_yh_reg_init();		/* 用户注册界面初始化 */
	window_yh_music_init();		/* 音乐播放器界面初始化 */

	gtk_widget_show_all(window_main);

	g_signal_connect(window_main, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	
	mkfifo("cmd_fifo", 0777);	/* 创建有名管道*/

	/* 主事件循环:用户在这时可以操作窗口 */
	gtk_main();

	return 0;
}

login_dl.c

#include <stdio.h>
#include <gtk/gtk.h>
#include <glib.h>
#include <pthread.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <semaphore.h>
#include "login_dl.h"
#include "other.h"


/*********************** 界面初始化 *************************/

/* 主界面初始化 */
void window_main_init(void)
{
	/* 设置窗口 */
	window_main = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window_main), "欢迎使用哭够音乐播放器!");
	gtk_widget_set_size_request(window_main, 600, 450);	
	gtk_window_set_resizable(GTK_WINDOW(window_main), FALSE);
	gtk_window_set_position(GTK_WINDOW(window_main), GTK_WIN_POS_CENTER);
	gtk_container_set_border_width(GTK_CONTAINER(window_main), 15);
	chang_background(window_main, 600, 450, "./img/5.jpg");

	/* 设置布局 */
	GtkWidget *table = gtk_table_new(2, 2, TRUE);			/* 2行2列均衡排列 */
	gtk_container_add(GTK_CONTAINER(window_main), table);

	GtkWidget *vbox_manager = gtk_vbox_new(FALSE, 0);
	gtk_table_attach_defaults(GTK_TABLE(table), vbox_manager, 0, 1, 1, 2);
	GtkWidget *vbox_user = gtk_vbox_new(FALSE, 0);
	gtk_table_attach_defaults(GTK_TABLE(table), vbox_user, 1, 2, 1, 2);

	/* 设置控件 */
	// 标签
	GtkWidget *label = gtk_label_new("哭够音乐播放器系统");
	gtk_label_set_markup(GTK_LABEL(label), "<span foreground='white' font_desc='28'>哭够音乐播放器系统</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 2, 0, 1);

	// 管理员	
	GtkWidget *label_manager = gtk_label_new("管理员");
	gtk_label_set_markup(GTK_LABEL(label_manager), "<span foreground='#b73838' font_desc='16'>管理员</span>");
	gtk_container_add(GTK_CONTAINER(vbox_manager), label_manager);
	GtkWidget *manager = create_button_from_file("./img/manager/manager.png", 80, 80);
	gtk_container_add(GTK_CONTAINER(vbox_manager), manager);

	// 用户
	GtkWidget *label_user = gtk_label_new("用户");
	gtk_label_set_markup(GTK_LABEL(label_user), "<span foreground='#b73838' font_desc='16'>用户</span>");
	gtk_container_add(GTK_CONTAINER(vbox_user), label_user);
	GtkWidget *user = create_button_from_file("./img/manager/user.png", 80, 80);
	gtk_container_add(GTK_CONTAINER(vbox_user), user);

	/* 信号连接 */
	//g_signal_connect(window_main, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(manager, "pressed", G_CALLBACK(do_manager), NULL);
	g_signal_connect(user, "pressed", G_CALLBACK(do_user), NULL);
}

/* 管理员登录界面初始化 */
void window_gl_logintest_init(void)
{
	/* 设置窗口 */
	window_gl_logintest = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window_gl_logintest), "管理员你好!欢迎使用哭够音乐播放器!");
	gtk_widget_set_size_request(window_gl_logintest, 600, 450);
	gtk_window_set_resizable(GTK_WINDOW(window_gl_logintest), FALSE);
	gtk_window_set_position(GTK_WINDOW(window_gl_logintest), GTK_WIN_POS_CENTER);
	gtk_container_set_border_width(GTK_CONTAINER(window_gl_logintest), 15);
	chang_background(window_gl_logintest, 600, 450, "./img/5.jpg");

	/* 设置布局 */
	GtkWidget *table = gtk_table_new(4, 5, TRUE);	/* 4行5列均衡排列 */
	gtk_container_add(GTK_CONTAINER(window_gl_logintest), table);

	GtkWidget *hbox = gtk_hbox_new(TRUE, 0);
	gtk_table_attach_defaults(GTK_TABLE(table), hbox, 0, 5, 3, 4);

	GtkWidget *vbox_login = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_login);
	GtkWidget *vbox_refresh = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_refresh);
	GtkWidget *vbox_back = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_back);

	/* 设置控件 */
	// 标签 + 行编辑框
	GtkWidget *label_title = gtk_label_new("管理员身份验证");
	gtk_label_set_markup(GTK_LABEL(label_title), "<span foreground='white' font_desc='28'>管理员身份验证</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_title, 0, 5, 0, 1);

	GtkWidget *label_manager_login_name = gtk_label_new("账号:");
	gtk_label_set_markup(GTK_LABEL(label_manager_login_name), "<span foreground='white' font_desc='14'>账号:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_manager_login_name, 0, 1, 1, 2);
	entry_manager_logintest_name = gtk_entry_new();
	gtk_table_attach_defaults(GTK_TABLE(table), entry_manager_logintest_name, 1, 5, 1, 2);

	GtkWidget *label_manager_login_password = gtk_label_new("密码:");
	gtk_label_set_markup(GTK_LABEL(label_manager_login_password), "<span foreground='white' font_desc='14'>密码:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_manager_login_password, 0, 1, 2, 3);
	entry_manager_logintest_password = gtk_entry_new();
	gtk_table_attach_defaults(GTK_TABLE(table), entry_manager_logintest_password, 1, 5, 2, 3);

	// 登录
	GtkWidget *label_login = gtk_label_new("登录");
	gtk_label_set_markup(GTK_LABEL(label_login), "<span foreground='#b73838' font_desc='14'>登录</span>");
	gtk_container_add(GTK_CONTAINER(vbox_login), label_login);
	GtkWidget *login = create_button_from_file("./img/manager/login.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_login), login);

	// 刷新
	GtkWidget *label_refresh = gtk_label_new("刷新");
	gtk_label_set_markup(GTK_LABEL(label_refresh), "<span foreground='#b73838' font_desc='14'>刷新</span>");
	gtk_container_add(GTK_CONTAINER(vbox_refresh), label_refresh);
	GtkWidget *refresh = create_button_from_file("./img/manager/refresh.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_refresh), refresh);

	// 返回上级
	GtkWidget *label_back = gtk_label_new("返回上级");
	gtk_label_set_markup(GTK_LABEL(label_back), "<span foreground='#b73838' font_desc='14'>返回上级</span>");
	gtk_container_add(GTK_CONTAINER(vbox_back), label_back);
	GtkWidget *back = create_button_from_file("./img/manager/back.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_back), back);

	/* 信号连接 */
	g_signal_connect(window_gl_logintest, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(login, "pressed", G_CALLBACK(do_manager_logintest_id), NULL);
	g_signal_connect(refresh, "pressed", G_CALLBACK(do_manager_logintest_refresh), NULL);
	g_signal_connect(back, "pressed", G_CALLBACK(do_manager_logintest_back), NULL);
}

/* 管理员功能界面初始化 */
void window_gl_cd_init(void)
{
	/* 设置窗口 */
	window_gl_cd = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window_gl_cd), "管理员你好!欢迎使用哭够音乐播放器!");
	gtk_widget_set_size_request(window_gl_cd, 600, 450);	
	gtk_window_set_resizable(GTK_WINDOW(window_gl_cd), FALSE);
	gtk_window_set_position(GTK_WINDOW(window_gl_cd), GTK_WIN_POS_CENTER);
	gtk_container_set_border_width(GTK_CONTAINER(window_gl_cd), 15);
	chang_background(window_gl_cd, 600, 450, "./img/5.jpg");

	/* 设置布局 */
	GtkWidget *table = gtk_table_new(2, 4, TRUE);			/* 2行4列均衡排列 */
	gtk_container_add(GTK_CONTAINER(window_gl_cd), table);

	GtkWidget *vbox_db = gtk_vbox_new(FALSE, 0);
	gtk_table_attach_defaults(GTK_TABLE(table), vbox_db, 0, 1, 1, 2);
	GtkWidget *vbox_music = gtk_vbox_new(FALSE, 0);
	gtk_table_attach_defaults(GTK_TABLE(table), vbox_music, 1, 2, 1, 2);
	GtkWidget *vbox_enroll = gtk_vbox_new(FALSE, 0);
	gtk_table_attach_defaults(GTK_TABLE(table), vbox_enroll, 2, 3, 1, 2);
	GtkWidget *vbox_back = gtk_vbox_new(FALSE, 0);
	gtk_table_attach_defaults(GTK_TABLE(table), vbox_back, 3, 4, 1, 2);

	/* 设置控件 */
	// 标签
	GtkWidget *label = gtk_label_new("哭够音乐播放器管理员列表");
	gtk_label_set_markup(GTK_LABEL(label), "<span foreground='white' font_desc='28'>哭够音乐播放器管理员列表</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 4, 0, 1);

	// 用户管理
	GtkWidget *label_login = gtk_label_new("用户管理");
	gtk_label_set_markup(GTK_LABEL(label_login), "<span foreground='#b73838' font_desc='16'>用户管理</span>");
	gtk_container_add(GTK_CONTAINER(vbox_db), label_login);
	GtkWidget *button_user_db = create_button_from_file("./img/manager/用户管理.png", 80, 80);
	gtk_container_add(GTK_CONTAINER(vbox_db), button_user_db);

	//音乐管理
	GtkWidget *label_reg = gtk_label_new("音乐管理");
	gtk_label_set_markup(GTK_LABEL(label_reg), "<span foreground='#b73838' font_desc='16'>音乐管理</span>");
	gtk_container_add(GTK_CONTAINER(vbox_music), label_reg);
	GtkWidget *button_music_db = create_button_from_file("./img/manager/音乐.png", 80, 80);
	gtk_container_add(GTK_CONTAINER(vbox_music), button_music_db);

	// 管理员注册
	GtkWidget *label_enroll = gtk_label_new("管理员注册");
	gtk_label_set_markup(GTK_LABEL(label_enroll), "<span foreground='#b73838' font_desc='16'>管理员注册</span>");
	gtk_container_add(GTK_CONTAINER(vbox_enroll), label_enroll);
	GtkWidget *button_admin_enroll = create_button_from_file("./img/manager/reg.png", 80, 80);
	gtk_container_add(GTK_CONTAINER(vbox_enroll), button_admin_enroll);

	// 返回上级
	GtkWidget *label_back = gtk_label_new("返回上级");
	gtk_label_set_markup(GTK_LABEL(label_back), "<span foreground='#b73838' font_desc='16'>返回上级</span>");
	gtk_container_add(GTK_CONTAINER(vbox_back), label_back);
	GtkWidget *button_back = create_button_from_file("./img/manager/返回.png", 80, 80);
	gtk_container_add(GTK_CONTAINER(vbox_back), button_back);

	/* 信号连接 */
	g_signal_connect(window_gl_cd, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(button_user_db, "pressed", G_CALLBACK(do_manager_yh), NULL);
	g_signal_connect(button_music_db, "pressed", G_CALLBACK(do_manager_yy), NULL);
	g_signal_connect(button_admin_enroll, "pressed", G_CALLBACK(do_manager_reg), NULL);
	g_signal_connect(button_back, "pressed", G_CALLBACK(do_manager_back), NULL);
}

/* 用户管理界面初始化 */
void window_gl_yh_init(void)
{
	/* 设置窗口 */
	window_gl_yh = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window_gl_yh), "管理员你好!欢迎使用哭够音乐播放器!");
	gtk_widget_set_size_request(window_gl_yh, 600, 450);
	gtk_window_set_resizable(GTK_WINDOW(window_gl_yh), FALSE);
	gtk_window_set_position(GTK_WINDOW(window_gl_yh), GTK_WIN_POS_CENTER);
	//gtk_container_set_border_width(GTK_CONTAINER(window_gl_yh), 15);
	chang_background(window_gl_yh, 600, 450, "./img/5.jpg");

	/* 设置布局 */
	GtkWidget *table = gtk_table_new(3, 4, TRUE);	/* 3行4列均衡排列 */
	gtk_container_add(GTK_CONTAINER(window_gl_yh), table);

	/* 设置控件 */
	// 标签
	GtkWidget *label_title = gtk_label_new("用户管理");
	gtk_label_set_markup(GTK_LABEL(label_title), "<span foreground='white' font_desc='28'>用户管理</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_title, 0, 3, 0, 1);

	// 返回
	GtkWidget *c = gtk_button_new_with_label("返回");
	gtk_table_attach_defaults(GTK_TABLE(table), c, 3, 4, 0, 1);

	// 查看
	GtkWidget *b = gtk_button_new_with_label("查看");
	gtk_table_attach_defaults(GTK_TABLE(table), b, 3, 4, 1, 2);

	// 删除
	GtkWidget *a = gtk_button_new_with_label("删除");
	gtk_table_attach_defaults(GTK_TABLE(table), a, 3, 4, 2, 3);

	// 分栏列表
	gchar *title[3] = {"账号","手机号","密码"};
	gl_user = gtk_clist_new_with_titles(3, title);
	gtk_clist_set_column_width(GTK_CLIST(gl_user), 0, 150);						/* 设置第一列宽度 */
	gtk_clist_set_column_width(GTK_CLIST(gl_user), 1, 150);
	gtk_clist_set_column_width(GTK_CLIST(gl_user), 2, 150);
	//gtk_clist_set_column_justification(GTK_CLIST(gl_user), 0, GTK_JUSTIFY_CENTER);/* 设置第一列内容居中对齐 */
	gtk_table_attach_defaults(GTK_TABLE(table), gl_user, 0, 3, 1, 3);

	/* 信号连接 */
	g_signal_connect(window_gl_yh, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(a, "pressed", G_CALLBACK(do_manager_yh_delete), NULL);
	g_signal_connect(b, "pressed", G_CALLBACK(do_manager_yh_show), NULL);
	g_signal_connect(c, "pressed", G_CALLBACK(do_manager_yh_back), NULL);
	g_signal_connect(gl_user, "select-row", G_CALLBACK(select_user), NULL);
}

/* 音乐管理界面初始化 */
void window_gl_music_init(void)
{
	/* 设置窗口 */
	window_gl_music = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window_gl_music), "管理员你好!欢迎使用哭够音乐播放器!");
	gtk_widget_set_size_request(window_gl_music, 600, 450);
	gtk_window_set_resizable(GTK_WINDOW(window_gl_music), FALSE);
	gtk_window_set_position(GTK_WINDOW(window_gl_music), GTK_WIN_POS_CENTER);
	//gtk_container_set_border_width(GTK_CONTAINER(window_gl_music), 15);
	chang_background(window_gl_music, 600, 450, "./img/5.jpg");

	/* 设置布局 */
	GtkWidget *table = gtk_table_new(4, 3, TRUE);	/* 4行3列均衡排列 */
	gtk_container_add(GTK_CONTAINER(window_gl_music), table);

	/* 设置控件 */
	// 标签
	GtkWidget *label_title = gtk_label_new("音乐管理");
	gtk_label_set_markup(GTK_LABEL(label_title), "<span foreground='white' font_desc='28'>音乐管理</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_title, 0, 2, 0, 1);

	// 返回
	GtkWidget *c = gtk_button_new_with_label("返回");
	gtk_table_attach_defaults(GTK_TABLE(table), c, 2, 3, 0, 1);

	// 查看
	GtkWidget *b = gtk_button_new_with_label("查看");
	gtk_table_attach_defaults(GTK_TABLE(table), b, 2, 3, 1, 2);

	// 登录
	GtkWidget *a = gtk_button_new_with_label("删除");
	gtk_table_attach_defaults(GTK_TABLE(table), a, 2, 3, 2, 3);

	// 增加
	GtkWidget *d = gtk_button_new_with_label("增加");
	gtk_table_attach_defaults(GTK_TABLE(table), d, 2, 3, 3, 4);

	// 分栏列表
	gchar *title[3] = {"ID","音乐名称"};
	gl_music = gtk_clist_new_with_titles(2, title);
	gtk_clist_set_column_width(GTK_CLIST(gl_music), 0, 200);						/* 设置第一列宽度 */
	gtk_clist_set_column_width(GTK_CLIST(gl_music), 1, 200);
	//gtk_clist_set_column_justification(GTK_CLIST(gl_user), 0, GTK_JUSTIFY_CENTER);/* 设置第一列内容居中对齐 */
	gtk_table_attach_defaults(GTK_TABLE(table), gl_music, 0, 2, 1, 4);

	/* 信号连接 */
	g_signal_connect(window_gl_music, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(a, "pressed", G_CALLBACK(do_manager_yy_delete), NULL);
	g_signal_connect(b, "pressed", G_CALLBACK(do_manager_yy_show), NULL);
	g_signal_connect(c, "pressed", G_CALLBACK(do_manager_yy_back), NULL);
	g_signal_connect(d, "pressed", G_CALLBACK(do_manager_yy_add), NULL);
	g_signal_connect(gl_music, "select-row", G_CALLBACK(select_music), NULL);
}

/* 管理员注册界面初始化 */
void window_gl_reg_init(void)
{
	/* 设置窗口 */
	window_gl_reg = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window_gl_reg), "管理员你好!欢迎使用哭够音乐播放器!");
	gtk_widget_set_size_request(window_gl_reg, 600, 450);
	gtk_window_set_resizable(GTK_WINDOW(window_gl_reg), FALSE);
	gtk_window_set_position(GTK_WINDOW(window_gl_reg), GTK_WIN_POS_CENTER);
	gtk_container_set_border_width(GTK_CONTAINER(window_gl_reg), 15);
	chang_background(window_gl_reg, 600, 450, "./img/5.jpg");

	/* 设置布局 */
	GtkWidget *table = gtk_table_new(4, 5, TRUE);	/* 4行5列均衡排列 */
	gtk_container_add(GTK_CONTAINER(window_gl_reg), table);

	GtkWidget *hbox = gtk_hbox_new(TRUE, 0);
	gtk_table_attach_defaults(GTK_TABLE(table), hbox, 0, 5, 3, 4);

	GtkWidget *vbox_reg = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_reg);
	GtkWidget *vbox_refresh = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_refresh);
	GtkWidget *vbox_back = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_back);

	/* 设置控件 */
	// 标签 + 行编辑框
	GtkWidget *label_title = gtk_label_new("注册哭够音乐播放器管理员");
	gtk_label_set_markup(GTK_LABEL(label_title), "<span foreground='white' font_desc='28'>注册哭够音乐播放器管理员</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_title, 0, 5, 0, 1);

	GtkWidget *label_manager_reg_name = gtk_label_new("账号:");
	gtk_label_set_markup(GTK_LABEL(label_manager_reg_name), "<span foreground='white' font_desc='14'>账号:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_manager_reg_name, 0, 1, 1, 2);
	entry_manager_reg_name = gtk_entry_new();
	gtk_table_attach_defaults(GTK_TABLE(table), entry_manager_reg_name, 1, 5, 1, 2);

	GtkWidget *label_manager_reg_password = gtk_label_new("密码:");
	gtk_label_set_markup(GTK_LABEL(label_manager_reg_password), "<span foreground='white' font_desc='14'>密码:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_manager_reg_password, 0, 1, 2, 3);
	entry_manager_reg_password = gtk_entry_new();
	gtk_table_attach_defaults(GTK_TABLE(table), entry_manager_reg_password, 1, 5, 2, 3);

	// 注册
	GtkWidget *label_reg = gtk_label_new("注册");
	gtk_label_set_markup(GTK_LABEL(label_reg), "<span foreground='#b73838' font_desc='14'>注册</span>");
	gtk_container_add(GTK_CONTAINER(vbox_reg), label_reg);
	GtkWidget *reg = create_button_from_file("./img/manager/reg.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_reg), reg);

	// 刷新
	GtkWidget *label_refresh = gtk_label_new("刷新");
	gtk_label_set_markup(GTK_LABEL(label_refresh), "<span foreground='#b73838' font_desc='14'>刷新</span>");
	gtk_container_add(GTK_CONTAINER(vbox_refresh), label_refresh);
	GtkWidget *refresh = create_button_from_file("./img/manager/refresh.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_refresh), refresh);

	// 返回上级
	GtkWidget *label_back = gtk_label_new("返回上级");
	gtk_label_set_markup(GTK_LABEL(label_back), "<span foreground='#b73838' font_desc='14'>返回上级</span>");
	gtk_container_add(GTK_CONTAINER(vbox_back), label_back);
	GtkWidget *back = create_button_from_file("./img/manager/back.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_back), back);

	/* 信号连接 */
	g_signal_connect(window_gl_reg, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(reg, "pressed", G_CALLBACK(do_manager_reg_id), NULL);
	g_signal_connect(refresh, "pressed", G_CALLBACK(do_manager_reg_refresh), NULL);
	g_signal_connect(back, "pressed", G_CALLBACK(do_manager_reg_back), NULL);
}

/* 用户登录界面初始化 */
void window_yh_login_init(void)
{
	/* 设置窗口 */
	window_yh_login = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window_yh_login), "用户你好!欢迎使用哭够音乐播放器!");
	gtk_widget_set_size_request(window_yh_login, 600, 450);
	gtk_window_set_resizable(GTK_WINDOW(window_yh_login), FALSE);
	gtk_window_set_position(GTK_WINDOW(window_yh_login), GTK_WIN_POS_CENTER);
	gtk_container_set_border_width(GTK_CONTAINER(window_yh_login), 15);
	chang_background(window_yh_login, 600, 450, "./img/5.jpg");

	/* 设置布局 */
	GtkWidget *table = gtk_table_new(5, 5, TRUE);	/* 5行5列均衡排列 */
	gtk_container_add(GTK_CONTAINER(window_yh_login), table);

	GtkWidget *hbox = gtk_hbox_new(TRUE, 0);
	gtk_table_attach_defaults(GTK_TABLE(table), hbox, 0, 5, 4, 5);

	GtkWidget *vbox_login = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_login);
	GtkWidget *vbox_refresh = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_refresh);
	GtkWidget *vbox_reg = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_reg);
	GtkWidget *vbox_back = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_back);

	/* 设置控件 */
	// 标签 + 行编辑框
	GtkWidget *label_title = gtk_label_new("用户你好!欢迎使用哭够音乐播放器");
	gtk_label_set_markup(GTK_LABEL(label_title), "<span foreground='white' font_desc='28'>用户你好!欢迎使用哭够音乐播放器</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_title, 0, 5, 0, 1);

	GtkWidget *label_username = gtk_label_new("账号:");
	gtk_label_set_markup(GTK_LABEL(label_username), "<span foreground='white' font_desc='14'>账号:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_username, 0, 1, 1, 2);
	entry_login_username = gtk_entry_new();
	gtk_table_attach_defaults(GTK_TABLE(table), entry_login_username, 1, 5, 1, 2);

	GtkWidget *label_password = gtk_label_new("密码:");
	gtk_label_set_markup(GTK_LABEL(label_password), "<span foreground='white' font_desc='14'>密码:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_password, 0, 1, 2, 3);
	entry_login_password = gtk_entry_new();
	gtk_table_attach_defaults(GTK_TABLE(table), entry_login_password, 1, 5, 2, 3);

	GtkWidget *label_test = gtk_label_new("验证码:");
	gtk_label_set_markup(GTK_LABEL(label_test), "<span foreground='white' font_desc='14'>验证码:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_test, 0, 1, 3, 4);
	entry_test = gtk_entry_new();
	gtk_table_attach_defaults(GTK_TABLE(table), entry_test, 1, 4, 3, 4);

	// 系统验证码
	label_user_input = gtk_label_new("");
	gtk_table_attach_defaults(GTK_TABLE(table), label_user_input, 4, 5, 3, 4);
	sys_generate_code();

	// 登录
	GtkWidget *label_login = gtk_label_new("登录");
	gtk_label_set_markup(GTK_LABEL(label_login), "<span foreground='#b73838' font_desc='14'>登录</span>");
	gtk_container_add(GTK_CONTAINER(vbox_login), label_login);
	GtkWidget *login = create_button_from_file("./img/manager/login.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_login), login);

	// 刷新
	GtkWidget *label_refresh = gtk_label_new("刷新");
	gtk_label_set_markup(GTK_LABEL(label_refresh), "<span foreground='#b73838' font_desc='14'>刷新</span>");
	gtk_container_add(GTK_CONTAINER(vbox_refresh), label_refresh);
	GtkWidget *refresh = create_button_from_file("./img/manager/refresh.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_refresh), refresh);

	// 注册
	GtkWidget *label_reg = gtk_label_new("注册");
	gtk_label_set_markup(GTK_LABEL(label_reg), "<span foreground='#b73838' font_desc='14'>注册</span>");
	gtk_container_add(GTK_CONTAINER(vbox_reg), label_reg);
	GtkWidget *reg = create_button_from_file("./img/manager/reg.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_reg), reg);

	// 返回上级
	GtkWidget *label_back = gtk_label_new("返回上级");
	gtk_label_set_markup(GTK_LABEL(label_back), "<span foreground='#b73838' font_desc='14'>返回上级</span>");
	gtk_container_add(GTK_CONTAINER(vbox_back), label_back);
	GtkWidget *back = create_button_from_file("./img/manager/back.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_back), back);

	/* 信号连接 */
	g_signal_connect(window_yh_login, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(login, "pressed", G_CALLBACK(do_user_login_id), NULL);
	g_signal_connect(refresh, "pressed", G_CALLBACK(do_user_login_refresh), NULL);
	g_signal_connect(reg, "pressed", G_CALLBACK(do_user_to_reg), NULL);
	g_signal_connect(back, "pressed", G_CALLBACK(do_user_login_back), NULL);
}

/* 用户注册界面初始化 */
void window_yh_reg_init(void)
{
	/* 设置窗口 */
	window_yh_reg = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window_yh_reg), "用户你好!欢迎使用哭够音乐播放器!");
	gtk_widget_set_size_request(window_yh_reg, 600, 450);
	gtk_window_set_resizable(GTK_WINDOW(window_yh_reg), FALSE);
	gtk_window_set_position(GTK_WINDOW(window_yh_reg), GTK_WIN_POS_CENTER);
	gtk_container_set_border_width(GTK_CONTAINER(window_yh_reg), 15);
	chang_background(window_yh_reg, 600, 450, "./img/5.jpg");

	/* 设置布局 */
	GtkWidget *table = gtk_table_new(5, 5, TRUE);	/* 5行5列均衡排列 */
	gtk_container_add(GTK_CONTAINER(window_yh_reg), table);

	GtkWidget *hbox = gtk_hbox_new(TRUE, 0);
	gtk_table_attach_defaults(GTK_TABLE(table), hbox, 0, 5, 4, 5);

	GtkWidget *vbox_reg = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_reg);
	GtkWidget *vbox_refresh = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_refresh);
	GtkWidget *vbox_back = gtk_vbox_new(FALSE, 0);
	gtk_container_add(GTK_CONTAINER(hbox), vbox_back);

	/* 设置控件 */
	// 标签 + 行编辑框
	GtkWidget *label_title = gtk_label_new("注册哭够音乐播放器账号");
	gtk_label_set_markup(GTK_LABEL(label_title), "<span foreground='white' font_desc='26'>注册哭够音乐播放器账号</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_title, 0, 5, 0, 1);

	GtkWidget *label_username = gtk_label_new("账号:");
	gtk_label_set_markup(GTK_LABEL(label_username), "<span foreground='white' font_desc='14'>账号:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_username, 0, 1, 1, 2);
	entry_reg_username = gtk_entry_new();
	gtk_table_attach_defaults(GTK_TABLE(table), entry_reg_username, 1, 5, 1, 2);

	GtkWidget *label_phone = gtk_label_new("手机号:");
	gtk_label_set_markup(GTK_LABEL(label_phone), "<span foreground='white' font_desc='14'>手机号:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_phone, 0, 1, 2, 3);
	entry_phone = gtk_entry_new();
	gtk_table_attach_defaults(GTK_TABLE(table), entry_phone, 1, 5, 2, 3);

	GtkWidget *label_password = gtk_label_new("密码:");
	gtk_label_set_markup(GTK_LABEL(label_password), "<span foreground='white' font_desc='14'>密码:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_password, 0, 1, 3, 4);
	entry_reg_password = gtk_entry_new();
	gtk_table_attach_defaults(GTK_TABLE(table), entry_reg_password, 1, 5, 3, 4);

	// 注册
	GtkWidget *label_reg = gtk_label_new("注册");
	gtk_label_set_markup(GTK_LABEL(label_reg), "<span foreground='#b73838' font_desc='14'>注册</span>");
	gtk_container_add(GTK_CONTAINER(vbox_reg), label_reg);
	GtkWidget *reg = create_button_from_file("./img/manager/reg.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_reg), reg);

	// 刷新
	GtkWidget *label_refresh = gtk_label_new("刷新");
	gtk_label_set_markup(GTK_LABEL(label_refresh), "<span foreground='#b73838' font_desc='14'>刷新</span>");
	gtk_container_add(GTK_CONTAINER(vbox_refresh), label_refresh);
	GtkWidget *refresh = create_button_from_file("./img/manager/refresh.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_refresh), refresh);

	// 返回上级
	GtkWidget *label_back = gtk_label_new("返回上级");
	gtk_label_set_markup(GTK_LABEL(label_back), "<span foreground='#b73838' font_desc='14'>返回上级</span>");
	gtk_container_add(GTK_CONTAINER(vbox_back), label_back);
	GtkWidget *back = create_button_from_file("./img/manager/back.png", 60, 60);
	gtk_container_add(GTK_CONTAINER(vbox_back), back);

	/* 信号连接 */
	g_signal_connect(window_yh_reg, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(reg, "pressed", G_CALLBACK(do_user_reg_id), NULL);
	g_signal_connect(refresh, "pressed", G_CALLBACK(do_user_reg_refresh), NULL);
	g_signal_connect(back, "pressed", G_CALLBACK(do_user_reg_back), NULL);
}

/* 音乐播放器界面初始化 */
void window_yh_music_init(void)
{
	/* 设置窗口 */
	window_yh_music = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window_yh_music), "哭够音乐播放器");
	gtk_widget_set_size_request(window_yh_music, 800, 600);
	gtk_window_set_resizable(GTK_WINDOW(window_yh_music), FALSE);
	gtk_window_set_position(GTK_WINDOW(window_yh_music), GTK_WIN_POS_CENTER);
	gtk_container_set_border_width(GTK_CONTAINER(window_yh_music), 15);
	chang_background(window_yh_music, 800, 600, "./img/5.jpg");

	/* 设置布局 */
	GtkWidget *table = gtk_table_new(7, 5, TRUE);			/* 7行5列均衡排列 */
	gtk_container_add(GTK_CONTAINER(window_yh_music), table);

	/* 设置控件 */
	GtkWidget *change_user = create_button_from_file("./img/music/change_user.png", 80, 80);/* 切换用户 */
	gtk_table_attach_defaults(GTK_TABLE(table), change_user, 0, 1, 0, 1);

	// 标签 + 图片 + 分栏列表
	GtkWidget *label_title = gtk_label_new("哭够音乐播放器");
	gtk_label_set_markup(GTK_LABEL(label_title), "<span foreground='white' font_desc='16'>哭够音乐播放器</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_title, 1, 4, 0, 1);

	image = gtk_image_new_from_pixbuf(NULL);
	load_image(image, "./img/music/射手座.mp3.jpg", 400, 200);
	gtk_table_attach_defaults(GTK_TABLE(table), image, 0, 4, 1, 4);

	gchar *title[1] = {"音乐名称"};
	clist = gtk_clist_new_with_titles(1, title);
	gtk_clist_set_column_width(GTK_CLIST(clist), 0, 150);						/* 设置第一列宽度 */
	gtk_clist_set_column_justification(GTK_CLIST(clist), 0, GTK_JUSTIFY_CENTER);/* 设置第一列内容居中对齐 */
	char *file_path = "/home/edu/share/me/week02/manager";
	char *file_type = ".mp3";
	search_file(file_path, file_type); 
	sqlite_add_music();
	gtk_table_attach_defaults(GTK_TABLE(table), clist, 4, 5, 1, 4);

	GtkWidget *label_now_song = gtk_label_new("当前播放的音乐是:");
	label_song = gtk_label_new("射手座.mp3");
	gtk_label_set_markup(GTK_LABEL(label_now_song), "<span foreground='white' font_desc='14'>当前播放的音乐是:</span>");
	gtk_table_attach_defaults(GTK_TABLE(table), label_now_song, 1, 2, 4, 5);
	gtk_table_attach_defaults(GTK_TABLE(table), label_song, 2, 3, 4, 5);

	GtkWidget *random = create_button_from_file("./img/music/random.png", 80, 80);		/* 随机播放 */
	gtk_table_attach_defaults(GTK_TABLE(table), random, 4, 5, 4, 5);

	GtkWidget *jxsy = create_button_from_file("./img/music/jxsy.png", 80, 80);			/* 减小音量 */
	gtk_table_attach_defaults(GTK_TABLE(table), jxsy, 0, 1, 5, 6);
	GtkWidget *button0 = gtk_button_new(); 						
	gtk_button_set_relief(GTK_BUTTON(button0), GTK_RELIEF_NONE);	
	gtk_table_attach_defaults(GTK_TABLE(table), button0, 1, 2, 5, 6);
	zt = create_button_from_file("./img/music/bf.png", 80, 80);						/* 暂停/播放 */
	gtk_table_attach_defaults(GTK_TABLE(table), zt, 2, 3, 5, 6);
	GtkWidget *button1 = gtk_button_new(); 						
	gtk_button_set_relief(GTK_BUTTON(button1), GTK_RELIEF_NONE);
	gtk_table_attach_defaults(GTK_TABLE(table), random, 3, 4, 5, 6);	
	GtkWidget *zjsy = create_button_from_file("./img/music/zjsy.png", 80, 80);			/* 加大音量 */
	gtk_table_attach_defaults(GTK_TABLE(table), zjsy, 4, 5, 5, 6);

	GtkWidget *slow = create_button_from_file("./img/music/slow.png", 80, 80);			/* 快退 */
	gtk_table_attach_defaults(GTK_TABLE(table), slow, 0, 1, 6, 7);
	GtkWidget *last_song = create_button_from_file("./img/music/last_song.png", 80, 80);	/* 上一曲 */
	gtk_table_attach_defaults(GTK_TABLE(table), last_song, 1, 2, 6, 7);
	msy = create_button_from_file("./img/music/sy.png", 80, 80);							/* 静音/开音 */
	gtk_table_attach_defaults(GTK_TABLE(table), msy, 2, 3, 6, 7);
	GtkWidget *next_song = create_button_from_file("./img/music/next_song.png", 80, 80); 	/* 下一曲 */
	gtk_table_attach_defaults(GTK_TABLE(table), next_song, 3, 4, 6, 7);
	GtkWidget *fast = create_button_from_file("./img/music/fast.png", 80, 80);			/* 快进 */
	gtk_table_attach_defaults(GTK_TABLE(table), fast, 4, 5, 6, 7);

	/* 信号连接 */
	g_signal_connect(window_yh_music, "destroy", G_CALLBACK(gtk_main_quit), NULL);
	g_signal_connect(window_yh_music, "destroy", G_CALLBACK(do_music_quit), NULL);
	g_signal_connect(clist, "select-row", G_CALLBACK(selection_made), NULL);
	g_signal_connect(zt, "pressed", G_CALLBACK(do_pause_music), NULL);
	g_signal_connect(slow, "pressed", G_CALLBACK(do_slow_music), NULL);
	g_signal_connect(fast, "pressed", G_CALLBACK(do_fast_music), NULL);
	g_signal_connect(jxsy, "pressed", G_CALLBACK(do_jxsy_music), NULL);
	g_signal_connect(zjsy, "pressed", G_CALLBACK(do_zjsy_music), NULL);
	g_signal_connect(last_song, "pressed", G_CALLBACK(do_last_music), NULL);
	g_signal_connect(next_song, "pressed", G_CALLBACK(do_next_music), NULL);
	g_signal_connect(msy, "pressed", G_CALLBACK(do_jy_music), NULL);
	g_signal_connect(random, "pressed", G_CALLBACK(do_random_music), NULL);
	g_signal_connect(change_user, "pressed", G_CALLBACK(do_change_user_music), NULL);
}


/*********************** 自定义函数 *************************/

/* 切换图片 */
void load_image(GtkWidget *image, const char *file_path, const int w, const int h )
{
	gtk_image_clear( GTK_IMAGE(image) );        // 清除图像
	GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(file_path, NULL);	// 创建图片资源
	GdkPixbuf *dest_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR); // 指定大小
	gtk_image_set_from_pixbuf(GTK_IMAGE(image), dest_pixbuf); // 图片控件重新设置一张图片(pixbuf)
	g_object_unref(src_pixbuf);		// 释放资源
	g_object_unref(dest_pixbuf);	// 释放资源
}

/* 根据图片路径创建一个新按钮,同时指定图片大小 */
GtkWidget *create_button_from_file(const char *file_path, const int w, const int h)
{
	GtkWidget *temp_image = gtk_image_new_from_pixbuf(NULL);
	load_image(temp_image, file_path, w, h);
	
	GtkWidget *button = gtk_button_new(); 				// 先创建空按钮
	gtk_button_set_image(GTK_BUTTON(button), temp_image);	// 给按钮设置图标
	gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);	// 按钮背景色透明
	
	return button;
}

/* 刷新按钮图标 */
void refresh_button_from_file(GtkWidget *button, const char *file_path, const int w, const int h)
{
	GtkWidget *temp_image = gtk_image_new_from_pixbuf(NULL);
	load_image(temp_image, file_path, w, h);
	
	gtk_button_set_image(GTK_BUTTON(button), temp_image);	// 给按钮设置图标
	gtk_button_set_relief(GTK_BUTTON(button), GTK_RELIEF_NONE);	// 按钮背景色透明
}

/* 设置背景图片 */
void chang_background(GtkWidget *widget, int w, int h, const gchar *path)
{
	gtk_widget_set_app_paintable(widget, TRUE);		//允许窗口可以绘图
	gtk_widget_realize(widget);	
 
	/* 更改背景图时,图片会重叠
	 * 这时要手动调用下面的函数,让窗口绘图区域失效,产生窗口重绘制事件(即 expose 事件)。
	 */
	gtk_widget_queue_draw(widget);
 
	GdkPixbuf *src_pixbuf = gdk_pixbuf_new_from_file(path, NULL);	// 创建图片资源对象
	// w, h是指定图片的宽度和高度
	GdkPixbuf *dst_pixbuf = gdk_pixbuf_scale_simple(src_pixbuf, w, h, GDK_INTERP_BILINEAR);
 
	GdkPixmap *pixmap = NULL;
 
	/* 创建pixmap图像; 
	 * NULL:不需要蒙版; 
	 * 123: 0~255,透明到不透明
	 */
	gdk_pixbuf_render_pixmap_and_mask(dst_pixbuf, &pixmap, NULL, 128);
	// 通过pixmap给widget设置一张背景图,最后一个参数必须为: FASLE
	gdk_window_set_back_pixmap(widget->window, pixmap, FALSE);
 
	// 释放资源
	g_object_unref(src_pixbuf);
	g_object_unref(dst_pixbuf);
	g_object_unref(pixmap);
}

/* 系统生成验证码并显示到标签 */
void sys_generate_code(void)
{
	int i;
	char a[4] = "";
	srand(time(NULL));
	for(i = 0; i < 4; ++i)
	{
		a[i] = rand() % 10 + '0';
	}
	gtk_label_set_text(GTK_LABEL(label_user_input), a);
	gchar *markup = g_strdup_printf("<span foreground='white' font_desc='14'>%s</span>", a);
	gtk_label_set_markup(GTK_LABEL(label_user_input), markup);
}

/* 切换音乐对应信息 */
void change_music_info(gint r)
{
	char *music = NULL;
	gtk_clist_get_text(GTK_CLIST(clist), r, 0, &music);
	gtk_label_set_text(GTK_LABEL(label_song), music);		/* 将标签文本设置为当前音乐名 */
	gchar name[40] = "";
	sprintf(name, "./img/music/%s.jpg", music);
	load_image(image, name, 400, 200);

	gchar cmd[100] = "";
	fd = open("cmd_fifo", O_WRONLY);		/* 以读写方式打开有名管道 */
	sprintf(cmd, "loadfile ./%s\n", music);
	write(fd, cmd, strlen(cmd));
	close(fd);
}

/* 扫描目录下指定后缀文件 */
int search_file(char* name,char * type)
{
	DIR *p=NULL;
	p=opendir(name);
	if(p==NULL)
	{
		perror("open dir error");
		return -1;
	}
	chdir(name);			/* 将当前的工作目录改变成以参数路径所指的目录 */
	int i;
	char a[10] = "";
	srand(time(NULL));
	while((pdir = readdir(p)) != NULL)
	{
		if (pdir->d_name[0] == '.')					//忽略隐藏文件
		{
			continue;
		}

		if(isMediaFile(pdir->d_name))
		{
			for(i = 0; i < 10; ++i)
			{
				a[i] = rand() % 10 + '0';
			}
			*music_add = a;
			*(music_add + 1) = pdir->d_name;
			add_to_music_table();
		}
	}
	closedir(p);

	return 0;
}

/* 判断一个文件是否为MP3文件 */
int isMediaFile(const char *filename)
{
	while (filename)			//找到文件后缀的点
	{
		if (*filename == '.')
		{
			break;
		}
		filename++;
	}

	if (!strcmp(filename, ".mp3"))
	{
		return 1;
	}

	return 0;
}

login.h

#ifndef _LOGIN_DL_H_
#define _LOGIN_DL_H_


/********************** 自定义变量 ************************/

/* mplayer 播放状态 */
typedef enum __mplayer_stat__
{
	MPLAYER_STAT_FREE,
	MPLAYER_STAT_PLAY,
	MPLAYER_STAT_PAUSE,
}MplayerStat_en;

/* mplayer 声音状态 */
typedef enum __mplayer_audio__
{
	MPLAYER_STAT_YES,
	MPLAYER_STAT_NO,
}MplayerAudio_en;

/* mplayer 当前工作状态 */
typedef struct __media_stat__
{
	MplayerStat_en curstat;
	MplayerAudio_en curaudio;
	guint curmedianum;
}MediaStat_t;



/*********************** 全局变量 *************************/

gint fd;
gchar *user_info[3];														/* 存放所选中用户信息 */
gchar *music_info[2];														/* 存放所选中音乐信息 */
gchar *music_add[2];
struct dirent *pdir;														/* 存储指定文件夹下文件信息 */
MediaStat_t MediaStat;														/* 媒体状态结构体 */
GtkWidget *image;															/* 音乐对应图片 */
GtkWidget *zt;																/* 暂停按钮 */
GtkWidget *msy;																/* 静音按钮 */
GtkWidget *label_song;														/* 当前音乐标签*/
GtkWidget *clist;															/* 分栏列表 */	
GtkWidget *window_main;														/* 主界面 */
GtkWidget *window_gl_logintest;												/* 管理员登陆测试界面 */
GtkWidget *entry_manager_logintest_name, *entry_manager_logintest_password;	/* 行编辑框:账号、密码 */
GtkWidget *window_gl_cd;													/* 管理员界面 */
GtkWidget *window_gl_yh;													/* 用户管理界面 */
GtkWidget *gl_user;                               							/* 用户分栏列表*/
GtkWidget *window_gl_music;													/* 音乐管理界面 */
GtkWidget *gl_music;														/* 音乐分栏列表*/
GtkWidget *window_gl_reg;													/* 管理员注册界面 */
GtkWidget *entry_manager_reg_name, *entry_manager_reg_password;				/* 行编辑框:账号、密码 */
GtkWidget *window_yh_login;													/* 用户登录界面 */
GtkWidget *label_user_input;												/* 用户输入的验证码 */
GtkWidget *entry_login_username, *entry_login_password, *entry_test;		/* 行编辑框:账号、密码、验证码 */
GtkWidget *window_yh_reg;													/* 用户注册界面 */
GtkWidget *entry_reg_username, *entry_reg_password, *entry_phone;			/* 行编辑框:账号、手机号、密码 */
GtkWidget *window_yh_music;													/* 音乐播放器用户界面 */



/*********************** 界面初始化 *************************/

/* 主界面初始化 */
extern void window_main_init(void);
/* 管理员登录测试界面初始化 */
extern void window_gl_logintest_init(void);
/* 管理员界面初始化 */
extern void window_gl_cd_init(void);
/* 管理员登录界面初始化 */
extern void window_gl_yh_init(void);
/* 管理员注册界面初始化 */
extern void window_gl_reg_init(void);
/* 用户登录界面初始化 */
extern void window_yh_cd_init(void);
/* 用户注册界面初始化 */
extern void window_yh_reg_init(void);
/* 音乐播放器用户界面初始化 */
extern void window_yh_music_init(void);


/*********************** 自定义函数 *************************/

/* 切换图片 */
extern void load_image(GtkWidget *image, const char *file_path, const int w, const int h );
/* 根据图片路径创建一个新按钮,同时指定图片大小 */
extern GtkWidget *create_button_from_file(const char *file_path, const int w, const int h);
/* 刷新按钮图标 */
extern void refresh_button_from_file(GtkWidget *button, const char *file_path, const int w, const int h);
/* 设置背景图片 */
extern void chang_background(GtkWidget *widget, int w, int h, const gchar *path);
/* 系统生成验证码并显示到标签 */
extern void sys_generate_code(void);
/* 切换音乐对应信息 */
extern void change_music_info(gint r);
/* 扫描目录下指定后缀文件 */
extern int search_file(char* name,char * type);
/* 判断一个文件是否为MP3文件 */
extern int isMediaFile(const char *filename);

#endif

other.c

#include <stdio.h>
#include <gtk/gtk.h>
#include <glib.h>
#include <pthread.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <semaphore.h>
#include "sqlite3.h"
#include "login_dl.h"
#include "other.h"

gint r = 0;

/* 数据库初始化 */
void my_sql_init(void)
{
	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);
	if (ret != SQLITE_OK)
	{
		perror("sqlite3_open\n");
	}

	char *cmd1 = "create table admin (id text, passwd text);";
	char *cmd2 = "create table user (name text, phone text, passwd text);";
	char *cmd3 = "create table music (id text, music text);";

	sqlite3_exec(db, cmd1, NULL, NULL, &errmsg);
	sqlite3_exec(db, cmd2, NULL, NULL, &errmsg);
	sqlite3_exec(db, cmd3, NULL, NULL, &errmsg);

	sqlite3_close(db);
}

/* 向数据库中添加音乐信息 */
void add_to_music_table(void)
{
	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);

	if (ret != SQLITE_OK)
		perror("sqlite3_open\n");

	char cmd[100] = "";
	sprintf(cmd, "select * from music where music='%s';", *(music_add + 1));
	char **table = NULL;
	int r = 0, c = 0; 
	sqlite3_get_table(db, cmd, &table, &r, &c, &errmsg);
	if (r != 0)
	{
		printf( "该音乐已经在数据库中\n");
		sqlite3_close(db);
		return;
	}

	char sql[100] = "";
	sprintf(sql,"insert into music values(\'%s\',\'%s\');", *music_add, *(music_add + 1));
	errmsg = NULL;
	int asd = sqlite3_exec(db, sql, NULL, NULL, &errmsg);
	if (asd != SQLITE_OK)
		printf("有问题啊!");

	sqlite3_close(db);
}

/* 向分栏列表中添加音乐名称 */
void sqlite_add_music(void)
{
	gtk_clist_clear(GTK_CLIST(gl_music));

	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);

	if (ret != SQLITE_OK)
		perror("sqlite3_open\n");

	const char *sql = "select * from music;";
	sqlite3_stmt *pstmt;
	int flag = sqlite3_prepare_v2(db, sql, strlen(sql), &pstmt, NULL);

	if (flag != 0)
	{
		printf("prepare error flag : %d\n", flag);
		return;
	}
	
	char *a[1];
	int a0;
	while (sqlite3_step(pstmt) == SQLITE_ROW) 
	{
        a[0] = (char *)sqlite3_column_text(pstmt, 1);
		a0 = gtk_clist_append(GTK_CLIST(clist), a);
		printf("step row num : %s, %d\n", a[0], a0);
    }

	sqlite3_finalize(pstmt);

	sqlite3_close(db);
}



/*********************** 回调函数 *************************/

/*************** 主界面 ***************/
/* 主界面跳转到管理员界面 */
void do_manager(GtkButton *button, gpointer user_data)
{
	gtk_widget_show_all(window_gl_logintest);
	gtk_widget_hide_all(window_main);		/* 隐藏主界面 */
}

/* 主界面跳转到用户界面 */
void do_user(GtkButton *button, gpointer user_data)
{
	gtk_widget_show_all(window_yh_login);
	gtk_widget_hide_all(window_main);		
}


/*************** 管理员登录测试界面 ***************/
/* 管理员登录测试 */
void do_manager_logintest_id(GtkButton *button, gpointer user_data)
{
	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);

	if (ret != SQLITE_OK)
		perror("sqlite3_open\n");

	const char *id = gtk_entry_get_text(GTK_ENTRY(entry_manager_logintest_name));
	const char *passwd = gtk_entry_get_text(GTK_ENTRY(entry_manager_logintest_password));


	char sql[100] = "";
	sprintf(sql, "select * from admin where id = \'%s\' and passwd =\'%s\';", id, passwd);
	char **table = NULL;
	int r = 0, c = 0; 
	int flag = sqlite3_get_table(db, sql, &table, &r, &c, &errmsg);

	if (flag == 0)
	{
		printf("管理员你好!\n");
		entry_clean_for_window_gl_logintest();
		gtk_widget_show_all(window_gl_cd);
		gtk_widget_hide_all(window_gl_logintest);
	}
	else
		printf("账号或密码错误,请确认是否为管理员身份!\n");

	sqlite3_close(db);
}

/* 刷新管理员登录测试界面 */
void do_manager_logintest_refresh(GtkButton *button, gpointer user_data)
{
	entry_clean_for_window_gl_logintest();
}

/* 管理员登录测试界面跳转到主界面 */
void do_manager_logintest_back(GtkButton *button, gpointer user_data)
{
	entry_clean_for_window_gl_logintest();
	gtk_widget_show_all(window_main);
	gtk_widget_hide_all(window_gl_logintest);
}


/*************** 管理员界面 ***************/
/* 管理员界面跳转到用户管理界面 */
void do_manager_yh(GtkButton *button, gpointer user_data)
{
	gtk_widget_show_all(window_gl_yh);
	gtk_widget_hide_all(window_gl_cd);
}

/* 管理员界面跳转到音乐管理界面 */
void do_manager_yy(GtkButton *button, gpointer user_data)
{
	gtk_widget_show_all(window_gl_music);
	gtk_widget_hide_all(window_gl_cd);
}

/* 管理员界面跳转到管理员注册界面 */
void do_manager_reg(GtkButton *button, gpointer user_data)
{
	gtk_widget_show_all(window_gl_reg);
	gtk_widget_hide_all(window_gl_cd);
}

/* 管理员界面跳转到主界面 */
void do_manager_back(GtkButton *button, gpointer user_data)
{
	gtk_widget_show_all(window_main);
	gtk_widget_hide_all(window_gl_cd);
}


/*************** 用户管理界面 ***************/
/* 查看用户信息 */ 
void do_manager_yh_show(GtkButton *button, gpointer user_data)
{
	gtk_clist_clear(GTK_CLIST(gl_user));

	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);

	if (ret != SQLITE_OK)
		perror("sqlite3_open\n");

	const char *sql = "select * from user;";
	sqlite3_stmt *pstmt;
	int flag = sqlite3_prepare_v2(db, sql, strlen(sql), &pstmt, NULL);

	if (flag != 0)
	{
		printf("prepare error flag : %d\n", flag);
		return;
	}
	
	char *a[3];
	int a0;
	while (sqlite3_step(pstmt) == SQLITE_ROW) 
	{
        a[0] = (char *)sqlite3_column_text(pstmt, 0);
        a[1] = (char *)sqlite3_column_text(pstmt, 1);
        a[2] = (char *)sqlite3_column_text(pstmt, 2);
		a0 = gtk_clist_append(GTK_CLIST(gl_user), a);
		printf("step row num : %s, %s, %s, %d\n", a[0], a[1], a[2], a0);
    }

	sqlite3_finalize(pstmt);

	sqlite3_close(db);

	gtk_widget_queue_draw(clist);
}

/* 删除用户信息 */
void do_manager_yh_delete(GtkButton *button, gpointer user_data)
{
	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);

	if (ret != SQLITE_OK)
		perror("sqlite3_open\n");

	char sql[100] = "";
	errmsg = NULL;
	sprintf(sql, "delete from user where name=\'%s\';", *user_info);
	printf("%s", *user_info);
	int flag = sqlite3_exec(db, sql, NULL, NULL, &errmsg);

	if (flag != 0)
	{
		printf("prepare error flag : %d\n", flag);
		return;
	}

	sqlite3_close(db);

	gtk_widget_queue_draw(clist);
}

/* 用户管理界面跳转到管理员界面 */
void do_manager_yh_back(GtkButton *button, gpointer user_data)
{
	gtk_widget_show_all(window_gl_cd);
	gtk_widget_hide_all(window_gl_yh);
}

/* 选中某一行用户信息时的回调函数 */
void select_user(GtkWidget *clist, gint row, gint col, GdkEventButton *event, gpointer data)
{
	gtk_clist_get_text(GTK_CLIST(gl_user), row, 0, user_info );
	gtk_clist_get_text(GTK_CLIST(gl_user), row, 1, (user_info + 1));
	gtk_clist_get_text(GTK_CLIST(gl_user), row, 2, (user_info + 2));
	printf("%s\n", *user_info);
	printf("%s\n", *(user_info + 1));
	printf("%s\n", *(user_info + 2));
}


/*************** 音乐管理界面 ***************/
/* 查看音乐信息 */ 
void do_manager_yy_show(GtkButton *button, gpointer user_data)
{
	gtk_clist_clear(GTK_CLIST(gl_music));

	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);

	if (ret != SQLITE_OK)
		perror("sqlite3_open\n");

	const char *sql = "select * from music;";
	sqlite3_stmt *pstmt;
	int flag = sqlite3_prepare_v2(db, sql, strlen(sql), &pstmt, NULL);

	if (flag != 0)
	{
		printf("prepare error flag : %d\n", flag);
		return;
	}
	
	char *a[3];
	int a0;
	while (sqlite3_step(pstmt) == SQLITE_ROW) 
	{
        a[0] = (char *)sqlite3_column_text(pstmt, 0);
        a[1] = (char *)sqlite3_column_text(pstmt, 1);
		a0 = gtk_clist_append(GTK_CLIST(gl_music), a);
		printf("step row num : %s, %s, %d\n", a[0], a[1], a0);
    }

	sqlite3_finalize(pstmt);

	sqlite3_close(db);

	gtk_widget_queue_draw(gl_music);
}

/* 增加音乐信息 */
void do_manager_yy_add(GtkButton *button, gpointer user_data)
{
	char *file_path = "/home/edu/share/me/week02/manager/src";
	char *file_type = ".mp3";
	search_file(file_path, file_type);
}

/* 删除音乐信息 */
void do_manager_yy_delete(GtkButton *button, gpointer user_data)
{
	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);

	if (ret != SQLITE_OK)
		perror("sqlite3_open\n");

	char sql[100] = "";
	
	//int flag = sqlite3_prepare_v2(db, sql, strlen(sql), &pstmt, NULL);
	errmsg = NULL;
	sprintf(sql, "delete from music where id=\'%s\';", *music_info);
	int flag = sqlite3_exec(db, sql, NULL, NULL, &errmsg);

	if (flag != 0)
	{
		printf("prepare error flag : %d\n", flag);
		return;
	}

	sqlite3_close(db);

	gtk_widget_queue_draw(gl_music);
}

/* 音乐管理界面跳转到管理员界面 */
void do_manager_yy_back(GtkButton *button, gpointer user_data)
{
	gtk_widget_show_all(window_gl_cd);
	gtk_widget_hide_all(window_gl_music);
}

/* 选中某一行音乐信息时的回调函数 */
void select_music(GtkWidget *clist, gint row, gint col, GdkEventButton *event, gpointer data)
{
	gtk_clist_get_text(GTK_CLIST(gl_music), row, 0, music_info);
	gtk_clist_get_text(GTK_CLIST(gl_music), row, 1, (music_info + 1));
	printf("%s\n", *music_info);
	printf("%s\n", *(music_info + 1));
}


/*************** 管理员注册界面 ***************/
/* 管理员注册 */
void do_manager_reg_id(GtkButton *button, gpointer user_data)
{
	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);

	if (ret != SQLITE_OK)
		perror("sqlite3_open\n");

	const char *id = gtk_entry_get_text(GTK_ENTRY(entry_manager_reg_name));
	const char *passwd = gtk_entry_get_text(GTK_ENTRY(entry_manager_reg_password));

	char cmd[100] = "";
	sprintf(cmd, "select * from admin where id='%s');", id);
	char **table = NULL;
	int r = 0, c = 0; 
	sqlite3_get_table(db, cmd, &table, &r, &c, &errmsg);
	if (r != 0)
	{
		gtk_entry_set_text(GTK_ENTRY(entry_manager_reg_name), "您已经注册了,请直接登录!");
		sqlite3_close(db);
		return;
	}

	char sql[100] = "";
	sprintf(sql, "insert into admin values ('%s', '%s');", id, passwd);
	errmsg = NULL;
	sqlite3_exec(db, sql, NULL, NULL, &errmsg);
	if (NULL == errmsg)
	{
		entry_clean_for_window_gl_reg();
		gtk_widget_show_all(window_gl_cd);
		gtk_widget_hide_all(window_gl_reg);
	}
	else
		gtk_entry_set_text(GTK_ENTRY(entry_manager_reg_name), "注册失败!");

	sqlite3_close(db);
}

/* 刷新管理员注册界面 */
void do_manager_reg_refresh(GtkButton *button, gpointer user_data)
{
	entry_clean_for_window_gl_reg();
}

/* 管理员注册界面跳转到管理员界面 */
void do_manager_reg_back(GtkButton *button, gpointer user_data)
{
	entry_clean_for_window_gl_reg();
	gtk_widget_show_all(window_gl_cd);
	gtk_widget_hide_all(window_gl_reg);
}


/*************** 用户登录界面 ***************/
/* 用户登录 */
void do_user_login_id(GtkButton *button, gpointer user_data)
{
	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);

	if (ret != SQLITE_OK)
		perror("sqlite3_open\n");

	const char *id = gtk_entry_get_text(GTK_ENTRY(entry_login_username));
	const char *passwd = gtk_entry_get_text(GTK_ENTRY(entry_login_password));

	char sql[100] = "";
	sprintf(sql, "select id, passwd from user where id='%s', passwd='%s');", id, passwd);
	char **table = NULL;
	int r = 0, c = 0; 
	sqlite3_get_table(db, sql, &table, &r, &c, &errmsg);

	if (r != 0)
		printf("账号或密码错误\n");

	sqlite3_close(db);

	const char *test = gtk_label_get_text(GTK_LABEL(label_user_input));
	const char *input = gtk_entry_get_text(GTK_ENTRY(entry_test));
	if(0 == strcmp(input, test))
	{
		gtk_label_set_text(GTK_LABEL(label_user_input), "验证码正确!");
		gtk_label_set_markup(GTK_LABEL(label_user_input), "<span foreground='#686fed' font_desc='10'>验证码正确!</span>");

		MediaStat.curstat = MPLAYER_STAT_FREE;
		MediaStat.curaudio = MPLAYER_STAT_YES;


		entry_clean_for_window_yh_login();
		gtk_widget_show_all(window_yh_music);
		gtk_widget_hide_all(window_yh_login);
		if (MediaStat.curstat == MPLAYER_STAT_FREE)
		{
			pid_t pid;					/* 创建进程号 */
			pid = fork();				/* 创建进程 */
			if (pid < 0)				/* 创建失败 */
			{
				perror("fork\n");		/* 打印错误信息 */
				return;
			}
			else if (0 == pid)			/* 子进程 */
			{
				/* 这个位置放第一首音乐名称
				 * 进程中启动mplayer以slave模式,不打印乱码 
				 * 播放完毕不退出 确认指令输入位置 指定管道位置 第一个放的歌曲名称
				 */
				execlp("mplayer", "mplayer", "-slave", "-quiet", 
					"-idle", "-input", "file=./cmd_fifo", "./射手座.mp3", NULL);

				MediaStat.curstat = MPLAYER_STAT_PLAY;
				_exit(0);				/* 结束进程 */
			}
		}
	}
	else
	{
		gtk_label_set_text(GTK_LABEL(label_user_input), "验证码错误!");
		gtk_label_set_markup(GTK_LABEL(label_user_input), "<span foreground='red' font_desc='10'>验证码错误!</span>");
	}
}

/* 用户登录界面跳转到用户注册界面 */
void do_user_to_reg(GtkButton *button, gpointer user_data)
{
	entry_clean_for_window_yh_login();
	gtk_widget_show_all(window_yh_reg);
	gtk_widget_hide_all(window_yh_login);
}

/* 用户刷新验证码 */
void do_user_login_refresh(GtkButton *button, gpointer user_data)
{
	entry_clean_for_window_yh_login();
	sys_generate_code();
}

/* 用户登录界面跳转到主界面 */
void do_user_login_back(GtkButton *button, gpointer user_data)
{
	gtk_widget_show_all(window_main);
	gtk_widget_hide_all(window_yh_login);
}


/*************** 用户注册界面 ***************/
/* 用户注册 */
void do_user_reg_id(GtkButton *button, gpointer user_data)
{
	sqlite3 *db;
	char *errmsg = NULL;
	int ret = sqlite3_open("hello.db", &db);

	if (ret != SQLITE_OK)
		perror("sqlite3_open\n");

	const char *id = gtk_entry_get_text(GTK_ENTRY(entry_reg_username));
	const char *phone = gtk_entry_get_text(GTK_ENTRY(entry_phone));
	const char *passwd = gtk_entry_get_text(GTK_ENTRY(entry_reg_password));

	char cmd[100] = "";
	sprintf(cmd, "select * from user where id='%s');", id);
	char **table = NULL;
	int r = 0, c = 0; 
	sqlite3_get_table(db, cmd, &table, &r, &c, &errmsg);
	if (r != 0)
	{
		gtk_entry_set_text(GTK_ENTRY(entry_manager_reg_name), "您已经注册了,请直接登录!");
		sqlite3_close(db);
		return;
	}

	char sql[100] = "";
	sprintf(sql, "insert into user values ('%s', '%s', '%s');", id, phone, passwd);
	errmsg = NULL;
	sqlite3_exec(db, sql, NULL, NULL, &errmsg);
	if (NULL == errmsg)
	{
		entry_clean_for_window_yh_reg();
		gtk_widget_show_all(window_yh_login);
		gtk_widget_hide_all(window_yh_reg);
	}
	else
		gtk_entry_set_text(GTK_ENTRY(entry_manager_reg_name), "注册失败!");

	sqlite3_close(db);
}

/* 刷新用户注册界面 */
void do_user_reg_refresh(GtkButton *button, gpointer user_data)
{
	entry_clean_for_window_yh_reg();
}

/* 用户注册界面跳转到用户登录界面 */
void do_user_reg_back(GtkButton *button, gpointer user_data)
{
	entry_clean_for_window_yh_reg();
	gtk_widget_show_all(window_yh_login);
	gtk_widget_hide_all(window_yh_reg);
}


/*************** 音乐播放器界面 ***************/
/* 用户选中某一行时的回调函数 */
void selection_made(GtkWidget *clist, gint row, gint col, GdkEventButton *event, gpointer data)
{	
	gtk_widget_queue_draw(clist);

	gchar *text;
	
	/* 取得存储在被选中的行和列的单元格上的文本
	 * 当鼠标点击时,我们用text参数接收一个指针
	 */
	gtk_clist_get_text(GTK_CLIST(clist), row, col, &text);
	gtk_label_set_markup(GTK_LABEL(label_song), "<span foreground='white' font_desc='14'>{{text}}</span>");
	gtk_label_set_text(GTK_LABEL(label_song), text);		/* 将标签文本设置为当前音乐名 */
	
	switch(row)
	{
		case 0:
		{		
			change_music_info(row);
			break; 
		}
		case 1:
		{
			change_music_info(row); 
			break; 
		}
		case 2:
		{ 
			change_music_info(row); 
			break; 
		}
		case 3:
		{ 
			change_music_info(row);
			break; 
		}
		case 4:
		{ 
			change_music_info(row);
			break; 
		}
	}
}

/* 关闭窗口结束音乐播放子进程 */
void do_music_quit(GtkWidget *widget, gpointer user_data)
{
	fd = open("cmd_fifo", O_WRONLY);		/* 以读写方式打开有名管道 */
	write(fd, "quit\n", strlen("quit\n"));
	close(fd);
}

/* 随机播放音乐 */
void do_random_music(GtkWidget *widget, gpointer user_data)
{
	int a;
	srand(time(NULL));		/* 设置随机因子 */
	a = rand() % 4;			/* 4首歌,对4取余 */

	switch(a)
	{
		case 0:
		{		
			change_music_info(a);
			break; 
		}
		case 1:
		{
			change_music_info(a);
			break; 
		}
		case 2:
		{ 
			change_music_info(a);  
			break; 
		}
		case 3:
		{ 
			change_music_info(a); 
			break; 
		}
		case 4:
		{ 
			change_music_info(a); 
			break; 
		}
	}
}

/* 暂停音乐并切换图标 */
void do_pause_music(GtkWidget *widget, gpointer user_data)
{
	if (MediaStat.curstat == MPLAYER_STAT_PLAY)
	{
		refresh_button_from_file(zt, "./img/music/pause.png", 80, 80);
		MediaStat.curstat = MPLAYER_STAT_PAUSE;
	}
	else
	{
		refresh_button_from_file(zt, "./img/music/bf.png", 80, 80);
		MediaStat.curstat = MPLAYER_STAT_PLAY;
	}

	fd = open("cmd_fifo", O_WRONLY);		/* 以读写方式打开有名管道 */
	write(fd, "pause\n", strlen("pause\n"));
	close(fd);
}

/* 减小声音 */
void do_jxsy_music(GtkWidget *widget, gpointer user_data)
{
	fd = open("cmd_fifo", O_WRONLY);		/* 以读写方式打开有名管道 */
	write(fd, "volume -10\n", strlen("volume -10\n"));
	close(fd);
}

/* 增加声音 */
void do_zjsy_music(GtkWidget *widget, gpointer user_data)
{
	fd = open("cmd_fifo", O_WRONLY);		/* 以读写方式打开有名管道 */
	write(fd, "volume 10\n", strlen("volume 10\n"));
	close(fd);
}

/* 快进 */
void do_fast_music(GtkWidget *widget, gpointer user_data)
{
	fd = open("cmd_fifo", O_WRONLY);		/* 以读写方式打开有名管道 */
	write(fd, "seek 10\n", strlen("seek 10\n"));
	close(fd);
}

/* 快退 */
void do_slow_music(GtkWidget *widget, gpointer user_data)
{
	fd = open("cmd_fifo", O_WRONLY);		/* 以读写方式打开有名管道 */
	write(fd, "seek -10\n", strlen("seek -10\n"));
	close(fd);
}

/* 静音 */
void do_jy_music(GtkWidget *widget, gpointer user_data)
{
	if (MediaStat.curaudio == MPLAYER_STAT_YES)
	{
		refresh_button_from_file(msy, "./img/music/sy.png", 80, 80);
		fd = open("cmd_fifo", O_WRONLY);		/* 以读写方式打开有名管道 */
		write(fd, "mute 0\n", strlen("mute 0\n"));
		close(fd);
		MediaStat.curaudio = MPLAYER_STAT_NO;
	}
	else
	{
		refresh_button_from_file(msy, "./img/music/msy.png", 80, 80);
		fd = open("cmd_fifo", O_WRONLY);		/* 以读写方式打开有名管道 */
		write(fd, "mute 1\n", strlen("mute 1\n"));
		close(fd);
		MediaStat.curaudio = MPLAYER_STAT_YES;
	}
	
}

/* 上一首音乐 */
void do_last_music(GtkWidget *widget, gpointer user_data)
{
	gchar *text;

	r--;

	if(r < 0)
		r = 4;

	switch(r)
	{
		case 0:
		{		
			change_music_info(r); 
			break; 
		}
		case 1:
		{
			change_music_info(r); 
			break; 
		}
		case 2:
		{ 
			change_music_info(r); 
			break; 
		}
		case 3:
		{ 
			change_music_info(r);
			break; 
		}
		case 4:
		{ 
			change_music_info(r);
			break; 
		}
	}
}

/* 下一首音乐 */
void do_next_music(GtkWidget *widget, gpointer user_data)
{
	gchar *text;

	r++;
	if (r > 4)
		r = 0;

	switch(r)
	{
		case 0:
		{		
			change_music_info(r); 
			break; 
		}
		case 1:
		{
			change_music_info(r); 
			break; 
		}
		case 2:
		{ 
			change_music_info(r); 
			break; 
		}
		case 3:
		{ 
			change_music_info(r);
			break; 
		}
		case 4:
		{ 
			change_music_info(r);
			break; 
		}
	}
}

/* 切换用户 */
void do_change_user_music(GtkWidget *widget, gpointer user_data)
{
	fd = open("cmd_fifo", O_WRONLY);		/* 以读写方式打开有名管道 */
	write(fd, "quit\n", strlen("quit\n"));
	close(fd);;
	gtk_widget_show_all(window_yh_login);
	gtk_widget_hide_all(window_yh_music);
}



/*********************** 清除函数 *************************/
/* 管理员登录测试界面行编辑框清除 */
void entry_clean_for_window_gl_logintest(void)
{
	gtk_entry_set_text(GTK_ENTRY(entry_manager_logintest_name), "");
	gtk_entry_set_text(GTK_ENTRY(entry_manager_logintest_password), "");
}

/* 管理员注册界面行编辑框清除 */
void entry_clean_for_window_gl_reg(void)
{
	gtk_entry_set_text(GTK_ENTRY(entry_manager_reg_name), "");
	gtk_entry_set_text(GTK_ENTRY(entry_manager_reg_password), "");
}

/* 用户登录界面行编辑框清除 */
void entry_clean_for_window_yh_login(void)
{
	gtk_entry_set_text(GTK_ENTRY(entry_login_username), "");
	gtk_entry_set_text(GTK_ENTRY(entry_login_password), "");
	gtk_entry_set_text(GTK_ENTRY(entry_test), "");
	sys_generate_code();
}

/* 用户注册界面行编辑框清除 */
void entry_clean_for_window_yh_reg(void)
{
	gtk_entry_set_text(GTK_ENTRY(entry_reg_username), "");
	gtk_entry_set_text(GTK_ENTRY(entry_phone), "");
	gtk_entry_set_text(GTK_ENTRY(entry_reg_password), "");
}

other.h

#ifndef _OTHER_H_
#define _OTHER_H_

/* 数据库初始化 */
extern void my_sql_init(void);
/* 向数据库中添加音乐信息 */
extern void add_to_music_table(void);
/* 向分栏列表中添加音乐名称 */
extern void sqlite_add_music(void);


/*********************** 回调函数 *************************/

/*************** 主界面 ***************/
/* 主界面跳转到管理员界面 */
extern void do_manager(GtkButton *button, gpointer user_data);
/* 主界面跳转到用户界面 */
extern void do_user(GtkButton *button, gpointer user_data);


/*************** 管理员登录测试界面 ***************/
/* 管理员登录测试 */
extern void do_manager_logintest_id(GtkButton *button, gpointer user_data);
/* 刷新管理员登录测试界面 */
extern void do_manager_logintest_refresh(GtkButton *button, gpointer user_data);
/* 管理员登录测试界面跳转到主界面 */
extern void do_manager_logintest_back(GtkButton *button, gpointer user_data);


/*************** 管理员界面 ***************/
/* 管理员界面跳转到用户管理界面 */
extern void do_manager_yh(GtkButton *button, gpointer user_data);
/* 管理员界面跳转到音乐管理界面 */
extern void do_manager_yy(GtkButton *button, gpointer user_data);
/* 管理员界面跳转到管理员注册界面 */
extern void do_manager_reg(GtkButton *button, gpointer user_data);
/* 管理员界面跳转到主界面 */
extern void do_manager_back(GtkButton *button, gpointer user_data);


/*************** 用户管理界面 ***************/
/* 查看用户信息 */ 
extern void do_manager_yh_show(GtkButton *button, gpointer user_data);
/* 删除用户信息 */
extern void do_manager_yh_delete(GtkButton *button, gpointer user_data);
/* 用户管理界面跳转到管理员界面 */
extern void do_manager_yh_back(GtkButton *button, gpointer user_data);
/* 选中某一行用户信息时的回调函数 */
extern void select_user(GtkWidget *clist, gint row, gint col, GdkEventButton *event, gpointer data);


/*************** 音乐管理界面 ***************/
/* 查看音乐信息 */ 
extern void do_manager_yy_show(GtkButton *button, gpointer user_data);
/* 增加音乐信息 */
extern void do_manager_yy_add(GtkButton *button, gpointer user_data);
/* 删除音乐信息 */
extern void do_manager_yy_delete(GtkButton *button, gpointer user_data);
/* 音乐管理界面跳转到管理员界面 */
extern void do_manager_yy_back(GtkButton *button, gpointer user_data);
/* 选中某一行音乐信息时的回调函数 */
extern void select_music(GtkWidget *clist, gint row, gint col, GdkEventButton *event, gpointer data);


/*************** 管理员注册界面 ***************/
/* 管理员注册 */
extern void do_manager_reg_id(GtkButton *button, gpointer user_data);
/* 刷新管理员注册界面 */
extern void do_manager_reg_refresh(GtkButton *button, gpointer user_data);
/* 管理员注册界面跳转到管理员界面 */
extern void do_manager_reg_back(GtkButton *button, gpointer user_data);


/*************** 用户登录界面 ***************/
/* 用户登录 */
extern void do_user_login_id(GtkButton *button, gpointer user_data);
/* 用户登录界面跳转到用户注册界面 */
extern void do_user_to_reg(GtkButton *button, gpointer user_data);
/* 用户刷新验证码 */
extern void do_user_login_refresh(GtkButton *button, gpointer user_data);
/* 用户界面跳转到主界面 */
extern void do_user_login_back(GtkButton *button, gpointer user_data);


/*************** 用户注册界面 ***************/
/* 用户注册 */
extern void do_user_reg_id(GtkButton *button, gpointer user_data);
/* 刷新用户注册界面 */
extern void do_user_reg_refresh(GtkButton *button, gpointer user_data);
/* 用户注册界面跳转到用户登录界面 */
extern void do_user_reg_back(GtkButton *button, gpointer user_data);


/*************** 音乐播放器界面 ***************/
/* 用户选中某一行时的回调函数 */
extern void selection_made(GtkWidget *clist, gint row, gint col, GdkEventButton *event, gpointer data);
/* 关闭窗口结束音乐播放子进程 */
extern void do_music_quit(GtkWidget *widget, gpointer user_data);
/* 随机播放音乐 */
extern void do_random_music(GtkWidget *widget, gpointer user_data);
/* 暂停音乐并切换图标 */
extern void do_pause_music(GtkWidget *widget, gpointer user_data);
/* 减小声音 */
extern void do_jxsy_music(GtkWidget *widget, gpointer user_data);
/* 增加声音 */
extern void do_zjsy_music(GtkWidget *widget, gpointer user_data);
/* 快进 */
extern void do_fast_music(GtkWidget *widget, gpointer user_data);
/* 快退 */
extern void do_slow_music(GtkWidget *widget, gpointer user_data);
/* 静音 */
extern void do_jy_music(GtkWidget *widget, gpointer user_data);
/* 上一首音乐 */
extern void do_last_music(GtkWidget *widget, gpointer user_data);
/* 下一首音乐 */
extern void do_next_music(GtkWidget *widget, gpointer user_data);
/* 切换用户 */
extern void do_change_user_music(GtkWidget *widget, gpointer user_data);


/*********************** 清除函数 *************************/
/* 管理员登录测试界面行编辑框清除 */
extern void entry_clean_for_window_gl_logintest(void);
/* 管理员注册界面行编辑框清除 */
extern void entry_clean_for_window_gl_reg(void);
/* 用户登录界面行编辑框清除 */
extern void entry_clean_for_window_yh_login(void);
/* 用户注册界面行编辑框清除 */
extern void entry_clean_for_window_yh_reg(void);

#endif

项目完成度

在这里插入图片描述

  • 音乐播放器有Bug
  • 音乐管理增加功能未能如期完成

项目总结

在这里插入图片描述

  • 闭门造车,出门合辙
    • 其一如古意
      • 项目分工标准化、流程化,结合时自然而然可以运行
    • 其二如今意
      • 可以使用别人的轮子来完成自己的目的,但要做好不能运行的准备
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值