« Suggestion de lecture pour les fêtes | Page d'accueil | Tests unitaires d'une application grails simple »

14 janvier 2010

Créer une application Grails de base

Après avoir monté une première démo avec Grails (voir les vidéos http://agile.blogspirit.com/archive/2009/03/14/demonstration-de-grails.html) j'ai voulu refaire le tour du jardin en couvrant la base de nos besoins en développement rapide. Je suis parti avec un modèle simple où il y avait la plupart des types de données et de relations, bien que ce ne soit pas exhaustif (par exemple il n'y a pas d'héritage). Je me suis inspiré d'un système que nous avons réalisé récemment (IP-Suivi de projets).

 

J'ai donc esquissé le modèle objet du système

 

UML01.jpg

 

En fait, pour être honnête, la figure précédente est ce que j'ai réalisé. Le modèle initial ressemblait à ceci:

 

UML02.jpg

 

J'ai aussi esquissé la navigation de l'application:

 

NAV01.jpg

Les classes du domaine

La première étape consistait à créer les classes du domaine. Il y a donc 4 entités : Projet, Suivi, Marché et Personne. Elles ont été générée par grails et j'ai complété le code (partout dans le texte j'ai mis en gras ce que j'ai dû écrire).

 

class Projet {

      Integer     numero

      String      nom

      Date        dateProposition

      String      description

      Boolean     hauteVisibilite

      String      urlProjet

      Marche      marche

      Float       budget = 20000

      Date        dateCreated

      Date        lastUpdated

 

      static hasMany = [suivis:Suivi, participants:Personne]

     

    static constraints = {

            numero(nullable:true, min:1000, unique:true )

            nom(blank:false,unique:true,maxSize:80)

            description(nullable:true )

            dateProposition()

            marche(nullable:true )

            budget(scale:2, min:0f, max:100000f,nullable:true )

            hauteVisibilite()

            urlProjet(url:true,nullable:true )

    }

 

      String toString() {return nom + " (" + numero + ")"}

}

 

 

class Suivi {

 

      String notes

      Date dateCreated

      Date lastUpdated

 

      static belongsTo = [projet:Projet]

 

    static constraints = {

            notes(blank:false)

    }

     

      String toString() {return notes + " @ " + lastUpdated}

}

 

class Marche {

      String nom

 

      static hasMany = [projets:Projet]

 

    static constraints = {

            nom(blank:false,unique:true,maxlength:25)

    }

 

      String toString() {return nom}

}

 

class Personne {

      String      nom

      String      prenom

      String      cIP

      String      adresse

      String      ville

 

      static hasMany = [projets:Projet]

      static belongsTo = Projet

 

    static constraints = {

            nom(blank:false)

            prenom(blank:false)

            cIP(matches:"[a-zA-Z]{2}[0-9]{4}",unique:true)

            adresse(nullable:true)

            ville(nullable:true)

    }

 

      String toString() {return prenom + " " + nom}

}

 

Ce code nous donnes des classes qui persistent en base de données.

Les controleurs et le scaffolding

Pour pouvoir les manipuler, j'ai utilisé la génération dynamique des écrans web en mettant une ligne de code dans les contrôleurs générés par Grails.

 

class ProjetController {

 

    def scaffold = Projet

}

 

Juste avec ces 50 lignes de codes, j'ai une application web qui me permet de valider avec mon client le modèle de données, incluant les validations de bases. Le look de l'application est très Grails et la navigation n'est pas nécessairement celle que l'on désire, mais j'ai une application fonctionnelle.

Feuille de style

J'ai ensuite remplacé la feuille de style par défaut, par une qui correspond plus à nos normes graphiques et à notre esthétique. J'ai aussi modifié la page d'index de l'application pour coller à nos gabarits.

 

 

 

Donc avec 50 lignes de code et un fichier CSS, j'ai des écrans de liste comme celui-ci:

 

 scr01.jpg

Cet écran supporte le tri des colonnes. Par exemple en cliquant sur la colonne CIP…

 

 scr02.jpg

Dans les pages des liste la pagination s'ajoute automatiquement lorsque le nombre de ligne passe un certain seuil (par défaut à 10).

 

 scr03.jpg

Les écrans de détails, en lecture seul, ressemble à ceci:

 

 scr04.jpg

Notez qu'il y a une relation entre Personne et Projets, et que par conséquent il est possible d'accéder directement au projets de la personne.

 

En mode édition, l'écran de détail est le suivant:

 

 scr05.jpg

Notez que la validation est fonctionnelle. On va montrer plus loin comment afficher un message plus significatif pour l'utilisateur.

 

19:15 | Lien permanent | Commentaires (0) | Tags : grails

Écrire un commentaire