Optimisation de RuoYi-Vue avec MyBatis-Plus-Ext et gestion de la persistence

Intégration de MyBatis-Plus-Ext pour la gestion automatique du schéma

L'extension mybatis-plus-ext facilite grandement la création et la modification automatique des tables SQL à partir des entités Java. Lors de son utilisation au sein de l'écosystème RuoYi-Vue, certaines configurations spécifiques sont nécessaires, notamment pour le stockage des données complexes.

Gestion des champs JSON

Pour éviter que le moteur de génération ne transforme vos listes ou objets en simples colonnse varchar, il est impératif de définir explicitement le type json dans l'annotation @Column. Voici comment structurer votre entité :

@Column(comment = "Galerie d'images", type = "json")
@JsonSerializable(typeHandler = JacksonTypeHandler.class)
private List<String> listeImages;

Configuration de Nginx pour les fichiers statiques

Un problème courant dans RuoYi-Vue concerne l'affichage des ressources téléchargées. Une configuration correcte du bloc location est essentielle pour mapper les requêtes frontend vers le stockage serveur réel.

http {
    gzip on;
    gzip_min_length 1k;
    gzip_comp_level 4;
    gzip_types text/plain application/javascript text/css application/xml;

    server {
        listen 80;
        server_name localhost;
        charset utf-8;

        location / {
            root /home/ruoyi/projects/ruoyi-ui;
            try_files $uri $uri/ /index.html;
            index index.html index.htm;
        }

        location /prod-api/ {
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_pass http://localhost:8080/;
        }

        # Mapping pour les fichiers uploadés
        location /profile/ {
            alias /home/ruoyi/uploadPath/;
        }
    }
}

Résolution des anomalies de pagination

Dans certains cas complexes, la pagination standard peut échouer. Il est alors recommandé de créer une structure de données dédiée pour encapsuler les résultats transformés tout en conservant les métadonnées de pagination originales.

Sturcture de données pour pagination personnalisée

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class WrapperPagination<T, U> {
    private List<T> donneesTransformees;
    private List<U> donneesInitiales;
}

Méthode utilitaire dans le contrôleur

Pour renvoyer correctement les données au format attendu par RuoYi, vous pouvez implémenter une méthode de réponse spécifique :

protected TableDataInfo construireReponsePagination(List<?> listeOrigine, List<?> listeDestination) {
    TableDataInfo reponse = new TableDataInfo();
    reponse.setCode(HttpStatus.SUCCESS);
    reponse.setMsg("Récupération réussie");
    reponse.setRows(listeDestination);
    reponse.setTotal(new PageInfo(listeOrigine).getTotal());
    return reponse;
}

Application du filtre DataScope (Permissions de données)

L'utilisation de l'annotation @DataScope nécessite une attention particulière à la chaîne d'appel. Pour que les restrictions de département ou d'utilisateur s'appliquent correctement dans le SQL :

  • Assurez-vous que le contrôleur possède les annotations d'autorisation nécessaires (ex: @PreAuthorize).
  • Placez l'annotation @DataScope(deptAlias = "d", userAlias = "u") sur la méthode correspondante dans la couche Service.
  • Appelez le Mapper via le Service et non directement depuis le contrôleur pour garantir l'interception de l'AOP.

Pagination et relations One-to-Many avec MyBatis

Lorsqu'une entité possède une collection imbriquée, une jointure simple (JOIN) peut fausser le compte total de la pagination. La solution consiste à utiliser une requête séparée pour la collection via l'attribut select dans le resultMap.

<resultMap id="ResultatCommandeMap" type="com.projet.domaine.dto.CommandeDTO">
    <id property="id" column="id" />
    <result property="codeCommande" column="code_commande" />
    <collection property="utilisateursAssocies" 
                ofType="com.projet.domaine.dto.UserDTO"
                select="rechercherUtilisateursParCommande"
                column="id">
    </collection>
</resultMap>

<select id="rechercherUtilisateursParCommande" resultType="com.projet.domaine.dto.UserDTO">
    SELECT user_id as userId, nom_utilisateur as username 
    FROM relation_commande_user
    WHERE commande_id = #{id}
</select>

Cette approche garantit que la pagination est effectuée sur l'entité principale avant que les relations ne soient chargées, évitant ainsi la duplication des lignes dans le résultat final.

Étiquettes: RuoYi-Vue MyBatis-Plus nginx Java spring-boot

Publié le 25 juillet à 19h59