A comprehensive academic management system with role-based portals for Root Admin, Academicians, and Students. Features course management, grade tracking, enrollment, and transcript generation.
OBS (Online Banking System renamed to Onboard System here) is an enterprise-grade academic information system demonstrating:
- Multi-role authentication & authorization
- Complex business logic (enrollment, grading, transcripts)
- Department and faculty management
- Real-time grade reporting
- Student academic history tracking
- π System overview & analytics
- π₯ User management (create, deactivate, assign roles)
- π« Department management
- π Faculty management
- π System configuration & security
- π Manage assigned courses
- π Create & update course content
- π Grade students
- π View student performance
- π Generate class reports
- ποΈ Manage attendance
- π View available courses
- β Enroll in courses
- ποΈ Check grades & transcripts
- π View course materials
- π Track academic progress
- π Download transcript
- β JWT authentication with refresh tokens
- β Role-based access control (RBAC)
- β Course enrollment validation
- β GPA calculation
- β Transcript generation
- β Audit logging
- β Data export (PDF reports)
- Framework: Spring Boot 3.x
- Security: Spring Security + JWT
- ORM: Hibernate/JPA
- Database: PostgreSQL
- API: RESTful with OpenAPI docs
- Validation: Bean Validation
- Caching: Spring Cache (Redis ready)
- UI Framework: React 18
- State Management: Context API / Redux
- Styling: Tailwind CSS / Bootstrap
- HTTP Client: Axios
- Routing: React Router v6
- Component Library: Custom + Ant Design (optional)
-- Users (base for all roles)
CREATE TABLE users (
id UUID PRIMARY KEY,
email VARCHAR(255) UNIQUE NOT NULL,
password_hash VARCHAR(255),
first_name VARCHAR(100),
last_name VARCHAR(100),
role VARCHAR(50), -- ADMIN, ACADEMICIAN, STUDENT
is_active BOOLEAN DEFAULT TRUE,
created_at TIMESTAMP DEFAULT NOW()
);
-- Departments
CREATE TABLE departments (
id UUID PRIMARY KEY,
name VARCHAR(100) UNIQUE NOT NULL,
code VARCHAR(20),
description TEXT
);
-- Programs (Degree programs like BS, MS)
CREATE TABLE programs (
id UUID PRIMARY KEY,
department_id UUID REFERENCES departments(id),
name VARCHAR(100),
duration_years INT,
total_credits INT
);
-- Courses
CREATE TABLE courses (
id UUID PRIMARY KEY,
code VARCHAR(20) UNIQUE NOT NULL,
name VARCHAR(100),
department_id UUID REFERENCES departments(id),
credit_hours INT,
description TEXT,
max_students INT
);
-- Faculty (Academicians)
CREATE TABLE faculty (
id UUID PRIMARY KEY,
user_id UUID REFERENCES users(id),
department_id UUID REFERENCES departments(id),
qualification VARCHAR(100)
);
-- Course Offerings (semester-based)
CREATE TABLE course_offerings (
id UUID PRIMARY KEY,
course_id UUID REFERENCES courses(id),
faculty_id UUID REFERENCES faculty(id),
semester VARCHAR(20), -- Spring2024, Fall2024
capacity INT,
schedule JSONB -- Days and times
);
-- Enrollments
CREATE TABLE enrollments (
id UUID PRIMARY KEY,
student_id UUID REFERENCES users(id),
course_offering_id UUID REFERENCES course_offerings(id),
enrollment_date TIMESTAMP,
status VARCHAR(50), -- ACTIVE, COMPLETED, DROPPED
UNIQUE(student_id, course_offering_id)
);
-- Grades
CREATE TABLE grades (
id UUID PRIMARY KEY,
enrollment_id UUID REFERENCES enrollments(id),
assignment_name VARCHAR(100),
marks DECIMAL(5,2),
max_marks DECIMAL(5,2),
grade_type VARCHAR(50), -- ASSIGNMENT, EXAM, PARTICIPATION
UNIQUE(enrollment_id, assignment_name)
);
-- Transcripts
CREATE TABLE transcripts (
id UUID PRIMARY KEY,
student_id UUID REFERENCES users(id),
semester VARCHAR(20),
gpa DECIMAL(3,2),
total_credits INT,
generated_at TIMESTAMP
);POST /api/v1/auth/login
POST /api/v1/auth/refresh
POST /api/v1/auth/logoutGET /api/v1/admin/users
POST /api/v1/admin/users
GET /api/v1/admin/departments
POST /api/v1/admin/departments
GET /api/v1/admin/programs
POST /api/v1/admin/programs
GET /api/v1/admin/analyticsGET /api/v1/academician/courses
GET /api/v1/academician/courses/{courseId}/students
POST /api/v1/academician/courses/{courseId}/grades
{
"enrollmentId": "uuid",
"marks": 85.5,
"assignmentName": "Midterm"
}
GET /api/v1/academician/courses/{courseId}/reportGET /api/v1/student/courses/available
POST /api/v1/student/enrollments
{
"courseOfferingId": "uuid"
}
GET /api/v1/student/enrollments
GET /api/v1/student/grades
GET /api/v1/student/transcript
GET /api/v1/student/transcript/download # PDF# Backend tests
mvn test
# Run specific test
mvn test -Dtest=EnrollmentServiceTest
# With coverage
mvn test jacoco:report
# Frontend tests
cd frontend
npm test
# E2E with Cypress
npm run e2ecd backend
mvn clean install
mvn spring-boot:run
# API: http://localhost:8080
# Docs: http://localhost:8080/swagger-ui.htmlcd frontend
npm install
npm start
# UI: http://localhost:3000docker-compose up -d
# Services running on configured ports1. Student views available courses
β
2. Student clicks "Enroll"
β
3. Backend validates:
- Prerequisites passed?
- Not already enrolled?
- Capacity available?
β
4. If valid β Create enrollment record
β
5. Student can now see course in dashboard
β
6. Academician enters grades
β
7. System calculates course grade
β
8. Semester transcript generated
GPA = Ξ£(Credit Hours Γ Grade Point) / Ξ£ Credit Hours
Grade Map:
A (4.0) = 90-100
B (3.0) = 80-89
C (2.0) = 70-79
D (1.0) = 60-69
F (0.0) = Below 60
- β JWT tokens with expiry
- β Role-based access (@PreAuthorize)
- β Password hashing (bcrypt)
- β SQL injection prevention
- β CORS configuration
- β Audit logging for sensitive operations
- Caching frequently accessed data
- Indexed queries on student_id, course_id
- Pagination for large result sets
- Lazy loading for related entities
- Connection pooling with HikariCP
- Course prerequisites validation
- Waitlist for full courses
- Transcript notarization
- Mobile app
- Real-time notifications
- Advanced analytics dashboard
- Course recommendations
- Student performance predictions (ML)
obs-demo/
βββ backend/
β βββ src/main/java/com/obs/
β β βββ controller/
β β βββ service/
β β βββ repository/
β β βββ entity/
β β βββ dto/
β βββ pom.xml
βββ frontend/
βββ src/
β βββ pages/
β βββ components/
β βββ services/
βββ package.json