This commit is contained in:
Bilou 2022-12-08 03:58:56 +01:00
parent 37eec841b8
commit dd088c00a2
38 changed files with 53533 additions and 53544 deletions

File diff suppressed because it is too large Load Diff

308
README.md
View File

@ -1,154 +1,154 @@
---
titre: "Rapport_technique_Projet_IHM_Brinet_Besson_Boudjemline"
auteurs: "Félix Brinet / Romain Besson / Bilal Boudjemline"
date: "2022-12-04"
---
## Sommaire
- <div>
1. Introduction
2. Utilisation de l'API
3. Diagramme
4. Fonctionnalitées
- Fonctionnalitées réussi
- Fonctionnalitées non réussi
- Fonctionnalitées manquantes
5. Tests
- Tests réussi
- Tests non réussi
- Tests montrant des bugs
6. Conclusions
- Conclusion personnelles
- Conclusion générale
</div>
## Utilisation de l'API
Bilal a commencé le projet seul car Romain et Félix étaient encore sur le projet précédent. Il a pu commencer à utiliser à l'API et à tester en modèle non-persistant. À la suite, Félix a créé la base de données et a essayé d'aider Bilal pour le modèle persistant. Ensuite Romain à changé l'interface pour la rendre plus intuitive et plus agréable à utiliser. Il a par exemple utilisé des CardLayout et Jpanel pour éviter d'ouvrir une fenêtre pour chaque fonctionnalité. Il a pu aussi créer un menu afin d'accéder aux différentes applications.
## Diagrammes
## Fonctionnalitées
Pour les 3 vues, nous avons pas fait d'interface malgrès que les vues ont des méthodes en commun. En effet, nous voulons créer des applications indépendantes et déployable sans les autres donc une interface aurait empéché cette séparation.
### Fonctionnalitées réussi
**Administrateur :**
- <div>
- (M) Créer, supprimer et renommer un groupe;
- (M) Ajouter un individu dans un groupe;
- (M) Déplacer un individu dans un autre groupe;
</div>
**Professeur :**
- <div>
- (M) Afficher la liste des groupes
- (M) Afficher la liste des étudiant d'un groupe donné
- (S) Chercher le groupe d'un étudiant à partir des **3** premières lettres de son nom
</div>
**Elève :**
- <div>
- (M) Afficher la liste des groupes
- (M) Afficher la liste des étudiants d'un groupe donné
- (M) Demandé à passé dans groupe ~~qui est moins pleins que le sien~~ en ajoutant une explication
- (S) Voir les demandes de changement de groupe du type 2
</div>
### Fonctionnalitées non réussi
**Administrateur :**
- <div>
- (S) Déplacer un individus en validant sa demande
- (S) Refus d'une demande (de type 1)
- (C) Echanger des individus entre 2 groupes à leur demande respectives (demande de type 2)
- (C) Refus d'une demande (de type 2)
</div>
**Professeur :**
- <div>
- Toutes les fonctionnalitées ont été réussi
</div>
**Elève :**
- <div>
- (S) Demander à passer dans un groupe qui est de même taille ou plus grand en ajoutant une explication (demande de type 2 à faire valider)
</div>
### Fonctionnalitées manquantes
Par choix arbitraire, nous avons decidé de ne pas créer de sous groupe.
Rajouter un bouton quitter sur la page d'accueil, ce n'est pas indispensable mais cela pourrait rendre l'interface plus intuitive.
## Tests
### Tests réussi
Lorsqu'un administrateur clique sur "Changer le groupe d'un étudiant", il peut voir le changement en direct sur l'affichage du tableau à droite. De plus la base de données et également mis à jour.
Nous pensons que l'ensemble des fonctionnalités demandés ont été faite. (Mis a part ce qui se trouve dans la catégorie: Fonctionnalitées manquantes et Fonctionnalitées non reussi).
### Tests montrant des bugs
Nous avons fait essayer notre application à d'autres étudiants, dont Kilian Moulin. Il a pu détecter des bugs.
Lors d'un clique sur "Affichage" puis "Plein écran" ou bien "Fenêtré", les différents onglets pour changer de vue de "Menu" disparaissent. Ce qui fait que nous sommes alors coincés sur la vue choisie.
Si l'utilisateur se rend la vue Administrateur et qu'il choisit "Changer le groupe d'un étudiant" et que l'utilisateur se met ensuite sur la vue professeur ou bien élève en passant par le menu alors il peut déplacer des élèves sans être administrateur.
## Conclusions
### Conclusions personnelles
Bilal: J'ai trouvé ce projet intéressant à faire. Il a demandé une mobilisation de quasi toutes les connaissances que nous avons pu acquerir dans le BUT2. Ce que je trouve dommage, c'est que nous étions restraint par l'API.
Felix: Ce
Romain: ()
### Conclusion générale
Ce projet a été un challenge pour nous tous dans le projet. Tout d'abord en raison de sa complexité mais également car nous n'avions jamais travaillé ensemble au paravant. Nous sommes assez fier du rendu du projet mais nous aurions aimé rajouté plus de fonctionnalitées. Nous avons eu des problèmes sur la repartition des tâches à faire. Nous avons pu mettre en valeur les atouts de chacun dans se projet, Bilal pour l'utilisation de l'API et les fonctionnalités. Romain a pu mettre en avant ses compétences pour créer une interface intuitive et agréable à regarder. Félix a pu organiser les tâches à faire, aider lors de bug en faisaint du pair programming et la rédaction du rapport ainsi que la base de données.
---
titre: "Rapport_technique_Projet_IHM_Brinet_Besson_Boudjemline"
auteurs: "Félix Brinet / Romain Besson / Bilal Boudjemline"
date: "2022-12-04"
---
## Sommaire
- <div>
1. Introduction
2. Utilisation de l'API
3. Diagramme
4. Fonctionnalitées
- Fonctionnalitées réussi
- Fonctionnalitées non réussi
- Fonctionnalitées manquantes
5. Tests
- Tests réussi
- Tests non réussi
- Tests montrant des bugs
6. Conclusions
- Conclusion personnelles
- Conclusion générale
</div>
## Utilisation de l'API
Bilal a commencé le projet seul car Romain et Félix étaient encore sur le projet précédent. Il a pu commencer à utiliser à l'API et à tester en modèle non-persistant. À la suite, Félix a créé la base de données et a essayé d'aider Bilal pour le modèle persistant. Ensuite Romain à changé l'interface pour la rendre plus intuitive et plus agréable à utiliser. Il a par exemple utilisé des CardLayout et Jpanel pour éviter d'ouvrir une fenêtre pour chaque fonctionnalité. Il a pu aussi créer un menu afin d'accéder aux différentes applications.
## Diagrammes
## Fonctionnalitées
Pour les 3 vues, nous avons pas fait d'interface malgrès que les vues ont des méthodes en commun. En effet, nous voulons créer des applications indépendantes et déployable sans les autres donc une interface aurait empéché cette séparation.
### Fonctionnalitées réussi
**Administrateur :**
- <div>
- (M) Créer, supprimer et renommer un groupe;
- (M) Ajouter un individu dans un groupe;
- (M) Déplacer un individu dans un autre groupe;
</div>
**Professeur :**
- <div>
- (M) Afficher la liste des groupes
- (M) Afficher la liste des étudiant d'un groupe donné
- (S) Chercher le groupe d'un étudiant à partir des **3** premières lettres de son nom
</div>
**Elève :**
- <div>
- (M) Afficher la liste des groupes
- (M) Afficher la liste des étudiants d'un groupe donné
- (M) Demandé à passé dans groupe ~~qui est moins pleins que le sien~~ en ajoutant une explication
- (S) Voir les demandes de changement de groupe du type 2
</div>
### Fonctionnalitées non réussi
**Administrateur :**
- <div>
- (S) Déplacer un individus en validant sa demande
- (S) Refus d'une demande (de type 1)
- (C) Echanger des individus entre 2 groupes à leur demande respectives (demande de type 2)
- (C) Refus d'une demande (de type 2)
</div>
**Professeur :**
- <div>
- Toutes les fonctionnalitées ont été réussi
</div>
**Elève :**
- <div>
- (S) Demander à passer dans un groupe qui est de même taille ou plus grand en ajoutant une explication (demande de type 2 à faire valider)
</div>
### Fonctionnalitées manquantes
Par choix arbitraire, nous avons decidé de ne pas créer de sous groupe.
Rajouter un bouton quitter sur la page d'accueil, ce n'est pas indispensable mais cela pourrait rendre l'interface plus intuitive.
## Tests
### Tests réussi
Lorsqu'un administrateur clique sur "Changer le groupe d'un étudiant", il peut voir le changement en direct sur l'affichage du tableau à droite. De plus la base de données et également mis à jour.
Nous pensons que l'ensemble des fonctionnalités demandés ont été faite. (Mis a part ce qui se trouve dans la catégorie: Fonctionnalitées manquantes et Fonctionnalitées non reussi).
### Tests montrant des bugs
Nous avons fait essayer notre application à d'autres étudiants, dont Kilian Moulin. Il a pu détecter des bugs.
Lors d'un clique sur "Affichage" puis "Plein écran" ou bien "Fenêtré", les différents onglets pour changer de vue de "Menu" disparaissent. Ce qui fait que nous sommes alors coincés sur la vue choisie.
Si l'utilisateur se rend la vue Administrateur et qu'il choisit "Changer le groupe d'un étudiant" et que l'utilisateur se met ensuite sur la vue professeur ou bien élève en passant par le menu alors il peut déplacer des élèves sans être administrateur.
## Conclusions
### Conclusions personnelles
Bilal: J'ai trouvé ce projet intéressant à faire. Il a demandé une mobilisation de quasi toutes les connaissances que nous avons pu acquerir dans le BUT2. Ce que je trouve dommage, c'est que nous étions restraint par l'API.
Felix: Ce
Romain: ()
### Conclusion générale
Ce projet a été un challenge pour nous tous dans le projet. Tout d'abord en raison de sa complexité mais également car nous n'avions jamais travaillé ensemble au paravant. Nous sommes assez fier du rendu du projet mais nous aurions aimé rajouté plus de fonctionnalitées. Nous avons eu des problèmes sur la repartition des tâches à faire. Nous avons pu mettre en valeur les atouts de chacun dans se projet, Bilal pour l'utilisation de l'API et les fonctionnalités. Romain a pu mettre en avant ses compétences pour créer une interface intuitive et agréable à regarder. Félix a pu organiser les tâches à faire, aider lors de bug en faisaint du pair programming et la rédaction du rapport ainsi que la base de données.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,47 +1,47 @@
package API;
public interface Requete extends MonPrint {
/**
* Recuperer l'id de l'etudiant
*
* @return l'id de l'etudiant a l'origine du message
* */
public int getEtuId();
/**
* Recuperer le message
* */
public String getMessage();
/**
* Recuperer l'id d'un message
*
* @return l'id du message
* */
public int getIdMessage();
/**
* Recuperer le type de la requete
*
* @return le type de la requete 2 ou 1
* */
public int getType();
/**
* Recuperer le groupe que l'etudiant veut rejoindre
* */
public int getWitchGroupe();
/**
* Recuperer le statut de la requete
* */
public String getStatut();
/**
* @see MonPrint
* NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici.
*/
public default String monPrint() {
return null;
}
}
package API;
public interface Requete extends MonPrint {
/**
* Recuperer l'id de l'etudiant
*
* @return l'id de l'etudiant a l'origine du message
* */
public int getEtuId();
/**
* Recuperer le message
* */
public String getMessage();
/**
* Recuperer l'id d'un message
*
* @return l'id du message
* */
public int getIdMessage();
/**
* Recuperer le type de la requete
*
* @return le type de la requete 2 ou 1
* */
public int getType();
/**
* Recuperer le groupe que l'etudiant veut rejoindre
* */
public int getWitchGroupe();
/**
* Recuperer le statut de la requete
* */
public String getStatut();
/**
* @see MonPrint
* NB. On n'utilise le mécanisme des méthodes par défaut pour donner du code dans une interface. C'est un petit peu laid et à contre-emploi mais pratique ici.
*/
public default String monPrint() {
return null;
}
}

