Mudanças entre as edições de "Projeto de Programação 1 - Programa Controle de Acesso"

De MediaWiki do Campus São José
Ir para navegação Ir para pesquisar
Linha 12: Linha 12:
  
  
 +
== Implementações básicas para a Interface GUI ==
 +
==== Criando e configurando a janela do Administrador ====
 +
 +
/** Funções para se iniciar e configurar a janela administrador do Controle de Acesso de usuário **/
 +
window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
 +
gtk_window_set_title(GTK_WINDOW(window), "Controle de Acesso de Usuário - Administrador");
 +
gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
 +
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
 +
gtk_container_set_border_width(GTK_CONTAINER(window), 5);
 +
  
 +
==== Criando frames para divisão de espaços para a janela ====
 +
 +
  /** Funções para dividir a janela em dois frames: o primeiro (da esquerda) será um campo fixo e o segundo(da direita) conterá as atividades do  administrador **/
 +
table1 = gtk_table_new(2, 2, TRUE);
 +
gtk_table_set_row_spacings(GTK_TABLE(table1), 10);
 +
gtk_table_set_col_spacings(GTK_TABLE(table1), 10);
 +
gtk_container_add(GTK_CONTAINER(window), table1);
 +
 +
frame1 = gtk_frame_new("Bem Vindo");
 +
gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_IN);
 +
frame2 = gtk_frame_new("Opções de Gerenciamento");
 +
gtk_frame_set_shadow_type(GTK_FRAME(frame2), GTK_SHADOW_IN);
 +
frame3 = gtk_frame_new("Log de acesso");
 +
gtk_frame_set_shadow_type(GTK_FRAME(frame3), GTK_SHADOW_IN); 
 +
 +
gtk_table_attach_defaults(GTK_TABLE(table1), frame1, 0, 1, 0, 1);
 +
gtk_table_attach_defaults(GTK_TABLE(table1), frame2, 1, 2, 0, 2);
 +
gtk_table_attach_defaults(GTK_TABLE(table1), frame3, 0, 1, 1, 2);
 +
  
 +
==== Botão HOME e mensagen de Boas Vindas ====
 +
 +
/** Caixa que conterá itens do menu esquerdo - campo fixo **/
 +
/** Funções para criar o botão HOME **/
 +
/** Mensagem de boas vindas ao usuário **/
 +
vbox2 = gtk_vbox_new(FALSE, 10);
 +
hbox2 = gtk_hbox_new(FALSE, 10);
 +
halign2 = gtk_alignment_new (0,1,0,0);
 +
 +
botaoHome = gtk_button_new_with_label ("Home");
 +
gtk_widget_set_size_request(botaoHome, 70, 35);
 +
boasvindas = gtk_label_new ("Bom Dia Administrador!");
 +
 +
gtk_box_pack_start(GTK_BOX (hbox2), botaoHome, FALSE, TRUE, 10);
 +
gtk_box_pack_start(GTK_BOX (hbox2), boasvindas, FALSE, TRUE, 10);
 +
 +
gtk_container_add (GTK_CONTAINER (halign2), hbox2);
 +
gtk_box_pack_start(GTK_BOX (vbox2), halign2, FALSE, FALSE, 0);
 +
 +
gtk_container_add(GTK_CONTAINER(frame1), vbox2);
 +
 +
/** Função do botão HOME **/
 +
g_signal_connect(G_OBJECT(botaoHome), "clicked", G_CALLBACK(gtk_widget_show_all), NULL);
 +
  
 
+
==== Funções para fechar a janela e mostrar todos os seus itens ====
 
+
 
+
g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));
 
+
 +
/** Função para mostrar todos os itens da janela **/
 +
gtk_widget_show_all(window);
 +
  
 
== Ações do Administrador ==
 
