frerr / index.html
docto41's picture
Add 3 files
50aba09 verified
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>NexusWeb Pro - Générateur de sites complexes</title>
<script src="https://cdn.tailwindcss.com"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
<style>
body {
font-family: 'Inter', sans-serif;
background-color: #0f172a;
color: #f8fafc;
}
.gradient-bg {
background: linear-gradient(135deg, #1e40af 0%, #7c3aed 50%, #c026d3 100%);
}
.code-editor {
background: #1e293b;
border-radius: 0.5rem;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
.code-line {
counter-increment: line;
}
.code-line::before {
content: counter(line);
display: inline-block;
width: 2rem;
margin-right: 1rem;
color: #64748b;
text-align: right;
}
.progress-bar {
height: 6px;
background: linear-gradient(90deg, #3b82f6 0%, #8b5cf6 50%, #ec4899 100%);
}
.file-tree li {
position: relative;
padding-left: 1.5rem;
}
.file-tree li:before {
content: '';
position: absolute;
left: 0.5rem;
top: 0.75rem;
width: 0.5rem;
height: 0.5rem;
border-radius: 50%;
background-color: #64748b;
}
.file-tree li.file:before {
background-color: #3b82f6;
}
.file-tree li.folder:before {
background-color: #f59e0b;
}
</style>
</head>
<body class="min-h-screen">
<!-- Navigation -->
<nav class="bg-gray-800 fixed w-full z-50">
<div class="max-w-7xl mx-auto px-4 py-3">
<div class="flex justify-between items-center">
<div class="text-2xl font-bold text-white">NexusWeb Pro</div>
<button class="px-4 py-2 bg-indigo-600 text-white rounded-md hover:bg-indigo-700">
Générer un projet complet
</button>
</div>
</div>
</nav>
<!-- Hero Section -->
<div class="pt-24 pb-16 px-4">
<div class="max-w-4xl mx-auto text-center">
<h1 class="text-4xl md:text-5xl font-bold text-white mb-6">
<span class="block">Générateur de sites complexes</span>
<span class="gradient-bg bg-clip-text text-transparent">1500+ lignes de code</span>
</h1>
<p class="text-xl text-gray-300 mb-8">
Créez des applications web complètes avec architecture professionnelle en quelques clics
</p>
<div class="max-w-2xl mx-auto">
<div class="flex flex-col sm:flex-row gap-3">
<input id="project-description" type="text" placeholder="Ex: 'Plateforme SaaS avec dashboard admin, API et base de données'"
class="flex-1 px-4 py-3 rounded-md text-gray-900">
<button id="generate-btn" class="px-6 py-3 bg-indigo-600 text-white rounded-md hover:bg-indigo-700">
Générer le projet
</button>
</div>
<p class="mt-2 text-sm text-gray-400">
Essayez "Réseau social avec authentification, chat et notifications" ou "ERP avec gestion de stock"
</p>
</div>
</div>
</div>
<!-- Project Architecture -->
<div class="max-w-7xl mx-auto px-4 mb-16 hidden" id="project-architecture">
<div class="bg-gray-800 rounded-xl p-6">
<h2 class="text-2xl font-bold text-white mb-6">Architecture du projet</h2>
<div class="grid grid-cols-1 lg:grid-cols-3 gap-6">
<!-- File Structure -->
<div class="bg-gray-700 p-6 rounded-lg">
<h3 class="text-lg font-medium text-white mb-4 flex items-center">
<i class="fas fa-folder-open text-yellow-400 mr-2"></i>
Structure des fichiers
</h3>
<div class="file-tree text-gray-300 space-y-1" id="file-structure">
<!-- Dynamically filled by JS -->
</div>
</div>
<!-- Database Schema -->
<div class="bg-gray-700 p-6 rounded-lg">
<h3 class="text-lg font-medium text-white mb-4 flex items-center">
<i class="fas fa-database text-green-400 mr-2"></i>
Schéma de base de données
</h3>
<div class="overflow-auto max-h-64" id="database-schema">
<!-- Dynamically filled by JS -->
</div>
</div>
<!-- API Endpoints -->
<div class="bg-gray-700 p-6 rounded-lg">
<h3 class="text-lg font-medium text-white mb-4 flex items-center">
<i class="fas fa-server text-blue-400 mr-2"></i>
Points d'API
</h3>
<div class="overflow-auto max-h-64" id="api-endpoints">
<!-- Dynamically filled by JS -->
</div>
</div>
</div>
</div>
</div>
<!-- Code Preview -->
<div class="max-w-7xl mx-auto px-4 mb-16 hidden" id="code-preview-section">
<div class="bg-gray-800 rounded-xl p-6">
<h2 class="text-2xl font-bold text-white mb-6">Code généré</h2>
<div class="flex flex-wrap gap-4 mb-4">
<button class="px-4 py-2 bg-indigo-600 text-white rounded-md hover:bg-indigo-700 active-file" data-file="app.js">
app.js
</button>
<button class="px-4 py-2 bg-gray-700 text-gray-300 rounded-md hover:bg-gray-600" data-file="routes.js">
routes.js
</button>
<button class="px-4 py-2 bg-gray-700 text-gray-300 rounded-md hover:bg-gray-600" data-file="models.js">
models.js
</button>
<button class="px-4 py-2 bg-gray-700 text-gray-300 rounded-md hover:bg-gray-600" data-file="config.js">
config.js
</button>
<button class="px-4 py-2 bg-gray-700 text-gray-300 rounded-md hover:bg-gray-600" data-file="auth.js">
auth.js
</button>
</div>
<div class="code-editor p-4 rounded-lg overflow-auto max-h-96" id="code-preview">
<code class="text-gray-300 font-mono text-sm block whitespace-pre" id="code-content">
<div class="code-line">// Initialisation de l'application</div>
<div class="code-line">const express = require('express');</div>
<div class="code-line">const mongoose = require('mongoose');</div>
<div class="code-line">const cors = require('cors');</div>
<div class="code-line">const helmet = require('helmet');</div>
<div class="code-line">const rateLimit = require('express-rate-limit');</div>
<div class="code-line"></div>
<div class="code-line">// Configuration de l'application</div>
<div class="code-line">const app = express();</div>
<div class="code-line">const PORT = process.env.PORT || 3000;</div>
<div class="code-line"></div>
<div class="code-line">// Middlewares</div>
<div class="code-line">app.use(cors());</div>
<div class="code-line">app.use(helmet());</div>
<div class="code-line">app.use(express.json());</div>
<div class="code-line">app.use(express.urlencoded({ extended: true }));</div>
<div class="code-line"></div>
<div class="code-line">// Limiteur de requêtes</div>
<div class="code-line">const limiter = rateLimit({</div>
<div class="code-line"> windowMs: 15 * 60 * 1000, // 15 minutes</div>
<div class="code-line"> max: 100 // limite chaque IP à 100 requêtes par fenêtre</div>
<div class="code-line">});</div>
<div class="code-line">app.use(limiter);</div>
<div class="code-line"></div>
<div class="code-line">// Connexion à la base de données</div>
<div class="code-line">mongoose.connect(process.env.DB_URI, {</div>
<div class="code-line"> useNewUrlParser: true,</div>
<div class="code-line"> useUnifiedTopology: true,</div>
<div class="code-line"> useCreateIndex: true</div>
<div class="code-line">})</div>
<div class="code-line">.then(() => console.log('Connecté à MongoDB'))</div>
<div class="code-line">.catch(err => console.error('Erreur de connexion:', err));</div>
<div class="code-line"></div>
<div class="code-line">// Routes</div>
<div class="code-line">const apiRoutes = require('./routes/api');</div>
<div class="code-line">const authRoutes = require('./routes/auth');</div>
<div class="code-line">const adminRoutes = require('./routes/admin');</div>
<div class="code-line"></div>
<div class="code-line">app.use('/api', apiRoutes);</div>
<div class="code-line">app.use('/auth', authRoutes);</div>
<div class="code-line">app.use('/admin', adminRoutes);</div>
<div class="code-line"></div>
<div class="code-line">// Gestion des erreurs</div>
<div class="code-line">app.use((err, req, res, next) => {</div>
<div class="code-line"> console.error(err.stack);</div>
<div class="code-line"> res.status(500).json({ error: 'Erreur interne du serveur' });</div>
<div class="code-line">});</div>
<div class="code-line"></div>
<div class="code-line">// Démarrage du serveur</div>
<div class="code-line">app.listen(PORT, () => {</div>
<div class="code-line"> console.log(`Serveur démarré sur le port ${PORT}`);</div>
<div class="code-line">});</div>
</code>
</div>
<div class="mt-4 flex justify-between items-center">
<div class="text-gray-400 text-sm">
<span id="line-count">30</span> lignes de code générées
</div>
<button class="px-4 py-2 bg-green-600 text-white rounded-md hover:bg-green-700">
<i class="fas fa-download mr-2"></i>Télécharger le projet complet
</button>
</div>
</div>
</div>
<!-- Generation Process -->
<div id="generation-process" class="hidden py-12 bg-gray-800">
<div class="max-w-4xl mx-auto px-4">
<h2 class="text-2xl font-bold text-white text-center mb-8">Création de votre application</h2>
<div class="progress-bar rounded-full mb-8 w-full" id="progress-bar"></div>
<div class="grid grid-cols-1 md:grid-cols-3 gap-4 text-center">
<div class="bg-gray-700 p-4 rounded-lg">
<div class="text-3xl font-bold text-indigo-400 mb-2" id="file-count">0</div>
<div class="text-gray-300">Fichiers générés</div>
</div>
<div class="bg-gray-700 p-4 rounded-lg">
<div class="text-3xl font-bold text-green-400 mb-2" id="line-count-total">0</div>
<div class="text-gray-300">Lignes de code</div>
</div>
<div class="bg-gray-700 p-4 rounded-lg">
<div class="text-3xl font-bold text-blue-400 mb-2" id="endpoint-count">0</div>
<div class="text-gray-300">Endpoints API</div>
</div>
</div>
<div class="mt-8 bg-gray-900 p-4 rounded-lg">
<div class="text-gray-300 font-mono text-sm overflow-auto h-32" id="generation-log">
<div>> Initialisation du générateur...</div>
</div>
</div>
</div>
</div>
<!-- Features -->
<div class="py-12 bg-gray-900">
<div class="max-w-6xl mx-auto px-4">
<h2 class="text-2xl font-bold text-white text-center mb-8">Applications professionnelles générées</h2>
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
<div class="bg-gray-800 p-6 rounded-lg hover:transform hover:scale-105 transition-transform">
<div class="bg-indigo-600 p-3 rounded-full w-12 h-12 flex items-center justify-center mb-4">
<i class="fas fa-shopping-cart text-white text-xl"></i>
</div>
<h3 class="text-lg font-medium text-white mb-2">Plateforme e-commerce</h3>
<p class="text-gray-300 mb-4">
Système complet avec panier, paiement, gestion de produits et dashboard admin.
</p>
<div class="text-xs text-gray-400">
<span class="bg-gray-700 px-2 py-1 rounded mr-2">~2000 lignes</span>
<span class="bg-gray-700 px-2 py-1 rounded">12 endpoints API</span>
</div>
</div>
<div class="bg-gray-800 p-6 rounded-lg hover:transform hover:scale-105 transition-transform">
<div class="bg-purple-600 p-3 rounded-full w-12 h-12 flex items-center justify-center mb-4">
<i class="fas fa-users text-white text-xl"></i>
</div>
<h3 class="text-lg font-medium text-white mb-2">Réseau social</h3>
<p class="text-gray-300 mb-4">
Authentification, publications, commentaires, notifications en temps réel.
</p>
<div class="text-xs text-gray-400">
<span class="bg-gray-700 px-2 py-1 rounded mr-2">~2500 lignes</span>
<span class="bg-gray-700 px-2 py-1 rounded">18 endpoints API</span>
</div>
</div>
<div class="bg-gray-800 p-6 rounded-lg hover:transform hover:scale-105 transition-transform">
<div class="bg-green-600 p-3 rounded-full w-12 h-12 flex items-center justify-center mb-4">
<i class="fas fa-chart-line text-white text-xl"></i>
</div>
<h3 class="text-lg font-medium text-white mb-2">ERP d'entreprise</h3>
<p class="text-gray-300 mb-4">
Gestion de stock, facturation, RH, reporting et tableaux de bord analytiques.
</p>
<div class="text-xs text-gray-400">
<span class="bg-gray-700 px-2 py-1 rounded mr-2">~3500 lignes</span>
<span class="bg-gray-700 px-2 py-1 rounded">25 endpoints API</span>
</div>
</div>
</div>
</div>
</div>
<!-- Footer -->
<footer class="bg-gray-800 py-8">
<div class="max-w-4xl mx-auto px-4 text-center">
<p class="text-gray-400">
&copy; 2023 NexusWeb Pro. Générateur d'applications web complexes.
</p>
</div>
</footer>
<script>
document.addEventListener('DOMContentLoaded', function() {
const generateBtn = document.getElementById('generate-btn');
const projectDescription = document.getElementById('project-description');
const generationProcess = document.getElementById('generation-process');
const progressBar = document.getElementById('progress-bar');
const generationLog = document.getElementById('generation-log');
const fileCount = document.getElementById('file-count');
const lineCountTotal = document.getElementById('line-count-total');
const endpointCount = document.getElementById('endpoint-count');
const projectArchitecture = document.getElementById('project-architecture');
const codePreviewSection = document.getElementById('code-preview-section');
const fileStructure = document.getElementById('file-structure');
const databaseSchema = document.getElementById('database-schema');
const apiEndpoints = document.getElementById('api-endpoints');
const codeContent = document.getElementById('code-content');
const lineCount = document.getElementById('line-count');
const fileTabs = document.querySelectorAll('[data-file]');
// Templates pour différents types de projets
const projectTemplates = {
'ecommerce': {
name: "Plateforme e-commerce",
files: [
{name: "app.js", type: "file", lines: 120},
{name: "routes/", type: "folder", children: [
{name: "api.js", type: "file", lines: 250},
{name: "auth.js", type: "file", lines: 180},
{name: "admin.js", type: "file", lines: 200}
]},
{name: "models/", type: "folder", children: [
{name: "Product.js", type: "file", lines: 150},
{name: "User.js", type: "file", lines: 120},
{name: "Order.js", type: "file", lines: 180}
]},
{name: "controllers/", type: "folder", children: [
{name: "productController.js", type: "file", lines: 220},
{name: "userController.js", type: "file", lines: 200},
{name: "orderController.js", type: "file", lines: 240}
]},
{name: "middlewares/", type: "folder", children: [
{name: "auth.js", type: "file", lines: 100},
{name: "admin.js", type: "file", lines: 80}
]},
{name: "config/", type: "folder", children: [
{name: "db.js", type: "file", lines: 60},
{name: "passport.js", type: "file", lines: 90}
]},
{name: "public/", type: "folder", children: [
{name: "css/", type: "folder"},
{name: "js/", type: "folder"},
{name: "images/", type: "folder"}
]},
{name: "views/", type: "folder", children: [
{name: "layouts/", type: "folder"},
{name: "products/", type: "folder"},
{name: "users/", type: "folder"}
]}
],
database: [
"Users: id, email, password, name, address, role",
"Products: id, name, description, price, category, stock",
"Orders: id, userId, products, total, status, createdAt",
"Categories: id, name, description",
"Payments: id, orderId, amount, method, status"
],
endpoints: [
"POST /api/products - Créer un produit (admin)",
"GET /api/products - Lister tous les produits",
"GET /api/products/:id - Obtenir un produit",
"POST /api/orders - Créer une commande",
"GET /api/orders/:id - Obtenir une commande",
"POST /auth/register - S'inscrire",
"POST /auth/login - Se connecter",
"GET /auth/me - Profil utilisateur",
"GET /admin/orders - Lister toutes les commandes (admin)",
"PUT /admin/orders/:id - Mettre à jour une commande (admin)"
],
totalLines: 1500
},
'social': {
name: "Réseau social",
files: [
{name: "app.js", type: "file", lines: 120},
{name: "routes/", type: "folder", children: [
{name: "posts.js", type: "file", lines: 200},
{name: "auth.js", type: "file", lines: 180},
{name: "users.js", type: "file", lines: 220},
{name: "comments.js", type: "file", lines: 160}
]},
{name: "models/", type: "folder", children: [
{name: "User.js", type: "file", lines: 150},
{name: "Post.js", type: "file", lines: 180},
{name: "Comment.js", type: "file", lines: 140}
]},
{name: "controllers/", type: "folder", children: [
{name: "postController.js", type: "file", lines: 250},
{name: "userController.js", type: "file", lines: 220},
{name: "commentController.js", type: "file", lines: 200}
]},
{name: "socket/", type: "folder", children: [
{name: "index.js", type: "file", lines: 180}
]},
{name: "config/", type: "folder", children: [
{name: "db.js", type: "file", lines: 60},
{name: "passport.js", type: "file", lines: 90}
]}
],
database: [
"Users: id, username, email, password, bio, avatar",
"Posts: id, userId, content, image, likes, createdAt",
"Comments: id, postId, userId, content, createdAt",
"Likes: id, postId, userId, createdAt",
"Follows: id, followerId, followingId, createdAt"
],
endpoints: [
"POST /api/posts - Créer un post",
"GET /api/posts - Lister les posts",
"GET /api/posts/:id - Obtenir un post",
"POST /api/posts/:id/like - Aimer un post",
"POST /api/posts/:id/comment - Commenter un post",
"POST /auth/register - S'inscrire",
"POST /auth/login - Se connecter",
"GET /api/users/:id - Obtenir un utilisateur",
"POST /api/users/:id/follow - Suivre un utilisateur",
"GET /api/users/:id/posts - Posts d'un utilisateur"
],
totalLines: 1800
},
'erp': {
name: "Système ERP",
files: [
{name: "app.js", type: "file", lines: 150},
{name: "routes/", type: "folder", children: [
{name: "inventory.js", type: "file", lines: 300},
{name: "hr.js", type: "file", lines: 250},
{name: "finance.js", type: "file", lines: 280},
{name: "reports.js", type: "file", lines: 220}
]},
{name: "models/", type: "folder", children: [
{name: "Product.js", type: "file", lines: 200},
{name: "Employee.js", type: "file", lines: 180},
{name: "Invoice.js", type: "file", lines: 220},
{name: "Report.js", type: "file", lines: 150}
]},
{name: "controllers/", type: "folder", children: [
{name: "inventoryController.js", type: "file", lines: 350},
{name: "hrController.js", type: "file", lines: 300},
{name: "financeController.js", type: "file", lines: 320}
]},
{name: "services/", type: "folder", children: [
{name: "reportService.js", type: "file", lines: 280}
]},
{name: "config/", type: "folder", children: [
{name: "db.js", type: "file", lines: 80},
{name: "auth.js", type: "file", lines: 120}
]}
],
database: [
"Products: id, name, description, category, quantity, price",
"Employees: id, name, position, department, salary, joinDate",
"Customers: id, name, email, phone, address",
"Invoices: id, customerId, date, total, status",
"Orders: id, productId, quantity, date, status",
"Reports: id, type, data, generatedBy, createdAt"
],
endpoints: [
"GET /api/inventory - Liste des produits",
"POST /api/inventory - Ajouter un produit",
"PUT /api/inventory/:id - Mettre à jour un produit",
"GET /api/employees - Liste des employés",
"POST /api/employees - Ajouter un employé",
"POST /api/invoices - Créer une facture",
"GET /api/invoices - Liste des factures",
"GET /api/reports/generate - Générer un rapport",
"GET /api/reports/:id - Télécharger un rapport",
"POST /auth/login - Connexion admin"
],
totalLines: 2500
}
};
// Générateur de projet
generateBtn.addEventListener('click', function() {
const description = projectDescription.value.toLowerCase();
let templateKey = 'ecommerce'; // Par défaut
if (description.includes('social') || description.includes('réseau') || description.includes('reseau')) {
templateKey = 'social';
} else if (description.includes('erp') || description.includes('entreprise') || description.includes('gestion')) {
templateKey = 'erp';
}
const project = projectTemplates[templateKey];
// Afficher le processus de génération
generationProcess.classList.remove('hidden');
generationProcess.scrollIntoView({ behavior: 'smooth' });
// Simuler la génération progressive
simulateGeneration(project);
});
// Simuler la génération avec progression
function simulateGeneration(project) {
let progress = 0;
const totalSteps = 100;
const progressInterval = setInterval(() => {
progress += 1;
progressBar.style.width = `${progress}%`;
// Mettre à jour les logs
if (progress === 10) {
addLog("> Initialisation de l'architecture du projet...");
} else if (progress === 20) {
addLog("> Création des fichiers de configuration...");
} else if (progress === 35) {
addLog("> Génération des modèles de données...");
} else if (progress === 50) {
addLog("> Création des contrôleurs...");
} else if (progress === 65) {
addLog("> Configuration des routes API...");
} else if (progress === 80) {
addLog("> Optimisation du code...");
} else if (progress === 90) {
addLog("> Finalisation du projet...");
}
// Mettre à jour les compteurs
if (progress % 5 === 0) {
const files = Math.min(project.files.length, Math.floor(progress / 100 * project.files.length));
const lines = Math.min(project.totalLines, Math.floor(progress / 100 * project.totalLines));
const endpoints = Math.min(project.endpoints.length, Math.floor(progress / 100 * project.endpoints.length));
fileCount.textContent = files;
lineCountTotal.textContent = lines;
endpointCount.textContent = endpoints;
}
// Terminer la génération
if (progress >= totalSteps) {
clearInterval(progressInterval);
addLog("> Projet généré avec succès!");
// Afficher les résultats
setTimeout(() => {
displayProjectResults(project);
}, 1000);
}
}, 50);
}
function addLog(message) {
const logEntry = document.createElement('div');
logEntry.textContent = message;
generationLog.appendChild(logEntry);
generationLog.scrollTop = generationLog.scrollHeight;
}
function displayProjectResults(project) {
// Afficher l'architecture du projet
projectArchitecture.classList.remove('hidden');
projectArchitecture.scrollIntoView({ behavior: 'smooth' });
// Remplir la structure des fichiers
renderFileStructure(project.files, fileStructure);
// Remplir le schéma de base de données
databaseSchema.innerHTML = project.database.map(item =>
`<div class="bg-gray-800 p-2 mb-1 rounded text-sm font-mono">${item}</div>`
).join('');
// Remplir les endpoints API
apiEndpoints.innerHTML = project.endpoints.map(item =>
`<div class="bg-gray-800 p-2 mb-1 rounded text-sm font-mono">${item}</div>`
).join('');
// Afficher la prévisualisation du code
codePreviewSection.classList.remove('hidden');
// Gestion des onglets de fichiers
fileTabs.forEach(tab => {
tab.addEventListener('click', function() {
// Mettre à jour l'onglet actif
document.querySelector('.active-file').classList.remove('active-file', 'bg-indigo-600');
document.querySelector('.active-file').classList.add('bg-gray-700', 'text-gray-300');
this.classList.add('active-file', 'bg-indigo-600');
this.classList.remove('bg-gray-700', 'text-gray-300');
// Mettre à jour le contenu du code (simplifié)
const file = this.dataset.file;
updateCodePreview(file, project);
});
});
}
function renderFileStructure(files, container, level = 0) {
container.innerHTML = '';
files.forEach(file => {
const item = document.createElement('li');
item.className = file.type === 'folder' ? 'folder' : 'file';
const icon = file.type === 'folder' ?
'<i class="fas fa-folder text-yellow-400 mr-2"></i>' :
'<i class="fas fa-file-code text-blue-400 mr-2"></i>';
item.innerHTML = `${icon}${file.name}`;
if (file.lines) {
item.innerHTML += ` <span class="text-gray-500 text-xs">${file.lines} lignes</span>`;
}
container.appendChild(item);
if (file.children) {
const childList = document.createElement('ul');
childList.className = 'ml-4 mt-1';
item.appendChild(childList);
renderFileStructure(file.children, childList, level + 1);
}
});
}
function updateCodePreview(file, project) {
// Simplifié - en réalité on aurait le vrai contenu de chaque fichier
let content = '';
let lines = 30;
switch(file) {
case 'app.js':
content = `// ${project.name} - Fichier principal\n\n` +
`const express = require('express');\n` +
`const mongoose = require('mongoose');\n` +
`const cors = require('cors');\n\n` +
`// Configuration de l'application\n` +
`const app = express();\n` +
`const PORT = process.env.PORT || 3000;\n\n` +
`// Middlewares\n` +
`app.use(cors());\n` +
`app.use(express.json());\n\n` +
`// Connexion à la base de données\n` +
`mongoose.connect(process.env.DB_URI, {\n` +
` useNewUrlParser: true,\n` +
` useUnifiedTopology: true\n` +
`}).then(() => console.log('Connecté à MongoDB'))\n` +
` .catch(err => console.error('Erreur:', err));\n\n` +
`// Routes\n` +
`app.use('/api', require('./routes/api'));\n` +
`app.use('/auth', require('./routes/auth'));\n\n` +
`// Démarrage du serveur\n` +
`app.listen(PORT, () => {\n` +
` console.log(\`Serveur démarré sur le port \${PORT}\`);\n` +
`});`;
lines = 25;
break;
case 'routes.js':
content = `// ${project.name} - Routes API\n\n` +
`const express = require('express');\n` +
`const router = express.Router();\n` +
`const controller = require('../controllers/mainController');\n\n` +
`// Routes publiques\n` +
`router.get('/products', controller.getProducts);\n` +
`router.get('/products/:id', controller.getProduct);\n\n` +
`// Routes protégées\n` +
`router.use(require('../middlewares/auth'));\n\n` +
`router.post('/products', controller.createProduct);\n` +
`router.put('/products/:id', controller.updateProduct);\n` +
`router.delete('/products/:id', controller.deleteProduct);\n\n` +
`module.exports = router;`;
lines = 18;
break;
case 'models.js':
content = `// ${project.name} - Modèles de données\n\n` +
`const mongoose = require('mongoose');\n\n` +
`// Schéma Utilisateur\n` +
`const userSchema = new mongoose.Schema({\n` +
` name: { type: String, required: true },\n` +
` email: { type: String, required: true, unique: true },\n` +
` password: { type: String, required: true },\n` +
` role: { type: String, enum: ['user', 'admin'], default: 'user' },\n` +
` createdAt: { type: Date, default: Date.now }\n` +
`});\n\n` +
`// Schéma Produit\n` +
`const productSchema = new mongoose.Schema({\n` +
` name: { type: String, required: true },\n` +
` description: { type: String },\n` +
` price: { type: Number, required: true },\n` +
` category: { type: String },\n` +
` stock: { type: Number, default: 0 },\n` +
` createdAt: { type: Date, default: Date.now }\n` +
`});\n\n` +
`// Export des modèles\n` +
`module.exports = {\n` +
` User: mongoose.model('User', userSchema),\n` +
` Product: mongoose.model('Product', productSchema)\n` +
`};`;
lines = 28;
break;
default:
content = `// ${project.name} - ${file}\n\n` +
`// Contenu du fichier ${file}\n` +
`// Ce fichier fait partie de l'architecture du projet\n` +
`// et contient la logique spécifique à sa fonction.\n\n` +
`// ${project.totalLines} lignes de code au total dans ce projet.`;
lines = 5;
}
codeContent.innerHTML = content.split('\n').map(line =>
`<div class="code-line">${line}</div>`
).join('');
lineCount.textContent = lines;
}
});
</script>
<p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=docto41/frerr" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
</html>