Skip to content

FarrelApriandry/Web-VocaTIonal

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

106 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

πŸŽ“ VocaTIonal: Professional IT Student Grievance System

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.


πŸ“Š Project Status

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

πŸš€ Architecture Overview

Dual Application Structure

VocaTIonal is split into two isolated applications with separate entry points:

1. Public Application (vocational/public/)

  • 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

2. Admin Panel (vocational/admin/)

  • 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)

πŸ—οΈ Technical Architecture

Admin Panel MVC Stack

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

Project Structure

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

Technology Stack

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

πŸ› οΈ Installation & Setup

Prerequisites

  • Docker & Docker Compose installed
  • Git installed
  • At least 2GB RAM available

Quick Start

# 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)

Environment Configuration

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=admin123

Database Migrations

Database 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;"

πŸ” Security Features

Authentication & Authorization

  • Password Hashing: PASSWORD_BCRYPT for secure storage
  • Session Management: 60-minute timeout with configurable extension
  • Role-Based Access Control:
    • Admin: Full system access
    • Kaprodi: Program lead management
    • Advokasi: Advocacy officer functions
  • CSRF Protection: Token validation on state-changing requests

Data Protection

  • Anonymity Support: Students can submit aspirations anonymously
  • Data Isolation: Sensitive data via .env files (never committed)
  • SQL Injection Prevention: PDO prepared statements on all queries
  • XSS Protection: htmlspecialchars() on all output

Network Security

  • 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

🌐 Deployment

Development Environment

vocational.prod          β†’ http://vocational.prod (public app)
admin.vocational.prod    β†’ http://admin.vocational.prod (admin panel)

Both served via HTTP with Docker-based Apache.

Production Environment

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

Apache VirtualHost Configuration

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

πŸ“Š Admin Panel Features

Dashboard

  • Real-time statistics (Total, Pending, Processing, Completed)
  • Most reported aspirations
  • Category breakdown
  • Quick action buttons

Aspirations Management

  • Advanced filtering (Status, Category, Search)
  • Pagination (20 items per page)
  • Inline editing of aspiration status
  • Detail modal with full information
  • Anonymous/Named indicator

Reports Management

  • Review inappropriate content reports
  • Filter by reason (Inappropriate, Spam, Offensive)
  • Approve/Reject reports
  • Statistics dashboard

Bulletin Board Management

  • Approve aspirations for public display
  • Manage published content
  • Category filtering
  • Reaction tracking

πŸ§ͺ Testing & Verification

Syntax Validation

# 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

Application Testing

# 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

Database Testing

# 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;"

πŸ“ API Endpoints

Admin Panel API

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

Public App API

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

πŸ› Troubleshooting

Apache Configuration Issues

# Check logs
docker logs vocational-apache

# View error logs
docker exec vocational-apache tail -f /var/log/apache2/admin_dev_error.log

Database Connection Issues

# 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();
  }
"

Router Issues

  • Ensure mod_rewrite is enabled: docker exec vocational-apache a2enmod rewrite
  • Check RewriteBase in vhost configuration
  • Verify .htaccess has AllowOverride All in Apache config

πŸ“š Documentation


πŸ‘₯ Contributing

  1. Create a feature branch: git checkout -b feature/your-feature
  2. Commit changes: git commit -m 'Add your feature'
  3. Push to branch: git push origin feature/your-feature
  4. Submit pull request

πŸ”’ Security Notice

  • Never commit .env files or SSL private keys
  • Always use HTTPS in production
  • Regularly rotate admin credentials
  • Keep dependencies updated
  • Review access logs regularly

πŸ“„ License

This project is proprietary and designed for Universitas Tidar's IT Student Association (HIMATIF).


πŸ‘€ Author

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

🎯 Project Links


Last Updated: April 6, 2026
Version: 2.0.0 (MVC Architecture Complete)

About

VocaTIonal is a secure reporting platform for Vocational IT students that enables transparent grievance communication with stakeholders while protecting data integrity and user anonymity through a Zero-Trust architecture.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Contributors