Full-stack project for the Software Development II course @ FIT. Includes a Flutter mobile app, a desktop admin app, and a .NET backend with RabbitMQ for messaging and Stripe for payments.
- Project Overview
- Tech Stack
- Features
- Getting Started
- Credentials
- Notes & Behaviors
- Payments (Stripe Test)
- Messaging (RabbitMQ)
- Movie Recommendation System
- UI Flows (Screenshots)
eCinema is a platform designed for users to browse movies, reserve tickets, and leave reviews. Staff and administrators use it to manage content and operations. It features authentication, role-based access, payments, messaging, and a movie recommendation system.
- Mobile: Flutter (Dart)
- Desktop: .NET (Windows)
- Backend: .NET, Docker, SQL Server, EF Core, RabbitMQ
- Recommender: ML.NET (content-based, cosine similarity)
- Payments: Stripe (test mode)
- Browse and search for movies and screenings
- Reserve and purchase tickets for screenings
- Leave reviews for watched movies
- View past reservations
- Manage user profile
- Get random movie suggestions
- Get personalized movie recommendations on the home screen
- Scan QR codes to mark tickets as used
- Full CRUD operations for movies, genres, halls, users, roles, and other entities
- Create and manage staff accounts
- Manage screenings and promotions
- View and download reports
- Supports dark and light themes
- Includes localization for Bosnian and English
- Docker and Docker Compose
- Android Emulator (or device) for the mobile app
- Windows environment for the desktop app
- Ensure Docker and Docker Compose are installed.
- Open a terminal in
rs2/eCinema. - Start services (backend API, SQL Server database, and RabbitMQ):
docker-compose up --build
- Wait until the backend and dependencies are healthy. The database will be automatically migrated on startup.
- Extract the archive:
fit-build-2025-09-28-desktop.zip. - Open the
Releasefolder. - Run
ecinema_desktop.exe. - Log in with the admin credentials listed below.
- Uninstall any existing eCinema app from your Android emulator/device.
- Extract the archive:
fit-build-2025-10-08-mobile.zip. - Locate the APK in
flutter-apk/. - Drag the APK onto the emulator to install (or use
adb install <apk>). - Log in with a test user (see Credentials).
- username: admin
- password: stringst
- User 1
- username: user1
- password: stringst
- User 2
- username: user2
- password: stringst
- Staff
- username: staff
- password: stringst
- Staff Registration
- Staff users cannot self-register. An administrator creates staff accounts using the desktop app; the staff user then receives an email with login credentials.
- Navigation & Back Behavior
- The global Back button is context-aware: primary screens (Dashboard, Movies, Screenings, etc.) use navigation, while detail/forms support step-back behavior.
- Reviews
- Users can only review movies they have actually watched. A QR code tied to their reservation must be scanned to mark the ticket as used. After watching, the app shows a bottom sheet prompting a review only if the reservation is marked as used.
- Screenings List Default Filter
- The “From” date filter defaults to the current date, showing screenings today and in the future. Past dates are excluded.
For testing Stripe payments:
- Card number: 4242 4242 4242 4242
- Expiry date: any future date
- CVC: any 3 digits
- ZIP: any 5 digits
RabbitMQ is used to send emails:
- During mobile user registration (welcome message).
- When an admin creates a new staff user (username + temporary password are emailed).
The backend includes a movie recommendation system implemented using ML.NET, specifically within the RecommenderService.cs. This system provides personalized movie suggestions to users based on their interaction history.
Here's how it works:
- For new users (no prior reviews): The system recommends top-rated movies that are not marked as 'Coming Soon' or 'Deleted'.
- For existing users (with reviews): The system builds a profile based on movies the user has already reviewed. It then uses a content-based recommendation approach, calculating cosine similarity between the user's profile (based on text features like title, description, director, genres, and actors of rated movies) and candidate movies. Movies with higher similarity scores are recommended.
Below are some guided flows showcasing the UI