Full-Stack Web Development
Homestay Booking System
A homestay booking platform with availability conflict detection, customer booking lookup, and a secure role-based admin portal for managing bookings and administrator accounts.
Project Overview & Context
- The Problem: Traditional homestay management relies heavily on spreadsheets or manual bookkeeping, inviting human error, unorganized scheduling conflicts, and missing audit logs.
- The Solution: A clean, data-driven web environment built specifically to model, manage, and process vacation rental agreements and client stay histories.
Key Features & User Flow
- Booking Lifecycle Engine: Granular state machine managing stay records natively through strict status tracking (Pending, Approved, Cancelled).
- Secure Administration Space: Dedicated, isolated admin area to create, audit, modify, and purge booking records.
- Deterministic Code Generation: An automatic string generator engine that outputs clean, unique alphanumeric reservation codes upon reservation checkout.
- Dynamic Data Filtering: Built-in viewing filters allowing administrators to isolate specific client history files by status, date, or user identifiers.
Technical Architecture & Tech Stack
- Framework: Built on ASP.NET Core using Razor Pages architecture, enabling server-rendered pages with built-in validation attributes for rapid web application development.
- Database & ORM: SQLite paired with Entity Framework Core (EF Core) for robust schema migrations and object-relational mapping.
- Identity Controls: Deployed safe ASP.NET Core Identity integrations to implement explicit user validation boundaries.
Engineering Challenges & Solutions
Dynamic State Validation & Multi-Source Storage Swap
- Situation: Hardcoding direct database engines into Razor endpoints breaks structural testing patterns and makes it impossible to switch database backends without massive downstream refactoring.
- Task: Build a modular, decoupled data layer capable of switching between local JSON mock objects and a live database with zero breaking changes to business logic.
- Action:
- Introduced an abstract dependency contract layer (
IBookingRepository) that standardizes all write and query interfaces. - Engineered a local file backup repository fallback (
JsonBookingRepository) utilizing atomic disk writes alongside the primary database layer.
- Introduced an abstract dependency contract layer (
- Result: Achieved complete storage separation, making the infrastructure highly testable and capable of switching database providers seamlessly.
Gambaran Keseluruhan & Konteks Projek
- Masalah: Pengurusan inap desa tradisional sangat bergantung pada hamparan data atau pembukuan manual, yang terdedah kepada kesilapan manusia, konflik jadual yang tidak teratur, dan kehilangan log audit.
- Penyelesaian: Persekitaran web berasaskan data yang bersih, dibina khas untuk memodelkan, mengurus, dan memproses perjanjian sewaan percutian serta sejarah penginapan pelanggan.
Ciri-Ciri Teras & Aliran Pengguna
- Enjin Kitaran Hayat Tempahan: Enjin keadaan terperinci yang menguruskan rekod penginapan secara terbina melalui penjejakan status yang ketat (Menunggu, Diluluskan, Dibatalkan).
- Ruang Pentadbiran Selamat: Kawasan pentadbir terasing khas untuk membina, mengaudit, mengemas kini, dan memadam rekod tempahan.
- Penjana Kod Deterministik: Enjin penjana rentetan automatik yang mengeluarkan kod tempahan abjad angka yang unik semasa pendaftaran tempahan.
- Penapisan Data Dinamik: Penapis pandangan terbina yang membolehkan pentadbir mengasingkan rekod sejarah pelanggan mengikut status, tarikh, atau pengecam pengguna.
Seni Bina Teknikal & Stack Teknologi
- Rangka Kerja: Dibina di atas ASP.NET Core menggunakan seni bina Razor Pages, membolehkan halaman diisi dari pelayan dengan atribut pengesahan terbina untuk pembangunan aplikasi web yang pantas.
- Pangkalan Data & ORM: SQLite dipasangkan dengan Entity Framework Core (EF Core) untuk migrasi skema yang teguh dan pemetaan objek-hubungan (ORM).
- Kawalan Identiti: Mengintegrasikan ASP.NET Core Identity yang selamat untuk melaksanakan sempadan pengesahan pengguna yang jelas.
Cabaran Kejuruteraan & Penyelesaian
Pengesahan Keadaan Dinamik & Pertukaran Penstoran Pelbagai Sumber
- Situasi: Mengekod terus enjin pangkalan data ke dalam titik akhir Razor merosakkan corak ujian berstruktur dan menyukarkan pertukaran pangkalan data tanpa penyusunan semula kod yang besar.
- Tugasan: Membina lapisan data berasingan yang mampu bertukar antara objek ujian JSON setempat dan pangkalan data hidup tanpa sebarang perubahan pada logik perniagaan.
- Tindakan:
- Memperkenalkan lapisan kontrak kebergantungan abstrak (
IBookingRepository) yang menyelaraskan semua antara muka penulisan dan pertanyaan data. - Merangka repositori sandaran fail setempat (
JsonBookingRepository) yang memanfaatkan penulisan cakera atom di samping lapisan pangkalan data utama.
- Memperkenalkan lapisan kontrak kebergantungan abstrak (
- Hasil: Mencapai pengasingan penstoran sepenuhnya, menjadikan infrastruktur sangat mudah diuji dan mampu bertukar penyedia pangkalan data secara lancar.