View File

@ -1,51 +1,51 @@
package MNP;
import API.Requete;
public class RequeteNP implements Requete {
private final int id;
private final String message;
private final int etuSource;
private final int type;
private final int witchGroupe;
private final String status;
public RequeteNP(int id, String message, int etuSource, int type, int witchGroupe, String status) {
this.id = id;
this.message = message;
this.etuSource = etuSource;
this.type = type;
this.witchGroupe = witchGroupe;
this.status = status;
}
@Override
public int getEtuId() {
return this.etuSource;
}
@Override
public String getMessage() {
return this.message;
}
@Override
public int getIdMessage() {
return this.id;
}
@Override
public int getType() {
return this.type;
}
@Override
public int getWitchGroupe() {
return this.witchGroupe;
}
@Override
public String getStatut() {
return this.status;
}
}
package MNP;
import API.Requete;
public class RequeteNP implements Requete {
private final int id;
private final String message;
private final int etuSource;
private final int type;
private final int witchGroupe;
private final String status;
public RequeteNP(int id, String message, int etuSource, int type, int witchGroupe, String status) {
this.id = id;
this.message = message;
this.etuSource = etuSource;
this.type = type;
this.witchGroupe = witchGroupe;
this.status = status;
}
@Override
public int getEtuId() {
return this.etuSource;
}
@Override
public String getMessage() {
return this.message;
}
@Override
public int getIdMessage() {
return this.id;
}
@Override
public int getType() {
return this.type;
}
@Override
public int getWitchGroupe() {
return this.witchGroupe;
}
@Override
public String getStatut() {
return this.status;
}
}

