Auditoria 6.3 apontava dashboard.php (2×), user/index.php e
user/profile.php como as únicas vistas com SQL direto, quebrando a
convenção da frota (config/functions_*.php como camada de models). As
quatro passam a chamar db_users_count_clients(), db_users_count_team(),
db_users_list() e db_user_update_profile() — mesmo SQL, mesmos
parâmetros, só movido para onde o resto do código já vai buscar dados.
Nota: views/admin/gyms/{create,edit}.php e views/admin/reviews/index.php
também têm SQL direto, mas não estavam no âmbito dos "3 vistas" da
auditoria (entraram depois, no trabalho de multi-ginásio) — por tratar
numa próxima passagem.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
134 lines
7.0 KiB
PHP
134 lines
7.0 KiB
PHP
<?php
|
|
require __DIR__ . '/../../config/db.php';
|
|
require __DIR__ . '/../../config/functions.php';
|
|
$user = require_admin();
|
|
|
|
// Counts for the dashboard widgets.
|
|
$counts = [
|
|
'clientes' => db_users_count_clients($pdo),
|
|
'equipa' => db_users_count_team($pdo),
|
|
'leads_novos' => db_membership_leads_count_new($pdo),
|
|
];
|
|
|
|
$page_title = 'Painel';
|
|
include __DIR__ . '/../../includes/header.php';
|
|
?>
|
|
<div class="container">
|
|
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2 mb-4">
|
|
<h1 class="h3 mb-0">Olá, <?= htmlspecialchars($user['name']) ?></h1>
|
|
<span class="text-muted">Painel de administração</span>
|
|
</div>
|
|
|
|
<div class="row g-3 mb-4">
|
|
<div class="col-sm-6 col-lg-3">
|
|
<div class="card shadow-sm"><div class="card-body">
|
|
<div class="text-muted small text-uppercase">Clientes</div>
|
|
<div class="display-6"><?= $counts['clientes'] ?></div>
|
|
</div></div>
|
|
</div>
|
|
<div class="col-sm-6 col-lg-3">
|
|
<div class="card shadow-sm"><div class="card-body">
|
|
<div class="text-muted small text-uppercase">Equipa</div>
|
|
<div class="display-6"><?= $counts['equipa'] ?></div>
|
|
</div></div>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card shadow-sm mb-4"><div class="card-body">
|
|
<h2 class="h5">Gestão de Conteúdos</h2>
|
|
<div class="row g-3 mt-1">
|
|
<div class="col-sm-6 col-lg-4">
|
|
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/gyms/index.php') ?>">
|
|
<div class="card-body">
|
|
<i class="bi bi-buildings-fill fs-3 text-primary mb-2 d-block"></i>
|
|
<strong>Ginásios</strong>
|
|
<p class="text-muted small mb-0">A editar: <?= htmlspecialchars(admin_gym($pdo)['name']) ?> — criar e gerir ginásios</p>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
<div class="col-sm-6 col-lg-4">
|
|
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/team/index.php') ?>">
|
|
<div class="card-body">
|
|
<i class="bi bi-people-fill fs-3 text-primary mb-2 d-block"></i>
|
|
<strong>Equipa</strong>
|
|
<p class="text-muted small mb-0">Gerir treinadores e staff</p>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
<div class="col-sm-6 col-lg-4">
|
|
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/modalidades/index.php') ?>">
|
|
<div class="card-body">
|
|
<i class="bi bi-grid-3x3-gap-fill fs-3 text-primary mb-2 d-block"></i>
|
|
<strong>Modalidades</strong>
|
|
<p class="text-muted small mb-0">Gerir aulas e categorias</p>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
<div class="col-sm-6 col-lg-4">
|
|
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/galerias/index.php') ?>">
|
|
<div class="card-body">
|
|
<i class="bi bi-images fs-3 text-primary mb-2 d-block"></i>
|
|
<strong>Galerias</strong>
|
|
<p class="text-muted small mb-0">Gerir galerias de fotos</p>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
<div class="col-sm-6 col-lg-4">
|
|
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/work_hours/index.php') ?>">
|
|
<div class="card-body">
|
|
<i class="bi bi-clock-fill fs-3 text-primary mb-2 d-block"></i>
|
|
<strong>Horário de Funcionamento</strong>
|
|
<p class="text-muted small mb-0">Horas de abertura</p>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
<div class="col-sm-6 col-lg-4">
|
|
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/horario/index.php') ?>">
|
|
<div class="card-body">
|
|
<i class="bi bi-calendar-week-fill fs-3 text-primary mb-2 d-block"></i>
|
|
<strong>Horário de Aulas</strong>
|
|
<p class="text-muted small mb-0">Aulas semanais</p>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
<div class="col-sm-6 col-lg-4">
|
|
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/memberships/index.php') ?>">
|
|
<div class="card-body">
|
|
<i class="bi bi-credit-card-2-front-fill fs-3 text-primary mb-2 d-block"></i>
|
|
<strong>Mensalidades</strong><?php if ($counts['leads_novos']): ?> <span class="badge bg-danger"><?= $counts['leads_novos'] ?> novo<?= $counts['leads_novos'] > 1 ? 's' : '' ?></span><?php endif; ?>
|
|
<p class="text-muted small mb-0">Cartões de preço e pedidos de inscrição</p>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
<div class="col-sm-6 col-lg-4">
|
|
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/reviews/index.php') ?>">
|
|
<div class="card-body">
|
|
<i class="bi bi-star-fill fs-3 text-primary mb-2 d-block"></i>
|
|
<strong>Reviews Google</strong>
|
|
<p class="text-muted small mb-0">Reviews do Google na página inicial</p>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
<div class="col-sm-6 col-lg-4">
|
|
<a class="card text-decoration-none border-primary shadow-sm h-100" href="<?= base_url('views/admin/info/edit.php') ?>">
|
|
<div class="card-body">
|
|
<i class="bi bi-telephone-fill fs-3 text-primary mb-2 d-block"></i>
|
|
<strong>Contactos</strong>
|
|
<p class="text-muted small mb-0">Telefone, e-mail, morada e redes sociais</p>
|
|
</div>
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div></div>
|
|
|
|
<div class="card shadow-sm"><div class="card-body">
|
|
<h2 class="h5">Acessos rápidos</h2>
|
|
<div class="d-flex flex-wrap gap-2 mt-3">
|
|
<a class="btn btn-outline-primary" href="<?= base_url('views/user/index.php') ?>"><i class="bi bi-people me-1"></i>Utilizadores</a>
|
|
<a class="btn btn-outline-secondary" href="<?= base_url('views/sysadmin/system_settings.php') ?>"><i class="bi bi-sliders me-1"></i>Definições</a>
|
|
<a class="btn btn-outline-secondary" href="<?= base_url('/') ?>" target="_blank" rel="noopener"><i class="bi bi-box-arrow-up-right me-1"></i>Site público</a>
|
|
</div>
|
|
</div></div>
|
|
</div>
|
|
<?php include __DIR__ . '/../../includes/footer.php'; ?>
|