/
evernotenkai
/
DataBaseXJavaProject
Обзор
Документация
Войти
/
evernotenkai
/
DataBaseXJavaProject
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/app/ui/admin/AdminUsersView.java
284 строки
16 KB
Makson4ik
Весь проект с src db и прочим делом
12 май 2026, 22:43
12 май 2026, 22:43
431f4aa
Код
Авторство
О чём код?
package app.ui.admin; import java.util.List; import app.model.StudentItem; import app.model.TeacherItem; import app.service.AdminService; import app.ui.components.PageHeader; import app.ui.components.UiKit; import app.util.Dialogs; import javafx.beans.property.SimpleStringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.collections.transformation.FilteredList; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.PasswordField; import javafx.scene.control.Tab; import javafx.scene.control.TabPane; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import javafx.scene.control.TextField; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; import javafx.scene.layout.Priority; import javafx.scene.layout.VBox; public class AdminUsersView extends VBox { public AdminUsersView(final AdminService service) { getStyleClass().add("content-root"); setSpacing(16); getChildren().add(new PageHeader("Пользователи", "Создание и сопровождение преподавателей и студентов в одном месте.")); TabPane tabs = new TabPane(); tabs.setTabClosingPolicy(TabPane.TabClosingPolicy.UNAVAILABLE); tabs.getTabs().add(new Tab("Преподаватели", buildTeacherPane(service))); tabs.getTabs().add(new Tab("Студенты", buildStudentPane(service))); getChildren().add(tabs); } private BorderPane buildTeacherPane(final AdminService service) { final ObservableList<TeacherItem> items = FXCollections.observableArrayList(service.findTeachers()); final FilteredList<TeacherItem> filtered = new FilteredList<TeacherItem>(items, p -> true); final TableView<TeacherItem> table = new TableView<TeacherItem>(); UiKit.configureTable(table); TableColumn<TeacherItem, String> c1 = new TableColumn<TeacherItem, String>("ФИО"); c1.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getFullName())); TableColumn<TeacherItem, String> c2 = new TableColumn<TeacherItem, String>("Кафедра"); c2.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getDepartment())); TableColumn<TeacherItem, String> c3 = new TableColumn<TeacherItem, String>("Email"); c3.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getEmail())); TableColumn<TeacherItem, String> c4 = new TableColumn<TeacherItem, String>("Логин"); c4.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getLogin())); table.getColumns().addAll(c1, c2, c3, c4); table.setItems(filtered); final TextField search = new TextField(); search.setPromptText("Поиск по преподавателю, кафедре или email"); search.textProperty().addListener((obs, old, value) -> filtered.setPredicate(item -> matchesTeacher(item, value))); Button reset = UiKit.ghostButton("Сбросить"); reset.setOnAction(e -> search.clear()); HBox teacherFilterBar = new HBox(10, search, reset); HBox.setHgrow(search, Priority.ALWAYS); final TextField fullName = new TextField(); final TextField department = new TextField(); final TextField email = new TextField(); final TextField phone = new TextField(); final TextField login = new TextField(); final PasswordField password = new PasswordField(); password.setPromptText("Пароль"); fullName.setPromptText("ФИО преподавателя"); department.setPromptText("Кафедра"); email.setPromptText("Email"); phone.setPromptText("Телефон"); login.setPromptText("Логин"); VBox form = UiKit.card( UiKit.section("Карточка преподавателя"), UiKit.fieldBox("ФИО", fullName, "Как будет отображаться в системе"), UiKit.fieldBox("Кафедра", department, "Например: Кафедра информатики"), UiKit.fieldBox("Email", email, "Уникальный контактный адрес"), UiKit.fieldBox("Телефон", phone, "Необязательно, но желательно"), UiKit.fieldBox("Логин", login, "Используется для входа"), UiKit.fieldBox("Пароль", password, "Пароль для входа"), buttonRow(new Button[] { UiKit.primaryButton("Создать"), UiKit.secondaryButton("Сохранить"), UiKit.dangerButton("Удалить"), UiKit.ghostButton("Очистить") }) ); final Button create = (Button) ((HBox) form.getChildren().get(form.getChildren().size() - 1)).getChildren().get(0); final Button update = (Button) ((HBox) form.getChildren().get(form.getChildren().size() - 1)).getChildren().get(1); final Button delete = (Button) ((HBox) form.getChildren().get(form.getChildren().size() - 1)).getChildren().get(2); final Button clear = (Button) ((HBox) form.getChildren().get(form.getChildren().size() - 1)).getChildren().get(3); table.getSelectionModel().selectedItemProperty().addListener((obs, old, sel) -> { if (sel == null) return; fullName.setText(sel.getFullName()); department.setText(sel.getDepartment()); email.setText(sel.getEmail()); phone.setText(sel.getPhone()); login.setText(sel.getLogin()); password.setText("1234"); }); create.setOnAction(e -> { try { service.createTeacher(fullName.getText(), department.getText(), email.getText(), phone.getText(), login.getText(), password.getText()); items.setAll(service.findTeachers()); clearFields(fullName, department, email, phone, login, password, table); } catch (Exception ex) { Dialogs.error("Ошибка создания преподавателя", ex); } }); update.setOnAction(e -> { try { TeacherItem sel = table.getSelectionModel().getSelectedItem(); if (sel == null) { Dialogs.info("Пользователи", "Выбери преподавателя в таблице."); return; } service.updateTeacher(sel.getTeacherId(), fullName.getText(), department.getText(), email.getText(), phone.getText(), login.getText(), password.getText()); items.setAll(service.findTeachers()); } catch (Exception ex) { Dialogs.error("Ошибка обновления преподавателя", ex); } }); delete.setOnAction(e -> { try { TeacherItem sel = table.getSelectionModel().getSelectedItem(); if (sel == null) { Dialogs.info("Пользователи", "Выбери преподавателя в таблице."); return; } if (Dialogs.confirm("Удаление", "Удалить преподавателя " + sel.getFullName() + "?")) { service.deleteTeacher(sel.getTeacherId()); items.setAll(service.findTeachers()); clearFields(fullName, department, email, phone, login, password, table); } } catch (Exception ex) { Dialogs.error("Ошибка удаления преподавателя", ex); } }); clear.setOnAction(e -> clearFields(fullName, department, email, phone, login, password, table)); BorderPane pane = new BorderPane(); pane.setTop(UiKit.card(UiKit.section("Поиск и фильтры"), teacherFilterBar)); BorderPane.setMargin(form, new Insets(0, 0, 0, 16)); BorderPane.setMargin(table, new Insets(0, 16, 0, 0)); pane.setLeft(UiKit.card(UiKit.section("Список преподавателей"), table)); pane.setRight(form); return pane; } private BorderPane buildStudentPane(final AdminService service) { final ObservableList<StudentItem> items = FXCollections.observableArrayList(service.findStudents()); final FilteredList<StudentItem> filtered = new FilteredList<StudentItem>(items, p -> true); final TableView<StudentItem> table = new TableView<StudentItem>(); UiKit.configureTable(table); TableColumn<StudentItem, String> c1 = new TableColumn<StudentItem, String>("ФИО"); c1.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getFullName())); TableColumn<StudentItem, String> c2 = new TableColumn<StudentItem, String>("Группа"); c2.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getGroupName())); TableColumn<StudentItem, String> c3 = new TableColumn<StudentItem, String>("Email"); c3.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getEmail())); TableColumn<StudentItem, String> c4 = new TableColumn<StudentItem, String>("Логин"); c4.setCellValueFactory(v -> new SimpleStringProperty(v.getValue().getLogin())); table.getColumns().addAll(c1, c2, c3, c4); table.setItems(filtered); final TextField search = new TextField(); search.setPromptText("Поиск по студенту, группе, email или логину"); search.textProperty().addListener((obs, old, value) -> filtered.setPredicate(item -> matchesStudent(item, value))); Button reset = UiKit.ghostButton("Сбросить"); reset.setOnAction(e -> search.clear()); HBox studentFilterBar = new HBox(10, search, reset); HBox.setHgrow(search, Priority.ALWAYS); final TextField fullName = new TextField(); final TextField groupName = new TextField(); final TextField email = new TextField(); final TextField phone = new TextField(); final TextField login = new TextField(); final PasswordField password = new PasswordField(); password.setPromptText("Пароль"); fullName.setPromptText("ФИО студента"); groupName.setPromptText("Группа"); email.setPromptText("Email"); phone.setPromptText("Телефон"); login.setPromptText("Логин"); VBox form = UiKit.card( UiKit.section("Карточка студента"), UiKit.fieldBox("ФИО", fullName, "Полное имя студента"), UiKit.fieldBox("Группа", groupName, "Например: ИС-21"), UiKit.fieldBox("Email", email, "Уникальный адрес для связи"), UiKit.fieldBox("Телефон", phone, "Необязательно"), UiKit.fieldBox("Логин", login, "Используется для входа"), UiKit.fieldBox("Пароль", password, "Пароль для входа"), buttonRow(new Button[] { UiKit.primaryButton("Создать"), UiKit.secondaryButton("Сохранить"), UiKit.dangerButton("Удалить"), UiKit.ghostButton("Очистить") }) ); final Button create = (Button) ((HBox) form.getChildren().get(form.getChildren().size() - 1)).getChildren().get(0); final Button update = (Button) ((HBox) form.getChildren().get(form.getChildren().size() - 1)).getChildren().get(1); final Button delete = (Button) ((HBox) form.getChildren().get(form.getChildren().size() - 1)).getChildren().get(2); final Button clear = (Button) ((HBox) form.getChildren().get(form.getChildren().size() - 1)).getChildren().get(3); table.getSelectionModel().selectedItemProperty().addListener((obs, old, sel) -> { if (sel == null) return; fullName.setText(sel.getFullName()); groupName.setText(sel.getGroupName()); email.setText(sel.getEmail()); phone.setText(sel.getPhone()); login.setText(sel.getLogin()); password.setText("1234"); }); create.setOnAction(e -> { try { service.createStudent(fullName.getText(), groupName.getText(), email.getText(), phone.getText(), login.getText(), password.getText()); items.setAll(service.findStudents()); clearFields(fullName, groupName, email, phone, login, password, table); } catch (Exception ex) { Dialogs.error("Ошибка создания студента", ex); } }); update.setOnAction(e -> { try { StudentItem sel = table.getSelectionModel().getSelectedItem(); if (sel == null) { Dialogs.info("Пользователи", "Выбери студента в таблице."); return; } service.updateStudent(sel.getStudentId(), fullName.getText(), groupName.getText(), email.getText(), phone.getText(), login.getText(), password.getText()); items.setAll(service.findStudents()); } catch (Exception ex) { Dialogs.error("Ошибка обновления студента", ex); } }); delete.setOnAction(e -> { try { StudentItem sel = table.getSelectionModel().getSelectedItem(); if (sel == null) { Dialogs.info("Пользователи", "Выбери студента в таблице."); return; } if (Dialogs.confirm("Удаление", "Удалить студента " + sel.getFullName() + "?")) { service.deleteStudent(sel.getStudentId()); items.setAll(service.findStudents()); clearFields(fullName, groupName, email, phone, login, password, table); } } catch (Exception ex) { Dialogs.error("Ошибка удаления студента", ex); } }); clear.setOnAction(e -> clearFields(fullName, groupName, email, phone, login, password, table)); BorderPane pane = new BorderPane(); pane.setTop(UiKit.card(UiKit.section("Поиск и фильтры"), studentFilterBar)); BorderPane.setMargin(form, new Insets(0, 0, 0, 16)); BorderPane.setMargin(table, new Insets(0, 16, 0, 0)); pane.setLeft(UiKit.card(UiKit.section("Список студентов"), table)); pane.setRight(form); return pane; } private boolean matchesTeacher(TeacherItem item, String query) { String q = query == null ? "" : query.trim().toLowerCase(); if (q.isEmpty()) return true; return contains(item.getFullName(), q) || contains(item.getDepartment(), q) || contains(item.getEmail(), q) || contains(item.getLogin(), q); } private boolean matchesStudent(StudentItem item, String query) { String q = query == null ? "" : query.trim().toLowerCase(); if (q.isEmpty()) return true; return contains(item.getFullName(), q) || contains(item.getGroupName(), q) || contains(item.getEmail(), q) || contains(item.getLogin(), q); } private boolean contains(String value, String query) { return value != null && value.toLowerCase().contains(query); } private HBox buttonRow(Button[] buttons) { HBox box = new HBox(10, buttons); box.setAlignment(Pos.CENTER_LEFT); return box; } private void clearFields(TextField a, TextField b, TextField c, TextField d, TextField e, TextField f, TableView<?> table) { a.clear(); b.clear(); c.clear(); d.clear(); e.clear(); f.clear(); table.getSelectionModel().clearSelection(); } }