add welcome page and README.md
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
{% extends "base.html" %}
|
||||
{% from "macros/forms.html" import render_field, render_select %}
|
||||
|
||||
{% block title %}Create account · Face Attendance{% endblock %}
|
||||
{% block title %}Create account - Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Accounts · Face Attendance{% endblock %}
|
||||
{% block title %}Accounts - Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Attendance · Face Attendance{% endblock %}
|
||||
{% block title %}Attendance - Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Kiosk · Face Attendance{% endblock %}
|
||||
{% block title %}Kiosk - Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{% extends "base.html" %}
|
||||
{% from "macros/forms.html" import render_field %}
|
||||
|
||||
{% block title %}Sign in · Face Attendance{% endblock %}
|
||||
{% block title %}Sign in - Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="auth-layout">
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
{% endif %}
|
||||
</ul>
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
<span class="small text-secondary">{{ current_user.full_name }} · {{ current_user.role|title }}</span>
|
||||
<span class="small text-secondary">{{ current_user.full_name }} - {{ current_user.role|title }}</span>
|
||||
<form method="post" action="{{ url_for('auth.logout') }}">
|
||||
<input type="hidden" name="csrf_token" value="{{ csrf_token() }}">
|
||||
<button class="btn btn-outline-secondary btn-sm" type="submit">Sign out</button>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Dashboard · Face Attendance{% endblock %}
|
||||
{% block title %}Dashboard - Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Access denied · Face Attendance{% endblock %}
|
||||
{% block title %}Access denied - Face Attendance{% endblock %}
|
||||
{% block content %}
|
||||
<section class="error-page">
|
||||
<h1>Access denied</h1>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Not found · Face Attendance{% endblock %}
|
||||
{% block title %}Not found - Face Attendance{% endblock %}
|
||||
{% block content %}
|
||||
<section class="error-page">
|
||||
<h1>Page not found</h1>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
{% extends "base.html" %}
|
||||
{% block title %}Server error · Face Attendance{% endblock %}
|
||||
{% block title %}Server error - Face Attendance{% endblock %}
|
||||
{% block content %}
|
||||
<section class="error-page">
|
||||
<h1>Server error</h1>
|
||||
|
||||
@@ -1,13 +1,13 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ person.full_name }} · Face Attendance{% endblock %}
|
||||
{% block title %}{{ person.full_name }} - Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
<div>
|
||||
<p class="eyebrow">Person profile</p>
|
||||
<h1>{{ person.full_name }}</h1>
|
||||
<p class="text-secondary mb-0">{{ person.employee_id }} · {{ "Active" if person.active else "Inactive" }}</p>
|
||||
<p class="text-secondary mb-0">{{ person.employee_id }} - {{ "Active" if person.active else "Inactive" }}</p>
|
||||
</div>
|
||||
<a class="btn btn-outline-secondary" href="{{ url_for('people.index') }}">Back</a>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{% extends "base.html" %}
|
||||
{% from "macros/forms.html" import render_field, render_textarea %}
|
||||
|
||||
{% block title %}Enroll person · Face Attendance{% endblock %}
|
||||
{% block title %}Enroll person - Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}People · Face Attendance{% endblock %}
|
||||
{% block title %}People - Face Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="page-header">
|
||||
|
||||
68
app/templates/welcome.html
Normal file
68
app/templates/welcome.html
Normal file
@@ -0,0 +1,68 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Face Attendance - Secure Recognition Attendance{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="welcome-page">
|
||||
<section class="welcome-hero">
|
||||
<nav class="welcome-nav" aria-label="Welcome navigation">
|
||||
<a class="welcome-brand" href="{{ url_for('main.index') }}">Face Attendance</a>
|
||||
<a class="btn btn-light btn-sm" href="{{ url_for('auth.login') }}">Sign in</a>
|
||||
</nav>
|
||||
|
||||
<div class="welcome-copy">
|
||||
<p class="eyebrow welcome-eyebrow">Production-ready Flask application</p>
|
||||
<h1>Face Attendance</h1>
|
||||
<p>
|
||||
A secure attendance platform for enrolling people, identifying faces at a kiosk,
|
||||
and reviewing check-in and check-out history with role-based staff access.
|
||||
</p>
|
||||
<div class="welcome-actions">
|
||||
<a class="btn btn-primary btn-lg" href="{{ url_for('auth.login') }}">Sign in</a>
|
||||
<a class="btn btn-outline-light btn-lg" href="#capabilities">View capabilities</a>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="welcome-section" id="capabilities">
|
||||
<div class="welcome-section-header">
|
||||
<p class="eyebrow">Capabilities</p>
|
||||
<h2>Built for controlled attendance workflows</h2>
|
||||
</div>
|
||||
<div class="feature-grid">
|
||||
<article class="feature-card">
|
||||
<span>01</span>
|
||||
<h3>Role-based staff access</h3>
|
||||
<p>Admins manage accounts, operators run attendance workflows, and viewers get read-only reports.</p>
|
||||
</article>
|
||||
<article class="feature-card">
|
||||
<span>02</span>
|
||||
<h3>Face enrollment</h3>
|
||||
<p>Store multiple reference encodings per person while keeping recognition logic isolated in services.</p>
|
||||
</article>
|
||||
<article class="feature-card">
|
||||
<span>03</span>
|
||||
<h3>Attendance kiosk</h3>
|
||||
<p>Capture a webcam snapshot, identify matches, and record check-in or check-out events from one screen.</p>
|
||||
</article>
|
||||
<article class="feature-card">
|
||||
<span>04</span>
|
||||
<h3>Audit-friendly records</h3>
|
||||
<p>Attendance entries include the person, event type, timestamp, source, confidence, and staff user.</p>
|
||||
</article>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="workflow-band">
|
||||
<div>
|
||||
<p class="eyebrow">Architecture</p>
|
||||
<h2>Clean Flask structure with production defaults</h2>
|
||||
</div>
|
||||
<ul class="workflow-list">
|
||||
<li>Application factory, Blueprints, SQLAlchemy models, and Alembic migrations.</li>
|
||||
<li>CSRF-protected forms, secure password hashing, and hardened session settings.</li>
|
||||
<li>Pytest fixtures for auth, authorization, models, and attendance behavior.</li>
|
||||
</ul>
|
||||
</section>
|
||||
</div>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user