Développement de Mini-Programmes WeChat - Système Communautaire

Implémentation des fonctionnalités clés d'une application communautaire

1. Module de gestion des annonces

1.1 Interface du mini-programme

La page des annonces affiche une liste d'informations communautaires avec images, titres, dates et contenus. La structure utilise la boucle wx:for pour itérer sur les données.

<!-- Template pour la liste des annonces -->
<view class="liste-annonces">
    <view wx:for="{{annoncesList}}" wx:key="identifiant" class="carte-annonce">
        <image class="vignette" src='{{item.image_url}}' mode="aspectFill"></image>
        <view class="corps-annonce">
            <text class="titre-annonce">{{item.titre}}</text>
            <text class="date-annonce">{{item.date_publication}}</text>
            <text class="contenu-annonce">{{item.texte}}</text>
        </view>
    </view>
</view>
/* Styles pour la page des annonces */
page {
    fond-couleur: #fff;
    taille-police: 28rpx;
}

.liste-annonces {
    espacement-interne: 20rpx;
}

.carte-annonce {
    affichage: flex;
    espacement-interne-vertical: 20rpx;
    bordure-bas: 1rpx solide #eee;
}

.vignette {
    largeur: 120rpx;
    hauteur: 120rpx;
    rayon-bordure: 8rpx;
    marge-droite: 20rpx;
}

.corps-annonce {
    flex: 1;
    affichage: flex;
    direction: colonne;
    justification-espace: espace-entre;
}
// Logique de la page des annonces
import chemins_api from '../../config/chemins'

Page({
    donnees: {
        annoncesList: []
    },

    auChargement() {
        this.chargerDonnees()
    },

    chargerDonnees() {
        wx.showLoading({ masque: true })
        wx.request({
            url: chemins_api.annonces,
            methode: 'GET',
            succes: (reponse) => {
                this.setData({
                    annoncesList: reponse.data
                })
            },
            complet: () => {
                wx.hideLoading()
            }
        })
    }
})

1.2 API backend

Le backend fournit les données via Django REST Framework avec un sérialiseur formatant les dates.

# Configuration du sérialiseur pour les annonces
class AnnonceSerializer(serializers.ModelSerializer):
    class Meta:
        model = Annonce
        champs = ['id', 'titre', 'image_url', 'date_publication', 'texte']
        options_supplementaires = {
            'date_publication': {'format': '%Y-%m-%d'}
        }

# Vue API pour les annonces
class VueAnnonce(GenericViewSet, ListModelMixin):
    ensemble_requetes = Annonce.objects.all().order_by('date_publication')
    classe_serialiseur = AnnonceSerializer

2. Système de gestion des activités

2.1 Interface utilisateur

La liste des activités montre les détails de chaque événement avec un bouton d'inscription. Li'nterface gère les états d'inscription et l'affichage du nombre de participants.

<!-- Structure pour afficher une activité -->
<view wx:for="{{activitesList}}" wx:key="identifiant" class="element-activite">
    <view class="details-activite">
        <text class="nom-activite">{{item.nom}}</text>
        <text class="statut-inscription">Inscrits: {{item.inscrits}} / {{item.capacite}}</text>
        <text class="recompense">Points: {{item.points}}</text>
        <text class="date-activite">{{item.quand}}</text>
        <text class="description-activite">{{item.description}}</text>
    </view>
    <button class="bouton-inscription" bind:tap="demanderInscription" mark:id="{{item.id}}">
        S'inscrire
    </button>
</view>

2.2 Structure de données backend

Le modèle de données inclut des relations many-to-many entre utilisateurs et activités via une table d'association.

# Modèles Django pour le système d'activites
class ProfilUtilisateur(models.Model):
    nom_complet = models.CharField(max_length=100)
    avatar = models.FileField(upload_to='avatars/')
    points_accumules = models.IntegerField(default=0)
    telephone_mobile = models.CharField(max_length=11, null=True)

class Activite(models.Model):
    intitule = models.CharField(max_length=200)
    description = models.TextField(blank=True)
    date_evenement = models.DateField()
    inscrits_actuels = models.IntegerField(default=0)
    capacite_maximale = models.IntegerField(default=0)
    recompense_points = models.IntegerField(default=0)
    participants = models.ManyToManyField(
        ProfilUtilisateur,
        through='EnregistrementParticipation'
    )

