diff --git a/.direnv/flake-profile b/.direnv/flake-profile
index 0c05709..519b17b 120000
--- a/.direnv/flake-profile
+++ b/.direnv/flake-profile
@@ -1 +1 @@
-flake-profile-1-link
\ No newline at end of file
+flake-profile-3-link
\ No newline at end of file
diff --git a/.direnv/flake-profile-1-link b/.direnv/flake-profile-1-link
deleted file mode 120000
index 1f52160..0000000
--- a/.direnv/flake-profile-1-link
+++ /dev/null
@@ -1 +0,0 @@
-/nix/store/yh4rk74mwj495vjphknnjmk8mbz87yaz-java-devshell-env
\ No newline at end of file
diff --git a/.direnv/flake-profile-3-link b/.direnv/flake-profile-3-link
new file mode 120000
index 0000000..56eb919
--- /dev/null
+++ b/.direnv/flake-profile-3-link
@@ -0,0 +1 @@
+/nix/store/pv7anfrpq0yks95kdn0wig9s7pi04scz-java-devshell-env
\ No newline at end of file
diff --git a/college.db b/college.db
new file mode 100644
index 0000000..54ee830
Binary files /dev/null and b/college.db differ
diff --git a/flake.nix b/flake.nix
index db55709..41a4253 100644
--- a/flake.nix
+++ b/flake.nix
@@ -19,11 +19,42 @@
maven
gradle
jdt-language-server
+ # JavaFX Dependencies
+ gtk3
+ libGL
+ glib
+ pango
+ cairo
+ atk
+ gdk-pixbuf
+ fontconfig
+ freetype
+ xorg.libX11
+ xorg.libXext
+ xorg.libXxf86vm
+ xorg.libXi
+ xorg.libXtst
];
shellHook = ''
export JAVA_HOME=${pkgs.jdk21}
- echo "☕ Java devshell ready — JDK 21, Maven, Gradle"
+ export LD_LIBRARY_PATH="${pkgs.lib.makeLibraryPath (with pkgs; [
+ gtk3
+ glib
+ pango
+ cairo
+ atk
+ gdk-pixbuf
+ fontconfig
+ freetype
+ libGL
+ xorg.libX11
+ xorg.libXext
+ xorg.libXxf86vm
+ xorg.libXi
+ xorg.libXtst
+ ])}:$LD_LIBRARY_PATH"
+ echo "☕ Java devshell ready (with JavaFX support) — JDK 21, Maven, Gradle"
'';
};
});
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..63f2835
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,67 @@
+
+ 4.0.0
+ com.college
+ management-system
+ 1.0-SNAPSHOT
+
+ UTF-8
+ 21
+ 21
+ 21.0.1
+
+
+
+ org.openjfx
+ javafx-controls
+ ${javafx.version}
+
+
+ org.openjfx
+ javafx-fxml
+ ${javafx.version}
+
+
+ org.xerial
+ sqlite-jdbc
+ 3.45.1.0
+
+
+ com.itextpdf
+ itext7-core
+ 8.0.2
+ pom
+
+
+ org.apache.commons
+ commons-csv
+ 1.10.0
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.11.0
+
+ 21
+
+
+
+ org.openjfx
+ javafx-maven-plugin
+ 0.0.8
+
+
+
+ default-cli
+
+ com.college.management.App
+
+
+
+
+
+
+
diff --git a/src/main/java/com/college/management/AdminDashboard.java b/src/main/java/com/college/management/AdminDashboard.java
new file mode 100644
index 0000000..64305a0
--- /dev/null
+++ b/src/main/java/com/college/management/AdminDashboard.java
@@ -0,0 +1,321 @@
+package com.college.management;
+
+import javafx.geometry.Insets;
+import javafx.scene.Scene;
+import javafx.scene.control.*;
+import javafx.scene.layout.*;
+import javafx.stage.Stage;
+import java.sql.*;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.scene.control.cell.PropertyValueFactory;
+
+public class AdminDashboard {
+ private Stage stage;
+ private int userId;
+ private String username;
+
+ public AdminDashboard(Stage stage, int userId, String username) {
+ this.stage = stage;
+ this.userId = userId;
+ this.username = username;
+ }
+
+ public void show() {
+ BorderPane root = new BorderPane();
+
+ // Sidebar
+ VBox sidebar = new VBox(10);
+ sidebar.setPadding(new Insets(20));
+ sidebar.setStyle("-fx-background-color: #2c3e50;");
+ sidebar.setPrefWidth(200);
+
+ Label brand = new Label("Admin Panel");
+ brand.setStyle("-fx-text-fill: white; -fx-font-size: 18px; -fx-font-weight: bold;");
+
+ Button btnUsers = createSidebarButton("Manage Users");
+ Button btnNotices = createSidebarButton("Post Notice");
+ Button btnTimetable = createSidebarButton("Timetable");
+ Button btnEvents = createSidebarButton("Events");
+ Button btnChat = createSidebarButton("Global Chat");
+ Button btnPrivateChat = createSidebarButton("Private Chat");
+ Button btnReports = createSidebarButton("Reports");
+ Button btnLogout = createSidebarButton("Logout");
+
+ sidebar.getChildren().addAll(brand, new Separator(), btnUsers, btnNotices, btnTimetable, btnEvents, btnChat, btnPrivateChat, btnReports, btnLogout);
+
+ root.setLeft(sidebar);
+
+ // Default Content
+ showUserManagement(root);
+
+ btnUsers.setOnAction(e -> showUserManagement(root));
+ btnNotices.setOnAction(e -> showNoticeManagement(root));
+ btnTimetable.setOnAction(e -> showTimetableManagement(root));
+ btnEvents.setOnAction(e -> showEventManagement(root));
+ btnChat.setOnAction(e -> showChat(root, "Admin"));
+ btnPrivateChat.setOnAction(e -> root.setCenter(new PrivateChatUI(userId).getView()));
+ btnReports.setOnAction(e -> showReports(root));
+ btnLogout.setOnAction(e -> new App().start(stage));
+
+ Scene scene = new Scene(root, 900, 600);
+ stage.setTitle("Admin Dashboard");
+ stage.setScene(scene);
+ }
+
+ private void showTimetableManagement(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+ Label title = new Label("Manage Timetable");
+ title.setStyle("-fx-font-size: 24px; -fx-font-weight: bold;");
+
+ GridPane form = new GridPane();
+ form.setHgap(10); form.setVgap(10);
+
+ ComboBox cbDay = new ComboBox<>(FXCollections.observableArrayList("Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"));
+ cbDay.setPromptText("Day");
+ TextField txtTime = new TextField(); txtTime.setPromptText("Time (e.g. 09:00-10:00)");
+ TextField txtSubject = new TextField(); txtSubject.setPromptText("Subject");
+ TextField txtFaculty = new TextField(); txtFaculty.setPromptText("Faculty Name");
+ Button btnAdd = new Button("Add Entry");
+
+ form.add(new Label("Day:"), 0, 0); form.add(cbDay, 1, 0);
+ form.add(new Label("Time:"), 0, 1); form.add(txtTime, 1, 1);
+ form.add(new Label("Subject:"), 0, 2); form.add(txtSubject, 1, 2);
+ form.add(new Label("Faculty:"), 0, 3); form.add(txtFaculty, 1, 3);
+ form.add(btnAdd, 1, 4);
+
+ btnAdd.setOnAction(e -> {
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO timetable (day, time_slot, subject, faculty_name) VALUES (?, ?, ?, ?)")) {
+ pstmt.setString(1, cbDay.getValue());
+ pstmt.setString(2, txtTime.getText());
+ pstmt.setString(3, txtSubject.getText());
+ pstmt.setString(4, txtFaculty.getText());
+ pstmt.executeUpdate();
+ new Alert(Alert.AlertType.INFORMATION, "Timetable entry added!").show();
+ } catch (SQLException ex) { ex.printStackTrace(); }
+ });
+
+ content.getChildren().addAll(title, form);
+ root.setCenter(content);
+ }
+
+ private void showEventManagement(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+ Label title = new Label("Manage Events");
+ title.setStyle("-fx-font-size: 24px; -fx-font-weight: bold;");
+
+ TextField txtTitle = new TextField(); txtTitle.setPromptText("Event Title");
+ DatePicker datePicker = new DatePicker();
+ TextArea txtDesc = new TextArea(); txtDesc.setPromptText("Event Description");
+ Button btnAdd = new Button("Add Event");
+
+ btnAdd.setOnAction(e -> {
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO events (title, description, event_date) VALUES (?, ?, ?)")) {
+ pstmt.setString(1, txtTitle.getText());
+ pstmt.setString(2, txtDesc.getText());
+ pstmt.setString(3, datePicker.getValue().toString());
+ pstmt.executeUpdate();
+ new Alert(Alert.AlertType.INFORMATION, "Event added!").show();
+ } catch (SQLException ex) { ex.printStackTrace(); }
+ });
+
+ content.getChildren().addAll(title, txtTitle, datePicker, txtDesc, btnAdd);
+ root.setCenter(content);
+ }
+
+ public static void showChat(BorderPane root, String senderName) {
+ VBox content = new VBox(10);
+ content.setPadding(new Insets(20));
+ Label title = new Label("Global Chat / Announcements");
+ title.setStyle("-fx-font-size: 24px; -fx-font-weight: bold;");
+
+ TextArea chatArea = new TextArea();
+ chatArea.setEditable(false);
+ chatArea.setPrefHeight(400);
+
+ HBox inputArea = new HBox(10);
+ TextField txtMsg = new TextField();
+ txtMsg.setPrefWidth(500);
+ Button btnSend = new Button("Send");
+
+ Runnable refreshChat = () -> {
+ try (Connection conn = DatabaseManager.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT sender, content, timestamp FROM messages ORDER BY id ASC")) {
+ StringBuilder sb = new StringBuilder();
+ while (rs.next()) {
+ sb.append("[").append(rs.getString("timestamp")).append("] ")
+ .append(rs.getString("sender")).append(": ")
+ .append(rs.getString("content")).append("\n");
+ }
+ chatArea.setText(sb.toString());
+ chatArea.setScrollTop(Double.MAX_VALUE);
+ } catch (SQLException ex) { ex.printStackTrace(); }
+ };
+
+ btnSend.setOnAction(e -> {
+ if (txtMsg.getText().isEmpty()) return;
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO messages (sender, content) VALUES (?, ?)")) {
+ pstmt.setString(1, senderName);
+ pstmt.setString(2, txtMsg.getText());
+ pstmt.executeUpdate();
+ txtMsg.clear();
+ refreshChat.run();
+ } catch (SQLException ex) { ex.printStackTrace(); }
+ });
+
+ refreshChat.run();
+ inputArea.getChildren().addAll(txtMsg, btnSend);
+ content.getChildren().addAll(title, chatArea, inputArea);
+ root.setCenter(content);
+ }
+
+ private void showReports(BorderPane root) {
+ VBox content = new VBox(20);
+ content.setPadding(new Insets(20));
+
+ Label title = new Label("System Reports");
+ title.setStyle("-fx-font-size: 24px; -fx-font-weight: bold;");
+
+ Button btnCSV = new Button("Export Students to CSV");
+ Button btnPDF = new Button("Export Students to PDF");
+
+ btnCSV.setOnAction(e -> {
+ try {
+ ReportGenerator.exportStudentsCSV("students_report.csv");
+ new Alert(Alert.AlertType.INFORMATION, "Exported to students_report.csv").show();
+ } catch (Exception ex) { ex.printStackTrace(); }
+ });
+
+ btnPDF.setOnAction(e -> {
+ try {
+ ReportGenerator.exportStudentsPDF("students_report.pdf");
+ new Alert(Alert.AlertType.INFORMATION, "Exported to students_report.pdf").show();
+ } catch (Exception ex) { ex.printStackTrace(); }
+ });
+
+ content.getChildren().addAll(title, btnCSV, btnPDF);
+ root.setCenter(content);
+ }
+
+ private void showNoticeManagement(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+
+ Label title = new Label("Post New Notice");
+ title.setStyle("-fx-font-size: 24px; -fx-font-weight: bold;");
+
+ TextField txtTitle = new TextField();
+ txtTitle.setPromptText("Notice Title");
+ TextArea txtContent = new TextArea();
+ txtContent.setPromptText("Notice Content...");
+ Button btnPost = new Button("Post Notice");
+
+ btnPost.setOnAction(e -> {
+ if (txtTitle.getText().isEmpty() || txtContent.getText().isEmpty()) return;
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO notices (title, content, date) VALUES (?, ?, ?)")) {
+ pstmt.setString(1, txtTitle.getText());
+ pstmt.setString(2, txtContent.getText());
+ pstmt.setString(3, java.time.LocalDate.now().toString());
+ pstmt.executeUpdate();
+ txtTitle.clear();
+ txtContent.clear();
+ new Alert(Alert.AlertType.INFORMATION, "Notice Posted!").show();
+ } catch (SQLException ex) { ex.printStackTrace(); }
+ });
+
+ content.getChildren().addAll(title, txtTitle, txtContent, btnPost);
+ root.setCenter(content);
+ }
+
+ private Button createSidebarButton(String text) {
+ Button btn = new Button(text);
+ btn.setMaxWidth(Double.MAX_VALUE);
+ btn.setStyle("-fx-background-color: transparent; -fx-text-fill: white; -fx-alignment: CENTER_LEFT;");
+ return btn;
+ }
+
+ private void showUserManagement(BorderPane root) {
+ VBox content = new VBox(20);
+ content.setPadding(new Insets(20));
+
+ Label title = new Label("User Management");
+ title.setStyle("-fx-font-size: 24px; -fx-font-weight: bold;");
+
+ // Form to add user
+ HBox form = new HBox(10);
+ TextField txtUsername = new TextField();
+ txtUsername.setPromptText("Username");
+ PasswordField txtPassword = new PasswordField();
+ txtPassword.setPromptText("Password");
+ ComboBox cbRole = new ComboBox<>(FXCollections.observableArrayList("STUDENT", "FACULTY", "ADMIN"));
+ cbRole.setPromptText("Role");
+ Button btnAdd = new Button("Add User");
+
+ form.getChildren().addAll(txtUsername, txtPassword, cbRole, btnAdd);
+
+ // Table to show users
+ TableView table = new TableValue();
+ setupUserTable(table);
+ refreshUserTable(table);
+
+ btnAdd.setOnAction(e -> {
+ addUser(txtUsername.getText(), txtPassword.getText(), cbRole.getValue(), table);
+ txtUsername.clear();
+ txtPassword.clear();
+ });
+
+ content.getChildren().addAll(title, form, table);
+ root.setCenter(content);
+ }
+
+ private void setupUserTable(TableView table) {
+ TableColumn colId = new TableColumn<>("ID");
+ colId.setCellValueFactory(new PropertyValueFactory<>("id"));
+
+ TableColumn colUser = new TableColumn<>("Username");
+ colUser.setCellValueFactory(new PropertyValueFactory<>("username"));
+
+ TableColumn colRole = new TableColumn<>("Role");
+ colRole.setCellValueFactory(new PropertyValueFactory<>("role"));
+
+ table.getColumns().addAll(colId, colUser, colRole);
+ }
+
+ private void refreshUserTable(TableView table) {
+ ObservableList users = FXCollections.observableArrayList();
+ try (Connection conn = DatabaseManager.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT id, username, role FROM users")) {
+ while (rs.next()) {
+ users.add(new User(rs.getInt("id"), rs.getString("username"), rs.getString("role"), ""));
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ table.setItems(users);
+ }
+
+ private void addUser(String user, String pass, String role, TableView table) {
+ if (user.isEmpty() || pass.isEmpty() || role == null) return;
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO users (username, password, role) VALUES (?, ?, ?)")) {
+ pstmt.setString(1, user);
+ pstmt.setString(2, pass);
+ pstmt.setString(3, role);
+ pstmt.executeUpdate();
+ refreshUserTable(table);
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+
+ // Inner class fix for TableView
+ private static class TableValue extends TableView {}
+}
diff --git a/src/main/java/com/college/management/App.java b/src/main/java/com/college/management/App.java
new file mode 100644
index 0000000..6a0d984
--- /dev/null
+++ b/src/main/java/com/college/management/App.java
@@ -0,0 +1,96 @@
+package com.college.management;
+
+import javafx.application.Application;
+import javafx.geometry.Insets;
+import javafx.geometry.Pos;
+import javafx.scene.Scene;
+import javafx.scene.control.*;
+import javafx.scene.layout.VBox;
+import javafx.stage.Stage;
+
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+
+public class App extends Application {
+
+ @Override
+ public void start(Stage stage) {
+ DatabaseManager.initializeDatabase();
+ showLoginScreen(stage);
+ }
+
+ private void showLoginScreen(Stage stage) {
+ VBox layout = new VBox(10);
+ layout.setPadding(new Insets(20));
+ layout.setAlignment(Pos.CENTER);
+
+ Label titleLabel = new Label("College Management System - Login");
+ titleLabel.setStyle("-fx-font-size: 20px; -fx-font-weight: bold;");
+
+ TextField usernameField = new TextField();
+ usernameField.setPromptText("Username");
+ usernameField.setMaxWidth(250);
+
+ PasswordField passwordField = new PasswordField();
+ passwordField.setPromptText("Password");
+ passwordField.setMaxWidth(250);
+
+ Button loginButton = new Button("Login");
+ loginButton.setMinWidth(100);
+
+ Label statusLabel = new Label();
+
+ loginButton.setOnAction(e -> {
+ String user = usernameField.getText();
+ String pass = passwordField.getText();
+ handleLogin(user, pass, stage, statusLabel);
+ });
+
+ layout.getChildren().addAll(titleLabel, usernameField, passwordField, loginButton, statusLabel);
+
+ Scene scene = new Scene(layout, 400, 300);
+ stage.setTitle("Login");
+ stage.setScene(scene);
+ stage.show();
+ }
+
+ private void handleLogin(String username, String password, Stage stage, Label statusLabel) {
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("SELECT role FROM users WHERE username = ? AND password = ?")) {
+
+ pstmt.setString(1, username);
+ pstmt.setString(2, password);
+ ResultSet rs = pstmt.executeQuery();
+
+ if (rs.next()) {
+ String role = rs.getString("role");
+ int userId = -1;
+ try (PreparedStatement idStmt = conn.prepareStatement("SELECT id FROM users WHERE username = ?")) {
+ idStmt.setString(1, username);
+ ResultSet rsId = idStmt.executeQuery();
+ if (rsId.next()) userId = rsId.getInt("id");
+ }
+
+ if ("ADMIN".equals(role)) {
+ new AdminDashboard(stage, userId, username).show();
+ } else if ("FACULTY".equals(role)) {
+ new FacultyDashboard(stage, userId, username).show();
+ } else if ("STUDENT".equals(role)) {
+ new StudentDashboard(stage, userId, username).show();
+ }
+ } else {
+ statusLabel.setText("Invalid username or password.");
+ statusLabel.setStyle("-fx-text-fill: red;");
+ }
+ } catch (SQLException e) {
+ e.printStackTrace();
+ statusLabel.setText("Database error.");
+ }
+ }
+
+ public static void main(String[] args) {
+ launch();
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/college/management/ChatService.java b/src/main/java/com/college/management/ChatService.java
new file mode 100644
index 0000000..f9f2a55
--- /dev/null
+++ b/src/main/java/com/college/management/ChatService.java
@@ -0,0 +1,58 @@
+package com.college.management;
+
+import java.sql.*;
+import java.util.ArrayList;
+import java.util.List;
+
+public class ChatService {
+
+ public static void sendPrivateMessage(int senderId, int receiverId, String content) {
+ String sql = "INSERT INTO private_messages (sender_id, receiver_id, content) VALUES (?, ?, ?)";
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement(sql)) {
+ pstmt.setInt(1, senderId);
+ pstmt.setInt(2, receiverId);
+ pstmt.setString(3, content);
+ pstmt.executeUpdate();
+ } catch (SQLException e) { e.printStackTrace(); }
+ }
+
+ public static List getPrivateConversation(int user1, int user2) {
+ List messages = new ArrayList<>();
+ String sql = "SELECT u.username as sender_name, pm.content, pm.timestamp " +
+ "FROM private_messages pm " +
+ "JOIN users u ON pm.sender_id = u.id " +
+ "WHERE (pm.sender_id = ? AND pm.receiver_id = ?) " +
+ "OR (pm.sender_id = ? AND pm.receiver_id = ?) " +
+ "ORDER BY pm.timestamp ASC";
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement(sql)) {
+ pstmt.setInt(1, user1);
+ pstmt.setInt(2, user2);
+ pstmt.setInt(3, user2);
+ pstmt.setInt(4, user1);
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next()) {
+ messages.add("[" + rs.getString("timestamp") + "] " +
+ rs.getString("sender_name") + ": " + rs.getString("content"));
+ }
+ } catch (SQLException e) { e.printStackTrace(); }
+ return messages;
+ }
+
+ public static List getChatableUsers(int currentUserId, String roleToFilter) {
+ List users = new ArrayList<>();
+ String sql = "SELECT id, username, role FROM users WHERE id != ?";
+ if (roleToFilter != null) sql += " AND role = '" + roleToFilter + "'";
+
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement(sql)) {
+ pstmt.setInt(1, currentUserId);
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next()) {
+ users.add(new User(rs.getInt("id"), rs.getString("username"), rs.getString("role"), ""));
+ }
+ } catch (SQLException e) { e.printStackTrace(); }
+ return users;
+ }
+}
diff --git a/src/main/java/com/college/management/DatabaseManager.java b/src/main/java/com/college/management/DatabaseManager.java
new file mode 100644
index 0000000..6f7cfb9
--- /dev/null
+++ b/src/main/java/com/college/management/DatabaseManager.java
@@ -0,0 +1,109 @@
+package com.college.management;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+public class DatabaseManager {
+ private static final String URL = "jdbc:sqlite:college.db";
+
+ public static Connection getConnection() throws SQLException {
+ return DriverManager.getConnection(URL);
+ }
+
+ public static void initializeDatabase() {
+ try (Connection conn = getConnection();
+ Statement stmt = conn.createStatement()) {
+
+ // Users table
+ stmt.execute("CREATE TABLE IF NOT EXISTS users (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "username TEXT UNIQUE NOT NULL," +
+ "password TEXT NOT NULL," +
+ "role TEXT NOT NULL" + // ADMIN, FACULTY, STUDENT
+ ")");
+
+ // Profiles table
+ stmt.execute("CREATE TABLE IF NOT EXISTS profiles (" +
+ "user_id INTEGER PRIMARY KEY," +
+ "full_name TEXT," +
+ "email TEXT," +
+ "department TEXT," +
+ "FOREIGN KEY(user_id) REFERENCES users(id)" +
+ ")");
+
+ // Attendance
+ stmt.execute("CREATE TABLE IF NOT EXISTS attendance (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "student_id INTEGER," +
+ "date TEXT," +
+ "status TEXT," + // PRESENT, ABSENT
+ "FOREIGN KEY(student_id) REFERENCES users(id)" +
+ ")");
+
+ // Marks
+ stmt.execute("CREATE TABLE IF NOT EXISTS marks (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "student_id INTEGER," +
+ "subject TEXT," +
+ "score REAL," +
+ "FOREIGN KEY(student_id) REFERENCES users(id)" +
+ ")");
+
+ // Notices
+ stmt.execute("CREATE TABLE IF NOT EXISTS notices (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "title TEXT," +
+ "content TEXT," +
+ "date TEXT," +
+ "posted_by INTEGER," +
+ "FOREIGN KEY(posted_by) REFERENCES users(id)" +
+ ")");
+
+ // Timetable
+ stmt.execute("CREATE TABLE IF NOT EXISTS timetable (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "day TEXT," + // Monday, Tuesday, etc.
+ "time_slot TEXT," + // e.g., 09:00 - 10:00
+ "subject TEXT," +
+ "faculty_name TEXT," +
+ "target_role TEXT" + // ALL, STUDENT, FACULTY
+ ")");
+
+ // Events
+ stmt.execute("CREATE TABLE IF NOT EXISTS events (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "title TEXT," +
+ "description TEXT," +
+ "event_date TEXT" +
+ ")");
+
+ // Messages (Simple Chat)
+ stmt.execute("CREATE TABLE IF NOT EXISTS messages (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "sender TEXT," +
+ "content TEXT," +
+ "timestamp DATETIME DEFAULT CURRENT_TIMESTAMP" +
+ ")");
+
+ // Private Messages (One-to-One)
+ stmt.execute("CREATE TABLE IF NOT EXISTS private_messages (" +
+ "id INTEGER PRIMARY KEY AUTOINCREMENT," +
+ "sender_id INTEGER," +
+ "receiver_id INTEGER," +
+ "content TEXT," +
+ "timestamp DATETIME DEFAULT CURRENT_TIMESTAMP," +
+ "FOREIGN KEY(sender_id) REFERENCES users(id)," +
+ "FOREIGN KEY(receiver_id) REFERENCES users(id)" +
+ ")");
+
+ // Insert default admin if not exists
+ stmt.execute("INSERT OR IGNORE INTO users (username, password, role) VALUES ('admin', 'admin123', 'ADMIN')");
+
+ System.out.println("Database initialized successfully.");
+ } catch (SQLException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/src/main/java/com/college/management/FacultyDashboard.java b/src/main/java/com/college/management/FacultyDashboard.java
new file mode 100644
index 0000000..731de35
--- /dev/null
+++ b/src/main/java/com/college/management/FacultyDashboard.java
@@ -0,0 +1,240 @@
+package com.college.management;
+
+import javafx.geometry.Insets;
+import javafx.scene.Scene;
+import javafx.scene.control.*;
+import javafx.scene.layout.*;
+import javafx.stage.Stage;
+import java.sql.*;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.scene.control.cell.PropertyValueFactory;
+import java.time.LocalDate;
+
+public class FacultyDashboard {
+ private Stage stage;
+ private int userId;
+ private String username;
+
+ public FacultyDashboard(Stage stage, int userId, String username) {
+ this.stage = stage;
+ this.userId = userId;
+ this.username = username;
+ }
+
+ public void show() {
+ BorderPane root = new BorderPane();
+
+ VBox sidebar = new VBox(10);
+ sidebar.setPadding(new Insets(20));
+ sidebar.setStyle("-fx-background-color: #34495e;");
+ sidebar.setPrefWidth(200);
+
+ Label brand = new Label("Faculty Panel");
+ brand.setStyle("-fx-text-fill: white; -fx-font-size: 18px; -fx-font-weight: bold;");
+
+ Button btnAttendance = createSidebarButton("Attendance");
+ Button btnMarks = createSidebarButton("Marks Entry");
+ Button btnTimetable = createSidebarButton("My Timetable");
+ Button btnEvents = createSidebarButton("Events");
+ Button btnChat = createSidebarButton("Global Chat");
+ Button btnPrivateChat = createSidebarButton("Private Chat");
+ Button btnLogout = createSidebarButton("Logout");
+
+ sidebar.getChildren().addAll(brand, new Separator(), btnAttendance, btnMarks, btnTimetable, btnEvents, btnChat, btnPrivateChat, btnLogout);
+ root.setLeft(sidebar);
+
+ showAttendanceManagement(root);
+
+ btnAttendance.setOnAction(e -> showAttendanceManagement(root));
+ btnMarks.setOnAction(e -> showMarksEntry(root));
+ btnTimetable.setOnAction(e -> showTimetable(root));
+ btnEvents.setOnAction(e -> showEvents(root));
+ btnChat.setOnAction(e -> AdminDashboard.showChat(root, username));
+ btnPrivateChat.setOnAction(e -> root.setCenter(new PrivateChatUI(userId).getView()));
+ btnLogout.setOnAction(e -> new App().start(stage));
+
+ Scene scene = new Scene(root, 900, 600);
+ stage.setTitle("Faculty Dashboard");
+ stage.setScene(scene);
+ }
+
+ private void showTimetable(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+ Label title = new Label("College Timetable");
+ title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;");
+
+ TableView table = new TableView<>();
+ setupTimetableTable(table);
+ loadTimetable(table);
+
+ content.getChildren().addAll(title, table);
+ root.setCenter(content);
+ }
+
+ private void showEvents(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+ Label title = new Label("Upcoming Events");
+ title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;");
+
+ ListView listView = new ListView<>();
+ try (Connection conn = DatabaseManager.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT title, description, event_date FROM events ORDER BY event_date ASC")) {
+ while (rs.next()) {
+ listView.getItems().add(rs.getString("event_date") + " - " + rs.getString("title") + "\n" + rs.getString("description"));
+ }
+ } catch (SQLException e) { e.printStackTrace(); }
+
+ content.getChildren().addAll(title, listView);
+ root.setCenter(content);
+ }
+
+ private void setupTimetableTable(TableView table) {
+ TableColumn colDay = new TableColumn<>("Day");
+ colDay.setCellValueFactory(new PropertyValueFactory<>("day"));
+ TableColumn colTime = new TableColumn<>("Time");
+ colTime.setCellValueFactory(new PropertyValueFactory<>("timeSlot"));
+ TableColumn colSub = new TableColumn<>("Subject");
+ colSub.setCellValueFactory(new PropertyValueFactory<>("subject"));
+ TableColumn colFac = new TableColumn<>("Faculty");
+ colFac.setCellValueFactory(new PropertyValueFactory<>("facultyName"));
+ table.getColumns().addAll(colDay, colTime, colSub, colFac);
+ }
+
+ private void loadTimetable(TableView table) {
+ ObservableList data = FXCollections.observableArrayList();
+ try (Connection conn = DatabaseManager.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT day, time_slot, subject, faculty_name FROM timetable")) {
+ while (rs.next()) {
+ data.add(new TimetableEntry(rs.getString("day"), rs.getString("time_slot"), rs.getString("subject"), rs.getString("faculty_name")));
+ }
+ } catch (SQLException e) { e.printStackTrace(); }
+ table.setItems(data);
+ }
+
+ public static class TimetableEntry {
+ private String day, timeSlot, subject, facultyName;
+ public TimetableEntry(String d, String t, String s, String f) { day = d; timeSlot = t; subject = s; facultyName = f; }
+ public String getDay() { return day; }
+ public String getTimeSlot() { return timeSlot; }
+ public String getSubject() { return subject; }
+ public String getFacultyName() { return facultyName; }
+ }
+
+ private Button createSidebarButton(String text) {
+ Button btn = new Button(text);
+ btn.setMaxWidth(Double.MAX_VALUE);
+ btn.setStyle("-fx-background-color: transparent; -fx-text-fill: white; -fx-alignment: CENTER_LEFT;");
+ return btn;
+ }
+
+ private void showAttendanceManagement(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+
+ Label title = new Label("Mark Attendance");
+ title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;");
+
+ DatePicker datePicker = new DatePicker(LocalDate.now());
+ TableView table = new TableView<>();
+ setupStudentTable(table);
+ loadStudents(table);
+
+ HBox controls = new HBox(10);
+ Button btnPresent = new Button("Mark Present");
+ Button btnAbsent = new Button("Mark Absent");
+ controls.getChildren().addAll(new Label("Date:"), datePicker, btnPresent, btnAbsent);
+
+ btnPresent.setOnAction(e -> markAttendance(table, datePicker.getValue(), "PRESENT"));
+ btnAbsent.setOnAction(e -> markAttendance(table, datePicker.getValue(), "ABSENT"));
+
+ content.getChildren().addAll(title, controls, table);
+ root.setCenter(content);
+ }
+
+ private void showMarksEntry(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+
+ Label title = new Label("Enter Marks");
+ title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;");
+
+ TableView table = new TableView<>();
+ setupStudentTable(table);
+ loadStudents(table);
+
+ HBox controls = new HBox(10);
+ TextField txtSubject = new TextField();
+ txtSubject.setPromptText("Subject");
+ TextField txtScore = new TextField();
+ txtScore.setPromptText("Score");
+ Button btnSave = new Button("Save Mark");
+
+ controls.getChildren().addAll(txtSubject, txtScore, btnSave);
+
+ btnSave.setOnAction(e -> saveMark(table, txtSubject.getText(), txtScore.getText()));
+
+ content.getChildren().addAll(title, controls, table);
+ root.setCenter(content);
+ }
+
+ private void setupStudentTable(TableView table) {
+ TableColumn colId = new TableColumn<>("ID");
+ colId.setCellValueFactory(new PropertyValueFactory<>("id"));
+ TableColumn colUser = new TableColumn<>("Student Name");
+ colUser.setCellValueFactory(new PropertyValueFactory<>("username"));
+ table.getColumns().addAll(colId, colUser);
+ }
+
+ private void loadStudents(TableView table) {
+ ObservableList students = FXCollections.observableArrayList();
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("SELECT id, username FROM users WHERE role = 'STUDENT'")) {
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next()) {
+ students.add(new User(rs.getInt("id"), rs.getString("username"), "STUDENT", ""));
+ }
+ } catch (SQLException e) { e.printStackTrace(); }
+ table.setItems(students);
+ }
+
+ private void markAttendance(TableView table, LocalDate date, String status) {
+ User selected = table.getSelectionModel().getSelectedItem();
+ if (selected == null || date == null) return;
+
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO attendance (student_id, date, status) VALUES (?, ?, ?)")) {
+ pstmt.setInt(1, selected.getId());
+ pstmt.setString(2, date.toString());
+ pstmt.setString(3, status);
+ pstmt.executeUpdate();
+ showAlert("Success", "Attendance marked as " + status);
+ } catch (SQLException e) { e.printStackTrace(); }
+ }
+
+ private void saveMark(TableView table, String subject, String scoreStr) {
+ User selected = table.getSelectionModel().getSelectedItem();
+ if (selected == null || subject.isEmpty() || scoreStr.isEmpty()) return;
+
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("INSERT INTO marks (student_id, subject, score) VALUES (?, ?, ?)")) {
+ pstmt.setInt(1, selected.getId());
+ pstmt.setString(2, subject);
+ pstmt.setDouble(3, Double.parseDouble(scoreStr));
+ pstmt.executeUpdate();
+ showAlert("Success", "Marks saved for " + subject);
+ } catch (Exception e) { e.printStackTrace(); }
+ }
+
+ private void showAlert(String title, String content) {
+ Alert alert = new Alert(Alert.AlertType.INFORMATION);
+ alert.setTitle(title);
+ alert.setHeaderText(null);
+ alert.setContentText(content);
+ alert.showAndWait();
+ }
+}
diff --git a/src/main/java/com/college/management/PrivateChatUI.java b/src/main/java/com/college/management/PrivateChatUI.java
new file mode 100644
index 0000000..03c1c47
--- /dev/null
+++ b/src/main/java/com/college/management/PrivateChatUI.java
@@ -0,0 +1,96 @@
+package com.college.management;
+
+import javafx.geometry.Insets;
+import javafx.scene.control.*;
+import javafx.scene.layout.*;
+import java.util.List;
+
+public class PrivateChatUI {
+ private int currentUserId;
+ private User selectedUser;
+ private TextArea chatArea;
+ private ListView userList;
+
+ public PrivateChatUI(int currentUserId) {
+ this.currentUserId = currentUserId;
+ }
+
+ public Pane getView() {
+ BorderPane layout = new BorderPane();
+
+ // Left side: User List
+ VBox leftPane = new VBox(10);
+ leftPane.setPadding(new Insets(10));
+ leftPane.setPrefWidth(200);
+ Label userLbl = new Label("Contacts");
+ userLbl.setStyle("-fx-font-weight: bold;");
+
+ userList = new ListView<>();
+ refreshUserList();
+
+ userList.setCellFactory(param -> new ListCell() {
+ @Override
+ protected void updateItem(User item, boolean empty) {
+ super.updateItem(item, empty);
+ if (empty || item == null) setText(null);
+ else setText(item.getUsername() + " (" + item.getRole() + ")");
+ }
+ });
+
+ leftPane.getChildren().addAll(userLbl, userList);
+ layout.setLeft(leftPane);
+
+ // Center: Chat Area
+ VBox chatPane = new VBox(10);
+ chatPane.setPadding(new Insets(10));
+
+ chatArea = new TextArea();
+ chatArea.setEditable(false);
+ chatArea.setPrefHeight(400);
+ chatArea.setWrapText(true);
+
+ HBox inputPane = new HBox(10);
+ TextField txtMsg = new TextField();
+ txtMsg.setPrefWidth(400);
+ Button btnSend = new Button("Send");
+ inputPane.getChildren().addAll(txtMsg, btnSend);
+
+ chatPane.getChildren().addAll(new Label("Chat Window"), chatArea, inputPane);
+ layout.setCenter(chatPane);
+
+ // Logic
+ userList.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal) -> {
+ selectedUser = newVal;
+ refreshMessages();
+ });
+
+ btnSend.setOnAction(e -> {
+ if (selectedUser != null && !txtMsg.getText().isEmpty()) {
+ ChatService.sendPrivateMessage(currentUserId, selectedUser.getId(), txtMsg.getText());
+ txtMsg.clear();
+ refreshMessages();
+ }
+ });
+
+ return layout;
+ }
+
+ private void refreshUserList() {
+ List users = ChatService.getChatableUsers(currentUserId, null);
+ userList.getItems().setAll(users);
+ }
+
+ private void refreshMessages() {
+ if (selectedUser == null) {
+ chatArea.setText("Select a contact to start chatting.");
+ return;
+ }
+ List history = ChatService.getPrivateConversation(currentUserId, selectedUser.getId());
+ StringBuilder sb = new StringBuilder();
+ for (String msg : history) {
+ sb.append(msg).append("\n");
+ }
+ chatArea.setText(sb.toString());
+ chatArea.setScrollTop(Double.MAX_VALUE);
+ }
+}
diff --git a/src/main/java/com/college/management/ReportGenerator.java b/src/main/java/com/college/management/ReportGenerator.java
new file mode 100644
index 0000000..aed55f7
--- /dev/null
+++ b/src/main/java/com/college/management/ReportGenerator.java
@@ -0,0 +1,57 @@
+package com.college.management;
+
+import com.itextpdf.kernel.pdf.PdfDocument;
+import com.itextpdf.kernel.pdf.PdfWriter;
+import com.itextpdf.layout.Document;
+import com.itextpdf.layout.element.Paragraph;
+import com.itextpdf.layout.element.Table;
+import org.apache.commons.csv.CSVFormat;
+import org.apache.commons.csv.CSVPrinter;
+
+import java.io.FileWriter;
+import java.io.IOException;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+
+public class ReportGenerator {
+
+ public static void exportStudentsCSV(String filePath) throws Exception {
+ try (Connection conn = DatabaseManager.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT id, username, role FROM users WHERE role = 'STUDENT'");
+ CSVPrinter printer = new CSVPrinter(new FileWriter(filePath), CSVFormat.DEFAULT.withHeader("ID", "Username", "Role"))) {
+ while (rs.next()) {
+ printer.printRecord(rs.getInt("id"), rs.getString("username"), rs.getString("role"));
+ }
+ }
+ }
+
+ public static void exportStudentsPDF(String filePath) throws Exception {
+ PdfWriter writer = new PdfWriter(filePath);
+ PdfDocument pdf = new PdfDocument(writer);
+ Document document = new Document(pdf);
+
+ document.add(new Paragraph("Student Report").setFontSize(20).setBold());
+
+ float[] columnWidths = {50f, 200f, 100f};
+ Table table = new Table(columnWidths);
+
+ table.addCell("ID");
+ table.addCell("Username");
+ table.addCell("Role");
+
+ try (Connection conn = DatabaseManager.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT id, username, role FROM users WHERE role = 'STUDENT'")) {
+ while (rs.next()) {
+ table.addCell(String.valueOf(rs.getInt("id")));
+ table.addCell(rs.getString("username"));
+ table.addCell(rs.getString("role"));
+ }
+ }
+
+ document.add(table);
+ document.close();
+ }
+}
diff --git a/src/main/java/com/college/management/StudentDashboard.java b/src/main/java/com/college/management/StudentDashboard.java
new file mode 100644
index 0000000..c74b433
--- /dev/null
+++ b/src/main/java/com/college/management/StudentDashboard.java
@@ -0,0 +1,208 @@
+package com.college.management;
+
+import javafx.geometry.Insets;
+import javafx.scene.Scene;
+import javafx.scene.control.*;
+import javafx.scene.layout.*;
+import javafx.stage.Stage;
+import java.sql.*;
+import javafx.collections.FXCollections;
+import javafx.collections.ObservableList;
+import javafx.scene.control.cell.PropertyValueFactory;
+
+public class StudentDashboard {
+ private Stage stage;
+ private int studentId;
+ private String studentName;
+
+ public StudentDashboard(Stage stage, int studentId, String studentName) {
+ this.stage = stage;
+ this.studentId = studentId;
+ this.studentName = studentName;
+ }
+
+ public void show() {
+ BorderPane root = new BorderPane();
+
+ VBox sidebar = new VBox(10);
+ sidebar.setPadding(new Insets(20));
+ sidebar.setStyle("-fx-background-color: #16a085;");
+ sidebar.setPrefWidth(200);
+
+ Label brand = new Label("Student Panel");
+ brand.setStyle("-fx-text-fill: white; -fx-font-size: 18px; -fx-font-weight: bold;");
+ Label nameLbl = new Label("Welcome, " + studentName);
+ nameLbl.setStyle("-fx-text-fill: #ecf0f1; -fx-font-size: 12px;");
+
+ Button btnMarks = createSidebarButton("My Marks");
+ Button btnAttendance = createSidebarButton("My Attendance");
+ Button btnTimetable = createSidebarButton("Time Table");
+ Button btnEvents = createSidebarButton("Upcoming Events");
+ Button btnChat = createSidebarButton("Global Chat");
+ Button btnPrivateChat = createSidebarButton("Private Chat");
+ Button btnNotices = createSidebarButton("Notices");
+ Button btnLogout = createSidebarButton("Logout");
+
+ sidebar.getChildren().addAll(brand, nameLbl, new Separator(), btnMarks, btnAttendance, btnTimetable, btnEvents, btnChat, btnPrivateChat, btnNotices, btnLogout);
+ root.setLeft(sidebar);
+
+ showMarks(root);
+
+ btnMarks.setOnAction(e -> showMarks(root));
+ btnAttendance.setOnAction(e -> showAttendance(root));
+ btnTimetable.setOnAction(e -> showTimetable(root));
+ btnEvents.setOnAction(e -> showEvents(root));
+ btnChat.setOnAction(e -> AdminDashboard.showChat(root, studentName));
+ btnPrivateChat.setOnAction(e -> root.setCenter(new PrivateChatUI(studentId).getView()));
+ btnNotices.setOnAction(e -> showNotices(root));
+ btnLogout.setOnAction(e -> new App().start(stage));
+
+ Scene scene = new Scene(root, 900, 600);
+ stage.setTitle("Student Dashboard - " + studentName);
+ stage.setScene(scene);
+ }
+
+ private void showTimetable(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+ Label title = new Label("Class Schedule");
+ title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;");
+
+ TableView table = new TableView<>();
+ setupTimetableTable(table);
+ loadTimetable(table);
+
+ content.getChildren().addAll(title, table);
+ root.setCenter(content);
+ }
+
+ private void setupTimetableTable(TableView table) {
+ TableColumn colDay = new TableColumn<>("Day");
+ colDay.setCellValueFactory(new PropertyValueFactory<>("day"));
+ TableColumn colTime = new TableColumn<>("Time");
+ colTime.setCellValueFactory(new PropertyValueFactory<>("timeSlot"));
+ TableColumn colSub = new TableColumn<>("Subject");
+ colSub.setCellValueFactory(new PropertyValueFactory<>("subject"));
+ TableColumn colFac = new TableColumn<>("Faculty");
+ colFac.setCellValueFactory(new PropertyValueFactory<>("facultyName"));
+ table.getColumns().addAll(colDay, colTime, colSub, colFac);
+ }
+
+ private void loadTimetable(TableView table) {
+ ObservableList data = FXCollections.observableArrayList();
+ try (Connection conn = DatabaseManager.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT day, time_slot, subject, faculty_name FROM timetable")) {
+ while (rs.next()) {
+ data.add(new FacultyDashboard.TimetableEntry(rs.getString("day"), rs.getString("time_slot"), rs.getString("subject"), rs.getString("faculty_name")));
+ }
+ } catch (SQLException e) { e.printStackTrace(); }
+ table.setItems(data);
+ }
+
+ private void showEvents(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+ Label title = new Label("Upcoming Events");
+ title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;");
+
+ ListView listView = new ListView<>();
+ try (Connection conn = DatabaseManager.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT title, description, event_date FROM events ORDER BY event_date ASC")) {
+ while (rs.next()) {
+ listView.getItems().add(rs.getString("event_date") + " - " + rs.getString("title") + "\n" + rs.getString("description"));
+ }
+ } catch (SQLException e) { e.printStackTrace(); }
+
+ content.getChildren().addAll(title, listView);
+ root.setCenter(content);
+ }
+
+ private Button createSidebarButton(String text) {
+ Button btn = new Button(text);
+ btn.setMaxWidth(Double.MAX_VALUE);
+ btn.setStyle("-fx-background-color: transparent; -fx-text-fill: white; -fx-alignment: CENTER_LEFT;");
+ return btn;
+ }
+
+ private void showMarks(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+ Label title = new Label("Academic Results");
+ title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;");
+
+ TableView table = new TableView<>();
+ TableColumn colSub = new TableColumn<>("Subject");
+ colSub.setCellValueFactory(new PropertyValueFactory<>("subject"));
+ TableColumn colScore = new TableColumn<>("Score");
+ colScore.setCellValueFactory(new PropertyValueFactory<>("score"));
+ table.getColumns().addAll(colSub, colScore);
+
+ ObservableList data = FXCollections.observableArrayList();
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("SELECT subject, score FROM marks WHERE student_id = ?")) {
+ pstmt.setInt(1, studentId);
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next()) {
+ data.add(new MarkRecord(rs.getString("subject"), rs.getDouble("score")));
+ }
+ } catch (SQLException e) { e.printStackTrace(); }
+ table.setItems(data);
+
+ content.getChildren().addAll(title, table);
+ root.setCenter(content);
+ }
+
+ private void showAttendance(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+ Label title = new Label("Attendance Records");
+ title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;");
+
+ int present = 0, total = 0;
+ try (Connection conn = DatabaseManager.getConnection();
+ PreparedStatement pstmt = conn.prepareStatement("SELECT status FROM attendance WHERE student_id = ?")) {
+ pstmt.setInt(1, studentId);
+ ResultSet rs = pstmt.executeQuery();
+ while (rs.next()) {
+ total++;
+ if ("PRESENT".equals(rs.getString("status"))) present++;
+ }
+ } catch (SQLException e) { e.printStackTrace(); }
+
+ double percent = total == 0 ? 0 : (double) present / total * 100;
+ Label stats = new Label(String.format("Attendance: %d/%d (%.2f%%)", present, total, percent));
+ stats.setStyle("-fx-font-size: 18px;");
+
+ content.getChildren().addAll(title, stats);
+ root.setCenter(content);
+ }
+
+ private void showNotices(BorderPane root) {
+ VBox content = new VBox(15);
+ content.setPadding(new Insets(20));
+ Label title = new Label("College Notices");
+ title.setStyle("-fx-font-size: 22px; -fx-font-weight: bold;");
+
+ ListView listView = new ListView<>();
+ try (Connection conn = DatabaseManager.getConnection();
+ Statement stmt = conn.createStatement();
+ ResultSet rs = stmt.executeQuery("SELECT title, content, date FROM notices ORDER BY id DESC")) {
+ while (rs.next()) {
+ listView.getItems().add(rs.getString("date") + " - " + rs.getString("title") + "\n" + rs.getString("content"));
+ }
+ } catch (SQLException e) { e.printStackTrace(); }
+
+ content.getChildren().addAll(title, listView);
+ root.setCenter(content);
+ }
+
+ public static class MarkRecord {
+ private String subject;
+ private double score;
+ public MarkRecord(String subject, double score) { this.subject = subject; this.score = score; }
+ public String getSubject() { return subject; }
+ public double getScore() { return score; }
+ }
+}
diff --git a/src/main/java/com/college/management/User.java b/src/main/java/com/college/management/User.java
new file mode 100644
index 0000000..628fddd
--- /dev/null
+++ b/src/main/java/com/college/management/User.java
@@ -0,0 +1,20 @@
+package com.college.management;
+
+public class User {
+ private int id;
+ private String username;
+ private String role;
+ private String fullName;
+
+ public User(int id, String username, String role, String fullName) {
+ this.id = id;
+ this.username = username;
+ this.role = role;
+ this.fullName = fullName;
+ }
+
+ public int getId() { return id; }
+ public String getUsername() { return username; }
+ public String getRole() { return role; }
+ public String getFullName() { return fullName; }
+}
diff --git a/target/classes/com/college/management/AdminDashboard$TableValue.class b/target/classes/com/college/management/AdminDashboard$TableValue.class
new file mode 100644
index 0000000..06ece5d
Binary files /dev/null and b/target/classes/com/college/management/AdminDashboard$TableValue.class differ
diff --git a/target/classes/com/college/management/AdminDashboard.class b/target/classes/com/college/management/AdminDashboard.class
new file mode 100644
index 0000000..a7a1205
Binary files /dev/null and b/target/classes/com/college/management/AdminDashboard.class differ
diff --git a/target/classes/com/college/management/App.class b/target/classes/com/college/management/App.class
new file mode 100644
index 0000000..1ed4dc7
Binary files /dev/null and b/target/classes/com/college/management/App.class differ
diff --git a/target/classes/com/college/management/ChatService.class b/target/classes/com/college/management/ChatService.class
new file mode 100644
index 0000000..5b341a5
Binary files /dev/null and b/target/classes/com/college/management/ChatService.class differ
diff --git a/target/classes/com/college/management/DatabaseManager.class b/target/classes/com/college/management/DatabaseManager.class
new file mode 100644
index 0000000..b4f8c8e
Binary files /dev/null and b/target/classes/com/college/management/DatabaseManager.class differ
diff --git a/target/classes/com/college/management/FacultyDashboard$TimetableEntry.class b/target/classes/com/college/management/FacultyDashboard$TimetableEntry.class
new file mode 100644
index 0000000..4c4da40
Binary files /dev/null and b/target/classes/com/college/management/FacultyDashboard$TimetableEntry.class differ
diff --git a/target/classes/com/college/management/FacultyDashboard.class b/target/classes/com/college/management/FacultyDashboard.class
new file mode 100644
index 0000000..408f35c
Binary files /dev/null and b/target/classes/com/college/management/FacultyDashboard.class differ
diff --git a/target/classes/com/college/management/PrivateChatUI$1.class b/target/classes/com/college/management/PrivateChatUI$1.class
new file mode 100644
index 0000000..e189b69
Binary files /dev/null and b/target/classes/com/college/management/PrivateChatUI$1.class differ
diff --git a/target/classes/com/college/management/PrivateChatUI.class b/target/classes/com/college/management/PrivateChatUI.class
new file mode 100644
index 0000000..d7f5e42
Binary files /dev/null and b/target/classes/com/college/management/PrivateChatUI.class differ
diff --git a/target/classes/com/college/management/ReportGenerator.class b/target/classes/com/college/management/ReportGenerator.class
new file mode 100644
index 0000000..7c51a91
Binary files /dev/null and b/target/classes/com/college/management/ReportGenerator.class differ
diff --git a/target/classes/com/college/management/StudentDashboard$MarkRecord.class b/target/classes/com/college/management/StudentDashboard$MarkRecord.class
new file mode 100644
index 0000000..77a8d48
Binary files /dev/null and b/target/classes/com/college/management/StudentDashboard$MarkRecord.class differ
diff --git a/target/classes/com/college/management/StudentDashboard.class b/target/classes/com/college/management/StudentDashboard.class
new file mode 100644
index 0000000..d712aaa
Binary files /dev/null and b/target/classes/com/college/management/StudentDashboard.class differ
diff --git a/target/classes/com/college/management/User.class b/target/classes/com/college/management/User.class
new file mode 100644
index 0000000..8538855
Binary files /dev/null and b/target/classes/com/college/management/User.class differ
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
new file mode 100644
index 0000000..9128776
--- /dev/null
+++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst
@@ -0,0 +1,13 @@
+com/college/management/StudentDashboard.class
+com/college/management/FacultyDashboard.class
+com/college/management/ReportGenerator.class
+com/college/management/PrivateChatUI.class
+com/college/management/DatabaseManager.class
+com/college/management/AdminDashboard$TableValue.class
+com/college/management/App.class
+com/college/management/PrivateChatUI$1.class
+com/college/management/ChatService.class
+com/college/management/User.class
+com/college/management/FacultyDashboard$TimetableEntry.class
+com/college/management/StudentDashboard$MarkRecord.class
+com/college/management/AdminDashboard.class
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 0000000..a9b3e02
--- /dev/null
+++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
@@ -0,0 +1,9 @@
+/home/balraj/Work/Smart College Management System/src/main/java/com/college/management/DatabaseManager.java
+/home/balraj/Work/Smart College Management System/src/main/java/com/college/management/App.java
+/home/balraj/Work/Smart College Management System/src/main/java/com/college/management/ChatService.java
+/home/balraj/Work/Smart College Management System/src/main/java/com/college/management/ReportGenerator.java
+/home/balraj/Work/Smart College Management System/src/main/java/com/college/management/PrivateChatUI.java
+/home/balraj/Work/Smart College Management System/src/main/java/com/college/management/AdminDashboard.java
+/home/balraj/Work/Smart College Management System/src/main/java/com/college/management/FacultyDashboard.java
+/home/balraj/Work/Smart College Management System/src/main/java/com/college/management/StudentDashboard.java
+/home/balraj/Work/Smart College Management System/src/main/java/com/college/management/User.java