- 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.
434 lines
10 KiB
Markdown
434 lines
10 KiB
Markdown
# 📊 SQL Queries Reference - TravelMate Admin
|
|
|
|
Requêtes SQL utiles pour gérer et interroger la base de données.
|
|
|
|
## 🔍 Requêtes de Consultation
|
|
|
|
### Messages
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- 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
|
|
|
|
```sql
|
|
-- Exemple d'analyse de performance
|
|
EXPLAIN SELECT * FROM messages WHERE done = FALSE ORDER BY created_at DESC;
|
|
```
|