AI-Solutions — Website System (CET333 Product Development)
A multi-page website for AI-Solutions Ltd, a fictional Sunderland start-up that uses AI to improve the digital employee experience. The public site markets the company's services, past projects, feedback, events and gallery, and lets visitors submit an enquiry through a Contact Us form. A password-protected admin area lets staff review those enquiries.
- Frontend: React (Create React App) + React Router
- Backend: Node.js + Express (REST API)
- Database: PostgreSQL
- AI chatbot: Google Gemini (free tier), proxied through the backend
Features
Public website
- Home — mission, value proposition and featured services/feedback
- Services — the software solutions offered
- Past Solutions — case studies of completed industry projects
- Customer Feedback — testimonials with star ratings
- Photo Gallery — past & upcoming event photos with a lightbox
- Events — upcoming events (plus a past-events archive)
- Contact Us — 7-field enquiry form (Full Name, Email, Phone, Company, Country, Job Title, Job Details). No customer account required. Validated on both client and server and protected by Cloudflare Turnstile.
- AI chatbot ("Ava") — a floating widget on every page. Messages are sent to the backend Gemini proxy (the API key never reaches the browser) and the bot gracefully offers a human hand-off when a query should be escalated.
Admin area (password-protected)
- Sign in with the existing secure flow: email + password + Turnstile, then a 6-digit email OTP.
- A back-office dashboard whose sole job is to review Contact Us enquiries: headline stats, a searchable / filterable / paginated table, and a full-detail view of any single enquiry (mark read/unread, reply by email, delete).
- Only the admin role exists — there is no public sign-up and no role-management UI.
The authentication/security backend (JWT sessions, OTP, Turnstile, hashing, CSRF, rate limiting, Helmet, account lockout, audit logs) is reused as-is. The front end integrates with it; it does not reimplement or weaken any of it.
Project structure
src/
components/ Shared UI: Navbar, Footer, Field, Modal, StarRating, Chatbot, Turnstile, States…
pages/ Public pages (Home, Services, PastSolutions, Feedback, Gallery, Events, Contact)
pages/admin/ AdminLogin (login + OTP), AdminLayout, AdminDashboard (enquiries)
lib/ useFetch data hook
index.css Design system (DESIGN.md tokens + components)
api.js fetch wrapper (CSRF + token refresh) + JSON helpers
backend/
controllers/ auth, admin (inquiries), contact, publicContent, chat (Gemini proxy)
routes/ authRoutes, adminRoutes, publicRoutes
middleware/ authMiddleware, validate
utils/ hash, otp, email, logger, validator, turnstile
server.js Express app (Helmet, CORS, CSRF, rate limit)
seed.js Creates the admin + sample public content
database/
schema.sql Tables: users(admin), sessions, password_history, logs,
inquiries, solutions, case_studies, feedback, articles, events, gallery_images
Setup & run locally
1. Configure environment
Copy .env.example to .env and fill in the values (DB credentials, JWT secret, Turnstile keys,
email/OTP credentials). To enable the AI chatbot, add a free Gemini key from
https://aistudio.google.com/app/apikey:
GEMINI_API_KEY=your_key_here
GEMINI_MODEL=gemini-2.0-flash
If GEMINI_API_KEY is left blank, the site still runs — the chatbot replies with a friendly
"offline" message and points visitors to the Contact page.
2. Install dependencies
npm install # frontend (repo root)
cd backend && npm install
3. Create the database
# create the database once (psql), then load the schema:
psql -U postgres -d auth_db -f database/schema.sql
# seed the admin account + sample website content:
cd backend && node seed.js
The seed prints the default admin credentials:
Admin login: admin@ai-solutions.com
Password: Admin@2026!
(Change this after the first login. You can override via SEED_ADMIN_EMAIL / SEED_ADMIN_PASSWORD.)
4. Start the apps
cd backend && npm run dev # API → http://localhost:5000
npm start # site → http://localhost:3000 (run from repo root)
The public site is at /; the admin portal is at /admin.
Notes
- The Contact form and admin login both require a valid Cloudflare Turnstile challenge, which only completes in a real browser — automated/curl submissions are intentionally rejected server-side.
- OTP codes are emailed; in development they are also logged to the backend console.