diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml
new file mode 100644
index 0000000..74d8cf0
--- /dev/null
+++ b/.idea/inspectionProfiles/Project_Default.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
new file mode 100644
index 0000000..2b63946
--- /dev/null
+++ b/.idea/uiDesigner.xml
@@ -0,0 +1,124 @@
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+ -
+
+
+
+
+ -
+
+
+ -
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b6157a6
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+Оригинальная работа по созданию клиент серверного приложения
diff --git a/pom.xml b/pom.xml
index 3193d0f..3ccf9ec 100644
--- a/pom.xml
+++ b/pom.xml
@@ -5,7 +5,7 @@
4.0.0
org.example
- Kursovaya
+ TrainParcerPractice
1.0-SNAPSHOT
@@ -30,11 +30,60 @@
1.18.32
provided
+
+ org.springframework.boot
+ spring-boot-starter-data-jpa
+ 3.3.0
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+ 3.3.0
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+ 3.3.0
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ 3.3.0
+ runtime
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ 3.3.0
+ test
+
21
21
UTF-8
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.13.0
+
+
+ 21
+
+ -parameters
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/org/example/Main.java b/src/main/java/org/example/Main.java
deleted file mode 100644
index e5cba2d..0000000
--- a/src/main/java/org/example/Main.java
+++ /dev/null
@@ -1,104 +0,0 @@
-package org.example;
-import org.jsoup.*;
-import org.jsoup.nodes.Document;
-
-import org.jsoup.nodes.Element;
-import org.jsoup.select.Elements;
-import org.openqa.selenium.By;
-import org.openqa.selenium.WebDriver;
-import org.openqa.selenium.WebElement;
-import org.openqa.selenium.edge.EdgeDriver;
-import org.openqa.selenium.support.ui.ExpectedConditions;
-import org.openqa.selenium.support.ui.WebDriverWait;
-import java.io.IOException;
-
-import java.sql.*;
-import java.sql.Connection;
-import java.time.Duration;
-import java.util.ArrayList;
-import java.util.List;
-
-
-public class Main {
- static ListtrainNumbers = new ArrayList<>();
- static ListtrainDurations = new ArrayList<>();
- static ListtrainDates = new ArrayList<>();
- private static Connection connect;
- private static Statement statement;
- private static PreparedStatement prepare;
- private static ResultSet result;
-
-
- public static void main(String[] args) throws InterruptedException, SQLException {
-
-
- System.setProperty("webdriver.edge.driver", "D:\\WebDriver\\msedgedriver.exe");
- String url = "https://xn----btbhgbpv1d7d.xn--80aswg/kupit-zhd-bilety/#/sochi/krasnodar";
-
- WebDriver driver = new EdgeDriver();
- driver.get(url);
- Duration duration = Duration.ofSeconds(10);
- Thread.sleep(1200);
- String pageSource = driver.getPageSource();
- Document document = Jsoup.parse(pageSource);
- Elements trainNumElem = document.select("span.wg-train-info__number-link");
- Elements startDateElem = document.select("span.wg-track-info__date");
- Elements durationElem = document.select("span.wg-track-info__duration-time");
- for (Element element : trainNumElem) {
- String trainNumber = element.text();
- if(trainNumber.length()>7){
- continue;}
- trainNumbers.add(trainNumber);
-
- }
- for(Element element : startDateElem)
- {
- String trainDate = element.text();
- trainDates.add(trainDate);
- }
- for(Element element : durationElem)
- {
- String trainDuration = element.text();
- trainDurations.add(trainDuration);
- }
- printTrain();
- }
-
-
-
- static void dbWrite(Train train) throws SQLException {
- String sql = "INSERT INTO public.train(" + "train_id,train_duration,train_start,train_end)" + "VALUES (?, ?, ?, ?);";
- connect = database.connectDb();
- prepare = connect.prepareStatement(sql);
- prepare.setString(1,train.getNumber());
- prepare.setString(2,train.getDuration());
- prepare.setString(3,train.getStartDate());
- prepare.setString(4, train.getEndDate());
-
-
- prepare.executeUpdate();
-
- }
-
- static void printTrain() throws SQLException {
- Integer j=0;
- for(int i =0; i trainNumbers = new ArrayList<>();
+ static List trainDurations = new ArrayList<>();
+ static List trainDates = new ArrayList<>();
+
+ public static void runParsing() throws InterruptedException, SQLException {
+ LocalDate currentDate = LocalDate.now();
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd.MM.yyyy");
+ System.setProperty("webdriver.edge.driver", "D:\\WebDriver\\msedgedriver.exe");
+ EdgeOptions options = new EdgeOptions();
+ options.addArguments("--headless");
+ options.addArguments("--disable-gpu");
+ WebDriver driver = new EdgeDriver(options);
+
+ try {
+ for (int i = 0; i < 3; i++) {
+ String formattedDate = currentDate.format(formatter);
+ String url = "https://xn----btbhgbpv1d7d.xn--80aswg/kupit-zhd-bilety/#/sochi/krasnodar?date=" + formattedDate;
+ driver.get(url);
+
+ WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(20)); // Устанавливаем таймаут 20 секунд
+ wait.until(ExpectedConditions.presenceOfElementLocated(By.className("wg-train-container"))); // Указываем класс элемента
+
+ String pageSource = driver.getPageSource();
+ Document document = Jsoup.parse(pageSource);
+ ParsingData.parseTrainData(document);
+ currentDate = currentDate.plusDays(1);
+ }
+
+ printAndWriteTrains();
+ } finally {
+ driver.quit();
+ }
+ }
+
+
+ private static void printAndWriteTrains() throws SQLException {
+ int j = 0;
+ for (int i = 0; i < trainNumbers.size(); i++) {
+ TrainP trainP = new TrainP();
+ trainP.setNumber(trainNumbers.get(i));
+ trainP.setDuration(trainDurations.get(i));
+ trainP.setStartDate(trainDates.get(j));
+ trainP.setEndDate(trainDates.get(j + 1));
+
+ System.out.println("Номер поезда: " + trainP.getNumber());
+ System.out.println(trainP.getStartDate() + "------" + trainP.getDuration() + "------" + trainP.getEndDate());
+ System.out.println();
+
+ j += 2;
+ DatabaseWrite.dbWrite(trainP);
+ }
+ }
+
+
+}
diff --git a/src/main/java/org/example/parcer/ParsingData.java b/src/main/java/org/example/parcer/ParsingData.java
new file mode 100644
index 0000000..3f926d1
--- /dev/null
+++ b/src/main/java/org/example/parcer/ParsingData.java
@@ -0,0 +1,30 @@
+package org.example.parcer;
+
+import org.jsoup.nodes.Document;
+import org.jsoup.select.Elements;
+
+import static org.example.parcer.Parcer.*;
+
+public class ParsingData {
+
+ static void parseTrainData(Document document) {
+ Elements trainNumElem = document.select("span.wg-train-info__number-link");
+ Elements startDateElem = document.select("span.wg-track-info__date");
+ Elements durationElem = document.select("span.wg-track-info__duration-time");
+
+ for (var element : trainNumElem) {
+ String trainNumber = element.text();
+ if (trainNumber.length() <= 7) {
+ trainNumbers.add(trainNumber);
+ }
+ }
+
+ for (var element : startDateElem) {
+ trainDates.add(element.text());
+ }
+
+ for (var element : durationElem) {
+ trainDurations.add(element.text());
+ }
+ }
+}
diff --git a/src/main/java/org/example/spring/DemoApplication.java b/src/main/java/org/example/spring/DemoApplication.java
new file mode 100644
index 0000000..093cf49
--- /dev/null
+++ b/src/main/java/org/example/spring/DemoApplication.java
@@ -0,0 +1,19 @@
+package org.example.spring;
+
+
+import org.example.parcer.Parcer;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+import java.sql.SQLException;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) throws SQLException, InterruptedException {
+ SpringApplication.run(DemoApplication.class, args);
+ //Parcer.runParsing();
+
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/org/example/spring/QueryTool.java b/src/main/java/org/example/spring/QueryTool.java
new file mode 100644
index 0000000..63a69af
--- /dev/null
+++ b/src/main/java/org/example/spring/QueryTool.java
@@ -0,0 +1,7 @@
+package org.example.spring;
+
+
+
+public class QueryTool {
+
+}
diff --git a/src/main/java/org/example/spring/Train.java b/src/main/java/org/example/spring/Train.java
new file mode 100644
index 0000000..656e7c2
--- /dev/null
+++ b/src/main/java/org/example/spring/Train.java
@@ -0,0 +1,59 @@
+package org.example.spring;
+import jakarta.persistence.Entity;
+import jakarta.persistence.GeneratedValue;
+import jakarta.persistence.GenerationType;
+import jakarta.persistence.Id;
+
+@Entity
+public class Train {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private int id;
+ private String trainId;
+ private String trainStart;
+ private String trainEnd;
+ private String trainDuration;
+
+ // Getters and setters
+
+ public int getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getTrainId() {
+ return trainId;
+ }
+
+ public void setTrainId(String trainId) {
+ this.trainId = trainId;
+ }
+
+ public String getTrainStart() {
+ return trainStart;
+ }
+
+ public void setTrainStart(String trainStart) {
+ this.trainStart = trainStart;
+ }
+
+ public String getTrainEnd() {
+ return trainEnd;
+ }
+
+ public void setTrainEnd(String trainEnd) {
+ this.trainEnd = trainEnd;
+ }
+
+ public String getTrainDuration() {
+ return trainDuration;
+ }
+
+ public void setTrainDuration(String trainDuration) {
+ this.trainDuration = trainDuration;
+ }
+}
diff --git a/src/main/java/org/example/spring/TrainController.java b/src/main/java/org/example/spring/TrainController.java
new file mode 100644
index 0000000..3b7460c
--- /dev/null
+++ b/src/main/java/org/example/spring/TrainController.java
@@ -0,0 +1,33 @@
+package org.example.spring;
+
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.example.db.database;
+import java.util.List;
+import java.util.Map;
+
+
+@Controller
+public class TrainController {
+
+ @Autowired
+ private TrainService trainService;
+
+ @GetMapping("/train")
+ public String getTrains(Model model) {
+ List trains = trainService.getAllTrains();
+ model.addAttribute("trains", trains);
+ return "trains";
+ }
+ @PostMapping("/executeQuery")
+ public String executeQuery(@RequestParam("sqlQuery") String sqlQuery, Model model) {
+
+ return "trains";
+ }
+
+}
diff --git a/src/main/java/org/example/spring/TrainRepository.java b/src/main/java/org/example/spring/TrainRepository.java
new file mode 100644
index 0000000..cc0c819
--- /dev/null
+++ b/src/main/java/org/example/spring/TrainRepository.java
@@ -0,0 +1,12 @@
+package org.example.spring;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+public interface TrainRepository extends JpaRepository {
+
+ @Query("SELECT t FROM Train t ORDER BY t.id")
+ List findAllSortedByTrainStart();
+}
diff --git a/src/main/java/org/example/spring/TrainService.java b/src/main/java/org/example/spring/TrainService.java
new file mode 100644
index 0000000..e8e6b3b
--- /dev/null
+++ b/src/main/java/org/example/spring/TrainService.java
@@ -0,0 +1,17 @@
+package org.example.spring;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+@Service
+public class TrainService {
+
+ @Autowired
+ private TrainRepository trainRepository;
+
+ public List getAllTrains() {
+ return trainRepository.findAllSortedByTrainStart();
+ }
+}
diff --git a/src/main/java/org/example/Train.java b/src/main/java/org/example/train/TrainP.java
similarity index 82%
rename from src/main/java/org/example/Train.java
rename to src/main/java/org/example/train/TrainP.java
index 98fb43c..daca49d 100644
--- a/src/main/java/org/example/Train.java
+++ b/src/main/java/org/example/train/TrainP.java
@@ -1,9 +1,9 @@
-package org.example;
+package org.example.train;
import lombok.Getter;
import lombok.Setter;
-public class Train {
+public class TrainP {
@Setter
@Getter
String number;
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
new file mode 100644
index 0000000..00e2d7b
--- /dev/null
+++ b/src/main/resources/application.properties
@@ -0,0 +1,10 @@
+spring.application.name=demo
+spring.datasource.url=jdbc:postgresql://localhost:5432/TrainDB
+spring.datasource.username=postgres
+spring.datasource.password=12345
+spring.datasource.driver-class-name=org.postgresql.Driver
+spring.resources.static-locations=classpath:/static/
+
+spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
+spring.jpa.hibernate.ddl-auto=update
+
diff --git a/src/main/resources/templates/trains.html b/src/main/resources/templates/trains.html
new file mode 100644
index 0000000..7b9a984
--- /dev/null
+++ b/src/main/resources/templates/trains.html
@@ -0,0 +1,32 @@
+
+
+
+ Trains
+
+
+Trains
+
+
+
+
+
+
+
+ Train ID |
+ Start Date |
+ End Date |
+ Duration |
+
+
+ |
+ |
+ |
+ |
+
+
+
+
diff --git a/src/main/resources/templates/trains2.html b/src/main/resources/templates/trains2.html
new file mode 100644
index 0000000..6640605
--- /dev/null
+++ b/src/main/resources/templates/trains2.html
@@ -0,0 +1,64 @@
+
+
+
+
+
+ Document
+
+ Data Viewer
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID |
+ Name |
+ Value |
+
+
+
+ {% for result in results %}
+
+ {{ result.id }} |
+ {{ result.name }} |
+ {{ result.value }} |
+
+ {% endfor %}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file