[ Mini Kiebo ]
Server: Windows NT AKFAR_SERVER 10.0 build 26200 (Windows 10) AMD64
Path:
D:
/
xampp
/
htdocs
/
campus_repo
/
public
/
[
Home
]
File: admin_dashboard.php
<?php if (session_status() === PHP_SESSION_NONE) { session_start(); } require_once __DIR__ . '/../config/config.php'; require_once __DIR__ . '/../src/Database.php'; require_once __DIR__ . '/../src/Utils.php'; require_once __DIR__ . '/../src/auth.php'; requireRole(['admin','editor']); // Hanya admin/editor yang boleh masuk if (!isset($_SESSION['user']) || !in_array($_SESSION['user']['role'], ['admin','editor'])) { header("Location: login.php?msg=unauthorized"); exit; } $pdo = Database::getConnection(); // Hitung jumlah dokumen per status $countSubmitted = $pdo->query("SELECT COUNT(*) FROM documents WHERE status='submitted'")->fetchColumn(); $countApproved = $pdo->query("SELECT COUNT(*) FROM documents WHERE status='approved'")->fetchColumn(); $countRejected = $pdo->query("SELECT COUNT(*) FROM documents WHERE status='rejected'")->fetchColumn(); // Hitung jumlah user $countUsers = $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn(); $countAdmins = $pdo->query("SELECT COUNT(*) FROM users WHERE role='admin'")->fetchColumn(); $countEditors = $pdo->query("SELECT COUNT(*) FROM users WHERE role='editor'")->fetchColumn(); $countStudents = $pdo->query("SELECT COUNT(*) FROM users WHERE role='student'")->fetchColumn(); ?> <?php include 'header.php'; ?> <h2>Dashboard Admin</h2> <div style="display:flex; gap:20px; flex-wrap:wrap; margin-top:20px;"> <div style="flex:1; background:#f0f8ff; padding:20px; border-radius:8px;"> <h3>Dokumen</h3> <ul> <li>Submitted: <?= $countSubmitted ?></li> <li>Approved: <?= $countApproved ?></li> <li>Rejected: <?= $countRejected ?></li> </ul> </div> <div style="flex:1; background:#f5f5f5; padding:20px; border-radius:8px;"> <h3>Users</h3> <ul> <li>Total: <?= $countUsers ?></li> <li>Admin: <?= $countAdmins ?></li> <li>Editor: <?= $countEditors ?></li> <li>Mahasiswa: <?= $countStudents ?></li> </ul> </div> </div> <div style="margin-top:30px;"> <a href="admin.php">➡ Moderasi Dokumen</a> | <a href="search.php">➡ Lihat Repository</a> </div> <?php if (session_status() === PHP_SESSION_NONE) { session_start(); } require_once __DIR__ . '/../config/config.php'; require_once __DIR__ . '/../src/Database.php'; // Hanya admin/editor yang boleh masuk if (!isset($_SESSION['user']) || !in_array($_SESSION['user']['role'], ['admin','editor'])) { header("Location: login.php?msg=unauthorized"); exit; } $pdo = Database::getConnection(); // Hitung jumlah dokumen per status $countSubmitted = $pdo->query("SELECT COUNT(*) FROM documents WHERE status='submitted'")->fetchColumn(); $countApproved = $pdo->query("SELECT COUNT(*) FROM documents WHERE status='approved'")->fetchColumn(); $countRejected = $pdo->query("SELECT COUNT(*) FROM documents WHERE status='rejected'")->fetchColumn(); // Hitung jumlah user per role $countAdmins = $pdo->query("SELECT COUNT(*) FROM users WHERE role='admin'")->fetchColumn(); $countEditors = $pdo->query("SELECT COUNT(*) FROM users WHERE role='editor'")->fetchColumn(); $countStudents = $pdo->query("SELECT COUNT(*) FROM users WHERE role='student'")->fetchColumn(); ?> <canvas id="docChart" width="5" height="2"></canvas> <canvas id="userChart" width="5" height="2" style="margin-top:30px;"></canvas> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script> // Bar Chart: Dokumen per Status const ctx1 = document.getElementById('docChart').getContext('2d'); new Chart(ctx1, { type: 'bar', data: { labels: ['Submitted', 'Approved', 'Rejected'], datasets: [{ label: 'Jumlah Dokumen', data: [<?= $countSubmitted ?>, <?= $countApproved ?>, <?= $countRejected ?>], backgroundColor: ['orange', 'green', 'red'] }] }, options: { responsive: true, plugins: { title: { display: true, text: 'Dokumen per Status' } } } }); // Pie Chart: Distribusi User per Role const ctx2 = document.getElementById('userChart').getContext('2d'); new Chart(ctx2, { type: 'pie', data: { labels: ['Admin', 'Editor', 'Student'], datasets: [{ label: 'Jumlah User', data: [<?= $countAdmins ?>, <?= $countEditors ?>, <?= $countStudents ?>], backgroundColor: ['blue', 'purple', 'teal'] }] }, options: { responsive: true, plugins: { title: { display: true, text: 'Distribusi User per Role' } } } }); </script> <?php // Hitung jumlah upload per bulan (12 bulan terakhir) $stmt = $pdo->query(" SELECT DATE_FORMAT(created_at, '%Y-%m') AS bulan, COUNT(*) AS jumlah FROM documents GROUP BY DATE_FORMAT(created_at, '%Y-%m') ORDER BY bulan ASC "); $uploads = $stmt->fetchAll(PDO::FETCH_ASSOC); // Siapkan data untuk Chart.js $bulanLabels = []; $jumlahUploads = []; foreach ($uploads as $row) { $bulanLabels[] = $row['bulan']; $jumlahUploads[] = $row['jumlah']; } ?> <canvas id="uploadChart" width="6" height="2.5" style="margin-top:30px;"></canvas> <script src="https://cdn.jsdelivr.net/npm/chart.js"></script> <script> // Line Chart: Tren Upload per Bulan const ctx3 = document.getElementById('uploadChart').getContext('2d'); new Chart(ctx3, { type: 'line', data: { labels: <?= json_encode($bulanLabels) ?>, datasets: [{ label: 'Jumlah Upload', data: <?= json_encode($jumlahUploads) ?>, borderColor: 'navy', backgroundColor: 'rgba(0,0,128,0.2)', fill: true, tension: 0.3 }] }, options: { responsive: true, plugins: { title: { display: true, text: 'Tren Upload Dokumen per Bulan' } }, scales: { y: { beginAtZero: true } } } }); </script> <h3>Log Reset Password</h3> <table border="1" cellpadding="5" cellspacing="0"> <tr> <th>User ID</th> <th>Email</th> <th>Requested At</th> </tr> <?php $stmt = $pdo->query("SELECT * FROM reset_logs ORDER BY requested_at DESC LIMIT 20"); while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { echo "<tr> <td>{$row['user_id']}</td> <td>{$row['email']}</td> <td>{$row['requested_at']}</td> </tr>"; } ?> </table> <h3>Log Reset Password</h3> <form method="get" action="export_reset_logs.php"> <label>Dari Tanggal:</label> <input type="date" name="start_date" value="<?= $_GET['start_date'] ?? '' ?>"> <label>Sampai Tanggal:</label> <input type="date" name="end_date" value="<?= $_GET['end_date'] ?? '' ?>"> <button type="submit">Export ke CSV</button> </form> <?php include 'footer.php'; ?>