== Ações do Administrador ==
Linha 288: Linha 344:
 
  gtk_box_pack_start(GTK_BOX(vbox1), BloquearUser, 0, TRUE, 0);
 
  gtk_box_pack_start(GTK_BOX(vbox1), BloquearUser, 0, TRUE, 0);
 
  gtk_box_pack_start(GTK_BOX(vbox1), CadastrarUser, 0, TRUE, 0);
 
  gtk_box_pack_start(GTK_BOX(vbox1), CadastrarUser, 0, TRUE, 0);
 +
 +
/* Função do botão "Bloquear usuário"*/
 +
g_signal_connect(G_OBJECT(BloquearUser), "clicked", G_CALLBACK(BloquearUser_clicked), NULL);
 +
 +
/* Função do botão "Bloquear administrador"*/
 +
g_signal_connect(G_OBJECT(BloquearAdmin), "clicked", G_CALLBACK(BloquearAdmin_clicked), NULL);

Edição das 21h11min de 8 de abril de 2013

Proposta de trabalho:

  • Sistema de controle de acesso;
  • Interface GUI para o administrador;
  • Interface usuário GUI simulando o display LCD;
  • Arquivo de log de entrada/saída de usuários com horário e data;
  • Armazenamento da base de dados em arquivo;
  • Prever possibilidade de vários administradores;


Sistema de controle de acesso

Implementações básicas para a Interface GUI

Criando e configurando a janela do Administrador

/** Funções para se iniciar e configurar a janela administrador do Controle de Acesso de usuário **/
	window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title(GTK_WINDOW(window), "Controle de Acesso de Usuário - Administrador");
	gtk_window_set_default_size(GTK_WINDOW(window), 800, 600);
	gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER);
	gtk_container_set_border_width(GTK_CONTAINER(window), 5);

Criando frames para divisão de espaços para a janela

 /** Funções para dividir a janela em dois frames: o primeiro (da esquerda) será um campo fixo e o segundo(da direita) conterá as atividades do  administrador **/
	table1 = gtk_table_new(2, 2, TRUE);
	gtk_table_set_row_spacings(GTK_TABLE(table1), 10);
	gtk_table_set_col_spacings(GTK_TABLE(table1), 10);
	gtk_container_add(GTK_CONTAINER(window), table1);

	frame1 = gtk_frame_new("Bem Vindo");
	gtk_frame_set_shadow_type(GTK_FRAME(frame1), GTK_SHADOW_IN);
	frame2 = gtk_frame_new("Opções de Gerenciamento");
	gtk_frame_set_shadow_type(GTK_FRAME(frame2), GTK_SHADOW_IN);
	frame3 = gtk_frame_new("Log de acesso");
	gtk_frame_set_shadow_type(GTK_FRAME(frame3), GTK_SHADOW_IN);  

	gtk_table_attach_defaults(GTK_TABLE(table1), frame1, 0, 1, 0, 1);
	gtk_table_attach_defaults(GTK_TABLE(table1), frame2, 1, 2, 0, 2);
	gtk_table_attach_defaults(GTK_TABLE(table1), frame3, 0, 1, 1, 2);

Botão HOME e mensagen de Boas Vindas

/** Caixa que conterá itens do menu esquerdo - campo fixo **/
/** Funções para criar o botão HOME **/
/** Mensagem de boas vindas ao usuário **/
	vbox2 = gtk_vbox_new(FALSE, 10);	
	hbox2 = gtk_hbox_new(FALSE, 10);
	halign2 = gtk_alignment_new (0,1,0,0);

	botaoHome = gtk_button_new_with_label ("Home");
	gtk_widget_set_size_request(botaoHome, 70, 35);
	boasvindas = gtk_label_new ("Bom Dia Administrador!");

	gtk_box_pack_start(GTK_BOX (hbox2), botaoHome, FALSE, TRUE, 10);
	gtk_box_pack_start(GTK_BOX (hbox2), boasvindas, FALSE, TRUE, 10);

	gtk_container_add (GTK_CONTAINER (halign2), hbox2);
	gtk_box_pack_start(GTK_BOX (vbox2), halign2, FALSE, FALSE, 0);

	gtk_container_add(GTK_CONTAINER(frame1), vbox2);

