Estrutura multi-ginásio: as mesmas secções do site, conteúdo próprio por ginásio, e cada um numa pasta da URL com o código postal da zona. - migration_20260926_gyms: tabela gyms (pasta, nome, localidade, publicado, principal, secções visíveis, título/imagem do header, SEO, galeria, Place ID, página CrossFit) com o FitMe 3070 como ginásio 1 em /3070/; gym_id em team, modalidades (o horário segue a modalidade), work_hours, memberships, membership_leads e website_offer (tudo o existente → ginásio 1); events com gym_id NULL = todos; fitme3070_info passa a uma linha por ginásio (id = gym). - Site: /<pasta>/, /<pasta>/crossfit, /<pasta>/agendar|inscricao. Ginásio por publicar → 404 para o público, pré-visualização (com faixa) para a equipa. / e /home → 301 para o ginásio principal (a manter a query); com mais de um ginásio publicado, a raiz passa a uma página para escolher. Secções desligadas não aparecem nem no menu; menu, canonical, JSON-LD, sitemap, formulários, e-mails e reviews (Place ID e cache) são do ginásio. - Backoffice: Gestão → Ginásios (criar/editar/apagar, secções, e «começar com o conteúdo de» outro ginásio — cópias independentes) e o seletor «A editar» no topo; equipa, modalidades, horários, horário de funcionamento, mensalidades, pedidos, contactos e reviews trabalham sobre o ginásio escolhido, e um registo de outro ginásio não abre. - Modalidades passam para logo a seguir à galeria das instalações. - Galeria sem cantos arredondados (raio da marca). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
134 lines
7.2 KiB
PHP
134 lines
7.2 KiB
PHP
<?php
|
|
require __DIR__ . '/../../config/db.php';
|
|
require __DIR__ . '/../../config/functions.php';
|
|
$user = require_admin();
|
|
|
|
// Counts for the dashboard widgets.
|
|
$counts = [
|
|
'clientes' => (int) $pdo->query("SELECT COUNT(*) FROM users WHERE role = 'client'")->fetchColumn(),
|
|
'equipa' => (int) $pdo->query("SELECT COUNT(*) FROM users WHERE role IN ('admin','staff')")->fetchColumn(),
|
|
'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'; ?>
|