Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб_24 Головков И.Е. 12001208.docx
Скачиваний:
1
Добавлен:
26.06.2024
Размер:
122.48 Кб
Скачать
  1. Листинг класса MenuController

package com.course.courseud; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.layout.VBox; import java.util.Optional; import static com.course.courseud.UDApp.*; public class MenuController { @FXML private Button goToDeletesButton; @FXML private Button goToInsertsButton; @FXML private Button goToSelectsButton; @FXML private Button goToUpdatesButton; @FXML private Button goToGuestMenuButton; static boolean firstTimeAuth = true; UtilsController utilsController = new UtilsController(); @FXML public void initialize() { goToInsertsButton.setOnAction(actionEvent -> utilsController.openNewWindow(goToInsertsButton, "table_inserts.fxml")); goToSelectsButton.setOnAction(actionEvent -> utilsController.openNewWindow(goToSelectsButton, "table_selects.fxml")); goToUpdatesButton.setOnAction(actionEvent -> utilsController.openNewWindow(goToUpdatesButton, "table_updates.fxml")); goToDeletesButton.setOnAction(actionEvent -> utilsController.openNewWindow(goToDeletesButton, "table_deletes.fxml")); goToGuestMenuButton.setOnAction(actionEvent -> utilsController.openNewWindow(goToGuestMenuButton, "guest_menu.fxml")); //authUser(); закомментировать коннектЮзер connectUser(); } public void authUser() { if (firstTimeAuth) { Alert alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Вход"); alert.setHeaderText(null); VBox dialogPaneContent = new VBox(); Label userLabel = new Label("Имя пользователя"); TextField userTextField = new TextField(); Label passwordLabel = new Label("Пароль"); PasswordField passwordTextField = new PasswordField(); dialogPaneContent.getChildren().addAll(userLabel, userTextField, passwordLabel, passwordTextField); alert.getDialogPane().setContent(dialogPaneContent); ButtonType enter = new ButtonType("Войти"); // Remove default ButtonTypes alert.getButtonTypes().setAll(enter); Optional<ButtonType> option = alert.showAndWait(); if (option.get() == enter) { DB_USER = userTextField.getText(); DB_PASSWORD = passwordTextField.getText(); connectUser(); } firstTimeAuth = false; } } }

  1. Листинг класса SelectsController

package com.course.courseud; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.*; import javafx.scene.control.Button; import javafx.scene.control.TextField; import java.awt.*; import java.io.*; import java.nio.charset.StandardCharsets; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; import java.time.LocalDate; import java.time.LocalTime; import java.time.temporal.ChronoUnit; import java.io.File; import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.poi.xwpf.usermodel.XWPFStyles; import org.apache.poi.xwpf.usermodel.XWPFTable; import org.apache.poi.xwpf.usermodel.XWPFTableRow; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTFonts; import org.apache.poi.xwpf.usermodel.XWPFParagraph; import org.apache.poi.xwpf.usermodel.XWPFRun; public class SelectsController { @FXML private Button goToMenuButton; @FXML private Button refreshButton; @FXML private Button infoButton; @FXML private Button customQueryButton; @FXML private ComboBox<String> tablesComboBox; @FXML private TableView<ObservableList<String>> selectsTable; @FXML private TextField whereTextField; @FXML private ComboBox<String> orderByComboBox; @FXML private CheckBox ascCheckBox; UtilsController utilsController = new UtilsController(); @FXML public void initialize() { String instr = """ 1) Кнопка "<" - возвращает в главное меню. 2) Кнопка с изображением закрученных стрелок - обновляет и показывает выбранную таблицу. 3) Кнопка "i" (эта кнопка) - выводит окно справки. 4) Кнопка с изображением головы и шестерни - открывает окно для написания непосредественно SQL-запросов в приложении разработчиком. 5) Поле с выпадающим списком и подсказкой "Выбрать из доступных таблиц..." - открывает для выбора список всех таблиц базы данных. 6) Поле ввода условий и подсказкой "Условие для выборки..." - позволяет записывать условия для выборки из выбранной таблицы. Значения нужно записывать в форматах: а) "столбец = значение" для поиска нужного, б) "столбец >/< значение" для фильтрации/ Условия разделять словами "AND","OR", "и", "или", либо заятой (что равно "и"). 7) Поле с выпадающим списком и подсказкой "Сортировать по колонке..." - открывает для выбора список всех столбцов выбранной таблицы. 8) Флажок "По возрастанию" сортирует таблицу по выбранному столбцу по возрастанию, либо по убыванию, если флажок снят. 9) Кнопка с подписью "Создать отчёт" формирует отчёт по выбранным данным в формате html-файла и открывает его в браузере по умолчанию. Стандартный алгоритм: 1. Выбрать таблицу в поле с выпадающим списком 2. Ввести условие для выборки (Опционально) 2.1. Нажать Enter, не выходя из поля ввода 3. Выбрать столбец для сортировки в слующем поле с выпадающим списком (Опционально) 4. Оставить или снять флажок "По возрастанию" (Опционально) 5. Создать отчёт (Опционально) """; infoButton.setOnAction(actionEvent -> utilsController.showInstructionWindow(instr)); goToMenuButton.setOnAction(actionEvent -> utilsController.openNewWindow(goToMenuButton, "menu.fxml")); customQueryButton.setOnAction(actionEvent -> utilsController.openNewWindow(customQueryButton, "custom_query.fxml")); tablesComboBox.setOnAction(actionEvent -> { orderByComboBox.setOnAction(null); orderByComboBox.setValue(""); makeTableView(); fillOrderByComboBox(); orderByComboBox.setOnAction(actionEvent1 -> makeTableView()); }); whereTextField.setOnAction(actionEvent -> { orderByComboBox.setOnAction(null); orderByComboBox.setValue(""); makeTableView(); fillOrderByComboBox(); orderByComboBox.setOnAction(actionEvent1 -> makeTableView()); }); fillTablesComboBox(); } private void fillTablesComboBox() { tablesComboBox.getItems().addAll(utilsController.getTablesNames()); } private void fillOrderByComboBox() { ObservableList<String> columns = FXCollections.observableArrayList(); for (TableColumn<ObservableList<String>, ?> tc : selectsTable.getColumns()) { columns.add(tc.getText()); } orderByComboBox.setItems(columns); } @FXML private void makeTableView() { selectsTable.getColumns().clear(); String sqlQuery = "SELECT * FROM " + tablesComboBox.getValue(); sqlQuery = utilsController.appendWhereAndOrderByToQuery(whereTextField, orderByComboBox, ascCheckBox, sqlQuery); utilsController.fillTableWithSqlQuery(selectsTable, sqlQuery); } @FXML public void createReport() { File file = new File("reports.html"); try (FileWriter fw = new FileWriter(file.getPath(), StandardCharsets.UTF_8)) { fw.write(""" <!DOCTYPE html> <html> <head> <link rel="icon" href="icons8-report-100.png"/> <meta charset="utf-8" /> <title>Очёт</title> <style> body { background-color: #FFFFFF; /*цвет фона*/ font-family: "Segoe UI", sans-serif; font-size: 18px; text-align: center; } table { margin: auto; padding: 1em; width: 50%; } tr, td { border: 3px solid #6699ff; padding: 0em 1em; } tr:hover { background-color: #B3CCFF; } </style> </head> <body> <table> """); fw.write("<tr><td colspan=\"999\" style=\"border:0;background-color:#B3CCFF;\"> Отчёт по данным таблицы " + tablesComboBox.getValue() + "<br>Дата создания: " + LocalDate.now() + "<br>Время создания: " + LocalTime.now().truncatedTo(ChronoUnit.SECONDS) + " </td></tr>"); String sqlQuery = "SELECT * FROM " + tablesComboBox.getValue(); sqlQuery = utilsController.appendWhereAndOrderByToQuery(whereTextField, orderByComboBox, ascCheckBox, sqlQuery); Statement statement = UDApp.connection.createStatement(); ResultSet resultSet = statement.executeQuery(sqlQuery); int rowCount = 0; ResultSetMetaData metaData; metaData = resultSet.getMetaData(); fw.write("<tr >"); for (int i = 1; i <= metaData.getColumnCount(); i++) { fw.write("<th style=\"border:3px solid #334C80;background-color:#B3CCFF;\">"); fw.write(metaData.getColumnName(i)); fw.write("</th>"); } fw.write("</tr>"); while (resultSet.next()) { fw.write("<tr>"); for (int i = 1; i <= metaData.getColumnCount(); i++) { fw.write("<td>"); fw.write(resultSet.getString(i)); fw.write("</td>"); } fw.write("</tr>"); rowCount++; } fw.write("<tr><td colspan=\"999\" style=\"border:0;background-color:#B3CCFF;\"> Итого записей:" + rowCount + " </td></tr>"); fw.write(""" </table> </body> </html> """); Desktop.getDesktop().browse(file.toURI()); } catch (SQLException e) { utilsController.showSqlExceptionWindow(e); } catch (IOException e) { throw new RuntimeException(e); } } @FXML public void createDocReport() { XWPFDocument document = new XWPFDocument(); XWPFParagraph paragraph = document.createParagraph(); XWPFRun run = paragraph.createRun(); run.setText("Отчёт по данным таблицы " + tablesComboBox.getValue()); paragraph = document.createParagraph(); run = paragraph.createRun(); run.setText("Дата создания: " + LocalDate.now()); paragraph = document.createParagraph(); run = paragraph.createRun(); run.setText("Время создания: " + LocalTime.now().truncatedTo(ChronoUnit.SECONDS)); XWPFStyles styles = document.createStyles(); CTFonts fonts = CTFonts.Factory.newInstance(); fonts.setHAnsi("Segoe UI"); fonts.setAscii("Segoe UI"); styles.setDefaultFonts(fonts); File file = new File("Отчёт.docx"); try (FileOutputStream fileOutputStream = new FileOutputStream(file)) { String sqlQuery = "SELECT * FROM " + tablesComboBox.getValue(); sqlQuery = utilsController.appendWhereAndOrderByToQuery(whereTextField, orderByComboBox, ascCheckBox, sqlQuery); Statement statement = UDApp.connection.createStatement(); ResultSet resultSet = statement.executeQuery(sqlQuery); ResultSetMetaData metaData = resultSet.getMetaData(); XWPFTable table = document.createTable(); XWPFTableRow headerRow = table.getRow(0); headerRow.getCell(0).setText(metaData.getColumnName(1)); for (int i = 2; i <= metaData.getColumnCount(); i++) { headerRow.addNewTableCell().setText(metaData.getColumnName(i)); } int rowCounter = 0; while (resultSet.next()) { XWPFTableRow dataRow = table.createRow(); rowCounter++; for (int i = 1; i <= metaData.getColumnCount(); i++) { String value = resultSet.getString(i); dataRow.getCell(i - 1).setText(value); } } paragraph = document.createParagraph(); run = paragraph.createRun(); run.setText("Итого записей: " + rowCounter); document.write(fileOutputStream); Desktop.getDesktop().browse(file.toURI()); } catch (IOException e) { throw new RuntimeException(e); } catch (SQLException e) { utilsController.showSqlExceptionWindow(e); throw new RuntimeException(e); } } }