/** Função do botão HOME **/
	g_signal_connect(G_OBJECT(botaoHome), "clicked", G_CALLBACK(gtk_widget_show_all), NULL);

Funções para fechar a janela e mostrar todos os seus itens

g_signal_connect_swapped(G_OBJECT(window), "destroy", G_CALLBACK(gtk_main_quit), G_OBJECT(window));

/** Função para mostrar todos os itens da janela **/
	gtk_widget_show_all(window);

Ações do Administrador

Bloquear Usuário

case 1: /*** PARA BLOQUEAR USUÁRIO ***/
		printf("\nPara bloquear usuário:\n");
		 printf("\nEntre com o nome do usuário a ser bloqueado: ");
		scanf(" %s", userID);
		
		/* Loop para encontrar o usuário na tabela */
		for (aux=0, userEncontrado=1;aux<TAB_USER && userEncontrado;aux++) {
			if( strcmp(userID, TabelaUsuarios[aux].UserId)==0)
				userEncontrado=0;
		}
		
		/* Se o usuário for encontrado será bloqueado */
		if (userEncontrado==0) {
			aux--;
			if (TabelaUsuarios[aux].ContUser>=3) {
				printf("\nUsuário encontrado já bloqueado!\n");
			} else{
				printf("\nBloqueando usuário...\n");
				TabelaUsuarios[aux].ContUser = 3;

				/* Condição para verificar o sucesso da operação.*/
				if(TabelaUsuarios[aux].ContUser>=3)
					printf("\nUsuário bloqueado com sucesso!\n");
				}
		} else
			printf("\nUsuário não cadastrado!\n");
		break;

Cadastrar novo Usuário

case 2: /*** PARA CADASTRAR NOVO USUÁRIO ***/
		printf("\nPara cadastrar novo usuário: ");
		
		/* Loop para encontrar o final da tabela */
		for(i=0;TabelaUsuarios[i].UserId[0] && i<TAB_USER;i++)
			aux++;
		
		/* Condição para novo cadastro.*/
		if (i==TAB_USER)
			printf("\nLimite de cadastro de usuários atingido.\n");
		else {

			printf("\nEntre com um novo nome de Usuário:\n");
			scanf(" %s", userID);
	
			/* Loop para encontrar o usuário na tabela */
			for (i=0; i<aux && userEncontrado; i++) {
				if( strcmp(userID, TabelaUsuarios[i].UserId)==0)
					userEncontrado=0;
			}
			/* Se o usuário for encontrado já está cadastrado. */
			if (userEncontrado==0)
				printf("\nUsuário já cadastrado.Tente novamente com outro usuário.\n");
			else {
				strcat(TabelaUsuarios[aux].UserId,userID);
	
				printf("\nEntre com uma nova senha para o novo usuário %s:\n", userID);
				scanf(" %s", senha);
				strcat(TabelaUsuarios[aux].Senha,senha);
	
				strcat(TabelaUsuarios[aux].MsgUser,"Bom Dia");
				
				/* Condição para verificar o sucesso da operação.*/
				if(strcmp(userID, TabelaUsuarios[aux].UserId)==0 && strcmp(senha, TabelaUsuarios[aux].Senha)==0)
					printf("\nNovo usuário '%s' cadastrado com sucesso!\n", TabelaUsuarios[aux].UserId);
			}
		}
		break;

Desbloquear um Usuário

