Eu estou desenvolvendo um software, e tenho uma dúvida em relação acesso do usuário.
Quando o Administrador logar com um usuário e uma senha padrão do sistema pela primeira vez, eu gostaria que ele fosse redirecionado para a janela “Usuários”, a fim de alterar ambos os campos.
A minha dúvida é: Como o sistema vai saber que é a primeira vez que o Administrador entra no sistema?
Israel, como maneira paleativa você pode criar uma flag no banco informando se já foi feito primeiro acesso. Essa flag inicia como false e assim que o usuário entrar pode setar ela como true.
Ou seja, quando um usuário se loga você verifica se esta flag está como false para este usuário e redireciona caso esteja. Assim que ele alterar os dados você seta como true para informar que já foi acessado anteriormente.
Tenta isso.
I
IsraelFM
Desculpa, ainda sou meio leigo, o que seria “flag”?
Pelo que pude induzir seria uma variável?
R
raphaeloneves1 like
Flag é uma coluna booleana(true/false) ou char(1/0)** que geralmente possui um valor padrão definido. Exemplo: PRIMEIRO_ACESSO com valor padrão FALSE, caso seja um boolean.
A sugestão dada foi de criar uma coluna no banco com um destes dois tipos. Digamos que a coluna PRIMEIRO_ACESSO esteja mapeado na entidade com um método getter chamado boolean isPrimeiroAcesso(). Desta forma, quando o usuário logar, vc verifica o retorno deste método e aplica a regra conforme o retorno. Exemplo:
UsuariousuarioLogado=servico.login(username,password);if(usuarioLogado.isPrimeiroAcesso())// redirecionaelse// outra regra qlq
** Não necessariamente a flag precisa ser um boolean ou um char de 0/1. Na empresa que trabalho tenho flag do tipo char com valor P, D, entre outros. Sua regra de negócio define sua flag, O caso sugerido é o mais simples de aplicar e validar.
E
edumatias1 like
E ai Israel, conseguiu prosseguir com a solução?
I
IsraelFM
O MySql usa o TINY INT (1) como boolean (só pode 0 e 1). Definindo como false, o phpMyAdmin redefine como 0.
Contexto: Eu tenho um JFrame de Login e outro JFrame Principal. Dentro do Principal, alguns JInternalFrame são abertos, e entre esses está o JInternalFrame Usuário, que é para onde eu quero que o usuário padrão seja redirecionado.
Então eu pensei em criar uma função e chamar ela assim que o usuário logar:
publicvoidprimeiroAcesso(){Stringsql="Select * from usuarios";try{pst=conexao.prepareStatement(sql);rs=pst.executeQuery();if(rs.next()){Stringpa=rs.getString(7);// 7 coluna é o pa (primeiro acesso)if(pa.equals(0)){//0 é false// Aqui está minha dúvida, como eu redireciono o usuário? Não faço ideia de como pego o endereço do JInternalFrame Usuário.}}else{JOptionPane.showMessageDialog(null,"Mensagem qualquer","Erro",JOptionPane.INFORMATION_MESSAGE);}}catch(Exceptione){JOptionPane.showMessageDialog(null,"Banco de Dados não encontrado","Erro",JOptionPane.ERROR_MESSAGE);}}
E
edumatias1 like
Israel,
Tenta desta forma.
Primeiro, mude para boolean seu método chamado primeiro acesso. Altere para que este método que busque apenas os dados deste usuário, criando uma cláusula no seu select que compare com o usuário que logou.
Após, ao usuário clicar em logar, implemente um novo método que chame o este primeiroAcesso passando como parâmetro o usuário para você comparar.
Você verifica se é primeiro acesso. Se for, retorna true, senão false.
No método que chamou o primeiroAcesso, faça como abaixo:
Se eu mudo método para boolean ele me dá um erro na chave que o fecha.
publicbooleanprimeiroAcesso(){Stringsql="Select * from usuarios where loginUs=? and senhaUs=?";try{pst=conexao.prepareStatement(sql);pst.setString(1,txtUsuario.getText());pst.setString(2,txtSenha.getText());rs=pst.executeQuery();if(rs.next()){Stringlogin=rs.getString(4);Stringsenha=rs.getString(5);Stringperfil=rs.getString(6);// tentei mudar a variável abaixo para boolean mas ainda não consegui resolver o problema do ifbooleanpa=rs.getBoolean(7);// 7 coluna é o pa (primeiro acesso)//Erro nessa condição abaixo: boolean cannot be dereferencedif(login.equals("admin")&&senha.equals("admin")&&perfil.equals("Admin")&&pa.equals(0)){//0 é false /->/Condição do primeiro acesso\<-\// Aqui está minha dúvida, como eu redireciono o usuário? Não faço ideia de como pego o endereço do JInternalFrame Usuário.System.out.println("teste");}}else{JOptionPane.showMessageDialog(null,"Mensagem qualquer","Erro",JOptionPane.INFORMATION_MESSAGE);}}catch(Exceptione){JOptionPane.showMessageDialog(null,"Banco de Dados não encontrado","Erro",JOptionPane.ERROR_MESSAGE);}}
E
edumatias1 like
Se você mudar para booleano deve ter um retorno booleano. E você deveria chamar este método de outro e com o retorno redirecionar.
Mas, tente desta outra forma sem mudar mudar o retorno.
publicvoidprimeiroAcesso(){Stringsql="Select * from usuarios where loginUs=? and senhaUs=?";try{pst=conexao.prepareStatement(sql);pst.setString(1,txtUsuario.getText());pst.setString(2,txtSenha.getText());rs=pst.executeQuery();if(rs.next()){Stringlogin=rs.getString(4);Stringsenha=rs.getString(5);Stringperfil=rs.getString(6);// tentei mudar a variável abaixo para boolean mas ainda não consegui resolver o problema do ifbooleanehPrimeiroAcesso=rs.getBoolean(7);// 7 coluna é o pa (primeiro acesso)//Erro nessa condição abaixo: boolean cannot be dereferencedif(login.equals("admin")&&senha.equals("admin")&&perfil.equals("Admin")){//0 é false /-if(ehPrimeiroAcesso){//se for o primeiro acesso você deve instanciar o Frame e colocar com visivelFrmJanelaUsuariosframe=newFrmJanelaUsuarios();frame.setVisible(true);}else{//se não for chama a outra telaFrmOutraTelaframe=newFrmOutraTela();frame.setVisible(true);}}}else{JOptionPane.showMessageDialog(null,"Mensagem qualquer","Erro",JOptionPane.INFORMATION_MESSAGE);}}catch(Exceptione){JOptionPane.showMessageDialog(null,"Banco de Dados não encontrado","Erro",JOptionPane.ERROR_MESSAGE);}}
Não deu para redirecionar, o sistema só abre o frmPrincipal.
Eu estava pensando em mesclar o método primeiroAcesso com o método logar, ficaria assim:
publicvoidlogar(){Stringsql="Select * from usuarios where loginUs=? and senhaUs=?";try{pst=conexao.prepareStatement(sql);pst.setString(1,txtUsuario.getText());pst.setString(2,txtSenha.getText());rs=pst.executeQuery();//se existir usuário e senha correspondentesif(rs.next()){Stringlogin=rs.getString(4);Stringsenha=rs.getString(5);Stringperfil=rs.getString(6);booleanehPrimeiroAcesso=rs.getBoolean(7);// 7 coluna é o pa (primeiro acesso)//a estrutura abaixo faz o tratamento do perfil do usuárioif(perfil.equals("Admin")){// Dentro deste frmPrincipal eu tenho o deskPrincipal, que é onde os JIternalFrame aparecem.frmPrincipalprincipal=newfrmPrincipal();principal.setVisible(true);frmPrincipal.mnuRelatorio.setEnabled(true);frmPrincipal.mniUsuario.setEnabled(true);frmPrincipal.lblUsuario.setText(rs.getString(2));//pega o campo 2 da tabela(nomeUs)frmPrincipal.lblUsuario.setForeground(Color.red);this.dispose();if(login.equals("admin")&&senha.equals("admin")&&perfil.equals("Admin")){//0 é false /-if(ehPrimeiroAcesso){//se for o primeiro acesso você deve instanciar o Frame e colocar com visivelJDesktopPanedeskPrincipal=newJDesktopPane();JInternalFramefrmUsuario=newJInternalFrame();deskPrincipal.add(frmUsuario);frmUsuario.setVisible(true);/*frmUsuario frame = new frmUsuario(); frame.setVisible(true);*/}else{//se não for chama a outra telafrmPecasframe=newfrmPecas();frame.setVisible(true);}}}else{frmPrincipalprincipal=newfrmPrincipal();principal.setVisible(true);frmPrincipal.lblUsuario.setText(rs.getString(2));this.dispose();}}else{JOptionPane.showMessageDialog(null,"Usuário e/ou Senha Inválido(s)","Erro",JOptionPane.INFORMATION_MESSAGE);}}catch(Exceptione){JOptionPane.showMessageDialog(null,"Banco de Dados não encontrado.\nCertifique-se de que o Vertrigo esteja ligado!\n"+"Em caso de dúvida entre em contato com a empresa GeralTech.\nTelefone: (35)9 9944-8328","Erro",JOptionPane.ERROR_MESSAGE);}}
E
edumatias1 like
Amigo, utilize sempre letras maíusculas em Classes, Frames e afins.
Voltando ao problema, a parte de primeiro acesso ao software está OK? Já está validando se é o primeiro acesso (Lembre-se de setar como false esta flag após o primeiro acesso para não entrar novamente) ??
Apresentou algum erro ao não abrir o frame?
Debuga o código e veja se ele entra no seu if ( if(ehPrimeiroAcesso ){)
I
IsraelFM
Sim, está entrando no if,
Não apresentou nenhum erro ao abrir o frame. Está pegando todas as informações no banco de dados.
Quanto ao primeiroAcesso, está validando.
primeiro de tudo dá uma refatorada nas tuas classes e frames e coloca tudo com inicial maiusculo.
Feito isso dentro do teu if adicione o seguinte trecho de código
FrmPrincipal frame = new FrmPrincipal(); frame.setVisible(true);
Isso após o refatoramento.
Ele tem que abrir o frame Principal. Isso se entrar no IF, lógico.
Teste isso.
H
HIPERLENDARIO
so uma dica dos especialistas kkkk
so deixe a janela visivel depois que o meu velho amigo processador fazer os calculos, pra nao encher o processa de coisa!
espero que me ajudem no meu canal do youtube:
Hiperciencia Lendaria
espero que visitem o meu site da minha futura empresa: http://www.starkindustriesepios.org