A comprehensive web-based platform for managing tutoring services at Ho Chi Minh City University of Technology (HCMUT)
Live Demo: https://app.10diemse251.online
- System Overview
- Key Features
- Architecture
- Technology Stack
- Getting Started
- Production Deployment
- Mock Users
- API Documentation
- Project Structure
- Contributing
- License
HCMUT-TSS is a full-stack web application designed to streamline the tutoring and academic support services at HCMUT. The system facilitates connections between students and tutors, manages tutoring sessions, handles course materials, and provides comprehensive evaluation and feedback mechanisms.
- Student-Tutor Matching: Enable students to discover and enroll in tutoring courses offered by university staff
- Session Management: Allow tutors to schedule, reschedule, and manage tutoring sessions
- Material Distribution: Provide a centralized platform for uploading, organizing, and accessing course materials
- Feedback System: Collect student feedback and facilitate tutor performance evaluation
- Administrative Control: Enable administrators to oversee system operations, manage catalogs, and monitor activities
- Students: Undergraduate and graduate students seeking academic support
- Tutors: University professors, lecturers, and teaching assistants offering tutoring services
- Administrators: Academic advisors and department staff managing the tutoring program
- Cooperators: Department secretaries assisting with administrative tasks
- π Single Sign-On (SSO): Seamless authentication using HCMUT credentials
- π Course Discovery: Browse available tutoring courses filtered by subject, department, and tutor
- π Course Enrollment: Register for tutoring classes with real-time capacity tracking
- π Session Booking: View and join scheduled tutoring sessions with conflict detection
- π Material Access: Download course materials, lecture notes, and reference documents
- β Feedback Submission: Rate sessions and provide constructive feedback to tutors
- π Progress Tracking: Monitor enrolled courses and attended sessions
- π Course Creation: Create and manage tutoring courses with prerequisites and descriptions
- β° Session Scheduling: Schedule sessions with date, time, topic, and capacity limits
- π€ Material Upload: Upload course materials (PDFs, documents) up to 50MB per file
- π Library Integration: Add references to university library resources
- π₯ Student Management: View enrolled students and session participants
- π Performance Analytics: Access feedback and evaluation reports
- π Session Rescheduling: Modify or cancel sessions with automatic student notifications
- π€ User Management: Manage user accounts, roles, and permissions
- π« Catalog Administration: Maintain course catalogs, departments, and majors (via DATACORE)
- π System Monitoring: Track system usage, enrollment statistics, and session activities
- π Evaluation Tools: Generate reports on tutor performance and student satisfaction
- π‘οΈ Access Control: Configure role-based permissions and security policies
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Internet Users β
ββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββ
β
βΌ
ββββββββββββββββββββββββββ
β DNS: 10diemse251.onlineβ
β ββ A β 103.20.96.46 β
β ββ CNAME app β Vercel β
ββββββββββββββ¬βββββββββββββ
β
βββββββββββββββββββ΄ββββββββββββββββββ
β β
βΌ βΌ
ββββββββββββββββββββ ββββββββββββββββββββ
β Vercel CDN β β VPS Backend β
β (Frontend SPA) ββββββHTTPSβββββ€ 103.20.96.46 β
β β API Calls β β
β React + Vite β β Docker Stack β
β Tailwind CSS β β Nginx + SSL β
ββββββββββββββββββββ ββββββββββ¬ββββββββββ
β
ββββββββββββββββββββββΌβββββββββββββββββ
β β β
βΌ βΌ βΌ
ββββββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
β Nginx Reverse β β Backend β β Databases β
β Proxy β β Services β β β
β Port: 80/443 β β β β MySQL 8.1 β
β β β β’ TSS β β Redis 7 β
β β’ SSL/TLS β β β’ SSO β β β
β β’ Routing β β β’ Datacore β β Persistent β
β β’ Load Balance β β β’ Library β β Volumes β
ββββββββββββββββββββ ββββββββββββββββ ββββββββββββββββ
- Frontend SPA: React 18 single-page application hosted on Vercel CDN
- Global Edge Network: Content delivered from 100+ locations worldwide
- Custom Domain:
app.10diemse251.onlinewith HTTPS
- TSS Backend (Port 10001): Main Spring Boot application with business logic
- SSO Server (Port 10003): OAuth2 Authorization Server for authentication
- Datacore Service (Port 10005): Academic data provider (departments, courses, users)
- Library Service (Port 10006): Digital library and material management
- MySQL 8.1: Relational database for persistent data
- Redis 7: In-memory cache for session storage and performance optimization
- Docker Volumes: Persistent storage for uploads and library files
- Nginx: Reverse proxy with SSL/TLS termination
- Let's Encrypt: Free SSL certificates with auto-renewal
- Docker Compose: Container orchestration for microservices
- UFW Firewall: VPS security with minimal port exposure
- Framework: React 18.3.1 with TypeScript 5.8
- Build Tool: Vite 5.4.21 (fast builds, hot module replacement)
- UI Library: shadcn/ui + Radix UI Primitives
- Styling: Tailwind CSS 3.4.17 with custom design system
- State Management: Context API (AuthContext, ThemeContext)
- Routing: React Router DOM 6.30.1
- HTTP Client: Axios 1.13.1 with interceptors
- Form Management: React Hook Form 7.61.1 + Zod 3.25.76 validation
- Data Fetching: TanStack Query 5.83.0 (formerly React Query)
- Icons: Lucide React 0.462.0
- Charts: Recharts 2.15.4
- Hosting: Vercel (Edge Network, Global CDN)
- Framework: Spring Boot 3.5.7
- Language: Java 17 (Eclipse Temurin OpenJDK)
- Build Tool: Maven with Maven Wrapper
- Security: Spring Security 6.5.6 + OAuth2 Client
- Session: Spring Session with Redis
- ORM: Hibernate (via Spring Data JPA)
- Migrations: Flyway Database Migrations
- Validation: Jakarta Bean Validation
- Object Mapping: MapStruct 1.6.2
- API Docs: Springdoc-OpenAPI
- Reverse Proxy: Nginx Alpine (SSL termination, routing)
- Hosting: VPS (1GB RAM, Ubuntu, 103.20.96.46)
- RDBMS: MySQL 8.1 (Docker container)
- Cache: Redis 7-alpine (session store + caching)
- Connection Pool: HikariCP (default in Spring Boot)
- Containerization: Docker Compose 1.29.2
- Domain: 10diemse251.online (custom domain)
- SSL/TLS: Let's Encrypt with Certbot auto-renewal
- CI/CD: Vercel (Frontend automated), Manual VPS deployment (Backend)
- Version Control: Git + GitHub
- Monitoring: Docker logs, Spring Boot Actuator
- Firewall: UFW (Uncomplicated Firewall)
- SSO: HCMUT-SSO-MIMIC (OAuth 2.0 Authorization Server)
- Datacore: HCMUT-DATACORE-MIMIC (Academic data REST API)
- Library: HCMUT-LIBRARY-MIMIC (Digital library REST API)
Required Software:
- Node.js: v18.x or higher (Download)
- Java: JDK 17 (Download)
- Docker Desktop: For running databases (Download)
- Git: For cloning repository (Download)
Optional:
- Maven: (Maven Wrapper included in project)
- VS Code: Recommended IDE with extensions
- Java Extension Pack
- Spring Boot Extension Pack
- ESLint
- Prettier
git clone https://github.com/MinhTrinhh/LA_SE_SEM251.git
cd LA_SE_SEM251# Start Docker containers
docker-compose up -d
# Verify containers are running
docker psYou should see:
hcmut-tss-mysql-db(port 3306)hcmut-tss-redis(port 6379)
Terminal 1 - SSO Server (Port 10003)
cd HCMUT-SSO-MIMIC
./mvnw spring-boot:runTerminal 2 - Datacore Server (Port 10005)
cd HCMUT-DATACORE-MIMIC
./mvnw spring-boot:runTerminal 3 - Library Server (Port 10006)
cd HCMUT-LIBRARY-MIMIC
./mvnw spring-boot:runTerminal 4 - TSS Backend (Port 10001)
cd HCMUT-TSS-Backend
./mvnw spring-boot:runWait for all services to show "Started Application in X seconds" message.
Terminal 5 - React Frontend
cd HCMUT-TSS-Frontend
npm install # First time only
npm run devOpen your browser and navigate to:
- Frontend: http://localhost:10004
- Backend API: http://localhost:10001
- SSO Login: http://localhost:10003
For Windows users, we provide automation scripts:
# Interactive development menu
.\scripts\dev-menu.ps1
# Or start all services at once
.\scripts\start-all.ps1
# Check service status
.\scripts\check-status.ps1
# Stop all services
.\scripts\stop-all.ps1See scripts/README.md for detailed documentation.
- Open project in VS Code
- Press
Ctrl+Shift+PβTasks: Run Task - Select
Start All Services
This creates 5 integrated terminals inside VS Code.
The system is currently deployed in production:
- Frontend: https://app.10diemse251.online
- Backend API: https://10diemse251.online/api/
- SSO: https://10diemse251.online/oauth2/authorization/sso-server
- Frontend Hosting: Vercel Edge Network (Global CDN)
- Backend Hosting: VPS (103.20.96.46, Ubuntu, Docker)
- Domain: 10diemse251.online (custom domain)
- SSL/TLS: Let's Encrypt (auto-renewal)
- Reverse Proxy: Nginx Alpine
Frontend (Vercel)
βββ Automatic deployments from GitHub main branch
βββ Preview deployments for pull requests
βββ Global CDN (100+ edge locations)
βββ Custom domain: app.10diemse251.online
Backend (VPS)
βββ Docker Compose orchestration
βββ 7 containers: nginx, tss-backend, sso, datacore, library, mysql, redis
βββ Nginx reverse proxy with SSL termination
βββ Let's Encrypt SSL certificates
βββ Manual deployment via git pull + docker rebuild
| Service | Port | Protocol | Access |
|---|---|---|---|
| Nginx | 80, 443 | HTTP/HTTPS | Public |
| TSS Backend | 10001 | HTTP | Via Nginx |
| SSO Server | 10003 | HTTP | Via Nginx |
| Datacore | 10005 | HTTP | Internal |
| Library | 10006 | HTTP | Internal |
| MySQL | 3306 | TCP | Internal |
| Redis | 6379 | TCP | Internal |
For detailed deployment documentation, see PRODUCTION_DEPLOYMENT_REPORT.md.
The system includes pre-configured test accounts for development and demonstration:
- Email: Any of the users listed below
- Password:
pass(for all accounts)
| ID | Name | Program | Department | |
|---|---|---|---|---|
| an.nguyen@hcmut.edu.vn | 2110001 | An Van Nguyen | Computer Science (UG) | CSE |
| binh.le@hcmut.edu.vn | 2110002 | Binh Minh Le | Chemical Engineering (UG) | CHE |
| chi.tran@hcmut.edu.vn | 2010003 | Chi Thi Tran | Data Science (Grad) | CSE |
| dung.pham@hcmut.edu.vn | 2210004 | Dung Huu Pham | Civil Engineering (UG) | FME |
| giang.vo@hcmut.edu.vn | 1910005 | Giang Thanh Vo | Telecommunications (Grad) | CHE |
| ID | Name | Position | Department | System Role | |
|---|---|---|---|---|---|
| thanh.nguyen@hcmut.edu.vn | 5001 | Thanh Cong Nguyen | Professor | CSE | TUTOR |
| hang.vu@hcmut.edu.vn | 5002 | Hang Thu Vu | Dept. Secretary | CSE | COOPERATOR |
| long.dinh@hcmut.edu.vn | 5003 | Long Bao Dinh | Lecturer | CHE | TUTOR |
| phuong.mai@hcmut.edu.vn | 5004 | Phuong Anh Mai | Researcher | FME | TUTOR |
| tuan.ly@hcmut.edu.vn | 5005 | Tuan Anh Ly | Academic Advisor | FME | ADMINISTRATOR |
- CSE: Computer Science & Engineering
- CHE: Chemical Engineering
- FME: Faculty of Mechanical Engineering (Civil Engineering)
For service-to-service communication (development only):
DATACORE_API_KEY=YourVeryStrongAndSecretKeyHere12345
The system uses OAuth2 Authorization Code flow for secure authentication:
1. User clicks "Login" β Redirects to SSO Server
2. User enters credentials β SSO validates
3. SSO redirects back with authorization code
4. Backend exchanges code for access token
5. Session created (stored in Redis)
6. User authenticated with SESSION cookie
GET /auth/me - Get current user info
POST /auth/logout - Logout and clear session
GET /oauth2/authorization/sso-server - Initiate SSO login
GET /api/courses - List all courses
POST /api/courses - Create new course (Tutor)
GET /api/courses/{id} - Get course details
PATCH /api/courses/{id} - Update course (Tutor)
DELETE /api/courses/{id} - Delete course (Tutor)
GET /api/course-registrations/me - Get my enrollments
POST /api/course-registrations/enroll - Enroll in course
DELETE /api/course-registrations/{id} - Unenroll from course
GET /api/sessions - List all sessions
POST /api/sessions - Create session (Tutor)
GET /api/sessions/{id} - Get session details
PATCH /api/sessions/{id} - Update session (Tutor)
DELETE /api/sessions/{id} - Cancel session (Tutor)
GET /api/sessions/class/{classId} - Get sessions by class
GET /api/session-enrollments/user/{userId} - Get user's sessions
POST /api/session-enrollments/join - Join session
DELETE /api/session-enrollments/{sessionId}/leave - Leave session
GET /api/courses/{courseId}/materials - List materials
POST /api/courses/{courseId}/materials/upload - Upload file (Tutor)
POST /api/courses/{courseId}/materials/add-library-ref - Add library reference
DELETE /api/materials/{id} - Delete material (Tutor)
GET /api/materials/{id}/download - Download material
GET /api/feedback - List feedback (Admin)
POST /api/feedback - Submit feedback (Student)
GET /api/feedback/session/{sessionId} - Get session feedback
GET /api/evaluation/tutor/{tutorId} - Get tutor evaluation
POST /api/evaluation - Submit evaluation (Admin)
# DATACORE (Internal)
GET /datacore/users/{id} - Get user info
GET /datacore/courses - Get course catalog
GET /datacore/departments - Get departments
# LIBRARY (Internal)
GET /api/library/items - Search library items
GET /api/library/items/{id} - Get library item
GET /api/library/items/{id}/download - Download library file
For interactive API documentation (when running locally):
- Swagger UI: http://localhost:10001/swagger-ui.html
LA_SE_SEM251/
β
βββ HCMUT-TSS-Frontend/ # React Frontend (Port 10004)
β βββ src/
β β βββ components/ # Reusable UI components
β β βββ pages/ # Page components (routes)
β β βββ contexts/ # React Context providers
β β βββ hooks/ # Custom React hooks
β β βββ lib/ # Utility functions
β β βββ types/ # TypeScript type definitions
β βββ public/ # Static assets
β βββ package.json # NPM dependencies
β βββ vite.config.ts # Vite configuration
β βββ tailwind.config.ts # Tailwind CSS config
β βββ tsconfig.json # TypeScript config
β
βββ HCMUT-TSS-Backend/ # Main Backend (Port 10001)
β βββ src/main/
β β βββ java/org/minhtrinh/hcmuttssbackend/
β β β βββ config/ # Spring configurations
β β β βββ controller/ # REST API controllers
β β β βββ service/ # Business logic
β β β βββ repository/ # Database repositories
β β β βββ entity/ # JPA entities
β β β βββ dto/ # Data Transfer Objects
β β β βββ mapper/ # MapStruct mappers
β β β βββ exception/ # Custom exceptions
β β βββ resources/
β β βββ application.properties # Base config
β β βββ application-prod.properties # Production config
β β βββ db/migration/ # Flyway SQL scripts
β βββ uploads/materials/ # User-uploaded files
β βββ pom.xml # Maven dependencies
β βββ Dockerfile # Docker image definition
β
βββ HCMUT-SSO-MIMIC/ # SSO Server (Port 10003)
β βββ src/main/
β β βββ java/ # OAuth2 Authorization Server
β β βββ resources/
β β βββ users.json # Mock user database
β β βββ application.properties
β βββ pom.xml
β
βββ HCMUT-DATACORE-MIMIC/ # Datacore Service (Port 10005)
β βββ src/main/
β β βββ java/
β β β βββ service/DatacoreService.java # Hardcoded data
β β βββ resources/
β βββ pom.xml
β
βββ HCMUT-LIBRARY-MIMIC/ # Library Service (Port 10006)
β βββ src/main/
β β βββ java/ # Library REST API
β β βββ resources/
β βββ storage/ # Library file storage
β βββ pom.xml
β
βββ scripts/ # Development automation (Windows)
β βββ dev-menu.ps1 # Interactive menu
β βββ start-all.ps1 # Start all services
β βββ stop-all.ps1 # Stop all services
β βββ check-status.ps1 # Health checks
β βββ README.md
β
βββ docs/ # Documentation
β βββ PRODUCTION_DEPLOYMENT_REPORT.md
β βββ DEPLOYMENT_GUIDE.md
β βββ CLASS_DIAGRAM_REPORT.md
β βββ ...
β
βββ docker-compose.yaml # Development containers (MySQL + Redis)
βββ docker-compose.prod.yaml # Production deployment config
βββ nginx.conf # Nginx reverse proxy config
βββ README.md # This file
- Fork the repository and create a new branch
git checkout -b feature/your-feature-name-
Make your changes following our coding standards:
- Frontend: ESLint + Prettier configuration
- Backend: Spring Boot best practices, Java code conventions
-
Test your changes thoroughly:
- Run all services locally
- Test OAuth2 flow end-to-end
- Verify database migrations (Flyway)
- Check CORS and API integration
-
Commit with descriptive messages:
git commit -m "Feature: Add session conflict detection"- Push and create Pull Request:
git push origin feature/your-feature-nameFrontend (TypeScript + React)
- Use functional components with hooks
- Implement proper TypeScript types (no
any) - Follow component composition patterns
- Use React Hook Form for forms
- Apply Tailwind CSS utility classes
Backend (Java + Spring Boot)
- Follow MVC architecture: Controller β Service β Repository
- Use DTOs for API requests/responses
- Implement MapStruct for object mapping
- Write Flyway migrations for schema changes
- Apply proper exception handling
When adding new tables or modifying schema:
- Create Flyway migration script:
-- src/main/resources/db/migration/V3__add_notifications_table.sql
CREATE TABLE notifications (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
user_id BIGINT NOT NULL,
message TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);- Create JPA Entity:
@Entity
@Table(name = "notifications")
public class Notification {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
private String message;
private LocalDateTime createdAt;
}- Restart backend - Flyway runs migrations automatically
This project is licensed under the MIT License - see the LICENSE file for details.
- Repository: github.com/MinhTrinhh/LA_SE_SEM251
- Issues: GitHub Issues
- Documentation: docs/
- HCMUT: Ho Chi Minh City University of Technology
- Spring Boot Team: For the excellent backend framework
- Vercel: For free frontend hosting and CDN
- Let's Encrypt: For free SSL certificates
- shadcn/ui: For beautiful, accessible UI components
Frontend
- React 18.3 + TypeScript 5.8 + Vite 5.4
- shadcn/ui + Tailwind CSS 3.4
- React Router 6.30 + TanStack Query 5.83
- Axios 1.13 + React Hook Form 7.61
- Hosting: Vercel Edge Network
Backend
- Spring Boot 3.5.7 + Java 17
- Spring Security 6.5 + OAuth2 Client
- Spring Session + Redis
- MapStruct 1.6 + Flyway Migrations
- Hosting: VPS (Docker Compose)
Infrastructure
- MySQL 8.1 + Redis 7
- Nginx Alpine (Reverse Proxy)
- Docker Compose 1.29
- Let's Encrypt SSL
- Domain: 10diemse251.online
DevOps
- Vercel (Frontend CI/CD)
- Git + GitHub
- Docker + Docker Compose
- UFW Firewall
Made with β€οΈ by HCMUT Students