VocaTIonal is a professional-grade, secure reporting platform specifically designed for Vocational IT students at Universitas Tidar. It bridges the gap between students and stakeholders through a transparent, secure, and anonymous grievance mechanism. Built with Clean Architecture principles, the system ensures data integrity, user anonymity, and high-performance standards across both public and admin interfaces.
| Component | Status | Details |
|---|---|---|
| Admin Panel MVC | β Complete | Full router, controllers, views, models |
| Public App | β Complete | Student submission & bulletin board |
| Authentication | β Complete | Bcrypt hashing, session management, role-based access |
| Database Migration | β Complete | Auto-sync schema with version control |
| HTTPS/SSL | β Complete | Production-ready SSL configuration |
| Docker Setup | β Complete | Multi-container orchestration |
| Dual VirtualHost | β Complete | Development & production configurations |
| Public Access | β Complete | Accessible anywhere using vocational.info |
VocaTIonal is split into two isolated applications with separate entry points:
- Purpose: Student aspiration submission & public bulletin board
- Access:
vocational.prod(dev) /https://vocational.info(prod) - Features:
- Submit aspirations (Akademik, Fasilitas, Sarpras, Layanan, UKT, Lainnya)
- Anonymous or named submissions
- Public bulletin board viewing
- Reaction system (emoji responses)
- Report inappropriate content
- Purpose: Manage aspirations, reports, and bulletin board
- Access:
admin.vocational.prod(dev) /https://admin.vocational.info(prod) - Features:
- Dashboard with real-time statistics
- Aspiration management (filter, search, status update)
- Report management (review, approve, reject)
- Bulletin board management
- Role-based access control (Kaprodi, Advokasi, Super_Admin)
The admin panel implements a clean MVC (Model-View-Controller) architecture:
User Request
β
Router (index.php β routeAdmin())
β
Controller Layer (DashboardController, AspirationsController, etc.)
ββ Handles authentication checks
ββ Queries database via models
ββ Prepares data arrays
ββ Calls renderLayout()
β
View Layer (Pure view files)
ββ No business logic
ββ No database queries
ββ Receives extracted $data variables
ββ Renders HTML + PHP variable echoes
β
Layout Layer (main.php)
ββ Wraps view with header/sidebar
ββ Includes navigation components
ββ Outputs complete HTML page
β
Browser
Web-VocaTIonal/
βββ .github/workflows/ # DevSecOps CI/CD pipelines
β βββ deploy.yml # Automated deployment
β βββ cd.yml # Continuous deployment
β
βββ vocational/ # Main application root
β βββ public/ # PUBLIC APP - Web entry point
β β βββ index.php # Entry point (student aspirations)
β β βββ assets/ # CSS, JS, images
β β βββ api/ # Public API endpoints
β β
β βββ admin/ # ADMIN PANEL - Separate app
β β βββ public/
β β β βββ index.php # Admin entry point (router)
β β β βββ auth/
β β β β βββ login.php # Admin login page
β β β βββ api/ # Admin API endpoints
β β β βββ assets/ # Admin-specific assets
β β β
β β βββ app/ # Admin application logic
β β βββ Config/
β β β βββ Database.php # PDO connection
β β β βββ Session.php # Session management
β β β βββ routes.php # MVC routing
β β β βββ Migration.php # Database schema versioning
β β β
β β βββ Controllers/
β β β βββ AdminBaseController.php # Base with renderLayout()
β β β βββ DashboardController.php # Stats & overview
β β β βββ AspirationsController.php # Manage aspirations
β β β βββ ReportsController.php # Manage reports
β β β βββ BoardController.php # Manage bulletin board
β β β βββ AdminAuth.php # Authentication logic
β β β
β β βββ Models/
β β β βββ Aspirasi.php # Aspiration queries
β β β βββ AspirationReport.php # Report queries
β β β
β β βββ Views/
β β βββ Layouts/
β β β βββ main.php # Master page layout
β β βββ Components/
β β β βββ Sidebar.php # Navigation component
β β βββ dashboard.php # Dashboard view
β β βββ aspirations.php # Aspirations view
β β βββ reports.php # Reports view
β β βββ board.php # Bulletin board view
β β
β βββ app/ # PUBLIC APP - Application logic
β β βββ Config/
β β β βββ Database.php # Database connection
β β β βββ Migration.php # Schema migrations
β β βββ Controllers/
β β βββ Models/
β β βββ Views/
β β
β βββ docker/ # Infrastructure as Code
β β βββ apache/
β β βββ vhost.conf # Apache virtual hosts (dev & prod)
β β
β βββ Dockerfile # Container image definition
β βββ docker-compose.yml # Multi-container orchestration
β βββ documentation/ # Operational guides
β
βββ tests/ # Integration tests
| Layer | Technology | Version |
|---|---|---|
| Backend | PHP | 8.2+ (native) |
| Database | MySQL | 8.0 |
| Frontend | Tailwind CSS | Latest |
| Icons | Lucide Icons | Latest |
| Web Server | Apache | 2.4+ |
| Container | Docker | 20.10+ |
| Orchestration | Docker Compose | 1.29+ |
| SSL/TLS | Cloudflare | 1.3 |
| Server | Digital Ocean Droplet | 2 GB Memory / 1 Intel vCPU / 70 GB Disk / SGP1 |
- Docker & Docker Compose installed
- Git installed
- At least 2GB RAM available
# 1. Clone repository
git clone https://github.com/FarrelApriandry/Web-VocaTIonal.git
cd Web-VocaTIonal
# 2. Navigate to vocational directory
cd vocational
# 3. Start Docker containers
docker-compose up -d --build
# 4. Run database migrations
docker exec vocational-web php app/Config/Migration.php
# 5. Access applications
# - Public app: http://vocational.prod
# - Admin panel: http://admin.vocational.prod/auth/login.php
# (default: admin-prod / admin123)Create .env file in vocational/ directory:
# Database Configuration example
DB_HOST=vocational-db
DB_PORT=3306
DB_NAME=vocational_db
DB_USER=vocational_user
DB_PASS=secure_password_here
# Admin Credentials (for migrations)
ADMIN_USER=admin-prod
ADMIN_PASS=admin123Database schema is version-controlled and auto-synced:
# Run migrations (auto-creates tables & inserts default admin)
docker exec vocational-web php app/Config/Migration.php
# Check database connection
docker exec vocational-db mysql -u vocational_user -p vocational_db -e "SHOW TABLES;"- Password Hashing:
PASSWORD_BCRYPTfor secure storage - Session Management: 60-minute timeout with configurable extension
- Role-Based Access Control:
Admin: Full system accessKaprodi: Program lead managementAdvokasi: Advocacy officer functions
- CSRF Protection: Token validation on state-changing requests
- Anonymity Support: Students can submit aspirations anonymously
- Data Isolation: Sensitive data via
.envfiles (never committed) - SQL Injection Prevention: PDO prepared statements on all queries
- XSS Protection:
htmlspecialchars()on all output
- HTTP β HTTPS Redirect: Production traffic forced to SSL
- SSL/TLS Certificates: Self-signed (dev) / Let's Encrypt (prod)
- Virtual Host Isolation: Separate Apache vhosts for dev & production
vocational.prod β http://vocational.prod (public app)
admin.vocational.prod β http://admin.vocational.prod (admin panel)
Both served via HTTP with Docker-based Apache.
vocational.info β https://vocational.info (public app)
www.vocational.info β https://vocational.info (redirected)
admin.vocational.info β https://admin.vocational.info (admin panel)
All HTTPS with automatic HTTP β HTTPS 301 redirects
Configuration in vocational/docker/apache/vhost.conf:
- Development: Simple HTTP routing with RewriteBase
- Production: HTTPS with SSL certificates
- Admin Router: Query parameter-based MVC routing (
?action=) - Error Logging: Separate logs per application & environment
- Real-time statistics (Total, Pending, Processing, Completed)
- Most reported aspirations
- Category breakdown
- Quick action buttons
- Advanced filtering (Status, Category, Search)
- Pagination (20 items per page)
- Inline editing of aspiration status
- Detail modal with full information
- Anonymous/Named indicator
- Review inappropriate content reports
- Filter by reason (Inappropriate, Spam, Offensive)
- Approve/Reject reports
- Statistics dashboard
- Approve aspirations for public display
- Manage published content
- Category filtering
- Reaction tracking
# Check Apache configuration
docker exec vocational-apache apache2ctl configtest
# Output: Syntax OK
# Check PHP syntax
docker exec vocational-web php -l app/Config/Database.php
# Output: No syntax errors detected# Test public app
curl -v http://vocational.prod/
# Test admin login
curl -v http://admin.vocational.prod/auth/login.php
# Test admin dashboard (after login)
curl -v http://admin.vocational.prod/?action=dashboard
# Test production HTTPS redirect
curl -v http://vocational.info/
# Should return: 301 redirect to https://vocational.info# Check migrations were applied
docker exec vocational-db mysql -u vocational_user -p vocational_db -e "SHOW TABLES;"
# Verify admin user created
docker exec vocational-db mysql -u vocational_user -p vocational_db \
-e "SELECT id_admin, role_adm FROM admin_web WHERE id_admin = 1;"| Method | Endpoint | Purpose |
|---|---|---|
| POST | /api/admin-login.php |
Authenticate admin user |
| POST | /api/admin-logout.php |
Logout session |
| POST | /api/update-aspirasi-status.php |
Update aspiration status |
| Method | Endpoint | Purpose |
|---|---|---|
| POST | /api/submit-aspirasi.php |
Submit new aspiration |
| GET | /api/get-board-aspirasi.php |
Fetch bulletin board |
| POST | /api/add-reaction.php |
Add emoji reaction |
# Check logs
docker logs vocational-apache
# View error logs
docker exec vocational-apache tail -f /var/log/apache2/admin_dev_error.log# Test database connection
docker exec vocational-web php -r "
require 'app/Config/Database.php';
try {
\$pdo = Database::getConnection();
echo 'Database connected!';
} catch (PDOException \$e) {
echo 'Error: ' . \$e->getMessage();
}
"- Ensure
mod_rewriteis enabled:docker exec vocational-apache a2enmod rewrite - Check RewriteBase in vhost configuration
- Verify
.htaccesshasAllowOverride Allin Apache config
- Docker Running Guide - Docker setup & troubleshooting
- Operational Guide - Day-to-day operations
- Software Design Document - Architecture details
- Create a feature branch:
git checkout -b feature/your-feature - Commit changes:
git commit -m 'Add your feature' - Push to branch:
git push origin feature/your-feature - Submit pull request
- Never commit
.envfiles or SSL private keys - Always use HTTPS in production
- Regularly rotate admin credentials
- Keep dependencies updated
- Review access logs regularly
This project is proprietary and designed for Universitas Tidar's IT Student Association (HIMATIF).
Information Technology'24
Student Developer, Universitas Tidar
| Name | GitHub Account |
|---|---|
| Farrel Apriandry Ciu | @FarrelApriandry |
| Nabila Syafiqah Zahran Firlina | @nabilaszf |
| Yasabuana Athallahaufa Natawijaya | @Yasabuana |
| Nofiya Millatina | @nofiyamillatina |
| Hakkan Azrul Suseno | @hakkanazrul06 |
- Repository: https://github.com/FarrelApriandry/Web-VocaTIonal
- Website: https://vocational.info (Production)
- Admin Panel: https://admin.vocational.info (Production)
Last Updated: April 6, 2026
Version: 2.0.0 (MVC Architecture Complete)