class EnregistrementParticipation(models.Model):
    participant = models.ForeignKey(ProfilUtilisateur, on_delete=models.CASCADE)
    activite = models.ForeignKey(Activite, on_delete=models.CASCADE)
    inscription_validee = models.BooleanField(default=False)

3. Authentification et gestion des utilisateurs

3.1 Flux d'authentification

Le système propose deux méthodes de connexion : via le numéro de téléphone WeChat (one-click) ou avec vérification par SMS standard. Les deux conduisent à la génération d'un token JWT pour maintenir la session.

3.2 Page profil utilisateur

L'interface s'adapte en fonction de l'état d'uathentification de l'utilisateur, affichant soit un écran de connexion, soit le tableau de bord personnel.

// Gestion de l'authentification dans app.js
App({
    donnees_globales: {
        profil_actuel: null
    },

    initialiserProfil: function(nom, points, avatar, jeton) {
        var profil = {
            nom: nom,
            points: points,
            avatar: avatar,
            jeton: jeton
        }
        this.donnees_globales.profil_actuel = profil
        wx.setStorageSync('donnees_profil', profil)
    },

    deconnexionProfil: function() {
        wx.removeStorageSync('donnees_profil')
        this.donnees_globales.profil_actuel = null
    },

    auLancement() {
        var profil_stocke = wx.getStorageSync('donnees_profil')
        this.donnees_globales.profil_actuel = profil_stocke
    }
})

3.3 Endpoints API d'authentification

Le backend gère l'envoi de SMS, la vérification des codes et la création de tokens. Une classe d'authentification personnalisée extrait le token JWT des en-têtes HTTP.

# Vues API pour l'authentification
class VueAuthentification(GenericViewSet):
    @action(methodes=['POST'], detail=False)
    def connexion_sms(self, requete, *args, **kwargs):
        numero = requete.data.get('telephone')
        code_saisi = requete.data.get('code_verification')
        
        code_stocke = cache.get(f'sms_{numero}')
        if code_saisi != code_stocke:
            return Response({'statut': 'erreur', 'message': 'Code incorrect'})
        
        utilisateur, cree = ProfilUtilisateur.objects.get_or_create(
            telephone_mobile=numero,
            defaults={'nom_complet': generateur_faux_noms().name()}
        )
        
        jeton_acces = RefreshToken.for_user(utilisateur)
        return Response({
            'statut': 'succes',
            'token_acces': str(jeton_acces.access_token),
            'donnees_utilisateur': ProfilSerializer(utilisateur).data
        })

    @action(methodes=['POST'], detail=False)
    def connexion_rapide(self, requete, *args, **kwargs):
        code_wechat = requete.data.get('code')
        # Logique d'échange du code contre le numéro Wechat
        # ... implémentation de l'appel API Wechat
        return Response({'statut': 'succes', 'token_acces': '...'})

4. Système d'inscription aux activités

La fonctionnalité permet aux utilisateurs authentifiés de s'inscrire à des activités. Le système vérifie les doublons et met à jour les compteurs de participants.

# Vue pour l'inscription aux activités
class VueInscriptionActivite(GenericViewSet):
    @action(methodes=['POST'], detail=False)
    def s_inscrire(self, requete, *args, **kwargs):
        activite_id = requete.data.get('activite_id')
        utilisateur = requete.user
        
        activite = Activite.objects.get(pk=activite_id)
        
        if EnregistrementParticipation.objects.filter(
            activite=activite, 
            participant=utilisateur
        ).exists():
            return Response({'statut': 'erreur', 'message': 'Déjà inscrit'})
        
        if activite.inscrits_actuels >= activite.capacite_maximale:
            return Response({'statut': 'erreur', 'message': 'Activité complète'})
        
        EnregistrementParticipation.objects.create(
            activite=activite,
            participant=utilisateur
        )
        activite.inscrits_actuels += 1
        activite.save()
        
        return Response({'statut': 'succes', 'message': 'Inscription confirmée'})

5. Système de points et récompenses

Les utilisateurs accumulent des points en participant aux activités, stockés dans leur profil. Ces points peuvent être échangés dans une future boutique de récompenses (implémentation à venir).

Étiquettes: WeChat Mini-Program Django REST Framework JWT Authentication SMS Verification SQLite Database

Publié le 2 juin à 16h29