A multi-application platform for managing student internships, connecting students, companies, and faculty through a shared backend. Built as a university project for the Internet Programming course at the Faculty of Electrical Engineering, University of Banja Luka.
The system supports the full internship lifecycle: students build a CV profile and apply to internship postings, companies review applications and manage ongoing internships, and faculty oversee the process, evaluate outcomes, and manage company/student records. An AI-powered recommendation engine suggests relevant internships to students based on their profile.
Three separate client applications talk to a single REST API backend, each tailored to a specific user role:
| Application | Role | Stack | Port |
|---|---|---|---|
backend |
Shared REST API | Spring Boot, PostgreSQL | 8080 |
student-app |
Students | React + TypeScript (Vite) | 5173 |
company-app |
Companies | Java Servlets + JSP (embedded Tomcat) | 8081 |
faculty-app |
Faculty staff | Java Servlets + JSP (embedded Tomcat) | 8082 |
Students
- Build a CV profile (education, experience, skills, interests) and export it as PDF
- Browse and apply to internship postings
- Get AI-powered internship recommendations based on their profile (Gemini)
- Log work hours / journal entries during an active internship
- Track application status and evaluation results
Companies
- Post and manage internship listings
- Review student applications and CVs, accept or reject candidates
- Review and comment on student work logs
- Submit end-of-internship evaluations
Faculty
- Manage company and student records (including bulk student import via CSV)
- Oversee internships, applications, and work logs across the system
- Review evaluations submitted by companies
- Backend — Spring Boot REST API with a modular, domain-driven structure (
student,company,internship,application,evaluation,worklog,cv,recommendation,user). Stateless JWT authentication, PostgreSQL with Flyway migrations, OpenAPI/Swagger documentation, CSV and PDF export, and an AI client abstraction (Gemini, with a stub implementation for local development without an API key). - student-app — a single-page application (React Router, typed API client) consuming the backend REST API directly.
- company-app / faculty-app — server-rendered Java web apps (Servlets + JSP) that act as thin clients, calling the backend through a typed gateway layer rather than hitting the database directly.
- Infrastructure — PostgreSQL 16 and pgAdmin, orchestrated via Docker Compose for local development.
- Backend: Java, Spring Boot (Web, Security, Data JPA, Validation, WebFlux), PostgreSQL, Flyway, JWT (jjwt), springdoc-openapi, OpenPDF, Apache Commons CSV, Google GenAI (Gemini)
- Student App: React 18, TypeScript, Vite, React Router
- Company / Faculty Apps: Java, Jakarta Servlet API, JSP, embedded Tomcat
- Infrastructure: Docker Compose, PostgreSQL, pgAdmin
- Java 17+ and Maven
- Node.js and npm
- Docker (for the PostgreSQL database)
The repo includes a run.bat script that starts the database, backend, and all three client apps in one go:
run.batThis will:
- Start PostgreSQL (and pgAdmin) via Docker Compose
- Start the backend on
http://localhost:8080 - Start
company-apponhttp://localhost:8081 - Start
faculty-apponhttp://localhost:8082 - Start
student-apponhttp://localhost:5173
# 1. Start the database
docker compose -f backend/docker-compose.yml up -d
# 2. Start the backend
cd backend && mvn spring-boot:run
# 3. Start each client app in its own terminal
cd company-app && run-dev.bat # or run-dev.ps1
cd faculty-app && run-dev.bat
cd student-app && npm install && npm run devBefore running, set real values for security.jwt.secret and ai.api-key in backend/src/main/resources/application.properties (placeholder values are provided for local development). If no Gemini API key is configured, the recommendation service falls back to a stub implementation.
Once the backend is running, interactive API docs are available at:
http://localhost:8080/swagger-ui
.
├── backend/ # Spring Boot REST API
├── company-app/ # Server-rendered app for companies
├── faculty-app/ # Server-rendered app for faculty staff
├── student-app/ # React + TypeScript SPA for students
├── docker/ # Docker Compose setup for local infra
└── run.bat # One-command startup script (Windows)
Vedran Topić — github.com/vedrantopicc