case 3: /*** PARA DESBLOQUEAR USUÁRIO ***/
		printf("\nPara desbloquear usuário:\n");
		printf("\nEntre com o nome do usuário a ser desbloqueado: ");
		scanf(" %s", userID);
		
		/* Loop para encontrar o usuário na tabela */
		for (aux=0;aux<TAB_USER && userEncontrado;aux++) {
			if( strcmp(userID, TabelaUsuarios[aux].UserId)==0)
				userEncontrado=0;
		}

		/* Se o usuário for encontrado será desbloqueado */
		if (userEncontrado==0) {
			aux--;
			if (TabelaUsuarios[aux].ContUser>=3) {
				printf("\nUsuário encontrado bloqueado! Desbloqueando usuário...");
				TabelaUsuarios[aux].ContUser=0;

				/* Condição para verificar o sucesso da operação.*/
				if(TabelaUsuarios[aux].ContUser<=3)
					printf("\nUsuário desbloqueado com sucesso!\n");
			} else
				printf("\nUsuário encontrado desbloqueado! Tente novamente com outro usuário.\n");
		} else
			printf("\nUsuário não cadastrado!\n");
		break;

Excluir um Usuário

case 4: /*** PARA EXCLUIR UM USUÁRIO ***/
		printf("\nDigite o nome de usuário que deseja excluir: ");
		scanf(" %s", userID);

		/* Loop para encontrar o usuário na tabela.*/
		for (i=0;i<TAB_USER && userEncontrado; i++) {
			if( strcmp(userID, TabelaUsuarios[i].UserId)==0)
				userEncontrado=0;
		}
		/* Se usuário for encontrado será deletado */
		if (userEncontrado==0) {
			printf("\nExcluindo usuário...\n");
			i--;
			TabelaUsuarios[i].UserId[0]='\0';
			TabelaUsuarios[i].Senha[0]='\0';
			TabelaUsuarios[i].ContUser=0;
			TabelaUsuarios[i].MsgUser[0]='\0';

			/* Condição para verificar o sucesso da operação.*/
			if(TabelaUsuarios[i].UserId[0]==0)
				printf("\nUsuário excluído com sucesso!\n");
		} else
			printf("\nUsuário não cadastrado!\n");
	
		break;

Imprimir Tabela de Usuários

case 5: /*** PARA IMPRIMIR TABELA DE USUÁRIOS. ***/
		printf("\nListando tabela de usuários cadastrados...\n");

		for(aux=0;TabelaUsuarios[aux].UserId[0] && aux<TAB_USER;aux++) {
			printf("\n%s",TabelaUsuarios[aux].UserId);
			cont++;
		}
		printf("\n\nNúmero de usuários cadastrados: %d\n", cont);
		break;

Limpar Lista de Usuários

case 6: /*** PARA LIMPAR LISTA DE USUÁRIOS ***/
		printf("\nLimpando tabela de usuários...\n");
         	for(i=0;TabelaUsuarios[i].UserId[0];i++) {
           		TabelaUsuarios[i].UserId[0]='\0';
         		TabelaUsuarios[i].Senha[0]='\0';
           		TabelaUsuarios[i].ContUser=0;
			TabelaUsuarios[i].MsgUser[0]='\0';
		}
		break;

Modificar mensagem particular do Usuário

case 7: /*** PARA MODIFICAR MENSAGEM PARTICULAR DO USUÁRIO. ***/
		printf("\nPara modificar mensagem particular do usuário:\n");
		printf("\nEntre com o nome de usuário que deseja modificar a mensagem: ");
		scanf(" %s", userID);

		/* Loop para encontrar o usuário na tabela.*/
		for (i=0;i<TAB_USER && userEncontrado; i++) {
			if( strcmp(userID, TabelaUsuarios[i].UserId)==0)
				userEncontrado=0;
		}
		/* Se usuário for encontrado será modificado a mensagem particular. */
		if (userEncontrado==0) {
			printf("\nEntre com a nova mensagem: ");
			i--;
			scanf(" %s", TabelaUsuarios[i].MsgUser);
		
			/* Verificação do sucesso da operação.*/
			printf("\nA nova mensagem é '%s'.\n", TabelaUsuarios[i].MsgUser);	
			printf("\nMensagem particular modificada com sucesso!\n");
		}else
			printf("\nUsuário não cadastrado!\n");
		break;

Modificar mensagem padrão

