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 + 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 IDStart DateEnd DateDuration
+ + 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 + + + + + +
+ +
+ + +
+
+ + +
+ + + + + + + + + + + {% for result in results %} + + + + + + {% endfor %} + +
IDNameValue
{{ result.id }}{{ result.name }}{{ result.value }}
+ + +
+ + + +
+ +
+ + + \ No newline at end of file