View File

@ -17,7 +17,9 @@ import java.util.Iterator;
import org.mariadb.jdbc.*;
/**
* <p>Methodes pour les interaction avec une base de donnees</p>
* <p>
* Methodes pour les interaction avec une base de donnees
* </p>
*
* @author <a href="https://github.com/lalBi94">Bilal Boudjemline</a>
*/
@ -38,12 +40,13 @@ public class BDatabase {
try {
Class.forName("org.mariadb.jdbc.Driver");
} catch(ClassNotFoundException e) {
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
try {
this.sharedObject = DriverManager.getConnection(this.db_host + this.db_name, this.db_user, this.db_password);
this.sharedObject = DriverManager.getConnection(this.db_host + this.db_name, this.db_user,
this.db_password);
this.status = true;
} catch (SQLException e) {
System.out.println("Erreur de liaison avec la base de donnees.");
@ -61,12 +64,12 @@ public class BDatabase {
ArrayList<String> toReturn = new ArrayList<String>();
ResultSet rs = this.sharedObject.prepareStatement(request).executeQuery();
for(int i = 0; rs.next(); i++) {
for (int i = 0; rs.next(); i++) {
toReturn.add(i, String.valueOf(rs.getString(1)));
}
return toReturn;
} catch(SQLException e) {
} catch (SQLException e) {
System.out.println("Erreur de la requete : " + e);
return null;
}
@ -87,17 +90,17 @@ public class BDatabase {
Iterator<String> iteVal = Arrays.stream(value).iterator();
collumns.append("(");
while(iteCol.hasNext()) {
while (iteCol.hasNext()) {
collumns.append(iteCol.next()).append(", ");
}
collumns.setLength(collumns.length()-2);
collumns.setLength(collumns.length() - 2);
collumns.append(")");
values.append("(");
while(iteVal.hasNext()) {
while (iteVal.hasNext()) {
values.append("\"").append(iteVal.next()).append("\"").append(", ");
}
values.setLength(values.length()-2);
values.setLength(values.length() - 2);
values.append(")");
String request = "INSERT INTO " + table + collumns + " VALUES" + values + ";";
@ -107,13 +110,14 @@ public class BDatabase {
this.sharedObject.prepareStatement(request).executeQuery();
System.out.println("Succes: " + request);
return true;
} catch(SQLException e) {
} catch (SQLException e) {
return false;
}
}
/**
* Faire des requetes de type UPDATE SET (il y aura plus d'argument prochainement).
* Faire des requetes de type UPDATE SET (il y aura plus d'argument
* prochainement).
*
* @param request La requete
* @return Si oui ou non ca a fonctionne
@ -121,8 +125,9 @@ public class BDatabase {
public boolean updateRow(String request) {
try {
this.sharedObject.prepareStatement(request).executeQuery();
System.out.println("Succes:" + request);
return true;
} catch(SQLException e) {
} catch (SQLException e) {
return false;
}
}
@ -149,31 +154,27 @@ public class BDatabase {
* Recuperer la liste des etudiants (FIProjet Contexte)
*
* @return La liste des etudiants
* */
*/
public ArrayList<Etudiant> getEtuList() {
ArrayList<Etudiant> listEtu = new ArrayList<>();
ArrayList<String> studPrenom = this.fetchAll("SELECT prenom FROM fi_eleves");
ArrayList<String> studNom = this.fetchAll("SELECT nom FROM fi_eleves");
ArrayList<String> studGroupe = this.fetchAll("SELECT groupe FROM fi_eleves");
for(int i = 0; i <= studPrenom.size()-1; i++) {
if(studPrenom.get(i) != null && studNom.get(i) != null && studGroupe.get(i) != null) {
for (int i = 0; i <= studPrenom.size() - 1; i++) {
if (studPrenom.get(i) != null && studNom.get(i) != null && studGroupe.get(i) != null) {
try {
listEtu.add(
new EtudiantNP(
studNom.get(i),
studPrenom.get(i),
Integer.parseInt(studGroupe.get(i), 10)
)
);
} catch(NumberFormatException ignore) {
Integer.parseInt(studGroupe.get(i), 10)));
} catch (NumberFormatException ignore) {
listEtu.add(
new EtudiantNP(
studNom.get(i),
studPrenom.get(i),
-1
)
);
-1));
}
} else {
System.out.println("[!] Erreur lors du chargement de la liste des etudiants.");
@ -190,32 +191,28 @@ public class BDatabase {
* Recuperer la liste des groupes (FIProjet contexte)
*
* @return La liste des groupes
* */
*/
public ArrayList<Groupe> getGroupeList() {
ArrayList<Groupe> listGroupe = new ArrayList<>();
ArrayList<String> groupeId = this.fetchAll("SELECT id FROM fi_groupe");
ArrayList<String> groupeNom = this.fetchAll("SELECT nom FROM fi_groupe");
ArrayList<String> groupeMin = this.fetchAll("SELECT min FROM fi_groupe");
ArrayList<String> groupeMax = this.fetchAll("SELECT max FROM fi_groupe");
for(int i = 0; i <= groupeNom.size()-1; i++) {
if(groupeId.get(i) != null && groupeNom.get(i) != null && groupeMin.get(i) != null && groupeMax.get(i) != null) {
for (int i = 0; i <= groupeNom.size() - 1; i++) {
if (groupeId.get(i) != null && groupeNom.get(i) != null && groupeMin.get(i) != null
&& groupeMax.get(i) != null) {
listGroupe.add(
new GroupeNP(
Integer.parseInt(groupeId.get(i), 10),
groupeNom.get(i),
Integer.parseInt(groupeMin.get(i), 10),
Integer.parseInt(groupeMax.get(i), 10)
)
);
Integer.parseInt(groupeMax.get(i), 10)));
} else {
System.out.println("[!] Erreur lors du chargement de la liste des groupes.");
System.exit(-1);
}
}
System.out.println("[+] Liste des groupes chargees.");
return listGroupe;
}
@ -223,7 +220,7 @@ public class BDatabase {
* Recuperer les requetes
*
* @return la liste des requetes
* */
*/
public ArrayList<Requete> getRequestList() {
ArrayList<Requete> toReturn = new ArrayList<>();
ArrayList<String> requestId = this.fetchAll("SELECT id FROM fi_demandes");
@ -233,17 +230,15 @@ public class BDatabase {
ArrayList<String> requestType = this.fetchAll("SELECT type FROM fi_demandes");
ArrayList<String> requestStatut = this.fetchAll("SELECT statut FROM fi_demandes");
for(int i = 0; i <= requestId.size()-1; i++) {
for (int i = 0; i <= requestId.size() - 1; i++) {
toReturn.add(
new RequeteNP(
Integer.parseInt(requestId.get(i)),
requestMessage.get(i),
Integer.parseInt(requestEtu.get(i)),
Integer.parseInt(requestType.get(i)),
Integer.parseInt(requestWitchGrup.get(i)),
requestStatut.get(i)
)
);
new RequeteNP(
Integer.parseInt(requestId.get(i)),
requestMessage.get(i),
Integer.parseInt(requestEtu.get(i)),
Integer.parseInt(requestType.get(i)),
Integer.parseInt(requestWitchGrup.get(i)),
requestStatut.get(i)));
}
return toReturn;

File diff suppressed because it is too large Load Diff

View File

@ -66,7 +66,7 @@ public class ProfView extends JPanel {
settings.setPadding(new Insets(0, 0, 0, 50));
String[] groupeList = new String[this.g.size()];
for(int i = 0; i <= this.g.size()-1; i++) {
for (int i = 0; i <= this.g.size() - 1; i++) {
groupeList[i] = this.g.get(i).getName();
}
@ -97,7 +97,7 @@ public class ProfView extends JPanel {
this.text.setPreferredSize(new Dimension(110, 30));
text.addKeyListener(new KeyAdapter() {
public void keyTyped(KeyEvent e) {
if (text.getText().length() >= 3 )
if (text.getText().length() >= 3)
e.consume();
}
});

View File

@ -61,7 +61,7 @@ public class StudentView extends JPanel {
settings.setPadding(new Insets(0, 0, 0, 50));
String[] groupeList = new String[this.g.size()];
for(int i = 0; i <= this.g.size()-1; i++) {
for (int i = 0; i <= this.g.size() - 1; i++) {
groupeList[i] = this.g.get(i).getName();
}