case 13: /*** PARA MODIFICAR MENSAGEM PADRAO ***/
		printf("\nPara modificar mensagem padrão:\n");
		printf("\nEntre com a nova mensagem: ");
		scanf(" %s", MsgPadrao);
		
		/* Verificação do sucesso da operação.*/
		printf("\nA nova mensagem é '%s'.\n", MsgPadrao);	
		printf("\nMensagem padrão modificada com sucesso!\n");
		break;

Modificar senha do Administrador

case 15: /*** PARA MODIFICAR SENHA DO ADMINISTRADOR ***/
		printf("\nPara modificar senha do administrador:\n");
		printf("\nEntre com a senha atual do admin: ");
		scanf(" %s", senha);

		for (i=0;i<TAB_ADMIN && userEncontrado; i++) {
			if( strcmp(userID, TabelaAdmin[i].UserAdmin)==0)
				userEncontrado=0;
		}
		/* Condição para modificar a atual senha do administrador.*/
		if (userEncontrado==0) {
			i--;
			if (strcmp(senha, TabelaAdmin[i].SenhaAdmin)==0) {
				printf("\nEntre com a nova senha: ");
				scanf(" %s", senha);
				printf("\nConfirme a nova senha: ");
				scanf(" %s", TabelaAdmin[i].SenhaAdmin);
			
				/* Condição para verificar o sucesso da operação.*/
				if (strcmp(senha, TabelaAdmin[i].SenhaAdmin)==0)
					printf("\nSenha do administrador modificada com sucesso!\n");
				else
					printf("\nFalha ao modificar a senha. Dados incorretos. Tente novamente e verifique a nova senha.\n");
			} else 
				printf("\nDados incorretos. Tente novamente e verifique a senha do administrador fornecida.\n");
		}
		break;


Interface do Administrador (GUI)

Chamada de funções para Administrar

Abaixo encontra-se um exemplo de chamada de funções do GTK para acessar opções de atividades do Administrador:

 /** Chamadas funções para usuário **/
void BloquearUser_clicked(GtkWidget *widget, gpointer data)
{
	administrar(1, userID, senha);
}

/** Chamadas funções para administrador **/

void BloquearAdmin_clicked(GtkWidget *widget, gpointer data)
{
	administrar(8, userID, senha);
}

Tabela contendo os botões de atividades do Administrador

Tais botões estarão chamando os tipos de funções mostrados acima e são criados seguindo o exemplo abaixo:

/** Caixa que conterá as atividades do administrador **/
	vbox1 = gtk_vbox_new(FALSE, 1);
	  
	labelopcoes = gtk_label_new("Entre com uma das opções:");
	gtk_label_set_justify(GTK_LABEL(labelopcoes), GTK_JUSTIFY_CENTER);

	labeluser = gtk_label_new("Para usuário:");
	labeladmin = gtk_label_new("Para administrador:");

/** Definição dos textos que representam cada botão de ação **/
	BloquearUser = gtk_button_new_with_label("Bloquear usuário");
	BloquearAdmin = gtk_button_new_with_label("Bloquear administrador");

/** Criação dos botões para uso nas atividades do admin **/
	gtk_box_pack_start(GTK_BOX(vbox1), labelopcoes, 0, TRUE, 0);
	gtk_box_pack_start(GTK_BOX(vbox1), labeluser, 0, TRUE, 0);
	gtk_box_pack_start(GTK_BOX(vbox1), BloquearUser, 0, TRUE, 0);
	gtk_box_pack_start(GTK_BOX(vbox1), CadastrarUser, 0, TRUE, 0);

/* Função do botão "Bloquear usuário"*/
	g_signal_connect(G_OBJECT(BloquearUser), "clicked", G_CALLBACK(BloquearUser_clicked), NULL);

/* Função do botão "Bloquear administrador"*/
	g_signal_connect(G_OBJECT(BloquearAdmin), "clicked", G_CALLBACK(BloquearAdmin_clicked), NULL);