- Added DatabaseService to handle database operations for messages and support requests. - Created IDatabaseService interface to define the contract for database operations. - Developed ViewModels for Dashboard, Messages, and Support pages to manage data and commands. - Implemented XAML views for Dashboard, Messages, and Support, including data binding and UI elements. - Created SQL script for setting up the database schema and inserting test data.
10 KiB
10 KiB
📊 SQL Queries Reference - TravelMate Admin
Requêtes SQL utiles pour gérer et interroger la base de données.
🔍 Requêtes de Consultation
Messages
-- Tous les messages
SELECT * FROM messages ORDER BY created_at DESC;
-- Messages en attente uniquement
SELECT * FROM messages WHERE done = FALSE ORDER BY created_at DESC;
-- Messages traités uniquement
SELECT * FROM messages WHERE done = TRUE ORDER BY created_at DESC;
-- Compter les messages par statut
SELECT
COUNT(*) AS total,
SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END) AS en_attente,
SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) AS traites
FROM messages;
-- Messages récents (dernières 24h)
SELECT * FROM messages
WHERE created_at > NOW() - INTERVAL 24 HOUR
ORDER BY created_at DESC;
-- Messages d'un utilisateur spécifique
SELECT * FROM messages
WHERE email = 'jean.dupont@example.com'
ORDER BY created_at DESC;
-- Recherche dans les messages
SELECT * FROM messages
WHERE message LIKE '%RGPD%'
OR nom LIKE '%Dupont%'
ORDER BY created_at DESC;
Support Requests
-- Toutes les demandes support
SELECT * FROM support_requests ORDER BY created_at DESC;
-- Demandes en attente
SELECT * FROM support_requests WHERE done = FALSE ORDER BY created_at DESC;
-- Demandes traitées
SELECT * FROM support_requests WHERE done = TRUE ORDER BY created_at DESC;
-- Compter par statut
SELECT
COUNT(*) AS total,
SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END) AS en_attente,
SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) AS traites
FROM support_requests;
-- Demandes d'un compte spécifique
SELECT * FROM support_requests
WHERE account_email = 'lucas.petit@example.com'
ORDER BY created_at DESC;
-- Recherche par email de contact
SELECT * FROM support_requests
WHERE contact_email = 'lucas.contact@example.com'
ORDER BY created_at DESC;
Statistiques Globales
-- Vue d'ensemble complète
SELECT
'Messages' AS type,
COUNT(*) AS total,
SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END) AS en_attente,
SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END) AS traites
FROM messages
UNION ALL
SELECT
'Support',
COUNT(*),
SUM(CASE WHEN done = FALSE THEN 1 ELSE 0 END),
SUM(CASE WHEN done = TRUE THEN 1 ELSE 0 END)
FROM support_requests;
-- Activité par jour (7 derniers jours)
SELECT
DATE(created_at) AS date,
COUNT(*) AS messages
FROM messages
WHERE created_at > NOW() - INTERVAL 7 DAY
GROUP BY DATE(created_at)
ORDER BY date DESC;
-- Volume par heure de la journée
SELECT
HOUR(created_at) AS heure,
COUNT(*) AS nombre_messages
FROM messages
GROUP BY HOUR(created_at)
ORDER BY heure;
✏️ Requêtes de Modification
Changer le Statut
-- Marquer un message comme traité
UPDATE messages SET done = TRUE WHERE id = 1;
-- Marquer une demande support comme traitée
UPDATE support_requests SET done = TRUE WHERE id = 1;
-- Marquer comme non traité
UPDATE messages SET done = FALSE WHERE id = 1;
-- Marquer tous les messages en attente
UPDATE messages SET done = FALSE;
-- Marquer tous comme traités
UPDATE messages SET done = TRUE;
-- Marquer les vieux messages comme traités (plus de 30 jours)
UPDATE messages
SET done = TRUE
WHERE created_at < NOW() - INTERVAL 30 DAY AND done = FALSE;
Ajouter des Données
-- Nouveau message
INSERT INTO messages (nom, prenom, email, message, done, created_at)
VALUES (
'Nouveau',
'Test',
'test@example.com',
'Ceci est un nouveau message de test',
FALSE,
NOW()
);
-- Nouvelle demande support
INSERT INTO support_requests (nom, prenom, account_email, contact_email, message, done, created_at)
VALUES (
'Support',
'Test',
'account@example.com',
'contact@example.com',
'Problème de connexion',
FALSE,
NOW()
);
-- Ajouter plusieurs messages en une fois
INSERT INTO messages (nom, prenom, email, message, done, created_at) VALUES
('User1', 'Test', 'user1@test.com', 'Message 1', FALSE, NOW()),
('User2', 'Test', 'user2@test.com', 'Message 2', FALSE, NOW()),
('User3', 'Test', 'user3@test.com', 'Message 3', FALSE, NOW());
Supprimer des Données
-- Supprimer un message spécifique
DELETE FROM messages WHERE id = 1;
-- Supprimer tous les messages traités
DELETE FROM messages WHERE done = TRUE;
-- Supprimer les vieux messages (plus de 90 jours)
DELETE FROM messages WHERE created_at < NOW() - INTERVAL 90 DAY;
-- Attention : Supprimer TOUTES les données
-- DELETE FROM messages;
-- DELETE FROM support_requests;
🔧 Maintenance
Optimisation
-- Analyser les tables
ANALYZE TABLE messages;
ANALYZE TABLE support_requests;
-- Optimiser les tables
OPTIMIZE TABLE messages;
OPTIMIZE TABLE support_requests;
-- Vérifier l'état de la table
CHECK TABLE messages;
CHECK TABLE support_requests;
-- Réparer une table (si nécessaire)
REPAIR TABLE messages;
Index
-- Voir les index existants
SHOW INDEX FROM messages;
SHOW INDEX FROM support_requests;
-- Créer un index sur l'email (si performance lente)
CREATE INDEX idx_messages_email ON messages(email);
CREATE INDEX idx_support_account_email ON support_requests(account_email);
-- Supprimer un index
DROP INDEX idx_messages_email ON messages;
Backup
-- Exporter les données en SQL (en ligne de commande)
-- mysqldump -u root -p travelmateadmin > backup.sql
-- Exporter uniquement les messages
-- mysqldump -u root -p travelmateadmin messages > messages_backup.sql
-- Exporter sans données (structure seulement)
-- mysqldump -u root -p --no-data travelmateadmin > structure.sql
📊 Rapports et Analytics
Analyse des Messages
-- Messages les plus fréquents par email
SELECT
email,
COUNT(*) AS nombre_messages,
MAX(created_at) AS dernier_message
FROM messages
GROUP BY email
ORDER BY nombre_messages DESC
LIMIT 10;
-- Temps moyen de traitement
SELECT
AVG(TIMESTAMPDIFF(HOUR, created_at, NOW())) AS heures_moyennes
FROM messages
WHERE done = TRUE;
-- Messages par mois
SELECT
DATE_FORMAT(created_at, '%Y-%m') AS mois,
COUNT(*) AS nombre
FROM messages
GROUP BY DATE_FORMAT(created_at, '%Y-%m')
ORDER BY mois DESC;
-- Taux de complétion
SELECT
ROUND(SUM(done) / COUNT(*) * 100, 2) AS taux_completion_pourcent
FROM messages;
Analyse du Support
-- Problèmes les plus fréquents (par mots-clés)
SELECT
CASE
WHEN message LIKE '%connexion%' THEN 'Connexion'
WHEN message LIKE '%mot de passe%' THEN 'Mot de passe'
WHEN message LIKE '%synchronisation%' THEN 'Synchronisation'
WHEN message LIKE '%facturation%' THEN 'Facturation'
ELSE 'Autre'
END AS categorie,
COUNT(*) AS nombre
FROM support_requests
GROUP BY categorie
ORDER BY nombre DESC;
-- Utilisateurs avec plusieurs demandes
SELECT
account_email,
COUNT(*) AS nombre_demandes,
SUM(done) AS traitees,
COUNT(*) - SUM(done) AS en_attente
FROM support_requests
GROUP BY account_email
HAVING nombre_demandes > 1
ORDER BY nombre_demandes DESC;
🧪 Tests et Développement
Générer des Données de Test
-- Générer 50 messages aléatoires
INSERT INTO messages (nom, prenom, email, message, done, created_at)
SELECT
CONCAT('Nom', n.n),
CONCAT('Prenom', n.n),
CONCAT('test', n.n, '@example.com'),
CONCAT('Message de test numéro ', n.n),
n.n % 3 = 0, -- Un tiers sera "done"
NOW() - INTERVAL FLOOR(RAND() * 30) DAY
FROM (
SELECT @row := @row + 1 AS n
FROM (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t1,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t2,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t3,
(SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) t4,
(SELECT @row := 0) r
LIMIT 50
) n;
Réinitialiser pour les Tests
-- Vider toutes les tables
TRUNCATE TABLE messages;
TRUNCATE TABLE support_requests;
-- Réinitialiser les auto-increment
ALTER TABLE messages AUTO_INCREMENT = 1;
ALTER TABLE support_requests AUTO_INCREMENT = 1;
-- Recréer les données de test
SOURCE database_setup.sql;
🔐 Sécurité et Utilisateurs
Gestion des Utilisateurs
-- Créer un utilisateur pour l'application
CREATE USER 'travelmateapp'@'localhost' IDENTIFIED BY 'votre_mot_de_passe';
-- Donner les permissions nécessaires
GRANT SELECT, INSERT, UPDATE ON travelmateadmin.* TO 'travelmateapp'@'localhost';
-- Ne PAS donner DELETE en production pour la sécurité
-- GRANT DELETE ON travelmateadmin.* TO 'travelmateapp'@'localhost';
-- Appliquer les changements
FLUSH PRIVILEGES;
-- Voir les permissions d'un utilisateur
SHOW GRANTS FOR 'travelmateapp'@'localhost';
-- Révoquer une permission
REVOKE DELETE ON travelmateadmin.* FROM 'travelmateapp'@'localhost';
-- Supprimer un utilisateur
DROP USER 'travelmateapp'@'localhost';
📝 Informations sur la Base
-- Voir toutes les bases de données
SHOW DATABASES;
-- Utiliser la base TravelMate
USE travelmateadmin;
-- Voir toutes les tables
SHOW TABLES;
-- Voir la structure d'une table
DESCRIBE messages;
DESCRIBE support_requests;
-- Voir le CREATE TABLE original
SHOW CREATE TABLE messages;
-- Taille de la base de données
SELECT
table_schema AS 'Database',
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)'
FROM information_schema.tables
WHERE table_schema = 'travelmateadmin';
-- Nombre de lignes par table
SELECT
TABLE_NAME,
TABLE_ROWS
FROM information_schema.TABLES
WHERE TABLE_SCHEMA = 'travelmateadmin';
🚨 Dépannage
-- Vérifier les connexions actives
SHOW PROCESSLIST;
-- Tuer une connexion bloquée (remplacer X par l'ID)
-- KILL X;
-- Voir les variables MySQL
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'wait_timeout';
-- Voir le statut du serveur
SHOW STATUS;
-- Voir les erreurs récentes
SHOW WARNINGS;
SHOW ERRORS;
💡 Tips
- Toujours tester vos requêtes DELETE/UPDATE avec SELECT d'abord
- Faites des backups avant toute modification importante
- Utilisez LIMIT dans vos requêtes de test
- Les index améliorent les performances SELECT mais ralentissent INSERT/UPDATE
- Utilisez EXPLAIN pour analyser les performances des requêtes
-- Exemple d'analyse de performance
EXPLAIN SELECT * FROM messages WHERE done = FALSE ORDER BY created_at DESC;