Heim > Artikel > Web-Frontend > Erstellen eines sicheren Mitarbeiter-Dashboards mit Gesichtsauthentifizierung: Ein umfassendes Next.js-Tutorial
Sind Sie bereit, Ihr Arbeitsplatzmanagement zu revolutionieren? In diesem umfassenden Tutorial befassen wir uns eingehend mit der Erstellung eines hochmodernen Mitarbeiter-Dashboards, das die Gesichtsauthentifizierung nutzt. Wir werden einige der angesagtesten Tools in der Webentwicklung verwenden: Next.js, FACEIO und Shadcn UI. Am Ende dieses Leitfadens verfügen Sie über ein elegantes, sicheres Dashboard, das Ihren Mitarbeitern das Gefühl gibt, in der Zukunft zu leben!
Bevor wir eintauchen, stellen wir sicher, dass Sie alle Enten in einer Reihe haben:
Hast du das alles? Großartig! Bringen wir diese Show auf die Straße.
Das Wichtigste zuerst: Erstellen wir unser Next.js-Projekt. Öffnen Sie Ihr Terminal und geben Sie diese Zauberwörter ein:
npx create-next-app@latest faceio-app cd faceio-app
Ihnen werden einige Fragen gestellt. So beantworten Sie sie:
Jetzt schnappen wir uns alle Leckereien, die wir brauchen. Führen Sie diesen Befehl aus, um unsere Abhängigkeiten zu installieren:
npm install @faceio/fiojs @shadcn/ui class-variance-authority clsx tailwind-merge
Erstellen Sie eine Datei mit dem Namen .env.local im Stammverzeichnis Ihres Projekts. Hier bewahren wir unsere geheime FACEIO-App-ID auf:
NEXT_PUBLIC_FACEIO_APP_ID=your-super-secret-faceio-app-id
Denken Sie daran, „Ihre-supergeheime-Faceio-App-ID“ durch Ihre tatsächliche FACEIO-Anwendungs-ID zu ersetzen. Bewahren Sie es sicher auf!
Ihre Projektstruktur sollte wie folgt aussehen:
faceio-app/ ├── app/ │ ├── layout.tsx │ ├── page.tsx │ └── components/ │ ├── FaceAuth.tsx │ └── EmployeeDashboard.tsx ├── public/ ├── .env.local ├── next.config.js ├── package.json ├── tsconfig.json └── tailwind.config.js
Zeit, Tailwind neu zu gestalten. Aktualisieren Sie Ihre tailwind.config.js-Datei mit dieser ausgefallenen Konfiguration:
/** @type {import('tailwindcss').Config} */ module.exports = { darkMode: ["class"], content: [ './app/**/*.{ts,tsx}', ], theme: { container: { center: true, padding: "2rem", screens: { "2xl": "1400px", }, }, extend: { colors: { border: "hsl(var(--border))", input: "hsl(var(--input))", ring: "hsl(var(--ring))", background: "hsl(var(--background))", foreground: "hsl(var(--foreground))", primary: { DEFAULT: "hsl(var(--primary))", foreground: "hsl(var(--primary-foreground))", }, secondary: { DEFAULT: "hsl(var(--secondary))", foreground: "hsl(var(--secondary-foreground))", }, destructive: { DEFAULT: "hsl(var(--destructive))", foreground: "hsl(var(--destructive-foreground))", }, muted: { DEFAULT: "hsl(var(--muted))", foreground: "hsl(var(--muted-foreground))", }, accent: { DEFAULT: "hsl(var(--accent))", foreground: "hsl(var(--accent-foreground))", }, popover: { DEFAULT: "hsl(var(--popover))", foreground: "hsl(var(--popover-foreground))", }, card: { DEFAULT: "hsl(var(--card))", foreground: "hsl(var(--card-foreground))", }, }, borderRadius: { lg: "var(--radius)", md: "calc(var(--radius) - 2px)", sm: "calc(var(--radius) - 4px)", }, keyframes: { "accordion-down": { from: { height: 0 }, to: { height: "var(--radix-accordion-content-height)" }, }, "accordion-up": { from: { height: "var(--radix-accordion-content-height)" }, to: { height: 0 }, }, }, animation: { "accordion-down": "accordion-down 0.2s ease-out", "accordion-up": "accordion-up 0.2s ease-out", }, }, }, plugins: [require("tailwindcss-animate")], }
Lassen Sie uns den Star unserer Show erstellen – die FaceAuth-Komponente. Erstellen Sie eine neue Datei app/components/FaceAuth.tsx und fügen Sie diesen Code ein:
import { useEffect } from 'react'; import faceIO from '@faceio/fiojs'; import { Button, Card, CardHeader, CardTitle, CardContent } from '@shadcn/ui'; import { useToast } from '@shadcn/ui'; interface FaceAuthProps { onSuccessfulAuth: (data: any) => void; } const FaceAuth: React.FC<FaceAuthProps> = ({ onSuccessfulAuth }) => { const { toast } = useToast(); useEffect(() => { const faceio = new faceIO(process.env.NEXT_PUBLIC_FACEIO_APP_ID); const enrollNewUser = async () => { try { const userInfo = await faceio.enroll({ locale: 'auto', payload: { email: 'employee@example.com', pin: '12345', }, }); toast({ title: "Success!", description: "You're now enrolled in the facial recognition system!", }); console.log('User Enrolled!', userInfo); } catch (errCode) { toast({ title: "Oops!", description: "Enrollment failed. Please try again.", variant: "destructive", }); console.error('Enrollment Failed', errCode); } }; const authenticateUser = async () => { try { const userData = await faceio.authenticate(); toast({ title: "Welcome back!", description: "Authentication successful.", }); console.log('User Authenticated!', userData); onSuccessfulAuth({ name: 'John Doe', position: 'Software Developer', department: 'Engineering', photoUrl: 'https://example.com/john-doe.jpg', }); } catch (errCode) { toast({ title: "Authentication failed", description: "Please try again or enroll.", variant: "destructive", }); console.error('Authentication Failed', errCode); } }; const enrollBtn = document.getElementById('enroll-btn'); const authBtn = document.getElementById('auth-btn'); if (enrollBtn) enrollBtn.onclick = enrollNewUser; if (authBtn) authBtn.onclick = authenticateUser; return () => { if (enrollBtn) enrollBtn.onclick = null; if (authBtn) authBtn.onclick = null; }; }, [toast, onSuccessfulAuth]); return ( <Card className="w-full max-w-md mx-auto"> <CardHeader> <CardTitle>Facial Authentication</CardTitle> </CardHeader> <CardContent className="space-y-4"> <Button id="enroll-btn" variant="outline" className="w-full"> Enroll New Employee </Button> <Button id="auth-btn" variant="default" className="w-full"> Authenticate </Button> </CardContent> </Card> ); }; export default FaceAuth;
Jetzt erstellen wir das Dashboard, das unsere Mitarbeiter sehen werden. Erstellen Sie app/components/EmployeeDashboard.tsx:
import { useState } from 'react'; import { Card, CardHeader, CardTitle, CardContent } from '@shadcn/ui'; import { Button, Avatar, Badge, Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from '@shadcn/ui'; import FaceAuth from './FaceAuth'; interface EmployeeData { name: string; position: string; department: string; photoUrl: string; } const EmployeeDashboard: React.FC = () => { const [isAuthenticated, setIsAuthenticated] = useState(false); const [employeeData, setEmployeeData] = useState<EmployeeData | null>(null); const handleSuccessfulAuth = (data: EmployeeData) => { setIsAuthenticated(true); setEmployeeData(data); }; const mockAttendanceData = [ { date: '2024-07-14', timeIn: '09:00 AM', timeOut: '05:30 PM' }, { date: '2024-07-13', timeIn: '08:55 AM', timeOut: '05:25 PM' }, { date: '2024-07-12', timeIn: '09:05 AM', timeOut: '05:35 PM' }, ]; return ( <div className="space-y-6"> {!isAuthenticated ? ( <FaceAuth onSuccessfulAuth={handleSuccessfulAuth} /> ) : ( <> <Card> <CardHeader> <CardTitle>Employee Profile</CardTitle> </CardHeader> <CardContent className="flex items-center space-x-4"> <Avatar className="h-20 w-20" src={employeeData?.photoUrl} alt={employeeData?.name} /> <div> <h2 className="text-2xl font-bold">{employeeData?.name}</h2> <p className="text-gray-500">{employeeData?.position}</p> <Badge variant="outline">{employeeData?.department}</Badge> </div> </CardContent> </Card> <Card> <CardHeader> <CardTitle>Quick Actions</CardTitle> </CardHeader> <CardContent className="space-y-4"> <Button className="w-full">Check-in</Button> <Button className="w-full" variant="secondary">Request Leave</Button> </CardContent> </Card> <Card> <CardHeader> <CardTitle>Attendance Records</CardTitle> </CardHeader> <CardContent> <Table> <TableHeader> <TableRow> <TableHead>Date</TableHead> <TableHead>Time In</TableHead> <TableHead>Time Out</TableHead> </TableRow> </TableHeader> <TableBody> {mockAttendanceData.map((record, index) => ( <TableRow key={index}> <TableCell>{record.date}</TableCell> <TableCell>{record.timeIn}</TableCell> <TableCell>{record.timeOut}</TableCell> </TableRow> ))} </TableBody> </Table> </CardContent> </Card> </> )} </div> ); }; export default EmployeeDashboard;
Lasst uns abschließend unsere Hauptseite aktualisieren, um unsere harte Arbeit zu präsentieren. App/page.tsx aktualisieren:
import EmployeeDashboard from './components/EmployeeDashboard'; export default function Home() { return ( <main className="flex min-h-screen flex-col items-center justify-center p-4"> <EmployeeDashboard /> </main> ); }
Jetzt richten wir das Layout ein, das unsere gesamte App umschließt. Fügen Sie diesen Code hinzu: app/layout.tsx
import './globals.css' import type { Metadata } from 'next' import { Inter } from 'next/font/google' const inter = Inter({ subsets: ['latin'] }) export const metadata: Metadata = { title: 'Employee Dashboard with Facial Authentication', description: 'A cutting-edge employee dashboard featuring facial recognition for secure authentication and efficient workplace management.', } export default function RootLayout({ children, }: { children: React.ReactNode }) { return ( <html lang="en"> <body className={inter.className}> <header className="bg-primary text-white p-4"> <h1 className="text-2xl font-bold">Faceio Solutions</h1> </header> <main className="container mx-auto p-4"> {children} </main> <footer className="bg-gray-100 text-center p-4 mt-8"> <p>© 2024 Faceio . All rights reserved.</p> </footer> </body> </html> ) }
Dieses Layout ist wie der Rahmen eines Hauses – es bietet Struktur für Ihre gesamte App. Es enthält eine Kopfzeile mit Ihrem Firmennamen, einen Hauptinhaltsbereich, in dem Ihr Dashboard angezeigt wird, und eine Fußzeile. Außerdem sorgt es mit Metadaten für etwas SEO-Magie!
Weitere Informationen finden Sie unter FACEIO Best Practices.
Schwache PINs ablehnen
Doppelte Anmeldungen verhindern
Schutz vor Deep-Fakes
Minderjährige Einschreibungen verbieten
PIN zur Authentifizierung erforderlich
Eindeutige PINs erzwingen
Verdeckte Gesichter ignorieren
Fehlende Header ablehnen
Instanziierung einschränken
Webhooks aktivieren
Weitere Informationen finden Sie unter FACEIO Security Best Practices.
Nachdem wir dieses tolle Dashboard erstellt haben, fragen Sie sich vielleicht: „Wo kann ich es in der realen Welt verwenden?“ Nun, lassen Sie mich Ihnen sagen, die Möglichkeiten sind endlos! Hier nur ein paar Ideen:
Büromanagement: Verabschieden Sie sich von Lochkarten der alten Schule! Dieses System kann die Art und Weise revolutionieren, wie Sie die Anwesenheit verfolgen, den Zugang zu verschiedenen Bereichen Ihres Büros kontrollieren und Mitarbeiterinformationen verwalten.
Sicherheitssysteme: Stellen Sie sich eine Welt vor, in der Ihr Büro Fort Knox ist, aber ohne Hektik. Dieses Gesichtserkennungssystem kann der Grundstein für ein robustes Sicherheitsprotokoll sein.
Kundendienstkioske: Stellen Sie sich Folgendes vor: Ein Kunde geht zu einem Kiosk, er erkennt ihn sofort und bietet personalisierten Service. Es ist keine Science-Fiction mehr!
Herzlichen Glückwunsch, Tech-Zauberer! Sie haben gerade ein hochmodernes Mitarbeiter-Dashboard mit Gesichtsauthentifizierung erstellt. Aber warum hier aufhören? Das Schöne an diesem System ist seine Flexibilität. Hier sind einige Ideen, um es auf die nächste Stufe zu bringen:
Denken Sie daran, dass in der Welt der Technik die einzige Grenze Ihre Vorstellungskraft ist (und vielleicht auch Ihre Koffeinaufnahme).
Also, was denkst du? Sind Sie bereit, Ihren Arbeitsplatz in die Zukunft zu bringen? Probieren Sie dieses Projekt aus und lassen Sie mich wissen, wie es läuft. Ich würde gerne von Ihren Erfahrungen hören, von den coolen Funktionen, die Sie hinzufügen, oder von den Herausforderungen, denen Sie auf dem Weg begegnen.
Viel Spaß beim Programmieren und möge Ihre Gesichtserkennung Sie nie mit Ihrer Büropflanze verwechseln!
Das obige ist der detaillierte Inhalt vonErstellen eines sicheren Mitarbeiter-Dashboards mit Gesichtsauthentifizierung: Ein umfassendes Next.js-Tutorial. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!