j'ai ajouté une fenêtre administrateur qui va te permettre de gérer les utilisateurs.
-Visualisation, Ajout, Modification et suppression.
-La base de données est crée si elle est inexistante.
-La création de l'utilisateur admin est automatique.
-Chaque utilisateur peut modifier son mot de passe.
-Seul l'admin pourra ouvrir la fenêtre de gestion de la base de données.
-Le programme est minimaliste mais te permet d'obtenir un squelette qui j’espère répondra à ta demande. Sauvegarde le code ci-dessous avant de le lancer.
Code : Tout sélectionner
;/ by MetalOS
;/ Contributor : falsam
Declare UserProfilUpdate()
Declare AdminUsersList()
Declare AdminUserView(GadgetID.l)
Declare AdminUserUpdate()
Declare AdminUserDelete()
;- Global Variables and Constants
Global BubbleTipStyle.l, BubbleTipStyle=0
Global File.s ;Database à ouvrir
Global ReqSql.s ;Requete à envoyer à la base de données
Global IdLogin.s, IdRole.s, Nom.s, Password.s
Global Creation.i = 1 ;Indicateur de création d'un enregistrement
Global Modification = 2 ;Indicateur de modification d'un enregistrement
;- Window Constants
Enumeration 1
#Database
#Window_Form0
#Window_Form1
#Window_Form2
EndEnumeration
#WindowIndex=#PB_Compiler_EnumerationValue
;- Gadget Constants
Enumeration 1
;Window_Form0
#Gadget_Form0_Nom
#Gadget_Form0_Password
#Gadget_Form0_idrole
#Gadget_Form0_ListeNom
#Gadget_Form0_ButtonUpdate
#Gadget_Form0_ButtonDel
;Window_Form1
#Gadget_Form1_Text1
#Gadget_Form1_StringNom
#Gadget_Form1_Text2
#Gadget_Form1_StringPassword
#Gadget_Form1_ButtonAnnuler
#Gadget_Form1_ButtonValider
;Window_Form2
#Gadget_Form2_Nom
#Gadget_Form2_Password
#Gadget_Form2_Update
EndEnumeration
#GadgetIndex=#PB_Compiler_EnumerationValue
;Crypter une donnée
Procedure.S Encode(Value.s)
Protected Buffer.s = Space(1024)
Base64Encoder(@Value, StringByteLength(Value,#PB_UTF8), @Buffer, 1024)
ProcedureReturn Buffer
EndProcedure
Procedure.s Decode(Value.s)
Protected Buffer.s = Space(1024)
Base64Decoder(@Value, StringByteLength(Value), @Buffer, 1024)
ProcedureReturn Buffer
EndProcedure
;Panneau admin
Procedure Window_UserPanel()
OpenWindow(#Window_Form0, 0, 0, 350, 200, "Administration", #PB_Window_WindowCentered)
ListIconGadget(#Gadget_Form0_ListeNom, 10, 10, 330, 100, "Id Login", 50,#PB_ListIcon_FullRowSelect|#PB_ListIcon_AlwaysShowSelection)
AddGadgetColumn(#Gadget_Form0_ListeNom, 1, "Nom", 100)
AddGadgetColumn(#Gadget_Form0_ListeNom, 2, "Password", 100)
AddGadgetColumn(#Gadget_Form0_ListeNom, 3, "Role", 50)
StringGadget(#Gadget_Form0_Nom, 10, 120, 100, 20, "")
StringGadget(#Gadget_Form0_Password, 120, 120, 100, 20, "")
ComboBoxGadget(#Gadget_Form0_idrole, 230, 120, 120, 20)
AddGadgetItem(#Gadget_Form0_idrole, -1, "Administrateur")
AddGadgetItem(#Gadget_Form0_idrole, -1, "Utilisateur")
SetGadgetState(#Gadget_Form0_idrole, 1)
ButtonGadget(#Gadget_Form0_ButtonUpdate, 100, 170, 80, 20, "Enregistrer")
ButtonGadget(#Gadget_Form0_ButtonDel, 200, 170, 80, 20, "Supprimer")
;Defaut :Desactivation des bouton de mise à jour
DisableGadget(#Gadget_Form0_ButtonUpdate, #True)
DisableGadget(#Gadget_Form0_ButtonDel, #True)
;Defaut :A l'ouverture de la fenetre on considere qu'il s'agit d'une création
SetGadgetData(#Gadget_Form0_ButtonUpdate, Creation)
StickyWindow(#Window_Form0, #True)
EndProcedure
Procedure.l Window_Form1()
If OpenWindow(#Window_Form1,283,145,170,128,"Login",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_Invisible)
TextGadget(#Gadget_Form1_Text1,10,10,60,15,"Nom")
StringGadget(#Gadget_Form1_StringNom,10,25,145,20,"")
TextGadget(#Gadget_Form1_Text2,10,50,120,15,"Mot de passe")
StringGadget(#Gadget_Form1_StringPassword,10,65,145,20,"", #PB_String_Password)
ButtonGadget(#Gadget_Form1_ButtonAnnuler,95,100,60,20,"Annuler")
ButtonGadget(#Gadget_Form1_ButtonValider,30,100,60,20,"Valider")
HideWindow(#Window_Form1,0)
ProcedureReturn WindowID(#Window_Form1)
EndIf
EndProcedure
Procedure.l Window_Form2()
If OpenWindow(#Window_Form2,324,183,400,300,"Logiciel",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_WindowCentered|#PB_Window_Invisible)
TextGadget(#PB_Any, 10, 10, 40, 20, "Nom :")
TextGadget(#Gadget_Form2_Nom, 50, 10, 100, 20, Nom, #PB_Text_Border)
SetGadgetColor(#Gadget_Form2_Nom, #PB_Gadget_BackColor, #White)
TextGadget(#PB_Any, 160, 10, 50, 20, "Password :")
StringGadget(#Gadget_Form2_Password, 220, 10, 100, 20, Password)
ButtonGadget(#Gadget_Form2_Update, 330, 10, 50, 20, "M.a.j")
If IdRole="0"
Window_UserPanel()
AdminUsersList()
EndIf
HideWindow(#Window_Form2,0)
ProcedureReturn WindowID(#Window_Form2)
EndIf
EndProcedure
;Création de la base de données
Procedure DatabaseCreate()
Protected File.s, Database.i, ReqSQL.s, Nom.s, Password.s
File="Utilisateurs.db3"
;Création d'un fichier vierge
If CreateFile(#Database, File)
CloseFile(#Database)
Else
MessageRequester("Erreur", "Impossible de créer un fichier")
End
EndIf
;Création de la table des utilisateurs
;Chaque enregistrement possédera un identifiant automatique
If OpenDatabase(#Database, File, "", "", #PB_Database_SQLite)
ReqSql = "CREATE TABLE Login (" ;Création des opérations de recettes dépenses
ReqSql + "idlogin INTEGER PRIMARY KEY," ;Identifiant enregistrement
ReqSql + "Nom TEXT," ;Nom
ReqSql + "Password TEXT," ;Password
ReqSql + "idrole INTEGER" ;Role (0 : Super Admin, 1: Admin utilisateur, 2 : Utilisateur)
ReqSql + ")" ;Fin de la requete
;Exécution de la requete
DatabaseUpdate(#Database, ReqSql)
;Creation de l'admin par defaut (Nom=admin, password=admin")
;Modifiable une fois connecté
ReqSql = "insert into Login (idrole, Nom, Password) values ("
ReqSql + Chr(34) + "0" + Chr(34)+Chr(44)
ReqSql + Chr(34) + "admin" + Chr(34)+Chr(44)
ReqSql + Chr(34) + Encode("admin") + Chr(34)+")"
If DatabaseUpdate(#Database, ReqSql)=0
MessageRequester("Erreur", "Impossible d'ajouter l'admin de la base "+ Chr(13) + DatabaseError())
End
EndIf
;La création de la base de données est terminée
;CloseDatabase(#Database)
MessageRequester("Information","Création de la base terminée")
Else
MessageRequester("Erreur","Erreur lors de la création de la base de données" + Chr(13) +DatabaseError() )
EndIf
EndProcedure
;Existence de l'utlisateur et concordance avec le mot de passe
Procedure UserExist(Nom.s, Password.s)
Protected ReqSql.s
;Préparation de la requete de selection de l'utilisateur
;qui tente de se connecter
ReqSQl="select * from login where Nom=" + Chr(34)+Nom+Chr(34)
;La requete envoyée à la base de données va renvoyer un tableau
;Chaque ligne de ce tableau represente un enregistrement
;Chaque champs posséde un numéro d'ordre
;Dans ton cas : idlogin (0) + nom (1) + password (2)
If DatabaseQuery(#Database, ReqSql)
;Lecture de l'enregistrement retourné
NextDatabaseRow(#Database)
;Vérification du nom
If Nom = GetDatabaseString(#Database, 1)
;Le nom correspond : On vérifie le password
If Encode(Password) = GetDatabaseString(#Database, 2)
;Mémorisation de l'IdLogin en cas de mise à jour
IdLogin=Str(GetDatabaseLong(#Database, 0))
IdRole =Str(GetDatabaseLong(#Database, 3))
ProcedureReturn #True
Else
MessageRequester("Information", "Mauvais mot de passe")
EndIf
Else
MessageRequester("Information", "Votre nom d'utilisateur n'est pas référencé")
ProcedureReturn #False
EndIf
EndIf
FinishDatabaseQuery(#Database)
EndProcedure
Procedure UserProfilUpdate()
;Preparation de la requete de modification
Password=GetGadgetText(#Gadget_Form2_Password)
ReqSql = "update Login set "
ReqSql + "password=" + Chr(34) + Encode(Password) + Chr(34)
ReqSql + "where idlogin = " + Chr(34)+Idlogin+Chr(34)
;Mise à jour de l'enregistrement
If DatabaseUpdate(#Database, ReqSql) <>0
;Mise à joru de la fenetre admin si elle est ouverte
If IsWindow(#Window_Form0)
AdminUsersList()
EndIf
MessageRequester("Information","Modification de votre profil effectuée.")
Else
MessageRequester("Erreur", "Erreur durant la mise à jour de votre profil "+Chr(13)+DatabaseError())
EndIf
EndProcedure
;Liste des utilisateurs uniquement accessible par l'admin
Procedure AdminUsersList()
Protected Enregistrement.s
;Préparation de la requete SQL
;Pour l'exercice on ajoute un tri ascendant sur le nom de l'utilisateur
ReqSql="select * from login order by nom asc"
ClearGadgetItems(#Gadget_Form0_ListeNom)
;Exécution de la requete
If DatabaseQuery(#Database, ReqSql)
While NextDatabaseRow(#Database)
Enregistrement = Str(GetDatabaseLong(#Database, 0)) + Chr(10) ;IdLogin
Enregistrement + GetDatabaseString(#Database, 1) + Chr(10) ;Nom
Enregistrement + Decode(GetDatabaseString(#Database, 2)) + Chr(10) ;Password
Enregistrement + GetDatabaseString(#Database, 3) ;IdRole
AddGadgetItem(#Gadget_Form0_ListeNom, -1, Enregistrement)
Wend
FinishDatabaseQuery(#Database)
EndIf
EndProcedure
;Visualisation d'un utilisateur uniquemenet accessible par l'admin
Procedure AdminUserView(GadgetID.l)
If GetGadgetState(#Gadget_Form0_ListeNom) <> -1
Nom=GetGadgetItemText(GadgetID, GetGadgetState(GadgetID), 1)
Password=GetGadgetItemText(GadgetID, GetGadgetState(GadgetID), 2)
IdRole=GetGadgetItemText(GadgetID, GetGadgetState(GadgetID), 3)
SetGadgetText(#Gadget_Form0_Nom, Nom)
SetGadgetText(#Gadget_Form0_Password, Password)
SetGadgetState(#Gadget_Form0_idrole, Val(IdRole))
;Activation des boutons de mise à jour
DisableGadget(#Gadget_Form0_ButtonUpdate, #False)
If idRole<>"0"
DisableGadget(#Gadget_Form0_ButtonDel, #False)
DisableGadget(#Gadget_Form0_idrole, #False)
Else
DisableGadget(#Gadget_Form0_ButtonDel, #True)
DisableGadget(#Gadget_Form0_idrole, #True)
EndIf
;C'est une modification : On l'indique au bouton enregistrer
SetGadgetData(#Gadget_Form0_ButtonUpdate, Modification)
EndIf
EndProcedure
;Ajout ou modification d'un utilisateur uniquement accessible par l'admin
;#Gadget_Form0_ButtonUpdate indique s'il s'agit d'un ajout ou d'une modification
Procedure AdminUserUpdate()
Protected Idoperation.i, DateCrea.s, Operation.s, Recette.s, Depense.s
;Récupération des données
IdRole = Str(GetGadgetState(#Gadget_Form0_idrole))
Nom = GetGadgetText(#Gadget_Form0_Nom)
Password = GetGadgetText(#Gadget_Form0_Password)
;Création ou modification ?
If GetGadgetData(#Gadget_Form0_ButtonUpdate)=Creation
;Préparation de la requete de création
ReqSql = "insert into Login (idrole, nom, password) values ("
ReqSql + Chr(34) + idrole + Chr(34)+Chr(44)
ReqSql + Chr(34) + nom + Chr(34)+Chr(44)
ReqSql + Chr(34) + Encode(Password) + Chr(34)+")"
;Ajout de l'enregistrement
If DatabaseUpdate(#Database, ReqSql) <>0
AdminUsersList()
MessageRequester("Information","Utilisateur ajouté")
Else
MessageRequester("Erreur", "Erreur durant l'ajout d'un utilisateur" + Chr(13) + DatabaseError())
EndIf
Else
;Récupération de l'identifiant automatique
Idlogin=GetGadgetItemText(#Gadget_Form0_ListeNom, GetGadgetState(#Gadget_Form0_ListeNom))
;Preparation de la requete de modification
ReqSql = "update login set "
ReqSql + "idrole=" + Chr(34) + idrole + Chr(34)+Chr(44)
ReqSql + "nom=" + Chr(34) + nom + Chr(34)+Chr(44)
ReqSql + "password=" + Chr(34) + Encode(Password) + Chr(34)
ReqSql + "where idlogin = " + Chr(34)+Idlogin+Chr(34)
;Mise à jour de l'enregistrement
If DatabaseUpdate(#Database, ReqSql) <>0
SetGadgetText(#Gadget_Form2_Password, Password)
AdminUsersList()
MessageRequester("Information","Modification effectuée.")
Else
MessageRequester("Erreur", "Erreur durant la modification d'un utilisateur" + Chr(13) + DatabaseError())
EndIf
EndIf
SetGadgetText(#Gadget_Form0_Nom,"")
SetGadgetText(#Gadget_Form0_Password,"")
DisableGadget(#Gadget_Form0_ButtonUpdate, #True)
DisableGadget(#Gadget_Form0_ButtonDel, #True)
SetGadgetData(#Gadget_Form0_ButtonUpdate, Creation)
EndProcedure
;Supprimer une opération uniquement accessible par l'admin
;On se sert de l'identifiant automatique poru supprimer un enregistrement
Procedure AdminUserDelete()
;Préparation de la requete de suppression
Idlogin=GetGadgetItemText(#Gadget_Form0_ListeNom, GetGadgetState(#Gadget_Form0_ListeNom))
ReqSql="delete from login where idlogin="+IdLogin
If DatabaseUpdate(#Database,ReqSQL)
FinishDatabaseQuery(#Database)
AdminUsersList()
SetGadgetText(#Gadget_Form0_Nom,"")
SetGadgetText(#Gadget_Form0_Password,"")
DisableGadget(#Gadget_Form0_ButtonUpdate, #True)
DisableGadget(#Gadget_Form0_ButtonDel, #True)
SetGadgetData(#Gadget_Form0_ButtonUpdate, Creation)
MessageRequester("Information","Suppression effectuée.")
Else
MessageRequester("Erreur", "Erreur durant la suppression d'un utilisateur" + Chr(13) + DatabaseError())
End
EndIf
EndProcedure
;-Debut
UseSQLiteDatabase()
File="Utilisateurs.db3"
;Test existance de la base
If Not ReadFile(#Database, File)
DatabaseCreate()
Else
CloseFile(#Database)
OpenDatabase(#Database, File, "", "", #PB_Database_SQLite)
EndIf
;- Main Loop
If Window_Form1()
quitForm1=0
Repeat
EventID =WaitWindowEvent()
MenuID =EventMenu()
GadgetID =EventGadget()
WindowID =EventWindow()
Select EventID
Case #PB_Event_CloseWindow
Select WindowID
Case #Window_Form1
quitForm1=1
Case #Window_Form2
If IsWindow(#Window_Form0)
CloseWindow(#Window_Form0)
EndIf
CloseWindow(#Window_Form2)
EndSelect
Case #PB_Event_Gadget
Select GadgetID
Case #Gadget_Form0_ListeNom
AdminUserView(GadgetID)
Case #Gadget_Form0_Nom, #Gadget_Form0_Password
If Trim(GetGadgetText(#Gadget_Form0_Nom))="" Or Trim(GetGadgetText(#Gadget_Form0_Password))=""
DisableGadget(#Gadget_Form0_ButtonUpdate, #True)
If GetGadgetData(#Gadget_Form0_ButtonUpdate)=Modification
DisableGadget(#Gadget_Form0_ButtonUpdate, #True)
EndIf
Else
DisableGadget(#Gadget_Form0_ButtonUpdate, #False)
If GetGadgetData(#Gadget_Form0_ButtonUpdate)=Modification
DisableGadget(#Gadget_Form0_ButtonUpdate, #False)
EndIf
EndIf
Case #Gadget_Form0_ButtonUpdate
AdminUserUpdate()
Case #Gadget_Form0_ButtonDel
AdminUserDelete()
Case #Gadget_Form1_StringNom
Case #Gadget_Form1_StringPassword
Case #Gadget_Form1_ButtonAnnuler
quitForm1=1
Case #Gadget_Form1_ButtonValider
Nom=GetGadgetText(#Gadget_Form1_StringNom)
Password=GetGadgetText(#Gadget_Form1_StringPassword)
If UserExist(Nom, Password)
Window_Form2()
EndIf
Case #Gadget_Form2_Update
UserProfilUpdate()
EndSelect
EndSelect
Until quitForm1
CloseDatabase(#Database)
CloseWindow(#Window_Form1)
EndIf
End